Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 25 ноя 2017, 15:07

Часовой пояс: UTC + 3 часа [ Летнее время ]


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 09:42 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
Очень уж я привык к такому выделению за время работы в автокаде - когда выделяются объекты, частично попавшие в область выделения.
к сожалению, в визио можно включать такой режим только в настройках (с выключением нормального режима), да и то он работает криво.
поспрашивал в форумах - как такое поведение рамки можно реализовать по-человечески, все упорно молчали.
короче, сделал сам с помощью макросов.
принцип простейший: при нажатии мышки, запоминается Х1 координата. при отжатии - новая Х2 координата сравнивается со старой Х1. если Х2<Х1, то рамка секущая и выполняется моя процедура выделения через ф-ю визио SpatialNeighbors. в противном случае выделение идет по старому - только те объекты, которые полностью попали в рамку.

Запуск вручную через процедуру Start. либо помещаем Set myapp = Application в процедуру Document_DocumentOpened - для автозапуска при открытии документа.

Пишем весь код в модуле ThisDocument.
Код:
Dim WithEvents myapp As Visio.Application
Dim x As Double, y As Double

'процедура запуска
Sub Start()
    Set myapp = Application
End Sub

'начало выделения секущей рамкой - запоминание координат
Private Sub myapp_MouseDown(ByVal Button As Long, ByVal KeyButtonState As Long, ByVal x1 As Double, ByVal y1 As Double, CancelDefault As Boolean)
    If Button = 1 Then 'левая кнопка мыши
        x = x1: y = y1
    End If
End Sub

'конец выделения секущей рамкой - рамка справа-налево
Private Sub myapp_MouseUp(ByVal Button As Long, ByVal KeyButtonState As Long, ByVal x2 As Double, ByVal y2 As Double, CancelDefault As Boolean)
    Dim sh As Visio.Shape, sht As Visio.Shape, sel As Visio.Selection, sel2 As Visio.Selection, scp As Long
   
    If Button = 1 Then 'левая кнопка мыши
        If Not (ActiveWindow.Type = visDrawing And ActiveWindow.SubType = visPageWin) Then Exit Sub 'нас интересует только область рисования
        If x2 < x Then
            scp = Application.BeginUndoScope("FenceSelect")
            Set sel2 = ActiveWindow.Selection 'сохраняем предыдущий набор
            Set sh = ActivePage.DrawRectangle(x, y, x2, y2) 'временный вспомогательный шейп
            Set sel = sh.SpatialNeighbors(visSpatialContain + visSpatialOverlap + visSpatialTouching, 0, 0) 'определение соседей верменного шейпа
            For Each sht In sel 'выделение на экране всех найденных шейпов
                ActiveWindow.Select sht, visSelect
            Next sht
            For Each sht In sel2 'добавление в набор шейпов из предыдущего набора
                ActiveWindow.Select sht, visSelect
            Next sht
            sh.Delete 'удаление временного шейпа
            Application.EndUndoScope scp, True
        End If
    End If
End Sub


При желании, можно реализовать эти алгоритмы через надстройку для визио, чтобы этот функционал работал в любом документе.

P.S. забыл написать, что секущая рамка это выделение объектов рамкой справа-налево, обычное выделение - слева-направо
P.S. добавил возможность добавлять в набор уже выделенных на экране шейпов. т.е. теперь можно поэтапно добавлять в набор шейпы несколько раз секущей рамкой, удерживая CTRL.


Последний раз редактировалось 9rey 12 ноя 2014, 13:23, всего редактировалось 3 раз(а).

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 10:33 
Не в сети
Ветеран

Зарегистрирован: 05 июл 2012, 21:34
Сообщений: 207
Очков репутации: 27

Добавить очки репутацииУменьшить очки репутации
Хорошая штука. А может сделать как в AC, различать выделений слева на право и справа на лево, а фичу держать включенной постоянно.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 11:02 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
это и имелось в виду. она так и работает. у меня она постоянно включена. и все различается. попробуй


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 12:43 
Не в сети
Ветеран

Зарегистрирован: 05 июл 2012, 21:34
Сообщений: 207
Очков репутации: 27

Добавить очки репутацииУменьшить очки репутации
Ок. Не так понял. А там по селекту есче есть различие в потере выделений, если выбрать, что то другле предыдущий выбор не дополняется, а сбрасывается, для добавления в текущий выбор пиходится зажимать ctrl. В этом ключе Вас все устраивает?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 13:21 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
сделал как Вы хотели :)
в первом посте внес изменения в код. теперь удерживая CTRL можно выделять многократно


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 13:25 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
9rey
щикарный подгон, дружище ! работает отлично.
осталось самому догнать как работать со Spatial. Бьюсь над задачей как автомтизировать нумерацию коннекторов отходящих от шейпа. Когда выделяю 6 шейпов все работает на ура. а когда больше нумерация кривая получается


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 14:15 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
Surrogate
закинь анимашку, что у тебя получилось. может помочь смогу. лучше тему создать


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 16:09 
Не в сети
Ветеран

Зарегистрирован: 05 июл 2012, 21:34
Сообщений: 207
Очков репутации: 27

Добавить очки репутацииУменьшить очки репутации
9rey писал(а):
сделал как Вы хотели :)
в первом посте внес изменения в код. теперь удерживая CTRL можно выделять многократно

