Domanda

Sto cercando di utilizzare graphviz sulla wiki media come strumento di documentazione per il software.

In primo luogo, ho documentato alcune relazioni di classe che ha funzionato bene. Tutto è stato classificato in verticale come previsto.

Ma, allora, alcuni dei nostri moduli sono DLL, che ho voluto separare in una scatola. Quando ho aggiunto i nodi a un cluster, hanno ottenuto bordati, ma cluster sembrano avere una regola classifica LR. O essere aggiunto a un cluster ha rotto la classifica TB dei nodi del cluster ora viene visualizzata sul lato del grafico.

Questo grafico rappresenta quello che sto cercando di fare. Al momento, cluster1 e cluster2 sembrano destro di cluster0

voglio / bisogno loro di comparire in basso.

<graphviz>
digraph d {
    subgraph cluster0 {
      A -> {B1 B2}
      B2 -> {C1 C2 C3}
      C1 -> D;
    }
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }
    subgraph cluster2 { 
      C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}
</graphviz>

È stato utile?

Soluzione

Il layout è un tentativo da parte di Dot per ridurre al minimo l'altezza complessiva.

Una ragione per la più compatta rispetto layout richiesto è l'uso del bordo che va nella direzione inversa da dll1_a B1 . Si cerca di tirare il gruppo più vicino al nodo di destinazione possibile. Per evitare questo bordo influenzare il grafico, sia rilassare il constraint sulle upwards bordi, come illustrato, o disegnare il bordo in avanti e utilizzare il dir attributo per invertire la freccia .

Questo vi aiuterà con molti layout, ma da sola non è sufficiente a correggere l'esempio dato. Per evitare che Dot di mantenere il layout compatto che preferisce è possibile aggiungere un minlen di attributo ai bordi che dovrebbe rimanere (quasi) verticale. Questo può essere difficile da calcolare in generale, ma è pratico per i layout sintonizzati manualmente.

digraph d {
    subgraph cluster0 {
        A -> {B1 B2}    
        B2 -> {C1 C2 C3}
        C1 -> D;
    }
    subgraph cluster1 {
        C2 -> dll1_A [minlen = 2];
        dll1_A -> B1 [constraint = false];
        /* B1 -> dll1_A [dir = back]; */
    }
    subgraph cluster2 {
        C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}

Layout Corretto

Altri suggerimenti

La mia esperienza dimostra che constraint=false dà comunemente bordi inutilmente complesse. Sembra che weight=0 dà risultati migliori:

digraph d {
    subgraph cluster0 {
        A -> {B1 B2}    
        B2 -> {C1 C2 C3}
        C1 -> D;
    }
    subgraph cluster1 {
        C2 -> dll1_A [minlen = 2];
        dll1_A -> B1 [weight = 0];
        /* B1 -> dll1_A [dir = back]; */
    }
    subgraph cluster2 {
        C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}

Questo produrrà il grafico che si sta cercando:

digraph d {
  subgraph cluster0 {
    A -> {B1 B2}
    B2 -> {C1 C2 C3}
    C1 -> D;
  }

  subgraph {
    rankdir="TB"
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }

    subgraph cluster2 {
      C3 -> dll2_A;
    }
  }
  dll1_A -> dll2_A;
}

Quello che fa è creat un sottografo che viene utilizzato solo per scopi di layout per fornire la parte superiore di ordinare in basso che si desidera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top