DOT语言是否支持变量/别名?

She*_*hep 25 graphviz

我正在尝试打印有向图,并且我不断更改各种节点属性,例如颜色和形状.有没有办法使用一次定义并用于多个节点的变量?理想情况下,我喜欢这样的事情:

digraph g { 

building_color = "red"
land_color = "green"

farm  [ fillcolor=land_color]
barn  [ fillcolor=building_color]
house  [ fillcolor=building_color]

}
Run Code Online (Sandbox Code Playgroud)

所以我可以改变建筑颜色一次,而不必去每个节点.这可能吗?

mar*_*pet 20

您可以定义默认值以避免重复:

digraph g{
   node[fillcolor=red];
   barn;
   house;
   ...
   node[fillcolor=green];
   farm;
   ...

   edge[color=red];
   barn -> house;
   edge[color=green];
   barn --> farm;
   house --> farm;
}
Run Code Online (Sandbox Code Playgroud)

不支持变量.


更复杂的解决方法是使用gvpr- 图形模式扫描和处理语言.

gvpr 读取和输出图形,允许添加和修改图形,节点和属性.

例如,您可以在comment属性中存储自定义信息,并让您的脚本根据此属性的内容执行操作.

这个这个 SO答案包含gvpr脚本的例子.


Dee*_*ter 17

最简单的解决方案是使用m4- 通用的文本到文本预处理器.

SampleGraph.dot.m4:

digraph g { 

   define(`building_style',`style=filled, fillcolor = "red"')
   define(`land_style',`style=filled, fillcolor = "green"')

   farm  [label="Farm", land_style]
   barn  [building_style]
   house [label="House", building_style]
}
Run Code Online (Sandbox Code Playgroud)

m4 SampleGraph.dot.m4 > SampleGraph.dot

结果SampleGraph.dot:

digraph g { 




   farm  [label="Farm", style=filled, fillcolor = "green"]
   barn  [style=filled, fillcolor = "red"]
   house [label="House", style=filled, fillcolor = "red"]
}
Run Code Online (Sandbox Code Playgroud)