2009-05-06 21 views
5

Próbuję narysować wykres zależności między plikami nagłówkowymi C za pomocą graphviz.Etykiety krawędzi GraphViz

Zasadniczo, co robię jest rejestrowanie wszystkich #include, które pojawiają się i warunek (warunki #if mam na myśli). Jeśli plik zawiera inny, staje się jego ojcem na wykresie, a potencjalnym warunkiem jest etykieta krawędzi.

Otrzymuję dość duży wykres. Problem wynika z etykiet skrajnych, które są zawsze poziome (nie można tego zmienić) i zawsze wydają się być wyrównane do lewej (próbowałem labelloc i labeljust, ale nic nie zmienia.) Jaki jest właściwy sposób "centrowania"? Aby uniknąć tego problemu, próbowałem wyrenderować warunki jako węzły.Jeśli Ah zawiera Bh pod warunkiem ANSI, istnieje łącze od Ah do ANSI, a następnie od ANSI do Bh .. To wygląda OK, ale problem polega na tym, że jeśli Ch obejmuje Dh w tym samym stanie, zobaczyłbym link od Ah do ANSI, jeden od do Ch do ANSI, jeden z ANSI do Bh i jeden z ANSI do Dh. nie wiem, czy to jest Ah, czy Ch, które obejmuje Bh. Czy istnieje sposób określenia czegoś takiego jak przejście przez węzły (link od Ah do Bh, który przechodzi pod ANSI może wykorzystujący przezroczystość).

+0

używasz domyślnego rankdir (= TB?) Jak długo etykiety brzegowe? –

+0

Tak, używam domyślnego rankdir ... Etykiety mogą być dość długie, jeśli masz kilka opcji konfiguracji połączonych. To też jeden problem (ale mógłbym dodać nową linię z \ l lub \ n ..) – LB40

Odpowiedz

4

Labelloc i labeljust są bez znaczenia dla krawędzi. Zobacz here, oznacza "GC" odpowiednio jako wykres, klaster lub "N" jako węzeł.

Można jednak rozważyć wygenerowanie unikatowych węzłów dla każdego warunku z etykietami. Wtedy będzie wiele węzłów z różnymi "identyfikatorami kropek", ale ta sama etykieta (tekst warunku), więc byłoby jasne, czy było to A.h lub C.h, które obejmowały B.h. Myślę, że będziesz zadowolony z wyników, ponieważ już oświadczyłeś, że wygląda dobrze.

Powodzenia!

+0

dzięki za odpowiedź ... to wydaje się być dobrym pomysłem ... Spróbuję tego – LB40

2

Osiągnąłem wiele sukcesów, używając unikatowych węzłów z tą samą etykietą, w zależności od tego, co ilustruję. Ciekawym sposobem uzyskania złudzenia etykiety krawędziowej, której wymaga się, jest użycie węzła o kształcie = tekst zwykły.

Można użyć tego również stanowić punkt przyłączenia - posiada pewną liczbę krawędzi udających się do lub z węzła słownym, jak pokazano poniżej:

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" 
} 
+0

problemem jest to, że mam statek relacji relacji. Jeśli ac zawiera ah, jeśli mam CONFIG_X, a bc zawiera bh z tym samym CONFIG_X ... Miałem jeden link od ac do CONFIG_X, jeden z bc do CONFIG_X i dwa łącza z CONFIG_X do ah i bh ... patrząc na wykres, skąd mam wiedzieć, czy jest to ac lub bc, który zawiera ah i bh? – LB40

+0

W tym przypadku użyłbym po prostu CONFIG_X jako etykiety include na krawędzi od a.c do a.h LUB jeśli używasz podejścia jawnego, masz dwa węzły tekstowe CONFIG_X_A i CONFIG_X_B oba z etykietą = "CONFIG_X". –