Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д.

Структура



Рассмотрим, из каких частей состоит документ Visio и как эти части взаимодействуют между собой.

Оконная структура

Оконная структура обычно не интересна пользователю и редко упоминается в руководствах. Однако разработчикам она в некоторых случаях нужна, поэтому имеет смысл начать с нее.

Главным окном является окно рисунка. Именно оно обычно откликается на Application.Windows(1) и имеет тип visDrawing. Понятно, что в программной деятельности оно участвует очень активно.

Вторым по значимости является окно трафаретов (тип visStencil). Оно является дочерним окном для окна рисунка и по умолчанию располагается слева от окна рисунка. Последнее не обязательно. Так как трафареты в принципе могут перемещаться и даже находиться в разных углах экрана, то Visio может создать несколько окон трафаретов и все они будут дочерними для окна рисунка.

Третьим по значимости выступает окно шейп-листа (тип visSheet). На картинке выше оно не показано. Это окно такого же уровня, как и окно рисунка, то есть не имеет родительского окна.

Структура документа

Теперь перейдем собственно к структуре документа Visio. Документ хранится в виде одного файла (например, vsdx, но не обязательно). Кстати, документом может быть не только рисунок. Трафарет - это тоже документ. И шаблон - документ. Но пока остановимся на рисунке.

Документ-рисунок состоит из одной или нескольких страниц (это собственно рисунок), трафарета документа (Document Stencil) и дополнительной информации.

Страницы показываются в окне рисунка. Активна всегда только одна страница, остальные изображаются вкладками в нижней левой части окна.

Трафарет документа по смыслу похож на обычные внешние трафареты, но в отличие от них он входит в состав документа и сохраняется в одном файле с документом (рисунком). Его назначение - хранить копии мастер-шейпов, которые были перенесены с внешних трафаретов в рисунок. Так чтобы можно было впоследствии открыть и посмотреть рисунок даже в том случае, если внешних трафаретов на новом месте не будет. Здесь задействует механизм наследования, который нужно будет рассматривать отдельно.

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

Также в файле документа может сохраняться так называемое "рабочее пространство" (Workspace). Причем пользователь сам устанавливает в момент сохранения рисунка, нужно ли сохранять и рабоее пространство тоже или обойтись без него.

Рабочее пространство описывает подключенные к рисунку внешние трафареты и параметры открытых дополнительных окон. Сами внешние трафареты сюда не входят, только ссылки на них.

Взаимодействие трафаретов и рисунка

Раз уж мы коснулись понятия трафарета, нужно хотя бы кратко остановиться на взаимодействии трафаретов и рисунка. Рассмотрим следующий фрагмент рисунка.

Здесь показан процесс использования внешнего трафарета при создании рисунка. Имеется внейшний трафарет (Stencil) как набор заготовок для последующего использования. Начинка такого трафарета подбирается по теме или функциональному признаку, потом сохраняется в отдельном документе (с расширением vssx). Отдельный элемент в трафарете называется мастер-шейп или просто Master.

При создании рисунка мы (помимо рисунка) можем открыть нужные внешние трафареты и "перетаскивать" мастер-шейпы на страницу рисунка. Важно, что при этом всегда задействован трафарет документа, даже если он не открыт в окне трафаретов.

При перетаскивании мастер-шейпа на рисунок Visio всегда проверяет наличие такого же мастер-шейпа в трафарете документа. Если отсутствует, то сначала он добавляется туда, а только потом на страницу. А если уже имеется, то на страницу рисунка поступает шейп из трафарета документа.

На приведенной выше картинке показано, что рисунок состоит из четырех шейпов. Для их создания были использованы два мастер-шейпа из внешнего трафарета и копии обоих мастер-шейпов остались в трафарете документа.

Особая ситуация возникает, если когда-то при создании рисунка был использован мастер из одного трафарета, а через некоторое время пользователь пытается использовать мастер с таким же именем, но с другого трафарета. Или с того же, но уже модифицированного. Такая ситуация обычно рассматривается с понятием "наследование".

Структура страницы

Главное в этой структуре - две коллекции: коллекция шейпов (Shapes) и коллекция соединений (Connects). Причем первая из них легко наблюдается пользователем, например, через Drawing Explorer, а до второй добраться значительно сложнее, в основном это делается программным способом.

Остальное содержимое следовало бы отнести к свойствам и характеристикам страницы, по крайней мере то содержимое, которое формируется по умолчанию. Но не все так однозначно. В пределах страницы существует еще несколько разделов, которые можно представить как дополнительные коллекции. Это коллекция слоев, данных пользователя (User Data) и опять же пользовательских данных (Shape Data или Custom Properties). Рассмотрение пользовательских данных отложим до структуры шейпа, а вот коллекцию слоев придется рассмотреть здесь.

Слой - это некий признак, по которому могут быть объединены шейпы в пределах страницы. Причем слой имеет несколько свойств, с помощью которых можно управлять отображением шейпов. Например, сделать шейпы отнесенные на этот слой, невидимыми или подкрасить определенным цветом и т.д. Так вот набор слоев задается именно на уровне страницы. На другой странице того же документа будут уже другие слои.

Однако появляется слой во время работы с шейпом. То есть с точки зрения пользователя процесс выглядит так, будто слой создается для шейпа. Нужно помнить, что это не так. Просто в этот момент в перечень слоев страницы добавляется новый слой, а в свойства шейпа добавляется признак, что он отнесен на этот слой.

Наконец-то добрались до шейпа.

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

Так вот, все изображение на странице Visio состоит из шейпов. Они могут быть совсем простыми, например, линия, прямоугольник. Могут составлять более сложное изображение. Наконец, несколько простых шейпов можно сгруппировать, в результате чего появится новый шейп - группа, который будет содержать дочерние шейпы.

Таким образом страница состоит из множества шейпов, обычных или групп. Группа состоит из множества шейпов, обычных или групп. И такая вложенность не ограничена.

На картинке показано, как шейпы видны на странице и в окне Drawing Explorer. В данном случае коллекция шейпов страницы содержит два шейпа, один из них - группа. Группа в свою очередь состоит из трех шейпов.

Каждый шейп (и обычный и группа) имеют шейп-лист. Все форматирование и другие изменения, выполняемые пользователем над шейпом, отражаются в ячейках этого шейп-листа. И через шейп-лист производится программное управление свойствами (в том числе и изображением) шейпа.

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

Каждый шейп имеет иденитификатор, уникальный в пределах страницы. Независимо от того, простой ли это шейп, группа или член группы. Шейпу можно присвоить вообще глобальный уникальный идентификатор, хотя делается это очень редко.

Существует также индекс, определяющий перекрытие изображений шейпов на странице, так называемый z-порядок шейпов. По умолчанию шейп, нарисованный позже, перекрывает ранее нарисованные. Соответственно, в наборе инструментов есть операции, позволяющие изменить этот порядок, переместить шейп выше или ниже.

Что внутри шейпа

Простой шейп - это уже нижний уровень иерархии, тем не менее, слегка заглянем и туда. Как уже отмечено выше, и изображение, и поведение шейпа определяются шейп-листом. Для удобства обращения к данным шейп-лист считают разделенным на несколько секций, отвечающих за свою часть поведения. Например, параметры линии, параметры заливки, геометрию, события и т.д. Глубже это рассматривается в описании шейп-листа. Здесь я только отмечу несколько следствий.

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

Однако в шейп-листе может быть несколько секций геометрии. Значит изображение одного шейпа может быть довольно сложным. Например, несколько кругов и квадратиков в одном шейпе. Такие шейпы обычно получаются с помощью операций объединения, вычитания и т.д. шейпов. Причем отдельные фрагменты этого изображения можно сделать невидимыми (установить признак для одной секции геометрии). Это свойство, кстати, часто закладывается в основу так называемых "мультифигур", когда шейп в зависимости от определенного условия может "переключать" свое изображение.

Шейп может иметь только один текстовый блок. Однако его можно разделить на несколько строк с помощью символов перевода строки. Можно по-разному отформатировать части этого блока, то есть в одном шейпе части текста будут разного цвета или выполнены разными шрифтами.

Пользователь может добавить в шейп как минимум два блока данных. Это User Data и Shape Data (ранее было Custom Properties). Причем не только в обычный шейп, но и в страницу и документ.

User Data недоступны для пользовательского интерфейса. Они используются в основном программистами или пользователями, которые освоили работу с шейп-листом.

Shape Data также доступны через шейп-лист, но помимо этого могут отображаться в специальном окне, что делает возможной работу с ними даже для начинающих пользователей. Этот блок данных перемещается вместе с шейпом, копируется и дублируется вместе с ним. Данные могут быть собраны в отчет. Очень часто этот блок используется для интеграции рисунка (диаграммы) с внешними источниками данных. Подробнее об этом - в других разделах.

Соединения

Выше упоминалось, что страница содержит две главные коллекции: шейпов и соединений. Шейпы рассмотрели, теперь переходим к соединениям.

В процессе ручного рисования понятие соединения в общем-то не нужно. Нарисовал квадрат, присоединил к нему коннектор - все и так понятно.

А вот у программистов, желающих проследить цепочки соединенных шейпов, нередко возникают сложности. Причина в том, что сведения о соединениях доступны программисту как свойства шейпа. И это запутывает картину.

При рассмотрении структуры страницы видно, что все соединения собраны в общую коллекцию. Каждый элемент этой коллекции описывает одно соединение двух шейпов и в этом описании всего 6 полей: какой шейп, какой ячейкой, каким боком соединен с каким шейпом, какой ячейкой и к какому боку (FromSheet, FromCell, FromPart, ToSheet, ToCell, ToPart). А методы, используемые программистом, всего лишь выбирают из этой общей коллекции строки, связанные с нужным шейпом и требуемое поле из этих строк.

Перечень литературы

01.01.1900  Visio Stencils, Masters and Shapes: How are they related?  Scott Helmers.