2013-02-02 2 views
14

Sto provando a stampare un grafico diretto e continuo a modificare vari attributi del nodo come il colore e la forma. C'è un modo per usare una variabile che viene definita una volta e utilizzata per più nodi? Idealmente vorrei qualcosa del genere:Il linguaggio DOT supporta variabili/alias?

digraph g { 

building_color = "red" 
land_color = "green" 

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

} 

Così posso cambiare colore una volta senza dover andare su ogni nodo. È possibile?

risposta

14

È possibile definire i valori di default al fine di evitare ripetizioni:

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

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

veri variabili non sono supportate.


Una soluzione più complessa sarebbe quella di utilizzare gvpr - grafico modello di scansione e linguaggio di elaborazione.

gvpr letture e output grafico e consente di aggiungere e modificare grafici, nodi e attributi.

È possibile ad esempio memorizzare informazioni personalizzate nell'attributo comment e fare in modo che lo script funzioni in base al contenuto di questo attributo.

This e this La risposta di SO contiene esempi di script gvpr.

8

La soluzione più semplice è utilizzare 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

risultante SampleGraph.dot:

digraph g { 




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