Форум пользователей Visio http://visio.getbb.ru/ |
|
Копирование с базовой точкой http://visio.getbb.ru/viewtopic.php?f=6&t=138 |
Страница 1 из 2 |
Автор: | Robink [ 05 июл 2012, 21:43 ] |
Заголовок сообщения: | Копирование с базовой точкой |
Реализовал перемещение с базовой точкой. С копированием дело обстоит сложнее. Проблема в том, что нет стандартного инструмента, при помощи которого можно указать на точку, и который можно запустить через горячие клавиши(соответственно активировать через sendkeys), есть точка, но она ставится с зажатой левой клавишей. Единственный кандидат из инстументов, это обычная линия, как с помощью этого инструмента указать на точку, за один раз? |
Автор: | Surrogate [ 06 июл 2012, 09:17 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Копирование с базовой точкой - действительно очень полезная фича Никогда не задумывался можно ли ее реализовать в Визио… Ну что ж надо попробовать, может коллективными усилиями решим эту задачу! вопросы: Robink писал(а): Реализовал перемещение с базовой точкой 1. можно подробнее про реализацию перемещения с базовой точкой ? Robink писал(а): есть точка, но она ставится с зажатой левой клавишей. 2. Что это за точка ? Идеи по реализации: 1. Макрос вычисляеем координаты клика мыши 2. Макрос рисует линию с нулевой длиной - это и будет наша базовая точка 3. Макрос создает группу, включающую базовую точку и то что мы выделили. Где-то я читал, что в версиях Визио старше 2003 можно делать вставку именно точку, где находится мышь! Кто-нибудь может подсказать как это сделать ? |
Автор: | Robink [ 06 июл 2012, 17:01 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Добавление перемещения с базовой точкой: 1. Обработчик события фигура добавлена, встпавляет в контекстовое меню фигуры пункт переместить с базовой точкой. 2. Пользователь выделяет фигуру/фигуры, щелкает правой кнопкой мыши выбирает пункт меню переместить с базовой точкой. 3. Программа снимает выделение с фигур, включет инструмент линия 4. Пользователь чертит линию от точки до точки 5 Линия удаляется программой, фигуры перемещаются программой, на длину линии в заданном ею направлении. Можно вычислить координату клика, но она ничего даст, нужно чтобы установку можно было сделать по привязкам или приклеиванию. В любом случае надо использовать какой то примитив. |
Автор: | Surrogate [ 06 июл 2012, 17:32 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Да, действительна координата клика будет - координатой на экране, а не в самом визио |
Автор: | Tumanov [ 09 июл 2012, 15:04 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Не могли бы и мне пояснить, что не получается... Если основная трудность в том, чтобы определить координату мыши в системе листа Visio, то можно попробовать использовать событие Application.MouseMove. Или нужно, чтобы мышь была неподвижной? |
Автор: | Robink [ 09 июл 2012, 17:54 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Цитата: Не могли бы и мне пояснить, что не получается... Если основная трудность в том, чтобы определить координату мыши в системе листа Visio, то можно попробовать использовать событие Application.MouseMove. Или нужно, чтобы мышь была неподвижной? Нужна возможность указать на точку, используя привязки и приклеивание. |
Автор: | Tumanov [ 09 июл 2012, 18:48 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Понял. Для приклеивания нужно что-то 1D. Но линию рисовать не обязательно. Достаточно, чтобы был выбран инструмент и обрабатывалось событие MouseDown. |
Автор: | Robink [ 10 июл 2012, 16:27 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Цитата: Понял. Для приклеивания нужно что-то 1D. Но линию рисовать не обязательно. Достаточно, чтобы был выбран инструмент и обрабатывалось событие MouseDown. Не так все просто. Событие возвратит куда кликнул, а куда привязывается или приклеивается линия, эта точка хоть и рядом, но не та. |
Автор: | ss87 [ 18 июл 2012, 16:11 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Вот на досуге набросал, не идеально конечно Принцип, выделяем фигуру запускаем макрос Init_CopyBase далее рисуем линию, смотрим результат. Код вставляем в ThisDocument или Class Module Код: Private WithEvents vsoApplication As Visio.Application
Private lngScopeID As Long Private flagCopy As Boolean Private oldGlueSettings As Variant Private selShape As Visio.Shape Public Sub Init_CopyBase() Set vsoApplication = Application flagCopy = True Application.DoCmd (1221) oldGlueSettings = Application.ActiveDocument.GlueSettings Application.ActiveDocument.GlueSettings = oldGlueSettings + visGlueToGeometry Set selShape = ActiveWindow.Selection(1) End Sub Private Sub CopyBase(ByVal bX As Double, ByVal bY As Double, _ ByVal eX As Double, ByVal eY As Double) selShape.Copy ActivePage.PasteToLocation eX + selShape.Cells("PinX") - bX, _ eY + selShape.Cells("PinY") - bY, 0 Application.DoCmd (1219) Application.ActiveDocument.GlueSettings = oldGlueSettings Set vsoApplication = Nothing End Sub Private Sub vsoApplication_ShapeAdded(ByVal vsoShape As Visio.IVShape) If vsoShape.OneD And flagCopy Then CopyBase vsoShape.Cells("BeginX"), vsoShape.Cells("BeginY"), _ vsoShape.Cells("EndX"), vsoShape.Cells("EndY") vsoShape.Delete End If End Sub |
Автор: | Tumanov [ 18 июл 2012, 16:41 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
А вот есть еще такая штука, как Controls (управляющие точки). Они тоже умеют коннектиться. Но в отличие от линии, это принадлежность шейпа. Если получится их использовать, то рисовать и удалять линию не надо. |
Автор: | Robink [ 18 июл 2012, 20:32 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Tumanov писал(а): А вот есть еще такая штука, как Controls (управляющие точки). Они тоже умеют коннектиться. Но в отличие от линии, это принадлежность шейпа. Если получится их использовать, то рисовать и удалять линию не надо. Я так делал. Там беда в том, что точку нужно выбирать, добавляются +2 действия. Последняя идея, это помещать управляющую точку сразу под курсор. |
Автор: | Robink [ 18 июл 2012, 20:40 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
ss87 писал(а): Вот на досуге набросал, не идеально конечно Принцип, выделяем фигуру запускаем макрос Init_CopyBase далее рисуем линию, смотрим результат. Код вставляем в ThisDocument или Class Module Код: Private WithEvents vsoApplication As Visio.Application Private lngScopeID As Long Private flagCopy As Boolean Private oldGlueSettings As Variant Private selShape As Visio.Shape Public Sub Init_CopyBase() Set vsoApplication = Application flagCopy = True Application.DoCmd (1221) oldGlueSettings = Application.ActiveDocument.GlueSettings Application.ActiveDocument.GlueSettings = oldGlueSettings + visGlueToGeometry Set selShape = ActiveWindow.Selection(1) End Sub Private Sub CopyBase(ByVal bX As Double, ByVal bY As Double, _ ByVal eX As Double, ByVal eY As Double) selShape.Copy ActivePage.PasteToLocation eX + selShape.Cells("PinX") - bX, _ eY + selShape.Cells("PinY") - bY, 0 Application.DoCmd (1219) Application.ActiveDocument.GlueSettings = oldGlueSettings Set vsoApplication = Nothing End Sub Private Sub vsoApplication_ShapeAdded(ByVal vsoShape As Visio.IVShape) If vsoShape.OneD And flagCopy Then CopyBase vsoShape.Cells("BeginX"), vsoShape.Cells("BeginY"), _ vsoShape.Cells("EndX"), vsoShape.Cells("EndY") vsoShape.Delete End If End Sub Спасибо, работает. Идея интересная. |
Автор: | Surrogate [ 18 июл 2012, 21:05 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Robink писал(а): Добавление перемещения с базовой точкой: 1. Обработчик события фигура добавлена, встпавляет в контекстовое меню фигуры пункт переместить с базовой точкой. 2. Пользователь выделяет фигуру/фигуры, щелкает правой кнопкой мыши выбирает пункт меню переместить с базовой точкой. кстати как добавить программно пункт в контекстное меню фигуры ? |
Автор: | Robink [ 18 июл 2012, 22:10 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Цитата: кстати как добавить программно пункт в контекстное меню фигуры ? Добавляешь секцию Actions, если её не было. Добавляешь строчку, в графу меню вставляешь название меню, в графу актионс ссылку на макрос. |
Автор: | 9rey [ 19 июл 2012, 08:32 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
дополнение Цитата: кстати как добавить программно пункт в контекстное меню фигуры ? макрос может быть записан вот так: Код: sh.CellsSRC(visSectionAction, 0, visActionAction).FormulaU = "CALLTHIS(""UGOProp.ShowFromDrawing"",)" sh.CellsSRC(visSectionAction, 0, visActionMenu).FormulaU = """Свойства элемента""" тогда в него будет передан указатель на шейп, с которого ты вызывал меню. ответная функция в данном случае такая: Код: Sub ShowFromDrawing(ByRef sh As Visio.Shape)
|
Автор: | Robink [ 08 авг 2012, 12:09 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Сделал вот такой пример: http://narod.ru/disk/59064844001.59a98f8a1045d959bdde88a58026f706/kopyr.vsd.html Запускаете. Создаете фигуру, нажимаете Ctrl+H, ставите управляющую точку на нужное место, вставляете Ctrl+V, ствите упр точку на нужное место. Через контекстовое меню не работает, почему то вызывается событие фигура добавлена, которое портит фигуру. |
Автор: | Robink [ 08 авг 2012, 21:51 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
В примере выше. Там следующие беды: 1. Если выбрать пункт в меню, то после выполнения макроса copy_with_base_point, срабатывает событие фигура добавлена. 2. События, которые привязаны к шейпам, формула изменена, срабатывают только на изменение координаты Y управляющей точки. 3. Если вставлять через контекстовое меню, то событие моузе мове даст только точку в которой щелкнули правой кнопкой мыши. |
Автор: | Robink [ 24 май 2013, 18:19 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Вижу тема представляет интерес. Тот пример kopyr.vsd выкладывал я, пользуюсь тем же алгоритмом. Юзаю так: запускаю через сочетание Ctrl+H, контрол падает под курсор, ставлю его на нужное место, правой кнопкой щелкаю на схеме, выбираю вставить, появившийся контрол ставлю на нужное место. Когда вставляешь, контрол падает не под курсор, а в той точке, в которой было вызвано меню, это не удобно. http://yadi.sk/d/gronS5u858GdS |
Автор: | nbelyh [ 25 май 2013, 10:22 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
Как предложил 9rey здесь, попробовал завернуть копирование и перемещение с базовой точкой в аддин: Работает примерно так: http://www.youtube.com/watch?v=YjZZJPt459s Идея следующая: - По включению режима "перемещения/копирования" включаем режим добавления точек соединения (это даст приклеивание к геометрии) и мониторим, когда пользователь добавит первую точку. Запоминаем ее. - Потом ждем когда пользователь добавит вторую. Когда добавил вторую, действуем. Для перемещения: удаляем точки которые пользователь наделал, и делаем тупо Selection.Move Для копирования делаем Selection.Duplicate, вычисляем насколько этот Duplicate сделал отступ, делаем на него поправку, а затем Selection.Move. здесь еще мелкая проблемка что исходный Selection надо сохранить, чтобы "Штамп" работал - чтобы можно было несколько раз продублировать, но она чисто техническая, и вроде бы более-менее нормально решается путем запоминания теущего Selection перед Duplicate и восстановлением после. Исходники на github: https://github.com/nbelyh/TwoPointMoveAddin/ -- редакция - выложил в публичный доступ, допилил для Visio 2003/2007 |
Автор: | 9rey [ 25 май 2013, 12:36 ] |
Заголовок сообщения: | Re: Копирование с базовой точкой |
nbelyh, дружище, спасибо! отличная идея и спасибо за пример (правда не проверял, у меня 2003 ) |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |