Author |
Topic |
|
maniac
Russia
25 Posts |
Posted - 03/12/2009 : 14:43:45
|
Добрый всем! Возникли трудности: 1)На листе есть несколько шейпов связанных через Connection Points. Как, выбрав один из шейпов, автоматически последовательно перебрать всю связанную цепочку шейпов и считать из них информацию (допустим Height). 2)Можно ли увеличить радиус чувствительности Connection Points (сделать больше красный квадратик прилипания). Спасибо, Ваш кровожадный Maniac :) |
|
Tumanov
Russia
1198 Posts |
|
maniac
Russia
25 Posts |
Posted - 03/16/2009 : 08:36:36
|
Спасибо, прочитал, но понял не всё (в силу своих ограниченных возможностей :)). Вопрос - если склеенны 2 шейпа (SH2 приклеен к SH1), то SH1 - пассивный, а SH2 - активный?
Tumanov ------ Вообще-то, пассивный, активный - это не очень распространенная терминология. Только так, для понимания... В том топике квадратики - пассивные, коннекторы - активные. Квадратики ждут, когда к ним кто-то приклеится. Коннекторы цепляются за квадратики. |
|
|
maniac
Russia
25 Posts |
Posted - 03/16/2009 : 13:09:31
|
Ещё вопросы. Есть несколько "склеенных" шейпов. При двойном клике на шейпе, показываются его связи.
i = ActiveWindow.Selection.Item(1) Set Active = ActivePage.Shapes(i).Connects.ToSheet On Error Resume Next MsgBox Active Set Passive = ActivePage.Shapes(i).FromConnects.FromSheet MsgBox Passive
1)Почему это не работает когда я копирую последний шейп и приклеиваю его к первому? 2)Как перейти на приклеенные шейпы через Connect (плохо с синтаксисом - если можно пример кода) Спасибо! |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/16/2009 : 16:11:11
|
Слишком много ошибок. i = ActiveWindow.Selection.Item(1) Это очень кривая запись. Лучше было бы Set sh = ActiveWindow.Selection.Item(1) sh - это будет селектированный шейп. Connects.ToSheet - тоже в корне неверно. Connects - это коллекция. Для .ToSheet обязательно нужно указывать какой-то элемент коллекции. Например Connects(1).ToSheet. Здесь указан первый элемент коллекции. Тогда вместо строчки Set Active = ActivePage.Shapes(i).Connects.ToSheet должно быть нечто похожее на Set Active = sh.Connects(1).ToSheet Если селектирован коннектор, то такой строчкой мы получим шейп, к которому он подключен. Только тогда уж логично было бы писать не Active, а Passive :) А если второй конец коннектора тоже куда-то подключен, то можно использовать и Connects(2). Это будет уже шейп с обратной стороны. Но сдается мне, что Вы пытаетесь не коннекторы использовать, а 2D шейпы между собой склеивать. Тогда все усложняется. Надо разбираться с типами Conecction points (inward, outward...). В этом случае любой шейп может быть и "активным" и "пассивным" - в зависимости от типа точки. Если точка Outward, значит шейп похож на коннектор. Если Inward - значит к ней будут коннектиться. Если у шейпа есть точки обоих типов, значит опрашивать придется обе коллекции - и Connects и FromConnects.
|
|
|
maniac
Russia
25 Posts |
Posted - 03/17/2009 : 08:54:02
|
Всё верно, извиняюсь за кривоту изложения вопросов. Есть ряд склееных между собой 2D-шейпов. При выборе любого шейпа мне необходимо считывать свойства каждого из них - длина, для получения суммарной длинны. Этот код работает, за исключением первого склеенного шейпа. Не помогает и защита от ошибки Почему, не пойму? Sub SumWidht() Set sh = ActiveWindow.Selection.Item(1) Set Active = sh.Connects(1).ToSheet On Error Resume Next MsgBox Active Set Passive = sh.FromConnects(1).FromSheet MsgBox Passive End Sub |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/17/2009 : 16:07:54
|
Тут гадать можно долго... Лучше пришлите файлик. Все лишнее из него удалите. Укажите точно ситуацию - с каким шейпом что не работает. Посмотрю, скажу. Присылать на ttt@post.rzn.ru |
|
|
maniac
Russia
25 Posts |
Posted - 03/19/2009 : 13:43:05
|
Геннадий, большое спасибо! Всё работает! Если кому интересно, то вот код: Dim Passive(10) As String Dim Active(10) As String Sub ConnectedShapes() Set sh = ActiveWindow.Selection.Item(1) 'выделенный шейп 'Активные связи 2D-шейпа If sh.Connects.Count > 0 Then 'условие наличия активных связей For i = 1 To sh.Connects.Count 'цикл перебора всех активных связей Active(i) = sh.Connects(1).ToSheet 'активные связи (к чему приклеен) Debug.Print Active(i) Next End If 'Пассивные связи 2D-шейпа If sh.FromConnects.Count > 0 Then 'условие наличия пассивных связей For i = 1 To sh.FromConnects.Count 'цикл перебора всех пассивных связей Passive(i) = sh.FromConnects(i).FromSheet 'пассивные связи (какие шейпы приклеены к выделенному) Debug.Print Passive(i) Next End If End Sub Эта программа определяет связи 2D-шейпа по 2clc(Format/Behavior/Double-click/RunMacro/ConnectedShapes)при выборе одного из склеенных шейпов. |
|
|
bdfy
Belarus
267 Posts |
Posted - 03/29/2009 : 09:16:01
|
не могу связать две группы. коннекшн пойнтс вроде есть, вроде по размерам совпадают - соединения нет. файл http://rapidshare.de/files/46408185/testSx.vsd.html условно говоря есть несколько групп "верхов" (распред. ус-во) и несколько групп "низов" (трансформаторы). в файле примере их под два типа. нужно их соединять в нужной конфигурации (в перспективе желательно скриптово). добится этого я не могу (( в чем ошибка ? коннекшн пойнтс не те или не там ? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/29/2009 : 09:33:44
|
Слишком много нарисовано, поэтому вопрос не понятен. Что-то соединяется, что-то нет... Хорошо бы оставить в этом файле самый минимум, чтобы без вариантов было ясно, о какой точке идет речь. |
|
|
bdfy
Belarus
267 Posts |
Posted - 03/29/2009 : 09:39:58
|
ок. оставил один верх один низ. слева они отдельно. справа соединены как нужно. только без "склейки", руками подогнаны. мне же нужно чтобы группы легко склеивались при перетаскивании и соединялись легко скриптово. вроде точек соединения немеряно, но не цепляется ни одна http://rapidshare.de/files/46408496/testSx.vsd.html
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/29/2009 : 19:11:33
|
Да, какие-то проблемы... Сходу не понятно, в чем дело. И даже нет уверенности, что Visio вообще позволит такое склеить. Все-таки основное применение склеивания - это когда 2D шейпы соединяются коннекторами. Соединение двух 2D шейпов - это уже некоторый выход за рамки, но вроде еще объяснимый. А у Вас многократно вложенные группы, да еще и содержащие внутренние склеивания... Visio ведь пытается все это по ходу дела пересчитать. И при любой ошибке цепочка вычислений гробится. Сдается мне, что придется что-то в подходе пересматривать. Упрощать. |
|
|
zhuravsky
Russia
115 Posts |
Posted - 03/30/2009 : 17:30:36
|
Обратите внимание! Я однажды столкнулся с такими "особенностями" механизма приклеивания шейпа к шейпу: 1. Если шейп - это группа, состоящая более чем из 20-ти (примерно, точно не помню)элементов, то другой шейп может к первому и не приклеиться;
2. Если последовательно приклеиваешь друг к дружке одинаковые шейпы, то после 10-го-12-го (тоже точно не помню) с приклеиванием начинаются проблемы.
Попробуйте, например, сделать квадрат, у которого в левом нижнем и правом нижнем углу - коннекшен поинтс, скопируйте его несколько раз и поприклеивайте друг к другу. |
|
|
bdfy
Belarus
267 Posts |
Posted - 03/31/2009 : 16:13:07
|
я вообще начинаю сомневаться что коннектор можно повесить к группе. в другом случае, на другом чертеже тоеж проблема похожая - группа много меньше, но коннектится желает только по точкам фигур включенных в группу. добавлять общую точку для группы в шейпшит словно бесполезно. |
|
|
|
Topic |
|