All Forums
 Категория Visio
 Форум Вопросы и ответы
 Как добавить коннекшн пойнт?
Author Previous Topic Topic Next Topic  

mormax

Russia
18 Posts

Posted - 03/30/2004 :  12:03:16
Как программно добавить конекшен поинт шейпу?
Например:
рисуем
Set Rect = ActivePage.DrawRectangle(2, 1, 5,3)
Нужно добавить конекшен поинт в точке(5,2).

Tumanov

Russia
1198 Posts

Posted - 03/30/2004 :  17:30:26
Чтобы самому ответить на этот вопрос нужно сделать следующее:
1. Нарисовать прямоугольник
2. Открыть и посмотреть его шейп-лист
3. Добавить руками Connection Point
4. Посмотреть, как изменился шейп-лист

После этого уже станет ясно, что программно (чтобы сделать то же самое) нужно:
1. Добавить к шейпу секцию Conenction Points
2. Вставить в нее одну строку
3. Задать в этой строке значения X и Y.

Еще можно с помощью SectionExists проверить, вдруг эта секция уже существует
Вставляется секция и строка с константами visSectionConnectionPts и visRowConnectionPts, типа
shpObj.AddSection visSectionConnectionPts
shpObj.AddRow visSectionConnectionPts, visRowConnectionPts, 0

Если это строка первая, то ячейки адресуются как Connections.X1 и Connections.Y1.
Например
Set conYCellObj = shpObj.Cells("Connections.Y1")
Go to Top of Page

mormax

Russia
18 Posts

Posted - 03/31/2004 :  09:47:38
Спасибо!
Все заработало.
Go to Top of Page

yurant

4 Posts

Posted - 12/16/2005 :  12:40:29
А как задать координаты относительно shape у добавляемой section?

UPDATE: Сделал

v.ActiveDocument.SnapSettings:='&H20';
v.ActivePage.DrawRectangle(3,3,5,4);
v.ActivePage.DrawRectangle(7,6,9,7);

v.ActivePage.Shapes(1).AddSection(7);
v.ActivePage.Shapes(1).AddRow(7,0,153);
v.ActivePage.Shapes(1).Section(7).Row(0).Cell(0):=2;
v.ActivePage.Shapes(1).Section(7).Row(0).Cell(1):=0.5;
v.ActivePage.Shapes(2).AddSection(7);
v.ActivePage.Shapes(2).AddRow(7,0,153);
v.ActivePage.Shapes(2).Section(7).Row(0).Cell(0):=0;
v.ActivePage.Shapes(2).Section(7).Row(0).Cell(1):=0.5;

Если после этого применить

v.ActiveWindow.SelectAll;
v.ActiveWindow.Selection.ConnectShapes;

то появившийся коннектор все равно не крепится к поинтам. Он одним концом цепляется за нужную точку (середина правого ребра 1го прямоугольника), а второй конец идет не в конн.поинт, а в середину нижнего ребра второго п-ка. Подскажите, в чем дело?

UPDATE:
Могу даже переформулировать вопрос: как сделать так, чтобы прямоугольники соединялись всегда одинаково: коннектор выходит из правого ребра и входит в левое?

Edited by - yurant on 12/19/2005 10:10:06
Go to Top of Page

brace

Russia
358 Posts

Posted - 12/19/2005 :  14:00:58
перетащи на рисунок два Rectangle - каждый имеет 5 шт. Connection Points -
затем соедини их посредством шейпа Dynamic connector концы которого должны покраснеть (приклеится)
перед этим включи на запись Macro
Макра запишет код программы соединения
этот код можно просмотреть и если подойдет использовать.

Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/19/2005 :  21:05:05
quote:
Могу даже переформулировать вопрос: как сделать так, чтобы прямоугольники соединялись всегда одинаково: коннектор выходит из правого ребра и входит в левое?

Если Вы точно знаете позицию, куда нужно подключить коннектор, то можно просто пользоваться методом GlueToPos.
И Connection Points самому создавать не надо.
Вот такой код
Set celBeginX = shpConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DBeginX)
Set celEndX = shpConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DEndX)
celBeginX.GlueToPos ActivePage.Shapes(2), 1, 0.5
celEndX.GlueToPos ActivePage.Shapes(3), 0, 0.5
приклеит коннектор из середины правого ребра в середину левого
Go to Top of Page

yurant

4 Posts

Posted - 12/20/2005 :  08:20:01
quote:
Originally posted by brace

перетащи на рисунок два Rectangle - каждый имеет 5 шт. Connection Points -
затем соедини их посредством шейпа Dynamic connector концы которого должны покраснеть (приклеится)
перед этим включи на запись Macro
Макра запишет код программы соединения
этот код можно просмотреть и если подойдет использовать.



Дело в том, что когда я программно из Delphi перетаскиваю прямоугольники ( v.ActivePage.DrawRectangle() ), они не имеют connection points :( Может быть что-то можно сделать, чтобы прямоугольник сразу был с поинтами?

quote:
Originally posted by brace

Если Вы точно знаете позицию, куда нужно подключить коннектор, то можно просто пользоваться методом GlueToPos.
И Connection Points самому создавать не надо.
Вот такой код
Set celBeginX = shpConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DBeginX)
Set celEndX = shpConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DEndX)
celBeginX.GlueToPos ActivePage.Shapes(2), 1, 0.5
celEndX.GlueToPos ActivePage.Shapes(3), 0, 0.5
приклеит коннектор из середины правого ребра в середину левого



Спасибо, работает. Остался только один вопрос : как переместить центральную точку коннектора? Когда я делаю v.ActivePage.Drop(v.ConnectorToolDataObject,4,4), центр, вроде, должен задаваться, но после GlueToPos он опять смещается. Если это НЕ специфика Delphi, напишите, пожалуйста, почему так происходит. Ещё раз спасибо.

Edited by - yurant on 12/20/2005 14:56:23
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 12/20/2005 :  18:23:00
Коннектор - это не просто линия. У него свои мозги, которые все пересчитывают после любого изменения. Эта часть пользователю недоступна. Delphi здесь ни при чем.
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)