All Forums
 Категория Visio
 Форум Вопросы и ответы
 Реакция на изменение геометрии динамического конн.
Author Previous Topic Topic Next Topic  

zhuravsky

Russia
115 Posts

Posted - 12/25/2007 :  09:39:16
Стоит такая задача:
Есть динамический коннектор, необходимо каким-то образом среагировать на изменение геометрии его конечной точки, если конкретнее - то узнать вертикален ли последний сегмент.
Дело в том, что динамических коннекторов возможно изменение секции Geometry1 с добавлением новых строк типа LineTo. Если для начальной точки можно привязаться к определенной ячейке и реагировать на ее изменения, то для конечной точки эта ячейка может меняться, и как зацепится за последний сегмент - непонятно.
Можно ли в такой задаче обойтись только средствами Shape Sheet?
Если нет, то как лучше подойти из VBA?

Visio 2003

Tumanov

Russia
1198 Posts

Posted - 12/25/2007 :  16:13:30
Можно ли обойтись средствами Shape Sheet - зависит наверное от того, как Вы собираетесь использовать результат.
Мне приходилось строить коннектор со специальными наконечниками. Их прорисовка зависела от направления сегментов. Помнится, направление сегментов вычислялось чередованием и суммировалось по модулю 2 с направлением первого сегмента. Но формулы страшными были :)
В VBA, естественно, проще. Количество сегментов определяется по числу строк геометрии. Направление сегмента вычисляется сравнением координат X или Y в двух последних сегментах (или первых). Если равны X, сегмент вертикальный, если Y, горизонтальный.
Или Вас волнует не метод вычисления, а событие, по которому это должно делаться?
Кстати, а это нужно делать для приконнекченного коннектора или любого?
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 12/26/2007 :  05:02:05
Ну, как отличить горизонталь от вертикали - это понятно. Непонятно, как "пробежаться" по строкам секции Geometry средствами ShapeSheet и возможно ли это в принципе (ведь число строк переменно).
Событие, тоже интересует, т.к. кажется, что если с шифтом перетащить кусок коннектора за зеленую точку, то не возникает срабатывания в поле EventXFMod.
Обрабатывать хотелось и приконнеченный коннектор и нет.
Я тут параллельно начал копать в другом направлении - без коннектора, с обычной линией вроде получается проще, но, конечно, теряется гибкость.
А вообще, конечная задача - сделать шейп для многожильного кабеля, чтобы рисовать схемы подключения.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/26/2007 :  18:00:59
Встречал в похожем случае такое решение. Забито сразу много строк геометрии (только некоторые невидимы). Каждая строка содержит формулу, учитывающую номер строки. То есть не "пробегают" по строкам, но каждая строка знает, что ей делать.
А задача была чуть попроще - кабель для Э0. Это такой, у которого на концах разъемы, а посредине (на одном из колен) кружок с обозначением.
Go to Top of Page

zhuravsky

Russia
115 Posts

Posted - 12/30/2007 :  13:55:01
Ну, я тоже пришел к выводу, что динамический коннектор использовать не получиться. Буду работать с обычными линиями.
Есть ли смысл выложить сюда результат?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/30/2007 :  14:43:37
Конечно есть!
Задача непростая. А требуется наверное многим.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/03/2008 :  08:01:38
Шейп кабеля от zhuravsky выложен на сайте в http://visio.artberg.ru/store/kabel_1.zip
Выглядит он вот так - http://visio.artberg.ru/store/kab1.jpg
Go to Top of Page

GDK

Russia
90 Posts

Posted - 01/09/2008 :  15:42:58
Как я понял что проблемма в изменении номера последней ячейки. Если это так то мне кажется что прицепиться к последней, предпоследней ... любой ячейке - не проблема даже с использованием формул шейп-листа если фигура - ломаная линия. Т.е. если есть формула, ссылающаяся на последнюю ячейку напр. =Geomtry.X3, то при добавлении к фигуре одной новой точки эта формула автоматически изменится т.е. она станет такой: =Geomtry.X4.
Может быть использовать обычную линию совместно с динамическим коннектором. Кстати, при использовании динамического коннектора для такой цели может быть неожиданный результат. Т.е. не всегда все звенья динамического коннектора либо горизонтальны либо вертикальны. Если коннектор уже приклеен напр. конечной точкой и пользователь решит уменьшить последнее звено меньше некоторой(минимальной) длины, то последнее звено может получиться под градусом не равным 90.

