Domanda

Sto cercando di tracciare un grafico delle dipendenze tra i file di intestazione C usando graphviz.

Fondamentalmente, quello che sto facendo è registrare tutti i #include che appaiono e la condizione (condizioni #if intendo). Se un file ne include un altro, diventa suo padre nel grafico e la potenziale condizione è l'etichetta del bordo.

Ottengo un grafico abbastanza grande. Il problema deriva dalle etichette dei bordi che sono sempre orizzontali (non è possibile modificarlo) e sembrano sempre allineate a sinistra (ho provato labelloc e labeljust ma non cambia nulla. Qual è il modo corretto di "centrare" ; l'etichetta di un bordo.

Per evitare questo problema, ho provato a rendere le condizioni come nodi. Se Ah include Bh in condizione ANSI, c'è un collegamento da Ah a ANSI e quindi da ANSI a Bh .. Sembra ok, ma il problema è che se Ch include Dh nelle stesse condizioni, vedrei un collegamento da Ah a ANSI , uno da a Ch a ANSI; uno da ANSI a B.h e uno da ANSI a D.h. Il problema è che non so se è A.h o C.h che include B.h. Esiste un modo per specificare qualcosa come passare attraverso i nodi (un collegamento da A.h a B.h che passa sotto ANSI potrebbe sfruttare la trasparenza.)

È stato utile?

Soluzione

labelloc e labeljust sono insignificanti per i bordi. Vedi qui , dice " GC " come grafico, cluster o " N " come Nodo, rispettivamente.

Tuttavia, potresti considerare di generare nodi univoci per ogni condizione con etichette. Quindi ci sarebbero più nodi con differenti "ID punto" e una stessa etichetta (testo della condizione), quindi sarebbe chiaro se fosse Ah o Ch a includere Bh . Penso che sarai soddisfatto dei risultati, poiché hai già dichiarato che sembra ok.

Buona fortuna!

Altri suggerimenti

Ho avuto molto successo usando nodi unici con la stessa etichetta, a seconda di cosa sto illustrando. Un modo interessante per centrare l'illusione di un'etichetta perimetrale come richiesto è usare un nodo con shape = plaintext.

Puoi usarlo anche per fornire un punto di unione - hanno un numero di spigoli che vanno al o dal nodo in chiaro come mostrato di seguito:

digraph joins {

node [shape=box weight=bold fontsize=18 color=black fontcolor=black]
edge [color=black fontcolor=black ]
graph[size="6,4",ratio=fill,center=1]

tblXXMaster[shape=record label="tblXXMaster | <f0>intMasterXXNumber | <f1>boolXXsPrinting"] 
set[shape=plaintext label="sets flag"]
setandclear[shape=plaintext label="sets next value\nand clears flag"]
setandclear->tblXXMaster:f0
setandclear->tblXXMaster:f1

set->tblXXMaster:f1
use[shape=plaintext label="uses current\nnumber"]
tblXXMaster:f0->use
XX[shape=plaintext label="XXs\nflag"]
tblXXMaster:f1->XX

"wndManualReceipt\n.procOne"->setandclear
"wndManualDebit\n.procOne"->setandclear
"wndApproveXXs\n.procOne\n.d005TempSetBitToZero"->setandclear
"wndPrintXXs\n.procZero\n.procOne"->setandclear
"wndUnapproveXXs\n.procZero\n.procOne"->setandclear
"wndWriteXXForMultipleInvoices\n.procOne\n.d005TempSetBitToZero"->setandclear
"wndWriteManualXX\n.procOne\n.procZero"->setandclear

"wndConfirmXXPrint\n.applyLock"->set
"wndConfirmMultiInvoiceXXPrint\n.applyLock"->set

use->"wndConfirmXXPrint\n.nextNumber"
use->"wndConfirmManualXXPrint\n.nextNumber"
use->"wndConfirmMultiInvoiceXXPrint\n.nextNumber"
XX->"wndConfirmManualXXPrint\n.doPrint"
XX->"wndConfirmMultiInvoiceXXPrint\n.doPrint"
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top