All Forums
 Категория Visio
 Форум Вопросы и ответы
 Создание организационной диаграммы
Author Previous Topic Topic Next Topic  

rokaur

Russia
7 Posts

Posted - 12/30/2004 :  11:04:28
Есть такая задачка - создание организационной диаграммы в автоматическом режиме.
Исходные данные - иерархическое дерево объектов (по сути записи в некоей БД, между которыми организованы логические связи).
Количество записей, глубину вложенности отдельных ветвей (а она практически может быть не ограничена изначально) можно узнать обратившись к БД и это впринципе не составляет проблемы.
Проблема состоит в том, чтобы извне, обратившись к Visio (например из Delphi) отрисовать эту организационную диаграмму, чтобы не было различным наложений графических объектов.
Кроме того не ясно до конца, чем пользоваться. То ли стандартными средствами Visio? то ли библиотеками для рисования Organization Chart.

Хотелось бы выслушать какие-либо советы и может быть код (пусть даже макрос в Visio), организующий построение объектов и связей между ними (элементы - "ветви" и "листья" иерархического дерева).

Tumanov

Russia
1198 Posts

Posted - 12/30/2004 :  20:04:17
А что тут можно посоветовать-то? Надо просто садиться и придумывать алгоритм размещения...
Готового алгоритма явно ни у кого нет - здесь все определяется особенностями задачи: ограничения на размеры листа, размеры шейпа, количество текста в шейпе, поведение в особых ситуациях (например, когда что-то доходит до края листа)...
Если размещение сложное, то скорее всего удобнее будет оперировать своими шейпами, а не Organization Chart - проще изменить их вид или поведение при необходимости.
А Visio здесь вторично. Понятно, что шейп можно поставить в любую точку, соединить любые шейпы - а больше вроде ничего и не надо...
Определить, занята какая-то точка на листе другим шейпом или свободна - Visio такое позволяет, но когда картинка строится программно, проще расчитать это теоретически.
Go to Top of Page

rokaur

Russia
7 Posts

Posted - 01/06/2005 :  09:11:42
>А что тут можно посоветовать-то? Надо просто садиться и придумывать алгоритм размещения...

Это собственно понятно. Иначе просто не может быть . Этим я и занимаюсь
>Готового алгоритма явно ни у кого нет - здесь все определяется особенностями задачи: ограничения на размеры листа, размеры шейпа, количество текста в шейпе, поведение в особых ситуациях (например, когда что-то доходит до края листа)...

Да я в общем то и не просил готовый алгоритм. Если Вы не заметили меня интересовали общие советы. В частности, чем удобнее на ваш взгляд пользоваться.

Извините за такую категоричность, но ... видимо не поняли сразу друг друга.

Более приземленная задача. То есть вопрос.
Взял за основу предложенный макрос для Excel (рисование структуры сети). Начал перерабатывать. В частности заменил шаблон на "Basic Diagram.vst"
Отрисовал шейпы ("Rectangle"). Стоит задача их соединения.
Условно есть массив elements() и массив parentElements()/ Как связать два шейпа при помощи "Dynamic connector"?
То, что представленно в примере, не работает с этими шейпами, выдает ошибку. Пытаюсь разобраться, пока безуспешно.
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/06/2005 :  14:25:06
На всякий случай проверил, вдруг правда не работает :)
Таки работает... Прямоугольнички соединяются...
Может ошибка в другом месте возникает?

Берем блок кода, где происходит соединение.
Set mastObj = stnObj.Masters("Dynamic connector")
Set shpConnector = pagObj.Drop(mastObj, 4.25, 9)
Set celBeginX = shpConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DBeginX)
celBeginX.GlueTo elements(i).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX)
Set celEndX = shpConnector.CellsSRC(visSectionObject, visRowXForm1D, vis1DEndX)
celEndX.GlueTo parentElements(j).CellsSRC(visSectionObject, visRowXFormOut, visXFormPinX)
Естественно, массивы шейпов elements() и parentElements() уже должны существовать. Связываются здесь два шейпа: i-й элемент elements(i) и j-й элемент parentElements(j).
Может быть Вы неправильно в эти массивы шейпы уложили? Можно попробовать для начала работать не с массивами, а с одиночными шейпами. Тогда вместо elements(i) и parentElements(j) будут использоваться просто некоторые Shape1 и Shape2, которые Вы перенесете на рисунок.
А в какой именно строке происходит ошибка и какой выдается текст?
Go to Top of Page

rokaur

Russia
7 Posts

