ko444evnik (ko444evnik) wrote,
ko444evnik
ko444evnik

Categories:

ISO-15926 DiagramDesigner

ISO-15926 DiagramDesigner

Программа для построения и визуализации схем в стиле стандарта ISO-15926 (part 2, в части "диаграмм экземпляров" ("instance diagram") ).

на 2011-10-19: версия 1.0.0.3. (альфа) СКАЧАТЬ


программа написана на C# под Windows и .NET 4.0 ( необходимо также присутствие .NET 3.5 и .NET 3.5 sp1). требует инсталляции.


0.Инструкция по установке:

Распаковать .zip-архив и запустить setup.exe.

на текущий момент - инсталлятор действует по технологии ClickOnce что означает:

1) программа самостоятельно установится в папку вида:
C:\Documents and Settings\[имя-юзера]\Local Settings\Apps\2.0\[длинная-неосмысленная-строка]\

2) в меню "Пуск" добавится как:
Start\Programs\House of Lazy Dragon\ISO_15926_DiagramDesigner
(или Пуск\Программы\House of Lazy Dragon\ISO_15926_DiagramDesigner)

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

4) в процессе установки появится окошко, в котором Windows будет запрашивать - следует ли доверять предоставленному сертификату, на что следует ответить утвердительно (в ином случае установка прекратится).

5) удаление программы производится стандартно - через Пуск\Настройки\Установка и удаление программ.


1.Инструкция по применению

1.1. Общий вид:



1.2. Рабочий процесс. Построение схем вручную.

1.2.1. Последовательность действий.

1.2.1.1. необходимое количество элементов перетаскиваются на поверхность холста ( в смысле drag'n'drop ) из вкладок "Entities" ("Сущности" в смысле стандарта 15926 ) и "Resources" ("Ресурсы" - дополнительные поясняющие картину внешние данные, текст, изображения и т.п.).

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

1.2.1.3. полученная картина сохраняется в виде файла .xml ( импорт и экспорт в .owl на данный момент не поддерживаются ) или изображения .png.

1.2.2. Редактирование элемента с "сущностью".

при наведении мышки на элемент с "сущностью" проявляются дополнительные детали : некоторый набор коннекторов и кнопка "edit", нажатие на которую открывает окошко, в котором можно настраивать разнообразные детали. в принципе, путем настройки из одной наперед заданной сущности можно получить любую другую.

ID : редактируемая текстовая строка - имя/идентификатор сущности.

EntityType : точный тип сущности - выбирается из выпадающего списка "201-сущности-описанной-в-стандарте-15926-части-2".

TypeOf : более грубая градация - используется для выбора внешнего вида элемента (в следующих версиях программы исчезнет, так как дублирует собой функциональнсть EntityType).

AboutRdl : (на данной момент используется лишь для изменения цвета элемента в целях повышения выразительности ).

флаг IsEntity : если включен, не будет показываться строка ID.

флаг IsInstance : если включен, не будет показываться строка EntityType.

примечание: в случае если элемент содержит в себе сущность типа Relationship (либо производную от нее) установка обоих флагов IsEntity и IsInstance - практикуется чтобы получить часто используемую на практике нотацию "чистого 'ромба' без всяких сопроводительных надписей".

иллюстрация к редактированию сущностей:


иллюстрация: действие флагов IsEntity и IsInstance:


1.2.3. Связывание сущностей:

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

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



у разных типов сущностей - набор коннекторов и их расположение несколько отличается.



корректными-с-точки-зрения-стандарта-15926 будут такие связи:

связь между коннекторами [classification_out] и [classification_in] обозначает "классификацию" ( на рисунке связь между "СlassOfClass(1)" и "Class(2)" ).

связь между коннекторами [specialization_out] и [specialization_in] обозначает "специализацию" ( на рисунке связь между "Class(3)" и "Class(4)" ).

связь между коннекторами [role_out] и [role_in] означает "роль в отношении" ( на рисунке "Class(5)" связан с "#6" посредством отношения "xyz-relation". причем "Class(5)" играет в нем роль "role A", а "#6" - соответственно "role B" ).

связь между коннекторами [multidimensional] и [role_in] означает "агрегацию" - "включение" одного элемента в другой ( на рисунке "Multidimensional(9)" включает в себя "#(7)" и "#(8)" - причем первому назначен индекс "1", а второму - индекс "2" ).

некорректные связи между элементами с сущностями выделяются пунктиром. пунктиром же обозначаются связи между "элементами с сущностями" и "элементами с ресурсами" (на рисунке - связь "ClassOfClass(10)" с "some text" ).

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



1.2.4. Редактирование связи.

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

последовательность действий:
- выбрать связь (щелчком на линии);
- вызвать контекстное меню (щелчок правой кнопки мыши);
- выбрать пункт выпавшего меню 'Edit';
- внести требуемые изменения.



