Поддерживает ли язык 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"]
}