Форум пользователей 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/