Ловить события, как оказалось, дело не из простых. Если не знаешь английского - научиться сложно. Я вот пытался, пока не получается. Как я понял есть события документа - они стандартные(подключенные) короче не знаю как их назвать, с ними всё просто, и есть события, которые надо подключить(или может быть добавить: есть какой то EventList). Для них, как я понял, надо писать класс. Взял FAQ c этого сайта - там есть пара примеров, но писали их уже те кто разбирается. Пару раз пытался прочитать в справке по Visio, но языка не знаю, а по знакомым словам почти ничё не понятно. Так что будь готов...

Теперь несколько вопросов.
1. Есть ли какая-нибудь функция, которая возвращала бы номер ячейки, на которую ссылается. Поясню. Например при добавлении точки в ломаную линию формула которая ссылалась на Geometry.X3 теперь стала ссылаться на Geometry.X4. Надо такую функцию, которая возвращала бы: до добавления точки - число 3; после добавления - число 4.
2. Если такой нет то может быть есть такая, которая бы возвращала бы текст формулы той ячейки, на которую ссылается. Не результат, а именно текст формулы.
3.Можно ли писать функции для шейп-листа самому на VB или хотя бы на VC++. В Excell кажется есть такая возможность (уточню), а вот в Visio-?.
За кабель всем спасибо. Может скоро пригодится. Тогда сообщу в этой теме если чё'новое придумаю. Всё таки охота попробовать без макросов.

Edited by - GDK on 01/09/2008 15:48:08
Go to Top of Page

GDK

Russia
90 Posts

Posted - 01/11/2008 :  16:54:44
С событиями потихоньку начал разбираться благодаря тому что нашёл как пользоваться поиском по форуму. Здесь есть одна небольшая тема (автор-Lena), где описано как начать пользоваться возможностью отлавливать события. Жаль что это не вошло в FAQ.
Теперь ещё вопрос. Нигде не нашёл как отловить событие удаления одной из точек ломаной линии. Или (аналог наверное) событие удаления строки из секции шейп-листа. Скорее всего такое есть, может быть кто нибудь знает что это за событие
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/11/2008 :  17:20:14
Собственно удаления кажется нет.
Наверное можно использовать событие изменения формулы.
Вообще, для поиска событий идеально подходит Event Monitor tool, входящий в состав Visio SDK. Это окошко, в которое выводятся все происходящие события Visio. То есть включаете мониторинг, удаляете строку геометрии, выключаете лог и анализируете - какие события произошли.
Go to Top of Page

GDK

Russia
90 Posts

Posted - 01/14/2008 :  15:40:40
Для начинающих: "Event Monitor" получилось найти не сразу. Ссылки в меню "Пуск\..." для запуска этого окошка нет. Для запуска пришлось открыть папку, в которой лежит SDK. Там есть папка Tools. В ней файл "Event Monitor". Его и надо запустить.
Событие нашёл. TextChanged(испытал для активного листа). Кто бы мог подумать!? Удалял не строку в шейп-листе, а прямо точку геометрии ломаной линии на листе(типа как предполагаемый пользователь).
Можно ли сохранить или скопировать информацию из этого окна в текстовый файл? У меня не получилось.

Edited by - GDK on 01/14/2008 15:47:59
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/14/2008 :  16:22:18
В режиме приостанова копируется через буфер. Приостанавливает крайняя правая кнопка.
А на ходу, в режиме регистрации не хочет.
Go to Top of Page

GDK

Russia
90 Posts

Posted - 01/15/2008 :  09:52:24
Не-а. Дело не в этом. Работает в любом режиме. Только сочетание клавиш Ctrl+C не работает. Чтобы скопировать текст в буфер надо его выделить, потом на выделенном щёлкнуть правой кн. мышки, потом выбрать "копировать". Всё, выделенный текст в буфере обмена.

Edited by - GDK on 01/15/2008 15:01:28
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)