Posted - 01/10/2005 :  13:15:49
Извините, блин, наверное праздники действовали
Разобрался таки на трезвую голову, ошибочка малюсенькая закралась. Щас все нормально. Разрабатываю дальше.

Спасибы за соучастие.
Go to Top of Page

rokaur

Russia
7 Posts

Posted - 01/10/2005 :  13:52:34
Еще вопросик
Устанавливаем размеры шейпа:

Shape1.Cells("Width") = 1
Shape1.Cells("Height") = 2

По умолчанию устанавливаются в дюймах, может подскажете как установить их в миллиметрах не используя дроби.
Go to Top of Page

rokaur

Russia
7 Posts

Posted - 01/10/2005 :  15:12:06
и еще один

в шейпе задаем свойство текст

Shape1.Text = "Бла-бла-бла 1" + vbCrLf + "Бла-бла-бла 2" + vbCrLf + "Бла-бла-бла 3"

Как сделать программно, чтоб "Бла-бла-бла 1" и "Бла-бла-бла 2" были выровнены в шейпе по центру, а "Бла-бла-бла 3" по правому краю. И как для различных "Бла-бла-бла" задать различный размер шрифта.

Простите за назойливость
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/10/2005 :  15:13:50
Sub ttt()
ActivePage.Shapes(1).Cells("Width").Formula = "=10 mm"
ActivePage.Shapes(1).Cells("Height").Formula = "=5 cm"
End Sub
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 01/10/2005 :  15:44:53
По поводу шрифтов был похожий вопрос. Цитирую:

Все параметры шейпов в Visio отображаются и меняются в шейп-листе (ShapeSheet).
Если не знаете, как сделать что-то программно, делайте это вручную и смотрите, как это отражается в шейп-листе. Потом пытайтесь внести такое же изменение в ячейку шейп-листа программно.
Например.
Рисуем на листе только один квадрат, пишем в нем 1234567890. Открываем шейп лист. Находим секцию Character (на будущее). Теперь на листе рисунка красим текст в красный цвет. В шейп листе тут же в ячейке Color секции Character появляется 2 (номер красного цвета). Делаем вывод - если записать в ячейку Color значение 2, текст станет красным.
Проверяем. Отменяем ручные изменения и выполняем макрос
Sub ttt()
ActivePage.Shapes(1).Cells("Char.Color").Result("") = "2"
End Sub
Убеждаемся, что текст после этого макроса опять становится красным.
Точно также можно работать и с другими атрибутами секции Character: Font, Size, Scale и т.д.
Примечание.
Если в одном шейпе текст имеет разное форматирование (например 3 буквы красные, потом 5 синих), то в секции Character это будет отражено двумя строчками и можно менять параметры каждой группы текста отдельно. Больше групп - больше строчек.
Короче общая рекомендация - смотрите шейп-лист - там все видно.
=========================================================
Posted - 10/03/2002 : 08:44:35
--------------------------------------------------------------------------------
Спасибо за предыдущий ответ.
С этим я разобрался, но вопрос остается. Когда в шейпе текст уже отформатирован двумя шрифтами, то изменить их не представляет сложности, но когда шрифт в шейпе стоит один, что соответствует одному ряду в секции Character,а мне нужно этот текст разбить двумя
шрифтами, то возникающая проблема состоит в том, что я не могу добавить еще одну строку в эту секцию, т.к. добавление рядов в данную секцию запрещено.
--------------------------------------------------------------
Действительно проблема. В документации прямо указывается, что добавление и удаление строк из четырех секций запрещено (visSectionCharacter, visSectionParagraph, visSectionTextField, or visSectionTab).
Не знаю Вашей конкретной ситуации, но может получится заранее заготовить шейпы с нужным числом строк.
Если известно, что в каком-то типе шейпа может понадобиться менять форматирование фрагмента текста - взять и подправить мастер-шейп, то-есть внести несколько строк в секцию еще на уровне мастер-шейпа. Будет специальный мастер. А на рисунке уже работать с подготовленными секциями. Вот только разметка позиций будет фиксированной.
Еще один кривой вариант - работать с группой. В принципе наверно можно иметь несколько шейпов-текстовых блоков, менять их размер в зависимости от введенного текста (типа Width = GUARD(EVALTEXT(TheText)) и позиционировать один за другим. Тогда каждый будет управляться сам по себе, а выглядеть это будет как одна текстовая строка (сам не пробовал, но почему бы не работать).
Некоторые эффекты получаются с использованием ячеек Scale и Transparency. То есть фрагмент текста можно сделать невидимым и сжать, а когда нужно развернуть.
Но это, конечно, некоторые извращения...
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)