Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 29.11.06 17:17
Оценка: 83 (11) +5
Привет всем!

В свете повторно всплывшей темы про раскраску ещё кучи языков, я не мог обойти вниманием очень интересный и нужный (практически всем) язык. (Любопытный парадокс заключается в том, что чем больше человек владеет этим языком, тем больше он ему нужен).
Взгляните на это убожество:
  (A)
  / |
 v  |
(B) |
 |  |
  v v
  (C)

А теперь посмотрите в окно — на дворе 21-й век. А мы как в старые добрые времена БК и Спектрумов рисуем псевдографикой... Есть ли альтернатива? (Ну кроме конечно графических редакторов).

Есть! GraphViz — инструментальная программа, которая принимает на вход описание графа, а выдаёт картинку с этим графом. Пользуется большой популярностью, используется в куче инструментов в качестве движка для создания диаграмм (например doxygen).

Пора от рекламных лозунгов перейти к делу
SourceResult
digraph
{
// feel the difference!
size="1,2"
A->B
B->C
A->C
}
digraph
{
size="2,5"; // maximum size in inches
S0 -> S0 [ label = "0.5"];
S0 -> S1 [ label = "0.3"];
S0 -> S2 [ label = "0.1"];
S1 -> S0 [ label = "0.2"];
}
digraph G 
{
size ="4,4"; // size in inches
main [shape=box];

main -> parse [weight=8];
parse -> execute;
main -> init [style=dotted];
main -> cleanup;
execute -> { make_string; printf}
init -> make_string;
edge [color=red]; // so is this
main -> printf [style=bold,label="100 times"];
make_string [label="make a\nstring"];
node [shape=box,style=filled,color=".7 .3 1.0"];
execute -> compare;
}
// Something complicated
digraph structs
{
node [shape=record, fontsize=9];
struct1 [shape=record,
    label="<f0> left|<f1> middle|<f2> right"];
struct2 [shape=record,
    label="<f0> one|<f1> two"];
struct3 [shape=record,
    label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
// At last, UML!
digraph G {
fontname = "Verdana";
fontsize = 7;

node [
    fontname = "Verdana"
    fontsize = 7
    shape = "record"
    width = 1
]

edge [
    fontname = "Verdana"
    fontsize = 7
]

Animal [
    label = 
"{Animal|+ name : string\l+ age : int\l|+ die() : void\l}"
]

subgraph clusterAnimalImpl {
    label = "Package animal.impl"

    Dog [
        label = "{Dog||+ bark() : void\l}"
    ]

    Cat [
        label = "{Cat||+ meow() : void\l}"
    ]
}

edge [
    arrowhead = "empty"
]

Dog -> Animal
Cat -> Animal

edge [
    arrowhead = "none"

    headlabel = "0..*"
    taillabel = "0..*"
]

Dog -> Cat
}
После такого вступления моё пожелание совсем нетрудно предугадать: ввести тэг [graphviz]:
[graphviz] ... здесь определение графа ... [/graphviz]

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

Пожалуйста, высказывайтесь, что вы думаете об этом.

PS:
Кстати (надо же какое совпадение!) буквально вчера я наткнулся на ajax-сервис (написан на Руби) http://ashitani.jp/gv/
Можно зайти, поиграться. Есть несколько особенностей, о которых можно глянуть здесь. Кроме того, картинки генерятся в гифах, посему совсем не переливаются всеми цветами радуги. И остаётся открытым вопрос, насколько долго там хранятся сгенерированные картинки и можно вешать прямые линки отсюда прямо туда...
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Тэг [graphviz]
От: Андрей Хропов Россия  
Дата: 29.11.06 17:49
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Пожалуйста, высказывайтесь, что вы думаете об этом.

Хм, то есть ты предлагаешь включить в движок сайта генератор graphviz source code -> gif/png/... ?
И скажем помещать сгенерированную картинку в файлы пользователя и в результирующем HTML сообщения подставлять на нее ссылку?

Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...
Но его без доп настроек только Мозилла/Forefox показывать умеет, а MS вместо этого толкает свой проприетарный XAML .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 29.11.06 17:59
Оценка:
Андрей Хропов,

LCR>>Пожалуйста, высказывайтесь, что вы думаете об этом.

АХ>Хм, то есть ты предлагаешь включить в движок сайта генератор graphviz source code -> gif/png/... ?
АХ>И скажем помещать сгенерированную картинку в файлы пользователя и в результирующем HTML сообщения подставлять на нее ссылку?

Да, именно, механика такая. Как вариант — можно не в файлы пользователей, а в "глобальный пул". DokuWiki например так работает. Хотя для RSDN лучше в файлы пользователя.

И лучше подставлять не ссылку, а сразу .


АХ>Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...

АХ>Но его без доп настроек только Мозилла/Forefox показывать умеет, а MS вместо этого толкает свой проприетарный XAML .
Ну во-первых мне думается, что SVG намного тяжелее, а во-вторых — это непринципиально сейчас.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 01.12.06 09:27
Оценка: 17 (3)
Здравствуйте, Lazy Cjow Rhrr!

Идея дравая. Дело за тем чтобы раздобыть версию для .Net.

Вот здесь есть COM объектик: http://home.so-net.net.tw/oodtsen/wingraphviz/index.htm
Я сделал к нему обёртку: http://rsdn.ru/File/507/CSharpGraphvizSample.zip
Запустил. На каждый чих вытекает по 30 GDI объектов и несколько килобайт памяти. Это неприемлимо.
Посмотрел исходники...

Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.
Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[2]: Тэг [graphviz]
От: anonymous Россия http://denis.ibaev.name/
Дата: 01.12.06 10:21
Оценка: 5 (1)
Здравствуйте, Блудов Павел, Вы писали:

БП>Вот здесь есть COM объектик: http://home.so-net.net.tw/oodtsen/wingraphviz/index.htm

БП>Я сделал к нему обёртку: http://rsdn.ru/File/507/CSharpGraphvizSample.zip
БП>Запустил. На каждый чих вытекает по 30 GDI объектов и несколько килобайт памяти. Это неприемлимо.
БП>Посмотрел исходники...

БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.

БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.

А такое не пойдёт: QuickGraph: A 100% C# graph library with Graphviz Support?
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 01.12.06 10:51
Оценка:
Блудов Павел,

БП>Идея здравая. Дело за тем чтобы раздобыть версию для .Net.


БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.

БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.

Понял, рыть от забора до обеда...

Посмотрю, что можно сделать. Спасибо.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 01.12.06 10:51
Оценка: +1
Здравствуйте, anonymous, Вы писали:

A>А такое не пойдёт: QuickGraph: A 100% C# graph library with Graphviz Support?

"with Graphviz Support" В данном случае означает, что можно делать так:

            AdjacencyGraph g = new AdjacencyGraph(new VertexAndEdgeProvider(), true);
            
            IVertex a = g.AddVertex();
            IVertex b = g.AddVertex();
            IVertex c = g.AddVertex();
            IVertex d = g.AddVertex();
            IVertex e = g.AddVertex();

            g.AddEdge(a,b);
            g.AddEdge(a,c);
            g.AddEdge(b,c);
            g.AddEdge(c,d);                
            g.AddEdge(a,e);                
            g.AddEdge(c,a);                
            
            new GraphvizAlgorithm(g).Write(); // На выходе получаем текст в формате Graphviz.

А нужнен компонент, который на входе получает текст, а на выходе даёт gif/png/svg.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re: Тэг [graphviz]
От: Sheridan Россия  
Дата: 04.12.06 19:19
Оценка:
А не подскажеж ли гуй для этого дела под линух?
Чтото с первой попытки я не нашел
Matrix has you...
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 04.12.06 19:30
Оценка:
Sheridan,

S>А не подскажеж ли гуй для этого дела под линух?

S>Чтото с первой попытки я не нашел

Ну может поможет то, что под виндой этот самый гуй называется GVUI.exe.

Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:
dot -Tpng xxx.dot -o xxx.png

и усё.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: Тэг [graphviz]
От: korzhik Россия  
Дата: 04.12.06 19:36
Оценка:
Здравствуйте, Андрей Хропов, Вы писали:

АХ>Я бы конечно сказал еще что на дворе 21 век и кошерно рендерить векторную графику в SVG ...


Кстати Graphviz и в SVG умеет конвертить.
Re[3]: Тэг [graphviz]
От: Sheridan Россия  
Дата: 04.12.06 19:39
Оценка: +1 :)
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:


Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...
Matrix has you...
Re[4]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 04.12.06 22:49
Оценка:
Sheridan

LCR>>Да и зачем тебе гуй? Он сильно неудобный. Я делаю таг:


S>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...


Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 05.12.06 03:37
Оценка: 5 (1) +3
Здравствуйте, korzhik, Вы писали:

K>Кстати Graphviz и в SVG умеет конвертить.

Именно. В профиле можно будет сделать галочку
[X] Использовать векторную графику.

У кого будет выставлена, тот будет наслаждаться векторной графикой.
У кого нет — будет получать gif'ы низкого качества.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[5]: Тэг [graphviz]
От: Sheridan Россия  
Дата: 05.12.06 19:02
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

S>>Это понятно, но ведь намного удобнее слева скажем текст вводить, а справа динамически обновляемая картинка...

LCR>Ааа, ты на сайтик заходил? Да, мне тоже понравилось. Ничего подобного для локального использования не видел.

*чешет в затылке*
В принципе софтины то... текст, картинка и поле, и поле ввода, где коммстрока для преобразования одного в другое с кнопочкой "поехали"...
Matrix has you...
Re[2]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 08.12.06 04:13
Оценка:
Блудов Павел,

БП>Вобщем, у его есть охота — доводите до ума. Сейчас пока и говорить не о чем.

БП>Что нужно сделать: взять отсюда исходники или бинарники и написать для них managed обёртку на c#,VB,c++/clr, вобщем что угодно, но чтоб работало и не протекало.

Короче, я смотрю на плагин gv для DokuWiki. Там всё тупо:
$retval = exec('/usr/bin/dot -Gsize="5,4" -Tps '.$tmpdotfile.' -o '.$filename);


Так делать приемлемо?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 08.12.06 06:39
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>
LCR>$retval = exec('/usr/bin/dot -Gsize="5,4" -Tps '.$tmpdotfile.' -o '.$filename);
LCR>

LCR>Так делать приемлемо?

Не хотелось бы. Много накладных расходов. Андрей
Автор: anvaka
Дата: 03.12.06
не применёт написать сообщение, которое так просадит сервер, что мало не покажется.

Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[4]: Тэг [graphviz]
От: akasoft Россия  
Дата: 08.12.06 10:35
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.


В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?
... << RSDN@Home 1.2.0 alpha rev. 668>> SQLE 2005
Re[5]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 08.12.06 11:42
Оценка:
akasoft,

БП>>Второй момент, может быть даже более важный в том, что если тупо собрать exe-шник из исходников, то рано или поздно окажется, что в нём есть какой-нибудь Buffer Overflow и нас через него сломают злые хакеры.


A>В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?


Кстати, да. Если это будет нативная библиотека, и к ней враппер на дотнете, это нам чем нибудь грозит?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 10.12.06 01:56
Оценка: 60 (6)
Павел,

Я залил сборки к себе в профиль:
http://rsdn.ru/File/10144/NGraphviz.dll
http://rsdn.ru/File/10144/NGraphviz.Helpers.dll
http://rsdn.ru/File/10144/NGraphviz.Layout.dll

Использование:
using System;
using NGraphviz.Helpers;

public class HelloWorld
{
    public static void Main()
    {
        System.Console.WriteLine("Ok, let's rock!");
        String dotstring = @"
            digraph g              
            { 
            size=""6,7""
            graph [
                rankdir = ""LR""
            ];
            node [
                fontsize = ""16""
                shape = ""ellipse""
            ];
                edge [
            ];
            ""node0"" [
                label = ""<f0> 0x10ba8| <f1>""
                shape = ""record""
            ];
            ""node1"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |-1""
                shape = ""record""
            ];
            ""node2"" [
                label = ""<f0> 0xf7fc44b8| | |2""
                shape = ""record""
            ];
            ""node3"" [
                label = ""<f0> 3.43322790286038071e-06|44.79998779296875|0""
                shape = ""record""
            ];
            ""node4"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |2""
                shape = ""record""
            ];
            ""node5"" [
                label = ""<f0> (nil)| | |-1""
                shape = ""record""
            ];
            ""node6"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |1""
                shape = ""record""
            ];
            ""node7"" [
                label = ""<f0> 0xf7fc4380| <f1> | <f2> |2""
                shape = ""record""
            ];
            ""node8"" [
                label = ""<f0> (nil)| | |-1""
                shape = ""record""
            ];
            ""node9"" [
                label = ""<f0> (nil)| | |-1""
                shape = ""record""
            ];
            ""node10"" [
                label = ""<f0> (nil)| <f1> | <f2> |-1""
                shape = ""record""
            ];
            ""node11"" [
                label = ""<f0> (nil)| <f1> | <f2> |-1""
                shape = ""record""
            ];
            ""node12"" [
                label = ""<f0> 0xf7fc43e0| | |1""
                shape = ""record""
            ];
            ""node0"":f0 -> ""node1"":f0 [id = 0];
            ""node0"":f1 -> ""node2"":f0 [id = 1];
            ""node1"":f0 -> ""node3"":f0 [id = 2];
            ""node1"":f1 -> ""node4"":f0 [id = 3];
            ""node1"":f2 -> ""node5"":f0 [id = 4];
            ""node4"":f0 -> ""node3"":f0 [id = 5];
            ""node4"":f1 -> ""node6"":f0 [id = 6];
            ""node4"":f2 -> ""node10"":f0 [id = 7];
            ""node6"":f0 -> ""node3"":f0 [id = 8];
            ""node6"":f1 -> ""node7"":f0 [id = 9];
            ""node6"":f2 -> ""node9"":f0 [id = 10];
            ""node7"":f0 -> ""node3"":f0 [id = 11];
            ""node7"":f1 -> ""node1"":f0 [id = 12];
            ""node7"":f2 -> ""node8"":f0 [id = 13];
            ""node10"":f1 -> ""node11"":f0 [id = 14];
            ""node10"":f2 -> ""node12"":f0 [id = 15];
            ""node11"":f2 -> ""node1"":f0 [id = 16];
            }";


        new Dot().Run(GraphvizImageType.Png, dotstring, "out.png");
    }
}

