2011-11-19 4 views
8

È necessario disegnare un grafico complesso in cui saranno presenti 3 tipi di bordi e diversi tipi di nodi predefiniti.graphviz che definisce più "valori predefiniti"

È possibile definire un po 'di più (ad esempio non solo uno predefinito) "tipo di bordo" (o tipo di nodo) per l'uso successivo?

significare qualcosa come:

edge [colorscheme=paired12, color=8, fontsize=11, fontname="Arial narrow"]; 
edge2 [colorscheme=paired12, color=3, fontsize=11, fontname="Arial narrow", style=bold]; 
edge3 [colorscheme=paired12, color=5, fontsize=14, fontname="Arial narrow"]; 

node1 -> node2; /* will use the default edge definition from the above */ 
node2 -> node3 [edgetype=edge2]; /* will use the second edge definition */ 
node2 -> node4 [edgetype=edge3]; /* and so on... */ 

Quanto sopra, OFC, non è corretto - solo per una spiegazione ...

risposta

7

Utilizzando gvpr è semplice, se a capire le nozioni di base:

input.dot

digraph test { 
    node1 -> node2[label="test 1"]; /* will use the default edge definition from the above */ 
    node2 -> node3 [label="test 2", edgetype="edge2"]; /* will use the second edge definition */ 
    node2 -> node4 [label="test 3", edgetype="edge3"]; /* and so on... */ 
} 

filter.gvpr

E { 
    color="red"; 
    fontsize=11; 
    fontname="Arial narrow" 
} 
E[edgetype == "edge2"] { 
    color="green"; 
    fontsize=11; 
    fontname="Arial narrow"; 
    style="bold" 
} 
E[edgetype == "edge3"] { 
    color="blue"; 
    fontsize=14; 
    fontname="Arial narrow" 
} 

Con comando

gvpr -c -f filter.gvpr -o output.dot input.dot

produrrà il file output.dot:

digraph test { 
    node1 -> node2 [color=red, 
     fontname="Arial narrow", 
     fontsize=11, 
     label="test 1"]; 
    node2 -> node3 [color=green, 
     edgetype=edge2, 
     fontname="Arial narrow", 
     fontsize=11, 
     label="test 2", 
     style=bold]; 
    node2 -> node4 [color=blue, 
     edgetype=edge3, 
     fontname="Arial narrow", 
     fontsize=14, 
     label="test 3"]; 
} 
+1

wow! È fantastico! Grazie. ;) – jm666

+1

Prego, guarda https://github.com/ellson/graphviz/tree/master/cmd/gvpr/lib, per ulteriori (complessi) esempi che cosa puoi fare con 'gvpr'. – nepda

4

No, questo non è possibile.

Spesso raggruppo le definizioni dei bordi in base al loro tipo e ridefinisco il valore predefinito prima di ogni gruppo. Per esempio:

// type 1 edges 
edge [colorscheme=paired12, color=8, fontsize=11, fontname="Arial narrow"]; 
n1 -> n2; 
n3 -> n4; 
... 

// type 2 edges 
edge [colorscheme=paired12, color=3, fontsize=11, fontname="Arial narrow", style=bold]; 
n10 -> n11; 
... 

// type 3 edges 
edge [colorscheme=paired12, color=5, fontsize=14, fontname="Arial narrow"]; 
... 

Un altro - più complicata - possibilità sarebbe quella di utilizzare uno strumento come gvpr che consente di manipolare un grafico, e aggiungere attributi bordo in quel momento.

+0

Thanx, pulito idea ridefinire e raggruppare i bordi ... – jm666