Author |
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, горизонтальный. Или Вас волнует не метод вычисления, а событие, по которому это должно делаться? Кстати, а это нужно делать для приконнекченного коннектора или любого? |
|
|
zhuravsky
Russia
115 Posts |
Posted - 12/26/2007 : 05:02:05
|
Ну, как отличить горизонталь от вертикали - это понятно. Непонятно, как "пробежаться" по строкам секции Geometry средствами ShapeSheet и возможно ли это в принципе (ведь число строк переменно). Событие, тоже интересует, т.к. кажется, что если с шифтом перетащить кусок коннектора за зеленую точку, то не возникает срабатывания в поле EventXFMod. Обрабатывать хотелось и приконнеченный коннектор и нет. Я тут параллельно начал копать в другом направлении - без коннектора, с обычной линией вроде получается проще, но, конечно, теряется гибкость. А вообще, конечная задача - сделать шейп для многожильного кабеля, чтобы рисовать схемы подключения. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/26/2007 : 18:00:59
|
Встречал в похожем случае такое решение. Забито сразу много строк геометрии (только некоторые невидимы). Каждая строка содержит формулу, учитывающую номер строки. То есть не "пробегают" по строкам, но каждая строка знает, что ей делать. А задача была чуть попроще - кабель для Э0. Это такой, у которого на концах разъемы, а посредине (на одном из колен) кружок с обозначением. |
|
|
zhuravsky
Russia
115 Posts |
Posted - 12/30/2007 : 13:55:01
|
Ну, я тоже пришел к выводу, что динамический коннектор использовать не получиться. Буду работать с обычными линиями. Есть ли смысл выложить сюда результат? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 12/30/2007 : 14:43:37
|
Конечно есть! Задача непростая. А требуется наверное многим. |
|
|
Tumanov
Russia
1198 Posts |
|
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 |
|
|
GDK
Russia
90 Posts |
Posted - 01/11/2008 : 16:54:44
|
С событиями потихоньку начал разбираться благодаря тому что нашёл как пользоваться поиском по форуму. Здесь есть одна небольшая тема (автор-Lena), где описано как начать пользоваться возможностью отлавливать события. Жаль что это не вошло в FAQ. Теперь ещё вопрос. Нигде не нашёл как отловить событие удаления одной из точек ломаной линии. Или (аналог наверное) событие удаления строки из секции шейп-листа. Скорее всего такое есть, может быть кто нибудь знает что это за событие |
|
|
Tumanov
Russia
1198 Posts |
Posted - 01/11/2008 : 17:20:14
|
Собственно удаления кажется нет. Наверное можно использовать событие изменения формулы. Вообще, для поиска событий идеально подходит Event Monitor tool, входящий в состав Visio SDK. Это окошко, в которое выводятся все происходящие события Visio. То есть включаете мониторинг, удаляете строку геометрии, выключаете лог и анализируете - какие события произошли.
|
|
|
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 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 01/14/2008 : 16:22:18
|
В режиме приостанова копируется через буфер. Приостанавливает крайняя правая кнопка. А на ходу, в режиме регистрации не хочет. |
|
|
GDK
Russia
90 Posts |
Posted - 01/15/2008 : 09:52:24
|
Не-а. Дело не в этом. Работает в любом режиме. Только сочетание клавиш Ctrl+C не работает. Чтобы скопировать текст в буфер надо его выделить, потом на выделенном щёлкнуть правой кн. мышки, потом выбрать "копировать". Всё, выделенный текст в буфере обмена. |
Edited by - GDK on 01/15/2008 15:01:28 |
|
|
|
Topic |
|
|
|