你能在GraphViz中构建可重用的样式吗?

时间:2014-12-03 02:06:56

标签: graphviz flowchart

我正在使用graphviz来创建流程图。我每次都通过设置节点和边缘属性来更改样式:

node[shape="box", 
     style="filled, rounded", 
     fillcolor=lightyellow, 
     fontname="Verdana", 
     fontsize=9, 
     penwidth=.5, 
     color="gray83"]
   start, end;

在平行四边形,矩形,菱形等中包含此声明和其他类似声明有点痛苦。

我希望能够引用可重复使用的样式文档,而不是复制并粘贴到每个.dot文件中。

有没有标准的方法来做到这一点?我可以潜在地构建一个shell脚本或python脚本来为我做这个,但似乎功能应该已经存在。

7 个答案:

答案 0 :(得分:27)

"有时答案是“没有”。'。"

所以,没有。 GraphViz缺乏"命名样式的概念"在Microsoft Word和LibreOffice这样的文字处理器中看到,缺乏风格" class"来自HTML和CSS的概念。它的格式属性更原始,在许多情况下,必须明确说明。

您可以设置一些默认值,例如finite state machine example

node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
node [shape = circle];

在这里,您将默认为圆形(最后定义的形状),并显式调用先前在先前默认值(doublecircle)下声明的少数节点。这对某些设计来说是方便的,但它需要很好的预先计划(例如,声明订单项)。您有时可以使用subgraph功能来帮助按组as this Stack Overflow answer shows组织默认值。

但默认设置对我们这些习惯于表达简单类型机制的人来说是一种小小的安慰。查看文档的其余部分可以确认,虽然您可以对文本使用一些HTML样式元素,但它们仅限于<b><i>等HTML标记。这是大约2001年的原始HTML样式,在优质CSS传播之前。

也不要被stylesheet属性所欺骗;它仅适用于SVG输出,并且令人失望地比它最初看起来更不普遍和有价值。

所以,长话短说,&#34;没有。&#34; GraphViz没有内置的可重用样式元素。如果您需要,则必须使用程序,宏前导或类似程序单独构建它。遗憾!

答案 1 :(得分:3)

是的。

在节点或边中使用class属性。 使用图中的stylesheet属性(或在CLI中传递-Gstylesheet = whatever.css。

样式表是普通的CSS。类似于HTML中的类。

你需要非常新的graphviz来实现这个目的。

示例:

https://ralsina.gitlab.io/boxes-book/part3/git_3.svg

如果您查看来源,您会看到它加载https://ralsina.gitlab.io/boxes-book/styles/forest.css,其中包含所有样式。

它适用于SVG输出(这是良好的输出; - )

答案 2 :(得分:1)

是的,但是不能单独使用GraphViz。

如前所述,C预处理程序可用于创建一些非常好的模板。

DOT文件示例:

#define _STR(x) #x
#define STR(x) _STR(x)

#define STYLE1 shape="box",style="filled, rounded", fillcolor=lightyellow
#define _STYLE2_l(A,B) {{<ia>|<ib>}|A|B}
#define STYLE2(A,B) shape="record" label=STR(_STYLE2_l(A,B))

digraph Orthogonal {
    graph [rankdir=LR];

    a[STYLE1,label="a"];
    b[STYLE2(B1,B2)];
    c[STYLE1,label="c"];
    d[STYLE2(D1,D2)];

    a->b:ia;
    c->d:ib;
    b->c;
    b->d:ia;
}

已创建两个样式模板。在预处理过程中,“ STYLE1”仅被其定义替换。 “ STYLE2”稍微复杂一点,它显示了模板中参数/参数的使用。它是由几个宏构成的。

可以使用以下方式呈现文件:

cpp graph_file.gv | dot -Tpng >out.png

所有输出模式均应工作。结果是:

Example Graph

答案 3 :(得分:0)

您可以使用c预处理器和#include

某些c预处理器将输出将生成以#开头的行以指示原始行号,但GraphViz可以使用这些行。 来自GraphViz doc“The DOT language”: ...此外,以“#”字符开头的行被视为来自C预处理器的行输出(例如,#34表示第34行)并被丢弃。

答案 4 :(得分:0)

可以通过类似于answer的可解决方法来解决此问题:

// define some nodes which shall have common style properties:
myNode1, myNode2, myNode3 [shape="box", style="filled, rounded", ...]

// now you can define custom style properties for each node, f.e. the labels
myNode1 [label="my fancy label for node 1"]
myNode2 [label="my fancy label for node 2"]

// you can then define another common style for other nodes:
myHexNode1, myHexNode2 [shape="hexagon", ...]

// now you can define custom style properties for each node, f.e. the lables
myHexNode1 [label="my hexnode 1 text"]
myHexNode2 [label="my hexnode 2 text"]

// and now the edges
myNode1 -> myHexNode1 -> myNode2 -> myHexNode2;

答案 5 :(得分:0)

虽然我真的很喜欢cpp解决方案,但是我发现一个缺点:任何非开发人员不仅必须学习如何使用cpp(或python,m4,awk,snobol或其他方法),而且还必须弄清楚在哪里使用查找以及如何安装该软件包。非Linux用户处于特别不利的地位。

答案 6 :(得分:0)

并非直接在Graphviz中使用,但是Excel to Grapvhiz Relationship Visualizer可以根据其在Sourceforge上的功能列表来做到这一点:

...
样式编辑器,用于直观地定义Node,Edge和Cluster属性
按名称保存样式定义以供重复使用,并包括预定义的流程图形状
...

在同一Sourceforge页面上,有一个截图显示了此功能:

enter image description here