All Forums
 Категория Visio
 Форум Вопросы и ответы
 При обычном запуске и в реж. отладки разные рез-ты
Next Page
Author Previous Topic Topic Next 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.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 04/30/2010 :  16:01:16
Сажать программно точку соединения на коннектор как-то не очень хорошо. Начинают взаимодействовать Ваш макрос и аддон, поддерживающий коннектор. Результаты, как видим, непредсказуемы.
Если условия допускают, то лучше было бы использовать специальный коннектор, заранее подготовленный. Точку соединения на него посадить заранее.
Go to Top of Page

yabes

39 Posts

Posted - 04/30/2010 :  20:03:40
Задача такая, что должна быть возможность произвольного добавления точек соединения на коннектор!
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 04/30/2010 :  21:52:51
Вообще произвольного? Например 200?
Если количество точек ограничено десятком, то их все равно можно добавить заранее. Все 10.
А FormulaForce не помогло?
Go to Top of Page

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) Чтение из базы данных и воспроизведение конструкторского документа в полном объеме

Я полностью эту задачу выполнил. Но прога работает только в режиме отладки, В обычном режиме точки соединения с коннекторов улетают.
Подскажите вариант с заранее подготовленным коннектором. Пожалуйста опишите поподробнее. И еще, если не трудно, напишите поподробнее что происходит при помещении точки на коннектор? Что там за взаимодействие макроса и аддона(что такое аддон)? Мне нужно будет как-то объяснить руководителю причину!
С уважением, Ярослав
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/01/2010 :  10:55:17
ttt@post.rzn.ru присылайте, посмотрю.
Заодно гляну, что за задача такая интересная. Обычно схемы описываются как объекты и их соединения. Соединений между соединителями в такой методике просто не существует.
А сложность размещения точек соединения на коннекторах заключается в том, что коннектор - вещь в принципе нестабильная. Visio его перерисовывает, изменяет геометрию. То есть само понятие "задать точку на коннекторе" - некорректно.
Когда выполняется Ваш макрос, то коннектор сначала появляется в нижнем левом углу рисунка и состоит из двух сегментов. Потом, когда макрос задает координаты его концов, коннектор превращается в линию из одного сегмента. Вообще вся геометрия меняется.
При этом мы не знаем раскладки всех процессов во времени. Возможно, сначала выполняется весь макрос, а только потом запускается часть движка, управляющая расчетом геометрии коннектора. А в пошаговом режиме прорисовка выполняется после каждого шага. Отсюда и отличия в поведении.
Можно попробовать обмануть Visio. Разбить макрос на две части. Сначала прорисовать все до точек соединения, потом выйти из макроса, позволив Visio все рассчитать, потом другим макросом начать рассаживать точки соединения. Может и получится. Но все равно угроза краха так и будет висеть над душой... Поэтому, если есть такая возможность, лучше все-таки избегать точек соединения на коннекторе.
А если уж очень захочется показать соединение коннекторов, можно попробовать изображать связь не одним, а двумя соединенными коненкторами. Тогда третий коннектор будет подключаться уже не в некоторую точку в пространстве, а в реальную точку соединения двух коннекторов. Это проще. Хотя алгоритм обсчета схемы несколько усложнится, так как связь между объектами иногда будет осуществляться двумя последовательно соединенными коннекторами.
Go to Top of Page

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. То есть коннектор уже превратился в линию.
Go to Top of Page

yabes

39 Posts

Posted - 05/01/2010 :  11:56:58
Геннадий, я отправил письмо!
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/01/2010 :  12:32:36
Вот так все просто?
Среди трафаретов Visio есть группа Visio Extras. В ней - трафарет Connectors (Metric). А в трафарете коннектор Side - top/bottom.
В отличие от универсального коннектора, этот коннектор имеет стрелочки в точках перегиба. Насколько я понимаю, это - как раз то, что Вам нужно.
Соединения коннектора с коннектором исключаются. Промежуточных точек рассчитывать не надо. Коннекторы идут непосредственно от блока к блоку. А стрелочки в нужных местах прорисовывает Visio.
Попробуйте, может понравится.
Там и еще много интересных коннекторов есть...
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/01/2010 :  12:55:11
А может и не так все просто...
В этих коннекторах вместо настоящего коннектора используется набор линий из нескольких секций геометрии. И количество секций задано жестко. То есть при необходимости последующего редактирования такой гибкости, как с универсальными коннекторами, Вы не получите. Да и при автоматическом рисовании нужно не один тип использовать, а выбирать в зависимости от расположения соединяемых квадратиков.
Но на случай редактирования можно предложить другой вариант. Если при редактировании конфигурация коннектора должна измениться, то существующую связь можно уничтожить, соединить квадратики универсальным коннектором, а потом (сразу или в конце работы) выполнить функцию "конвертировать коннекторы". Эту функцию надо написать. Она должна превратить универсальные коннекторы в такую же комбинацию линий, как и коннекторы в предлагаемом трафарете. Функция не сложная. Обходится секция геометрии коннектора и создается новый шейп, в котором несколько секций геометрии будут проходить по тем же координатам. А "прототип" потом удаляется.
Go to Top of Page

yabes

39 Posts

Posted - 05/01/2010 :  13:16:12
Боюсь сглазить, но на данный момент - это наиболее правильное и удачное решение этой проблемы! В ближайшее время я рассмотрю этот вариант с руководителем и отпишусь в этой теме! Спасибо огромнейшее!
А вообще для развития, как можно самому создать такой коннектор, который на изгибах будет рисовать стрелку?

Edited by - yabes on 05/01/2010 18:55:53
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/01/2010 :  14:16:19
Лучшая методика - брать хорошие шейпы и рассматривать, как они устроены (шейп-лист).
В данном случае, как я уже отмечал, эти коннекторы являются линиями, в которых каждый отрезок описывается своей секцией геометрии. Координаты отрезков ссылаются друг на друга или на управляющую точку. Естественно, стиль оформления действует на каждую секцию, то есть каждый отрезок отображается с одним и тем же оконечником (стрелка, кружочек и т.д.)
То есть эти коннекторы выглядят, как коннекторы, но на самом деле коннекторами не являются :)
Go to Top of Page

yabes

39 Posts

Posted - 05/01/2010 :  15:03:32
Спасибо, попробую разобраться!

Edited by - yabes on 05/01/2010 18:55:37
Go to Top of Page

yabes

39 Posts

Posted - 05/01/2010 :  15:32:33
Возник вопрос. На схеме, которую я вам присылал есть коннектор (влево-вверх-влево-вверх), а в трафаретах - только (влево-вверх-влево). Как тут быть? Я вот создал еще таблицу Geometry4. Но я понимаю, что скорее всего во всех таблицах Geometry надо изменить значение Y-ков. Но не могу пока понять как!

Edited by - yabes on 05/01/2010 15:55:46
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 05/01/2010 :  16:02:08
Там есть опора на управляющую точку. Видите формулу =Controls.Row_1.Y ?
На перемещаемом сегменте стоит управляющая точка и ее координата берется за основу для геометрии.
Если перемещаемых сегментов становится два, то надо ввести еще одну управляющую точку. За нее будет тянуться другой сегмент, уже по координате X. И в геометрию нужно будет вставлять ссылки типа =Controls.Row_2.X.
Go to Top of Page
Previous Topic Topic Next Topic  
Next Page
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)