Супер! Спасибо!


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 12 ноя 2014, 22:27 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Согласен с Surrogate и Robink. Действительно шикарная вещь!
Долго ломал над этим голову, но без толку. Тем более ценно то, что "легким росчерком пера" можно модифицировать код для нужного поведения. Мне, например требовалось выделение и справа налево и слева направо и... короче всегда. Но оставаться выделенными должны были шейпы с определенным свойством. За пару минут все это реализовал! 9rey, спасибо огромное!
ps. Imho этот код - стопроцентный кандидат в копилку макросов.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 12:34 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Shishok писал(а):
Мне, например требовалось выделение и справа налево и слева направо и... короче всегда. Но оставаться выделенными должны были шейпы с определенным свойством. За пару минут все это реализовал!
т.е. ты реализовал как в автокаде выбор по критерию в уже выделенных шейпах ?
Я хотел в свое время это сделать в макросе, да тот же самый 9rey отговорил. Сказал надо надстройку делать, а до изучения VisuaStudio я еще не дошел…
Если не жалко поделись своим кодом.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 18:26 
Не в сети
Ветеран

Зарегистрирован: 05 июл 2012, 21:34
Сообщений: 207
Очков репутации: 27

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
Shishok писал(а):
Мне, например требовалось выделение и справа налево и слева направо и... короче всегда. Но оставаться выделенными должны были шейпы с определенным свойством. За пару минут все это реализовал!
т.е. ты реализовал как в автокаде выбор по критерию в уже выделенных шейпах ?
Я хотел в свое время это сделать в макросе, да тот же самый 9rey отговорил. Сказал надо надстройку делать, а до изучения VisuaStudio я еще не дошел…
Если не жалко поделись своим кодом.

Там же в коде видно, где шейпы отправляются на выделение, там можно и фильтр поставить.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 18:54 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Robink писал(а):
Surrogate писал(а):
Shishok писал(а):
Мне, например требовалось выделение и справа налево и слева направо и... короче всегда. Но оставаться выделенными должны были шейпы с определенным свойством. За пару минут все это реализовал!
т.е. ты реализовал как в автокаде выбор по критерию в уже выделенных шейпах ?
Я хотел в свое время это сделать в макросе, да тот же самый 9rey отговорил. Сказал надо надстройку делать, а до изучения VisuaStudio я еще не дошел…
Если не жалко поделись своим кодом.

Там же в коде видно, где шейпы отправляются на выделение, там можно и фильтр поставить.


Да, Robink прав. Я так и сделал.

Код:
            For Each sht In sel2 'выделение на экране всех найденных шейпов
                If sht.CellExistsU("User.TableName", 0) Then ActiveWindow.Select sht, visSelect
            Next sht


Проверка наличия в шейпе определенной строки в секции User-defined Cells. Ну, а тебе Surrogate нужно всего лишь сделать свою проверку. Вроде ничего сложного тут нет.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 19:20 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Кстати. Если нужно выделение всех шейпов попавших под указатель мыши без всяких условий, то можно заменить первый цикл:
Код:
            For Each sht In sel 'выделение на экране всех найденных шейпов
                ActiveWindow.Select sht, visSelect
            Next sht

на строку:
Код:
ActiveWindow.Selection = sel


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 19:47 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
да, правильно. в моем коде как раз были проверки. я их убрал перед тем как сюда запостить, поэтому остался цикл.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 19:56 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Robink писал(а):
Там же в коде видно, где шейпы отправляются на выделение, там можно и фильтр поставить.
Shishok писал(а):
Ну, а тебе Surrogate нужно всего лишь сделать свою проверку. Вроде ничего сложного тут нет.
это все понятно Изображение
я просто надеялся что кто-то уже сделал это а-la AutoCAD, с аналогичными фильтрами Изображение
раз уж мы косплеим фичи автокада…


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 20:09 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
я просто надеялся что кто-то уже сделал это а-la AutoCAD, с аналогичными фильтрами

это достойно отдельной темы :)
сделать несложно.
вообще интересно, какие еще фишки людям хотелось бы добавить в визио? может например дотянуть линию до объекта? или обрезать? и т.п. :)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 20:21 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
9rey писал(а):
это достойно отдельной темы :)
сделать несложно.
я как ты помнишь хотел копироватить интерфейс автокада. потом стало лениво заморачиваться с формами, чекбоксами и т.п.
да и со свободным временем небогато…
9rey писал(а):
вообще интересно, какие еще фишки людям хотелось бы добавить в визио?
ну что завести отдельный раздел под это дело ?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 20:39 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Surrogate, ты вот про это, что-ли?

Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 13 ноя 2014, 21:21 
Не в сети
Ветеран

Зарегистрирован: 21 окт 2011, 12:01
Сообщений: 876
Откуда: г. Екатеринбург
Использую Visio c: 2011
Очков репутации: 118

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
ну что завести отдельный раздел под это дело ?

не стоит. пусть в этом разделе будет все. пусть народ делится макросами/надстройками по мере сил. не обязательно же копировать АКАД.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Выделение секущей рамкой аля AutoCad
СообщениеДобавлено: 14 ноя 2014, 00:35 
Не в сети
Administrator

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 3362
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Связь
Должность: Бывший проектировщик
Уровнь квалификации: ShapeSheet, VBA
Shishok
я про фичу называемую Quickselect™
Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB