All Forums
 Категория Visio
 Форум Вопросы и ответы
 Атоматическое соединение фигур
Next Page
Author Previous Topic Topic Next Topic

ivan

31 Posts

Posted - 06/14/2006 :  15:17:37
Есть код:
ActiveWindow.DeselectAll
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(1), visSelect
ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(165), visSelect
Application.ActiveWindow.Selection.ConnectShapes

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

brace

Russia
358 Posts

Posted - 06/14/2006 :  18:04:35
включи макро рекордер
проделай все ручками
выключи макро рекордер
посмотри какой красивый макрос получился
используй его если устраивает.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/14/2006 :  18:57:22
Переделать, чтоб без участия пользователя можно.
Только это должно с чего-то начаться. Например, будет функция, принимающая два ID и соединяющая шейпы. Или должно обрабатываться событие опускания шейпа на лист, а макрос поищет, с кем бы его соединить и соединит.
Короче, вопрос - откуда возьмутся ID и как их примет макрос?
А работает и имеющийся код без участия пользователя.
Go to Top of Page

ivan

31 Posts

Posted - 06/15/2006 :  15:41:55
ID как раз берутся из той таблицы, откедова осуществлялся импорт в визио. к примеру в таблице эксель или акссес, задается еще один столбец с названием "ID" так вот после импорта, все фигуры, уже имеющиеся на листе принимают номера ID со сдвигом номером на число фигур. То есть было у вас 10 фигур для импорта и уже на листе еще 20 фигур. 10 фигур вы импортировали с айди (1, 2, 3, 4 и т. д.) то при работе с ID фигур всего листа. уже имеющиеся фигуры (родные), будут иметь айди с номерами, начинающимися от 11 (11, 12, 13, и т. д. до 30). это я заключил исходя из того, что в приведенном коде, фигура с номером 1 (это та, которая была импортирована), а с номером "165", уже та, которая была на листе. далее я с номером 165 хотел соединить и другие. и у них айди было именно то, которое я задал в таблице до проведения импорта. вот. причем когда я записывал макросссс, номер 165 вычислил сам визио, хотя в его особых свойствах такой строки не значилось.
Go to Top of Page

brace

Russia
358 Posts

Posted - 06/15/2006 :  16:02:48
quote:
номер 165 вычислил сам визио

визио айди не вычисляет он их назначает каждому шейпу свой
посмотреть айди можно так... Format > Special
Go to Top of Page

ivan

31 Posts

Posted - 06/15/2006 :  18:21:30
а понятно, тогда как допустим объяснить то, шо если я в таблице импортирую фигуры с айди, а айди других фигур, имеющихся на листе уже меняются со сдвигом на число импортированных фигур?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/15/2006 :  20:47:00
Вы что-то упустили, не так посмотрели.
Visio не меняет ID уже нарисованных шейпов. Если Вы удаляете шейпы, то в нумерации появляются дырки. Если потом добавлять новые, то дырки начинают заполняться. Но если шейп остается на листе, то его ID всегда неизменен.
Go to Top of Page

ivan

31 Posts

Posted - 06/16/2006 :  11:08:15
тогда странное, если визио не изменяет айди тех фигур, которые уже на листе бил до импорта, тогда как тогда объяснить, что импортируемые фигуры с новыми айди и их нумерация не конфликтует с имеющимися на листе?
Go to Top of Page

ivan

31 Posts

Posted - 06/16/2006 :  11:11:00
так вот вернувшись к автоматическому соединению фигур. ведь в опции дополнения/запустить дополнение/организэйшинал чат на основании чего-то визио соединяет фигуры? ведь не только на основании уникальных названий?
Go to Top of Page

brace

Russia
358 Posts

Posted - 06/16/2006 :  12:37:58
ты взял частный случай а задаешь общий вопрос по визио
известно что :
визио для разного типа схем ведет себя по разному
при рисовании Organization Shart...он ведет себя так как ты подметил
при рисовании графика выполнения работ он уже другой визио
при рисовании LAN схема локальной сети он опять другой
и набор шейпов разный для разного типа схем
Go to Top of Page

ivan

31 Posts

Posted - 06/16/2006 :  17:18:03
ну знаете ли, методы индукции и дедукции еще никто не запрещал. поэтому попутно, выясняя одну проблему можно выйти на одну общую проблему, и в итоге понимание общего смысла поможет в дальнейшем не теребить ваше священное спокойствие и такое же внимание. и по поводу макроса, вверху темы, есть макрос, я его записывал и проделывал все ручками. вопрос был в другом. он не работал даже если я еще кучу строк вставлю с айди фигур, он не хочет работать. все до чего я додумался, это взять и привязать горячие клавиши, потом удалить 2 строки, где упоминается айди фигуры и далее вручную и в определенном порядке выделяя фигуры и щелкая горячие клавиши и тогда все соединялось. вопрос в том, шо бы дать списком фигуры с их айди и научить вба соединять их самому. вот и все.
Go to Top of Page

ivan

31 Posts

Posted - 06/16/2006 :  17:21:54
quote:
Originally posted by brace

ты взял частный случай а задаешь общий вопрос по визио
известно что :
визио для разного типа схем ведет себя по разному
при рисовании Organization Shart...он ведет себя так как ты подметил
при рисовании графика выполнения работ он уже другой визио
при рисовании LAN схема локальной сети он опять другой
и набор шейпов разный для разного типа схем




и потом импорт данных из эксель файла поддерживает каждый шаблон. поэтому даже для разных шаблонов предусматривается одинаковое поведение и инструменты. вот потому я и перешел на общую тему, чтобы хоть как-то объяснить то, шо я имею ввиду, если вам затруднительно понимать.
Go to Top of Page

ivan

31 Posts

Posted - 06/16/2006 :  17:27:13
***** "ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(6),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(8),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(10),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(12),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(14),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(15),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(16),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(17),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(19),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(20),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(24),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(25),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(30),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(34),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(36),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(39),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(47),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(49),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(51),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(57),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(59),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(68),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(70),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(72),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(76),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(77),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(79),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(87),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(90),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(94),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(96),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes"
"ActiveWindow.DeselectAll
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(101),visSelect
ActiveWindow.SelectApplication.ActiveWindow.Page.Shapes.ItemFromID(111),visSelect
Application.ActiveWindow.Selection.ConnectShapes" ****

так вот по списку загнать это в макрос не получилось. фигура под номером 111 - это та, с которой надо было соединить все остальные.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/16/2006 :  20:16:33
Когда наконец-то упомянули Organisation Chart, стало ясно, почему Вы ошибаетесь :)
В приложении Organisation Chart экспортируются и импортируются не ID шейпов. Это другие ID. Они вычисляются не движком Visio, а приложением Organisation Chart. И хранятся они в другом месте - в ячейке User.UniqueID.
Этот ID только иногда случайно может совпасть с ID, который используется в Page.Shapes.ItemFromID().
Go to Top of Page

ivan

31 Posts

Posted - 06/17/2006 :  12:57:05
так я шаблон никакой не использовал и организэйшинал чарт привел как пример того, что визио соединяет встоенными средствами и не на основании айди фигуры. но ведь как-то он их соединяет!
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 06/18/2006 :  17:06:17
quote:
но ведь как-то он их соединяет!

Может я сейчас буду рассказывать что-то общеизвестное, но иначе не понимаю вопроса... :( В чем проблема-то?
--------------------------
Во всех приводимых Вами примерах используется функция ConnectShapes. Она появилась только в Visio 2003 и позволяет соединить некоторое число селектированных шейпов.
То есть задача включает две фазы:
- селектировать нужные шейпы (кстати, это можно сделать и вручную);
- соединить их.
Строка типа ActiveWindow.Select Application.ActiveWindow.Page.Shapes.ItemFromID(1), visSelect
позволяет селектировать шейп с ID = 1.
То есть в коллекции шейпов Shapes функцией ItemFromID ищется шейп с ID=1 и селектируется.
Вторая строка селектирует другой шейп.
Это, естественно не единственный способ. Если Вы другим способом зададите шейп, например, по имени
Dim ShpObj As Visio.Shape
Set ShpObj = ActivePage.Shapes("WWW Server")
ActiveWindow.Select ShpObj, visSelect
то первая задача все равно будет выполнена - шейп селектируется.
Выбирать шейпы, для того, чтобы сказать "Set ShpObj = Чего-то" можно по ID, по имени, по всяким другим признакам и ли содержимому нужных ячеек шейп-листа... Например, можно выбрать последний брошенный на страницу шейп или "первый из синих квадратов, накрывающий координаты 0,5х1,5". То есть - как угодно.
Строка типа Application.ActiveWindow.Selection.ConnectShapes
соединяет все, что селектировано.
Селектируете Вы перед этим два шейпа - соединит два. Селектируете десять - соединит десять...
---------------
Классический способ соединения шейпов описан в моей статье "Внешняя программа для Visio" в библиотеке сайта http://visio.artberg.ru . Он работает во всех Visio, не требует селектирования. На рисунок опускается коннектор, затем его концы поочередно подключаются к одному и другому шейпу.
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)