GraphViz края метки - PullRequest
       14

GraphViz края метки

5 голосов
/ 06 мая 2009

Я пытаюсь нарисовать график зависимостей между заголовочными файлами C, используя graphviz.

По сути, я делаю запись всех включенных #include и условий (я имею в виду условия #if). Если файл включает другой файл, он становится его отцом на графике, а потенциальным условием является метка края.

Я получаю довольно большой график. Проблема связана с метками ребер, которые всегда горизонтальны (вы не можете это изменить) и всегда кажутся выровненными по левому краю (я пробовал labelloc и labeljust, но это ничего не меняет. Какой правильный путь к центру метка одного края.

Чтобы избежать этой проблемы, я пытался отображать условия как узлы. Если Ah включает Bh при условии ANSI, есть ссылка от Ah до ANSI, а затем от ANSI до Bh. Это выглядит нормально, но проблема в том, что если Ch включает Dh при том же условии, я бы увидел ссылку от Ah до ANSI один от Ch до ANSI; один от ANSI до B.h и один от ANSI до D.h. Проблема в том, что я не знаю, является ли A.h или C.h включением B.h. Есть ли способ указать что-то вроде прохождения через узлы (ссылка от A.h до B.h, которая идет под ANSI, может усиливать прозрачность.)

Ответы [ 2 ]

4 голосов
/ 06 мая 2009

labelloc и labeljust не имеют смысла для краев. См. здесь , там написано "GC" как Graph, Cluster или "N" как Node, соответственно.

Однако вы можете рассмотреть возможность создания уникальных узлов для каждого условия с метками. Тогда было бы несколько узлов с разными «точечными идентификаторами», но с одной и той же меткой (текстом условия), поэтому было бы ясно, если бы это было A.h или C.h, что включало B.h. Я думаю, что Вы будете довольны результатами, так как Вы уже заявили, что все выглядит хорошо.

Удачи!

2 голосов
/ 27 мая 2009

Я имел большой успех, используя уникальные узлы с одинаковыми метками, в зависимости от того, что я иллюстрирую. Интересный способ сделать так, чтобы иллюзия краевой метки центрировалась так, как вам нужно, - это использовать узел с shape = plaintext.

Вы можете использовать это также для предоставления точки соединения - иметь ряд ребер, идущих к узлу открытого текста или от него, как показано ниже:

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"
}
...