1.2.5. Ресурсы.

здесь подразумеваются как разнообразные внешние данные, поясняющие схему:
- текст,
- текстовые файлы разных форматов и кодировок (в текущей версии программы : FlowDocument в .xaml, .rtf, unicode UTF8, windows-1251 ),
- изображения из файлов,
- рисунки пером,
и их комбинации.



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





1.3. Рабочий процесс. Автоматическая генерация схемы.

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

примечание: установленный флажок "Clear" означает, что перед созданием новых сущностей, предыдущий вариант схемы будет очищен. снятый - соответсвенно, что новые данные будут добавлены поверх предыдущих.

примечание: в текущей версии программы (v 1.0.0.3) генерация и декомпиляция элементов с ресурсами не поддерживается.

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

для поиска и извлечения данных из текста используется регулярные выражения.
для "вершин":
*\{(.*?)\} *([#crsea]+?) *\[(.+?)\] *\[(.*?)\]


для "ребер":
*\{(.+?)\} *-([-\>0mr]+?) *\{(.+?)\}(( *\[.*?\] *){0,3})


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

1.3.2 "Вершины".

описание "вершины" (т.е. entities = "сущности" с точки зрения ISO-15926) задается следующим образом:
{уникальный-ключ} селектор [тип-сущности][текст-идентификатор-сущности]

пример:
{сс-01} cc [ClassOfClass][Летательный аппарат]


где:
уникальный-ключ = текстовая строка, которая может позднее использоваться в описании "ребра";
селектор = некотоым образом аналог поля TypeOf из окна редакирования сущности (см. пункт 1.2.2 );
тип-сущности = аналог поля EntityType ;
текст-идентификатор-сущности = аналог поля ID.

допустимые наборы символов в селекторе:

# - индивид (для создания PossibleIndividual и производных от него сущностей );
a - абстракция (для Thing, AbstractObject и производных);
c - класс (для Class и производных);
cc - класс класса (для ClassOfClass и производных);
ccc - класс класса класса ( довольно редкая категория, под которую подпадает, например ClassOfPropertySpace );
r - отношение (для Relationship и производных );
cr - класс отношения (для ClassOfRelationship и производных );
ccr - класс класса отношения (для ClassOfClassOfRelationship и производных );

дополнительно используется:
e - "еntity" - аналог флага IsEntity;
s - "simple" - аналог флага IsInstance.

пример: селектор, описываемый строкой 'ser' (или 'res', или 'rse' - порядок следования символов здесь не важен) - преобразуется в сущность типа 'Relationship' - и будет выглядеть как 'просто ромб' без всяких сопутствующих подписей.

примечание: не следует использовать в селекторе символ 'm' для задания MultidimensionalObject.

примечание: в именах сущностей и ключах - очевидным образом запрещено явно использовать символы '{', '}', '[' и ']'. при авто-создании сущностей (см. пункт 1.4 ниже) производится замена этих символов:
{x}[y]

будет преобразована, например, в такую:
{‹x›‭‭«‭y»} a [Thing][‹x›‭‭«‭y»]


1.3.3. "Ребра".

описание "ребра" задается следующим образом:
{ключ-первой-сущности} -тип_связи {ключ-второй-сущности} [текст-1][текст-2][текст-3]


пример:
{cc-01} -> {c-1} [классификация]


где:
ключ-первой-сущности и ключ-второй-сущности - соответсвенно ключи пары сущностей, между которыми наводится связь;

допустимые типы_связи:
-> классификация (Classification);
-0 специализация (Specialization);
-r роль в отношении;
-m агрегация в MultidimensionalObject;
-- констатация наличия связи, которую нельзя описать средствами ISO-15926.


текст-1/2/3 - текстовые строки, которые в общем случае используются для задания имен меток на связи. при генерации - не являются обязательными, но тем не менее в некоторых случаях играют важную роль, например:
с помощью текст-1 - задается "имя роли в отношении";
с помощью текст-3 - задается "индекс элемента" для связи типа "агрегация".





2. Пошаговый пример генерации схемы:

2.1. в окне редактора набить, например, такой текст:
летательный аппарат
самолет
пассажирский самолет


2.2. выделить текст мышкой и нажать на кнопку 'Class'.
получится:
{летательный аппарат} c [Class][летательный аппарат]
{самолет} c [Class][самолет]
{пассажирский самолет} c [Class][пассажирский самолет]


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

{a} c [Class][летательный аппарат]
{b} c [Class][самолет]
{c} c [Class][пассажирский самолет]


2.3. для сущности 'летательный аппарат' изменить селектор на 'cc' (что означает 'Class Of Class' ), и изменить тип сущности на, например, 'ClassOfClassOfIndividual'. сделать это можно либо вручную, либо выделив соотвествующий текст мышкой - и вызвав контекстное меню нажатием на правую клавишу мыши - выбрать его из выпадающего списка.

{a} cс [ClassOfClassOfIndividual][летательный аппарат]
{b} c [ClassOfIndividual][самолет]
{c} c [ClassOfIndividual][пассажирский самолет]


2.4. аналогично действуем для следующей тройки строк, только воспользуемся кнопкой 'PossibleIndividual' :

"Сухой Суперджет" летный экземпляр №1
пилот
второй пилот


получится, например так:
{d} s# [PossibleIndividual][#"Сухой Суперджет" летный экземпляр №1]
{p1} s# [PossibleIndividual][#пилот]
{p2} s# [PossibleIndividual][#второй пилот]


2.5. для описания отношения - набить текст:
f


выделить текст мышкой и нажать на кнопку 'Relation'.
получится шаблон из одной 'вершины' и двух 'ребер':

{f} r [Relationship][f]
{f}-r{} []
{f}-r{} []


2.6. 'копированием/вставкой' или вручную записать:
- во 'вторые фигурные скобки' - ключи пары сущностей, которые мы хотим связать отношением;
- в 'квадратные скобки' - имена ролей, которые эти сущности будут играть в этом отношениии;
- 'тип сущности отношения' заменить с базового 'Relationship', на более подходящий, например, на 'Specialization'.

в результате получится, например, такое:
{f} er [Specialization][]
{f} -r {b} [superclass - одна из ролей отношения специализации]
{f} -r {c} [subclass - вторая из ролей отношения специализации]


2.7. действуя по аналогии с предыдущими пунктами, добавим такие сущности:
{xx} cс [ClassOfClassOfIndividual][класс транспортных средств]
{yy} cс [ClassOfClassOfIndividual][класс транспортных средств оборудованных для перевозки пассажиров]


и такой "класс отношения специализации"
{g} ecr [ClassOfSpecialization][]
{g} -r {xx} [class_of_superclass]
{g} -r {yy} [class_of_subclass]


2.8. чтобы создать пример сложного составного объекта (MultidimensionalObject) набить текст:
multi


выделить текст мышкой и нажать на кнопку 'Multidimensional'.
получится шаблон из одной 'вершина' и трех 'ребер':

{multi} a [MultidimensionalObject][multi]
{multi} -m {} [][][1]
{multi} -m {} [][][2]
{multi} -m {} [][][3]


2.9. 'копированием/вставкой' или вручную записать:
- во 'вторые фигурные скобки' - ключи сущностей, которые требуется включить;
- в 'соответствующие квадратные скобки' - номера индексов которыми следует их охарактеризовать;
по необходимости - добавить недостающие ребра, либо стереть лишние.
в результате получится, например, такое:

{multi} a [MultidimensionalObject][экипаж]
{multi} -m {p1} [][][1]
{multi} -m {p2} [][][2]


2.10 нажатие на кнопку 'Classification' предоставляет для последующего заполнения шаблон для описания ребра такого вида:
{} -> {}


в нашем случае уместными будут такие записи о таких связях:
{a} -> {b}
{c} -> {e}
{g} -> {f}
{c} -> {d}
{yy} -> {c}


2.11. нажатие на кнопку 'Specialization' предоставляет для последующего заполнения следующий шаблон:
{} -0 {}


в нашем случае уместными будут такие записи о таких связях:
{b} -0 {c}
{xx} -0 {a}





2.12. результатом генерации схемы на основе такого примера:

{a} cc [ClassOfClassOfIndividual][летательный аппарат]
{b} c [ClassOfIndividual][самолет]
{c} c [ClassOfIndividual][пассажирский самолет]

{d} s# [PossibleIndividual][#"Сухой Суперджет" летный экземпляр №1]

{p1} s# [PossibleIndividual][#пилот]
{p2} s# [PossibleIndividual][#второй пилот]

{f} er [Specialization][]
{f} -r {b} [superclass - одна из ролей отношения специализации]
{f} -r {c} [subclass - вторая из ролей отношения специализации]

{xx} cc [ClassOfClassOfIndividual][класс транспортных средств]
{yy} cc [ClassOfClassOfIndividual][класс транспортных средств оборудованных для перевозки пассажиров]

{g} ecr [ClassOfSpecialization][]
{g} -r {xx} [class_of_superclass]
{g} -r {yy} [class_of_subclass]

{multi} a [MultidimensionalObject][экипаж]
{multi} -m {p1} [][][1]
{multi} -m {p2} [][][2]

{a} -> {b}
{c} -> {e}
{g} -> {f}
{c} -> {d}
{yy} -> {c}

{b} -0 {c}
{xx} -0 {a}


будет примерно следующая картина:



творчески применив к ней феньшуй, можно добиться примерно следующего:




1. базовый код редактора основан на серии статей за авторством sukram на
codeproject.com
Tags: #6, #crsea, #второй, #пилот, .net, .wpf, diagramdesigner, iso-15926
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments