У меня появились некоторые соображения : ) по поводу хранения дракон-схем и иже с ними в XML файле.
Некоторые моменты проистекают сугубо из моей реализации раскладки графа дракон-схемы и, возможно, излишни или требуют правки.
Буду рад советам и критическим замечаниям : )
ДАР — Дракон АРхив; DAR – Drakon ARchive;
Кодировка, наверное, должна быть UTF8. Чтобы файлом можно было без проблем пользоваться в различных системах.
Формат должен содержать не только дракон-схемы, но и другие сущности (картинки, тексты, таблицы) с возможностью их группирования. А поскольку хотелось бы, чтобы формат поддерживал все офисные возможности, то описание займёт ~1000 страниц : ) Например, описание формата Open Document что то вроде 800 страниц, если мне не изменяет память, ну и ДАР ещё страниц 200 : )
Но начну с малого … не формально ...
И сразу же первая сложность: хранить только граф схемы или и какие-то свойства отображения (масштаб, смещение). Учитывая что этот формат мне нужен под конкретный редактор, то опишу как это видится мне.
Двумя косыми чертами обозначены примечания, которые в XML файле не используются.
По ходу изложения будет наблюдаться болтанка в применяемых обозначениях, просто пока не устоялось : )
Код:
<scena name=”%имя_сцены”>
<geometry>
<xmin>%координата_xmin</xmin>
<xmax>%координата_xmax</xmax>
<ymin>%координата_ymin</ymin>
<ymax>%координата_ymax</ymax>
</geometry>
<scheme kind=”drakon” version=”%версия” type=”%type”>
%описание_схемы_примитив
или
%описание_схемы_силуэт
</scheme>
// на одной сцене могут присутствовать несколько схем
</scena>
%type
primitive
silhouette
Куда-то ещё нужно viewport'ы прописать, через которые схема просматривается, а они могут находиться на разных страницах создаваемого документа … Как сделать у себя в программе, вроде понятно, а вот как сделать правильно и универсально в XML файле не совсем ясно ...
Код:
%описание_схемы_примитив
<branch>
<item name=”begin”> // обязательный элемент
%содержание_begin
</item>
%тело_примитива
<item name=”end”>
%содержание_ end // обязательный элемент
</item>
</branch>
%описание_схемы_силуэт
<branch> // первая, самая левая ветка
<item name=”begin”> // обязательный элемент только для первой ветки
%содержание_begin
</item>
%тело_примитива // секция_инициализации
%тело_ветки
</branch>
<branch> // вторая и последующие ветки
<item name=”entry”> // необязательный элемент
%содержание_ entry
</item>
%тело_примитива // секция_инициализации
%тело_ветки
</branch>
<branch_last hidden=”no”> // последняя ветка
<item name=”entry”> // необязательный элемент
%содержание_ entry
</item>
%тело_примитива // секция_инициализации ветки
<item name=”name_branch”>
%содержание_name_branch
</item>
%тело_примитива // секция_финализации схемы
<item name=”end”>
%содержание_ end
</item>
</branch_last>
%тело_примитива
// состоит из сочетаний проходных и переключающих элементов
// и имеет только один маршрут выхода
%проходной_элемент
%переключающий_элемент
%тело_ветки
<item name=”name_branch”>
%содержание_name_branch
</item>
// состоит из сочетания проходных и переключающих элементов
// имеет несколько маршрутов выхода
// заканчивающихся элементом «икона Адрес»
%проходной_элемент
%переключающий_элемент_силуэта // отличается от примитивного : )
// возможным наличием иконы Адрес в конце маршрутов
%проходной_элемент
%проходная_икона
или
%контакт
%проходная_икона
// все иконы кроме Вопрос и Выбор
%контакт
<top_join/> // точка входа в цикл
<bottom_join value=”%число”/> // точка схождения маршрутов,
// value – кво правых маршрутов, входящих в точку
<right_join/> // точка входа на маршрут от иконы Вопрос слева
%переключающий_элемент
%переключающая_икона
<route> // самый правый маршрут, для Вопроса единственный
// для Выбора — кво икон Вариант минус единица
// состоит из сочетания проходных, переключающих
// и связывающих элементов
%проходной_элемент
%переключающий_элемент
%связывающий_элемент
</route>
%переключающая_икона
<item name=”question”>
%содержание_question
</item>
или
<item name=”choice”>
%содержание_choice
</item>
%связывающий_элемент
<top_connect/> // подключение к top_join
или
<right_connect/> // подключение к right_join
или
<bottom_join/> // подключение к bottom_join
%переключающий_элемент_силуэта
%переключающая_икона
<route> // самый правый маршрут, для Вопроса единственный
// для Выбора — кво икон Вариант минус единица
// состоит из сочетания проходных, переключающих
// и связывающих элементов
// может заканчивающихся элементом «икона Адрес»
%проходной_элемент
%переключающий_элемент_силуэта // отличается от примитивного : )
// возможным наличием иконы Адрес в конце маршрутов
%связывающий_элемент
</route>
Основной тэг — item
<item name=”%item”>
%содержание_%item
</item>
%item
begin, action, end, variant, comment … // английские названия икон
top_join, right_join, bottom_join // точки контакта
top_connect, right_connect, bottom_connect // связывающие элементы
%содержание_%item
%общая_часть // до конца ещё не ясно, что войдёт в общую часть
%уникальная_часть
Для примера икона Действие:
%содержание_action
<properties>
<style>%style</style>
<pen_width>%pen_width</pen_width>
<pen_color>%pen_color</pen_color>
<brush_color>%brush_color</brush_color>
<x>%x</x> // смещение иконы в координатах вертикали
// на которой находится элемент
<y>%y</y> // в координатах вертикали, рассчитывается автоматически
<w>%w</w> // ширина
<h>%h</h> // высота
// shift-параметры зависят от реализации редактора.
// местоположение элементов рассчитывается автоматически,
// затем вносится коррекция, если требуется
<shift_down_manual>%shift_down_manual</shift_down_manual>
<shift_height_manual>%shift_height_manual</shift_height_manual>
// здесь можно было бы задать произвольный контур и другие свойства
</properties>
Вложение:
r1.png [ 3.07 КБ | Просмотров: 17938 ]
Код:
// комментарий внутри элемента
<comment_plain>comment_plain1</comment_plain>
// значимый текст внутри элемента
<text_plain>text_plain1</text_plain>
// ещё один комментарий
<comment_plain>comment_plain2</comment_plain>
// ещё текст
<text_plain>text_plain2</text_plain>
// ещё комментарий
<comment_plain>comment_plain3</comment_plain>
// здесь возникает вопрос КАК ОПИСЫВАТЬ ФОРМАТИРОВАННЫЙ ТЕКСТ?
// может как в Qt в формате HTML?
// т. е. теги text_plain и text_html содержат один и тот же текст,
// но разное форматирование
Вложение:
r2.png [ 1.97 КБ | Просмотров: 17938 ]
Код:
<leftward>%leftward_item</leftward> // элемент слева
<dextral>%dextral_item</dextral> // элемент справа
Вложение:
r3.png [ 3.14 КБ | Просмотров: 17938 ]
Код:
/%содержание_action закончено
Конечно, представленное описание далеко не полное : )
Я так думаю, что сначала нужно разобраться с «костями», а потом уже на них нарастить «мясо» : )
Перейду к «тазо-бедренным суставам» : )
Иконы Вопрос и Выбор принадлежат к переключающим элементам.
Все правые маршруты от таких элементов оформляются тегом route, начиная с самого правого маршрута. Самый верхний route – самый правый маршрут.
икона Вопрос
Код:
<item name=”question”>
%содержание_question
</item>
%содержание_question
<properties>Какие-то свойства</properties>
<context_right>no</context_right> // правый маршрут в контексте отрицания
<text_plain>Какой-то вопрос?</text_plain>
<leftward>Что-то слева</leftward>
// справа не может быть никаких икон
<text_right>Ответ на вопрос для правого маршрута</text_right>
<text_bottom>Ответ на вопрос для нижнего маршрута</text_bottom>
Пример 1
Вложение:
r3.png [ 3.14 КБ | Просмотров: 17938 ]
Код:
<scheme kind=”drakon” version=”0.0.001” type=”primitive”>
<branch>
<item name=”begin”>
<text_plain>Начало</text_plain>
</item>
<item name=”action”>
<text_plain>ДЕЙСТВИЕ</text_plain>
<leftward>
<item name=”pause”>
<text_plain>Левый элемент для ДЕЙСТВИЯ</text_plain>
<leftward>
<item name=”left_comment”>
<text_plain>
Левый элемент для ПАУЗЫ
</text_plain>
</item>
</leftward>
</item>
</leftward>
<dextral>
<item name=”right_comment”>
<text_plain>Правый элемент для ДЕЙСТВИЯ</text_plain>
</item>
</dextral>
</item>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch>
</scheme>
Пример 2
Вложение:
r4.png [ 7.19 КБ | Просмотров: 17938 ]
Код:
<scheme kind=”drakon” version=”0.0.001” type=”primitive”>
<branch>
<item name=”begin”>
<text_plain>Начало</text_plain>
</item>
<top_join/>
<item name=”choice”>
<text_plain>Выбор</text_plain>
</item>
<route>
<item name=”variant”>
<text_plain>V2</text_plain>
</item>
<right_join/>
<bottom_connect/>
</route>
<item name=”variant”>
<text_plain>V1</text_plain>
</item>
<item name=”question”>
<context_right>no</context_right>
<text_plain>Q1</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<item name=”question”>
<context_right>no</context_right>
<text_plain>Q4</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<right_connect/>
</route>
<bottom_connect/>
</route>
<item name=”question”>
<context_right>no</context_right>
<text_plain>Q2</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<item name=”action”>
<text_plain>D1</text_plain>
</item>
<bottom_connect/>
</route>
<bottom_join value=”2”/>
<bottom_join value=”1”/>
<item name=”question”>
<context_right>no</context_right>
<text_plain>Q3</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<top_connect/>
</route>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch>
</scheme>
Пример 3
Вложение:
r.png [ 22.32 КБ | Просмотров: 17938 ]
Код:
<scheme kind=”drakon” version=”0.0.001” type=”silhouette”>
<branch>
<item name=”begin”>
<text_plain>- Начало -</text_plain>
</item>
<top_join/>
<item name=”question”>
<context_right>yes</context_right>
<text_plain>Q1</text_plain>
<text_right>Да</text_right>
<text_bottom>Нет</text_bottom>
</item>
<route>
<top_connect/>
</route>
<item name=”name_branch”>
<text_plain>A</text_plain>
</item>
<item name=”choice”>
<text_plain>Выбор</text_plain>
</item>
<route>
<item name=”variant”>
<text_plain>V2</text_plain>
</item>
<bottom_connect/>
</route>
<item name=”variant”>
<text_plain>V1</text_plain>
</item>
<bottom_join value=”1”/>
<item name=”address”>
<text_plain>B</text_plain>
</item>
</branch>
<branch>
<item name=”entry”>
<text_plain>- вход -</text_plain>
</item>
<item name=”question”>
<context_right>no</context_right>
<text_plain>Q2</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<bottom_connect/>
</route>
<bottom_join value=”1”/>
<item name=”name_branch”>
<text_plain>B</text_plain>
</item>
<item name=”action”>
<text_plain>D1</text_plain>
</item>
<item name=”address”>
<text_plain>B</text_plain>
</item>
</branch>
<branch_last hidden=”no”>
<item name=”name_branch”>
<text_plain>Финиш</text_plain>
</item>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch_last>
</scheme>
P.S. Если где-то ошибся, говорите, поправлю.
Добавлено 19.04.12 14:07Свёртка блока — последовательность элементов прячется в одну икону.
Такими иконами могут быть: Действие, Вопрос, Выбор.
При этом в икону Действие сворачивается (прячется) блок элементов, расположенный ниже самой иконы Действие, а в иконы Вопрос, Выбор сворачивается блок расположенный выше.
Нужно как-то выделять иконы, содержащие свёртку. Пока выделяю двойным контуром.
Код:
<convolution>
<![CDATA[%тело_примитива]]>
</convolution>
Пример 4.
Вложение:
s1.png [ 3.68 КБ | Просмотров: 17773 ]
Код:
// пример 4 без свёртки
<scheme kind=”drakon” version=”0.0.001” type=”primitive”>
<branch>
<item name=”begin”>
<text_plain>Начало</text_plain>
</item>
<item name=”action”>
<comment_plain>Что-то там делается</comment_plain>
</item>
<top_join/>
<item name=”question”>
<context_right>no</context_right>
<text_plain>В1</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<top_connect/>
</route>
<item name=”action”>
<text_plain>Д1</text_plain>
</item>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch>
</scheme>
// пример 4 со свёрткой
<scheme kind=”drakon” version=”0.0.001” type=”primitive”>
<branch>
<item name=”begin”>
<text_plain>Начало</text_plain>
</item>
<item name=”action”>
<comment_plain>Что-то там делается</comment_plain>
<convolution>
<![CDATA[
<top_join/>
<item name=”question”>
<context_right>no</context_right>
<text_plain>В1</text_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<top_connect/>
</route>
<item name=”action”>
<text_plain>Д1</text_plain>
</item>
]]>
</convolution>
</item>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch>
</scheme>
Пример 5.
Вложение:
s2.png [ 4.75 КБ | Просмотров: 17773 ]
Код:
// пример 5 без свёртки
<scheme kind=”drakon” version=”0.0.001” type=”primitive”>
<branch>
<item name=”begin”>
<text_plain>Начало</text_plain>
</item>
<item name=”action”>
<text_plain>Д1</text_plain>
</item>
<item name=”action”>
<text_plain>Д2</text_plain>
</item>
<item name=”question”>
<context_right>no</context_right>
<comment_plain>Это самый главный вопрос в алгоритме?</comment_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
</item>
<route>
<bottom_connect/>
</route>
<bottom_join/>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch>
</scheme>
// пример 5 со свёрткой
<scheme kind=”drakon” version=”0.0.001” type=”primitive”>
<branch>
<item name=”begin”>
<text_plain>Начало</text_plain>
</item>
<item name=”question”>
<context_right>no</context_right>
<comment_plain>Это самый главный вопрос в алгоритме?</comment_plain>
<text_right>Нет</text_right>
<text_bottom>Да</text_bottom>
<convolution>
<![CDATA[
<item name=”action”>
<text_plain>Д1</text_plain>
</item>
<item name=”action”>
<text_plain>Д2</text_plain>
</item>
]]>
</convolution>
</item>
<route>
<bottom_connect/>
</route>
<bottom_join/>
<item name=”end”>
<text_plain>Конец</text_plain>
</item>
</branch>
</scheme>