Author |
Topic |
yabes
39 Posts |
Posted - 04/30/2010 : 11:49:09
|
Добрый день! У меня возник вопрос, который решит будущее моего диплома. Я постарался максимум упростить задачу, чтобы не отвлекаться на лишние данные. Задачка такая: Рисуется динамический коннектор. Указываются координаты начала и конца. Далее на коннектор помещается точка соединения с заданными координатами (Это делается с использованием кода, а не графических средств). Возникает проблема: в режиме отладки при построчном проходе всё работает как надо и точка помещается куда надо. Но при обычном запуске (Run) точка улетает непонятно куда на непонятные координаты. Помогите решить эту проблему! Вот код:
Sub Macro()
'Замените путь"F:\Рисунок_УИР.vsd" на путь к вашему документу
Set sh = ActivePage.Drop(Application.Documents.Item("F:\Рисунок_УИР.vsd").Masters.ItemU("Dynamic connector"), 0, 0)
sh.Cells("BeginX").Formula = 40 & "mm"
sh.Cells("BeginY").Formula = 150 & "mm"
sh.Cells("EndX").Formula = 40 & "mm"
sh.Cells("EndY").Formula = 250 & "mm"
intRowIndex = sh.AddRow(visSectionConnectionPts, visRowLast, visTagCnnctPt) 'добавление точки
Set vsoRow = sh.Section(visSectionConnectionPts).Row(intRowIndex)
vsoRow.Cell(visCnnctX).Formula = 2.5 & "mm"
vsoRow.Cell(visCnnctY).Formula = 20 & "mm"
End Sub
Я попробовал координаты точки завернуть в GUARD и все заработало, но такое решение не удовлетворяет остальным условиям задачи, которое я в этом топике не указал за ненадобностью. Я думал выйти из ситуации и сначала использовать GUARD, а потом его убрать. Но тогда выдается ошибка о том, что ячейка защищена. |
|
Tumanov
Russia
1198 Posts |
Posted - 04/30/2010 : 15:54:19
|
Чтобы убрать Guard, нужно вместо Formula использовать FormulaForce. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/30/2010 : 16:01:16
|
Сажать программно точку соединения на коннектор как-то не очень хорошо. Начинают взаимодействовать Ваш макрос и аддон, поддерживающий коннектор. Результаты, как видим, непредсказуемы. Если условия допускают, то лучше было бы использовать специальный коннектор, заранее подготовленный. Точку соединения на него посадить заранее. |
|
|
yabes
39 Posts |
Posted - 04/30/2010 : 20:03:40
|
Задача такая, что должна быть возможность произвольного добавления точек соединения на коннектор! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/30/2010 : 21:52:51
|
Вообще произвольного? Например 200? Если количество точек ограничено десятком, то их все равно можно добавить заранее. Все 10. А FormulaForce не помогло? |
|
|
yabes
39 Posts |
Posted - 05/01/2010 : 06:32:23
|
quote: Originally posted by Tumanov
Вообще произвольного? Например 200? Если количество точек ограничено десятком, то их все равно можно добавить заранее. Все 10. А FormulaForce не помогло?
С помощью FormulaForce получилось убрать GUARD, но точка опять улетела! Может я не совсем так сделал? Я написал:
vsoRow.Cell(visCnnctX).Formula = "=guard(" & 2.5 & "mm" & ")"
vsoRow.Cell(visCnnctY).Formula = "=guard(" & 20 & "mm" & ")"
vsoRow.Cell(visCnnctX).FormulaForce = 2.5 & "mm"
vsoRow.Cell(visCnnctY).FormulaForce = 20 & "mm" Вообщем я расстроен! Делал диплом целый год, а тут выяснилось, что точка соединения на коннекторе ведет себя неконтролируемо. Геннадий, у меня к Вам большая просьба, можете мне на почту прислать ваш E-mail, я Вам пришлю фото примера листа конструкторского документа, который и должен будет рисоваться в VISIO, а вы посоветуете каким образом все лучше сделать! Основной темой диплома является: 1) Создать шаблоны элементов, из которых будет создаваться схемы в документе (в упрощенном виде схемы представляют из себя прямоугольники и коннекторы. Должна быть возможность на коннекторе создавать точки соединения, чтобы в один коннектор могли входить несколько прямоугольников, а он в свою очередь еще в один) 2) Созданную из шаблонов схему необходимо выгрузить в базу данных (т.е. я делаю проход по всем элементам, и выгружаю текст, координаты фигур, названия их в шаблонах, во общем все что нужно, чтобы потом можно было используя только БД и шаблоны (фигуры) воспроизвести схему конструкторского документа) 3) Чтение из базы данных и воспроизведение конструкторского документа в полном объеме
Я полностью эту задачу выполнил. Но прога работает только в режиме отладки, В обычном режиме точки соединения с коннекторов улетают. Подскажите вариант с заранее подготовленным коннектором. Пожалуйста опишите поподробнее. И еще, если не трудно, напишите поподробнее что происходит при помещении точки на коннектор? Что там за взаимодействие макроса и аддона(что такое аддон)? Мне нужно будет как-то объяснить руководителю причину! С уважением, Ярослав |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/01/2010 : 10:55:17
|
ttt@post.rzn.ru присылайте, посмотрю. Заодно гляну, что за задача такая интересная. Обычно схемы описываются как объекты и их соединения. Соединений между соединителями в такой методике просто не существует. А сложность размещения точек соединения на коннекторах заключается в том, что коннектор - вещь в принципе нестабильная. Visio его перерисовывает, изменяет геометрию. То есть само понятие "задать точку на коннекторе" - некорректно. Когда выполняется Ваш макрос, то коннектор сначала появляется в нижнем левом углу рисунка и состоит из двух сегментов. Потом, когда макрос задает координаты его концов, коннектор превращается в линию из одного сегмента. Вообще вся геометрия меняется. При этом мы не знаем раскладки всех процессов во времени. Возможно, сначала выполняется весь макрос, а только потом запускается часть движка, управляющая расчетом геометрии коннектора. А в пошаговом режиме прорисовка выполняется после каждого шага. Отсюда и отличия в поведении. Можно попробовать обмануть Visio. Разбить макрос на две части. Сначала прорисовать все до точек соединения, потом выйти из макроса, позволив Visio все рассчитать, потом другим макросом начать рассаживать точки соединения. Может и получится. Но все равно угроза краха так и будет висеть над душой... Поэтому, если есть такая возможность, лучше все-таки избегать точек соединения на коннекторе. А если уж очень захочется показать соединение коннекторов, можно попробовать изображать связь не одним, а двумя соединенными коненкторами. Тогда третий коннектор будет подключаться уже не в некоторую точку в пространстве, а в реальную точку соединения двух коннекторов. Это проще. Хотя алгоритм обсчета схемы несколько усложнится, так как связь между объектами иногда будет осуществляться двумя последовательно соединенными коннекторами.
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/01/2010 : 11:09:02
|
Вот маленькая иллюстрация к динамике. Если вставить в Ваш макрос вот такую строчку vsoRow.Cell(visCnnctX).Formula = 2.5 & "mm" vsoRow.Cell(visCnnctY).Formula = 20 & "mm" Debug.Print sh.RowCount(visSectionFirstComponent) то при обычном запуске Debug.Print выведет число 4. Значит в момент установки точки соединения коннектор еще гнутый. А в режиме отладки будет напечатано число 3. То есть коннектор уже превратился в линию.
|
|
|
yabes
39 Posts |
Posted - 05/01/2010 : 11:56:58
|
Геннадий, я отправил письмо! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/01/2010 : 12:32:36
|
Вот так все просто? Среди трафаретов Visio есть группа Visio Extras. В ней - трафарет Connectors (Metric). А в трафарете коннектор Side - top/bottom. В отличие от универсального коннектора, этот коннектор имеет стрелочки в точках перегиба. Насколько я понимаю, это - как раз то, что Вам нужно. Соединения коннектора с коннектором исключаются. Промежуточных точек рассчитывать не надо. Коннекторы идут непосредственно от блока к блоку. А стрелочки в нужных местах прорисовывает Visio. Попробуйте, может понравится. Там и еще много интересных коннекторов есть... |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/01/2010 : 12:55:11
|
А может и не так все просто... В этих коннекторах вместо настоящего коннектора используется набор линий из нескольких секций геометрии. И количество секций задано жестко. То есть при необходимости последующего редактирования такой гибкости, как с универсальными коннекторами, Вы не получите. Да и при автоматическом рисовании нужно не один тип использовать, а выбирать в зависимости от расположения соединяемых квадратиков. Но на случай редактирования можно предложить другой вариант. Если при редактировании конфигурация коннектора должна измениться, то существующую связь можно уничтожить, соединить квадратики универсальным коннектором, а потом (сразу или в конце работы) выполнить функцию "конвертировать коннекторы". Эту функцию надо написать. Она должна превратить универсальные коннекторы в такую же комбинацию линий, как и коннекторы в предлагаемом трафарете. Функция не сложная. Обходится секция геометрии коннектора и создается новый шейп, в котором несколько секций геометрии будут проходить по тем же координатам. А "прототип" потом удаляется.
|
|
|
yabes
39 Posts |
Posted - 05/01/2010 : 13:16:12
|
Боюсь сглазить, но на данный момент - это наиболее правильное и удачное решение этой проблемы! В ближайшее время я рассмотрю этот вариант с руководителем и отпишусь в этой теме! Спасибо огромнейшее! А вообще для развития, как можно самому создать такой коннектор, который на изгибах будет рисовать стрелку? |
Edited by - yabes on 05/01/2010 18:55:53 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/01/2010 : 14:16:19
|
Лучшая методика - брать хорошие шейпы и рассматривать, как они устроены (шейп-лист). В данном случае, как я уже отмечал, эти коннекторы являются линиями, в которых каждый отрезок описывается своей секцией геометрии. Координаты отрезков ссылаются друг на друга или на управляющую точку. Естественно, стиль оформления действует на каждую секцию, то есть каждый отрезок отображается с одним и тем же оконечником (стрелка, кружочек и т.д.) То есть эти коннекторы выглядят, как коннекторы, но на самом деле коннекторами не являются :) |
|
|
yabes
39 Posts |
Posted - 05/01/2010 : 15:03:32
|
Спасибо, попробую разобраться! |
Edited by - yabes on 05/01/2010 18:55:37 |
|
|
yabes
39 Posts |
Posted - 05/01/2010 : 15:32:33
|
Возник вопрос. На схеме, которую я вам присылал есть коннектор (влево-вверх-влево-вверх), а в трафаретах - только (влево-вверх-влево). Как тут быть? Я вот создал еще таблицу Geometry4. Но я понимаю, что скорее всего во всех таблицах Geometry надо изменить значение Y-ков. Но не могу пока понять как! |
Edited by - yabes on 05/01/2010 15:55:46 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/01/2010 : 16:02:08
|
Там есть опора на управляющую точку. Видите формулу =Controls.Row_1.Y ? На перемещаемом сегменте стоит управляющая точка и ее координата берется за основу для геометрии. Если перемещаемых сегментов становится два, то надо ввести еще одну управляющую точку. За нее будет тянуться другой сегмент, уже по координате X. И в геометрию нужно будет вставлять ссылки типа =Controls.Row_2.X. |
|
|
Topic |
|
|
|