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

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

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


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


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



Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Копирование с базовой точкой
СообщениеДобавлено: 05 июл 2012, 21:43 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Реализовал перемещение с базовой точкой. С копированием дело обстоит сложнее. Проблема в том, что нет стандартного инструмента, при помощи которого можно указать на точку, и который можно запустить через горячие клавиши(соответственно активировать через sendkeys), есть точка, но она ставится с зажатой левой клавишей. Единственный кандидат из инстументов, это обычная линия, как с помощью этого инструмента указать на точку, за один раз?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 06 июл 2012, 09:17 
Не в сети
Administrator

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

1. можно подробнее про реализацию перемещения с базовой точкой ?
Robink писал(а):
есть точка, но она ставится с зажатой левой клавишей.

2. Что это за точка ?


Идеи по реализации:
1. Макрос вычисляеем координаты клика мыши
2. Макрос рисует линию с нулевой длиной - это и будет наша базовая точка
3. Макрос создает группу, включающую базовую точку и то что мы выделили.
Где-то я читал, что в версиях Визио старше 2003 можно делать вставку именно точку, где находится мышь!
Кто-нибудь может подсказать как это сделать ?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 06 июл 2012, 17:01 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Добавление перемещения с базовой точкой:
1. Обработчик события фигура добавлена, встпавляет в контекстовое меню фигуры пункт переместить с базовой точкой.
2. Пользователь выделяет фигуру/фигуры, щелкает правой кнопкой мыши выбирает пункт меню переместить с базовой точкой.
3. Программа снимает выделение с фигур, включет инструмент линия
4. Пользователь чертит линию от точки до точки
5 Линия удаляется программой, фигуры перемещаются программой, на длину линии в заданном ею направлении.

Можно вычислить координату клика, но она ничего даст, нужно чтобы установку можно было сделать по привязкам или приклеиванию. В любом случае надо использовать какой то примитив.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 06 июл 2012, 17:32 
Не в сети
Administrator

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 09 июл 2012, 15:04 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 899
Очков репутации: 100576

Добавить очки репутацииУменьшить очки репутации
Не могли бы и мне пояснить, что не получается...
Если основная трудность в том, чтобы определить координату мыши в системе листа Visio, то можно попробовать использовать событие Application.MouseMove.
Или нужно, чтобы мышь была неподвижной?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 09 июл 2012, 17:54 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Не могли бы и мне пояснить, что не получается...
Если основная трудность в том, чтобы определить координату мыши в системе листа Visio, то можно попробовать использовать событие Application.MouseMove.
Или нужно, чтобы мышь была неподвижной?

Нужна возможность указать на точку, используя привязки и приклеивание.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 09 июл 2012, 18:48 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 899
Очков репутации: 100576

Добавить очки репутацииУменьшить очки репутации
Понял. Для приклеивания нужно что-то 1D.
Но линию рисовать не обязательно. Достаточно, чтобы был выбран инструмент и обрабатывалось событие MouseDown.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 10 июл 2012, 16:27 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Понял. Для приклеивания нужно что-то 1D.
Но линию рисовать не обязательно. Достаточно, чтобы был выбран инструмент и обрабатывалось событие MouseDown.

Не так все просто. Событие возвратит куда кликнул, а куда привязывается или приклеивается линия, эта точка хоть и рядом, но не та.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 18 июл 2012, 16:11 
Не в сети
Постоянный участник

Зарегистрирован: 11 май 2012, 15:05
Сообщений: 92
Очков репутации: 25

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

Принцип, выделяем фигуру запускаем макрос 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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 18 июл 2012, 16:41 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 899
Очков репутации: 100576

Добавить очки репутацииУменьшить очки репутации
А вот есть еще такая штука, как Controls (управляющие точки). Они тоже умеют коннектиться. Но в отличие от линии, это принадлежность шейпа. Если получится их использовать, то рисовать и удалять линию не надо.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 18 июл 2012, 20:32 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
А вот есть еще такая штука, как Controls (управляющие точки). Они тоже умеют коннектиться. Но в отличие от линии, это принадлежность шейпа. Если получится их использовать, то рисовать и удалять линию не надо.

Я так делал. Там беда в том, что точку нужно выбирать, добавляются +2 действия. Последняя идея, это помещать управляющую точку сразу под курсор.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 18 июл 2012, 20:40 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
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


Спасибо, работает. Идея интересная.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 18 июл 2012, 21:05 
Не в сети
Administrator

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

кстати как добавить программно пункт в контекстное меню фигуры ?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 18 июл 2012, 22:10 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
кстати как добавить программно пункт в контекстное меню фигуры ?


Добавляешь секцию Actions, если её не было. Добавляешь строчку, в графу меню вставляешь название меню, в графу актионс ссылку на макрос.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 19 июл 2012, 08:32 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
дополнение

Цитата:
кстати как добавить программно пункт в контекстное меню фигуры ?


макрос может быть записан вот так:
Код:
sh.CellsSRC(visSectionAction, 0, visActionAction).FormulaU = "CALLTHIS(""UGOProp.ShowFromDrawing"",)"
sh.CellsSRC(visSectionAction, 0, visActionMenu).FormulaU = """Свойства элемента"""

тогда в него будет передан указатель на шейп, с которого ты вызывал меню.

ответная функция в данном случае такая:
Код:
Sub ShowFromDrawing(ByRef sh As Visio.Shape)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 08 авг 2012, 12:09 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Сделал вот такой пример: http://narod.ru/disk/59064844001.59a98f8a1045d959bdde88a58026f706/kopyr.vsd.html
Запускаете. Создаете фигуру, нажимаете ctrl+h, ставите управляющую точку на нужное место, вставляете ctrl+v, ствите упр точку на нужное место. Через контекстовое меню не работает, почему то вызывается событие фигура добавлена, которое портит фигуру.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 08 авг 2012, 21:51 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
В примере выше. Там следующие беды:
1. Если выбрать пункт в меню, то после выполнения макроса copy_with_base_point, срабатывает событие фигура добавлена.
2. События, которые привязаны к шейпам, формула изменена, срабатывают только на изменение координаты Y управляющей точки.
3. Если вставлять через контекстовое меню, то событие моузе мове даст только точку в которой щелкнули правой кнопкой мыши.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 24 май 2013, 18:19 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
Вижу тема представляет интерес. Тот пример kopyr.vsd выкладывал я, пользуюсь тем же алгоритмом. Юзаю так: запускаю через сочетание ctrl+h, контрол падает под курсор, ставлю его на нужное место, правой кнопкой щелкаю на схеме, выбираю вставить, появившийся контрол ставлю на нужное место. Когда вставляешь, контрол падает не под курсор, а в той точке, в которой было вызвано меню, это не удобно. http://yadi.sk/d/gronS5u858GdS


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 25 май 2013, 10:22 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 503
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100602

Добавить очки репутацииУменьшить очки репутации
Как предложил 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

_________________
Инструменты для облегчения создания диаграмм, и статьи по Visio:
http://unmanagedvisio.com/


Последний раз редактировалось nbelyh 26 май 2013, 16:20, всего редактировалось 2 раз(а).

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Копирование с базовой точкой
СообщениеДобавлено: 25 май 2013, 12:36 
Не в сети
Ветеран

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

Добавить очки репутацииУменьшить очки репутации
nbelyh, дружище, спасибо! отличная идея и спасибо за пример (правда не проверял, у меня 2003 :) )


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

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



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

Сейчас этот форум просматривают: Yandex [bot] и гости: 1


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

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