2013-02-02 12 views
14

Próbuję wydrukować ukierunkowany wykres i ciągle zmieniam różne atrybuty węzła, takie jak kolor i kształt. Czy istnieje sposób użycia zmiennej, która jest zdefiniowana raz i używana dla wielu węzłów? Idealnie chciałbym coś takiego:Czy język DOT obsługuje zmienne/aliasy?

digraph g { 

building_color = "red" 
land_color = "green" 

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

} 

Dzięki temu mogę zmienić kolor budynku raz bez konieczności przechodzenia do każdego węzła. czy to możliwe?

Odpowiedz

14

Można zdefiniować domyślnych w celu uniknięcia powtórzeń: zmienne

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

    edge[color=red]; 
    barn -> house; 
    edge[color=green]; 
    barn --> farm; 
    house --> farm; 
} 

Biura nie są obsługiwane.


Bardziej złożone Rozwiązaniem byłoby użyć gvpr - wykres skanowania obszaru i język przetwarzania.

gvpr odczytuje i generuje wykres oraz pozwala dodawać i modyfikować wykresy, węzły i atrybuty.

Można na przykład przechowywać niestandardowe informacje w atrybucie comment i mieć działanie skryptu w oparciu o zawartość tego atrybutu.

This i this Odpowiedź zawierająca przykłady skryptów gvpr.

8

Najprostszym rozwiązaniem jest użycie m4 - a generic text-to-text preprocessor.

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 m4 SampleGraph.dot.m4 > SampleGraph.dot

Wynikające SampleGraph.dot:

digraph g { 




    farm [label="Farm", style=filled, fillcolor = "green"] 
    barn [style=filled, fillcolor = "red"] 
    house [label="House", style=filled, fillcolor = "red"] 
}