среда, 19 января 2011 г.

Генеалогическое дерево. Часть 2: рисуем в graphviz

Итак, речь пойдет о том как нарисовать генеалогическое дерево с помощью graphviz.
Я напомню, что

Graphviz — разработанный специалистами лаборатории AT&T пакет утилит по автоматической визуализации графов, заданных в виде описания на языке dot. Пакет распространяется с открытыми исходными файлами по лицензии CPL (Common Public License) и работает на многих операционных системах, включая Linux, Mac OS, Unix-подобные, Microsoft Windows.
Используется при разработке программного обеспечения для визуализации структурированных данных.
В пакет утилит входит программа dot, автоматический визуализатор ориентированных графов, который принимает на вход текстовый файл с представлением графа в виде смежных списков, а на выходе формирует граф в виде графического, векторного или текстового файла.
Входной файл для программы dot является обычным текстовым файлом на специальном языке описания.

Но довольно теории, обратимся к практике.
Для начала необходимо установить graphviz. В Debian это делается одной командой:
# apt-get intall -y graphviz
После установки я в домашней папке /home/genmed создал папку GenTree, а внутри неё текстовый файлик ex.dot cледующего содержания:

digraph G{

graph [ fontname = "Times",
fontsize = 36,
label = "Фрагмент генеалогического дерева\nВ. И. Ульянова (Ленина)",
size = "6,6" ];

size="10,7.5";
ratio=auto;
//ratio=fill;
//ratio=compress;
//rotate=90;

node [style=filled];
edge [dir=back];
// edge [dir=forward, arrowhead=vee];
// edge [dir=back, arrowtail=vee];

A [label="Ульянов (Ленин)\nВладимир Ильич\n(1870-1924)",fillcolor=deepskyblue];
B [label="Бланк\nМария Александровна\n(1835-1916)",fillcolor=pink];
C [label="Ульянов\nИлья Николаевич\n(1831-1886)",fillcolor=deepskyblue];
D [label="Гросшопф\nАнна Ивановна\n(?-1838)",fillcolor=pink];
E [label="Бланк (Абель)\nАлександр Дмитриевич\n(1799-1870)",fillcolor=deepskyblue];
F [label="Смирнова\nАнна Алексеевна\n(1788-1871)",fillcolor=pink];
G [label="Ульянов (Ульянин)\nНиколай Васильевич\n(1768-1836)",fillcolor=deepskyblue];

A->B;
A->C;
B->D;
B->E;
C->F;
C->G;

{rank=same; A}
{rank=same; B C}
{rank=same; D E F G}

}

И сразу же посмотрите на результирующий файлик ex.png, который я собрал с помощью команд:

$ cd /home/genmed/GenTree
$ dot -Tpng ./ex.dot -o ./ex.png

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

Что мне понравилось, так это легкость и простота кода.
файл ex.dot весил 1,4 Кб, а ex.png - 82,9 Кб.

Тут я должен заметить что каждую фамилию можно оформить в виде ссылки на внешние документы, однако я этого не сделал. Если вы хотите ссылок, воспользуйтесь параметром URL в свойствах каждого узла.
Синтаксис:

node [..., URL="ссылка"];

Правда в этом случае накладывается ограничение на формат выходных файлов, это могут быть только ps2, cmap, i*map и SVG. Зачастую используется именно формат SVG.

В следующий раз я расскажу как строить генеалогическое дерево с помощью GRAMPS.

P.S.: Генеалогическое дерево Ульянова построено по материалам очерка М.Штейна "Род вождя" ("Вождь.   Ленин, которого мы не знали", Саратов, 1992 г.) ссылка

Комментариев нет: