Поддерживает ли язык DOT переменные/псевдонимы?
Я пытаюсь распечатать ориентированный граф, и я продолжаю изменять различные атрибуты узла, такие как цвет и форма. Есть ли способ использовать переменную, которая определена один раз и используется для нескольких узлов? В идеале мне бы хотелось что-то вроде этого:
digraph g {
building_color = "red"
land_color = "green"
farm [ fillcolor=land_color]
barn [ fillcolor=building_color]
house [ fillcolor=building_color]
}
Поэтому я могу изменить цвет здания один раз, не переходя к каждому узлу. Это возможно?
Ответы
Ответ 1
Вы можете определить значения по умолчанию, чтобы избежать повторения:
digraph g{
node[fillcolor=red];
barn;
house;
...
node[fillcolor=green];
farm;
...
edge[color=red];
barn -> house;
edge[color=green];
barn --> farm;
house --> farm;
}
Реальные переменные не поддерживаются.
Более сложным решением было бы использовать gvpr
graph pattern scan и язык обработки.
gvpr
считывает и выводит график и позволяет добавлять и изменять графики, узлы и атрибуты.
Например, вы можете хранить пользовательскую информацию в атрибуте comment
и активировать свой скрипт на основе содержимого этого атрибута.
В этом и этом SO-ответе содержатся примеры скриптов gvpr
.
Ответ 2
Самое простое решение - использовать 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]
}
Запустить 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"]
}