Выдаёт такую картинку:


Намано?

PS0: Не рекомендуется в качестве пути файла вводить путь к шаре
PS1: К сожалению реализован только алгоритм dot, алгоритмы neato, twopi, fdp, circo — увы (пока?).
PS2: А можно тэг будет [gv][/gv]? (Для других алгоритмов (если таковые появятся) сделать тэги типа [gv=neato][/gv]).
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: Тэг [graphviz]
От: Блудов Павел Россия  
Дата: 11.12.06 02:04
Оценка:
Зд7равствуйте, Lazy Cjow Rhrr, Вы писали:

A>>В смысле, ты хочешь, чтобы это был порт на .NET 2.0 в исходниках?

LCR>Кстати, да. Если это будет нативная библиотека, и к ней враппер на дотнете, это нам чем нибудь грозит?
Ну я бы попробовал для начала собрать Win32 версию, затем помучил бы её каким-нибудь BoundsChecker'ом.
Смущают меня конструкции типа (lefty\ws\mswin32\gpcanvas.c)
    brush = CreateSolidBrush (PALETTEINDEX (1));
    SelectObject (GC, brush);
    pen = CreatePen (PS_SOLID, 1, PALETTEINDEX (1));
    SelectObject (GC, pen);


Если нативная библиотека будет вести себя прилично, то написать к ней рапер на c# труда не составит, на с++/clr тем более.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.