5

我正在尝试使用 graphviz 绘制 C 头文件之间的依赖关系图。

基本上,我正在做的是记录所有出现的#include 和条件(我的意思是#if 条件)。如果一个文件包含另一个文件,则它在图中成为它的父亲,潜在条件是边缘标签。

我得到一个相当大的图表。问题源于始终水平的边缘标签(您无法更改它)并且似乎总是左对齐(我尝试过 labelloc 和 labeljust 但它没有改变任何东西。“居中”的正确方法是什么?一条边的标签。

为了避免这个问题,我尝试将条件渲染为节点。如果 Ah 在 ANSI 条件下包含 Bh,则存在从 Ah 到 ANSI,然后从 ANSI 到 Bh 的链接。这看起来不错,但问题是如果 Ch 在相同条件下包含 Dh,我会看到从 Ah 到 ANSI 的链接, 一个从到 Ch 到 ANSI;一个从 ANSI 到 Bh ,一个从 ANSI 到 Dh 。问题是我不知道是 Ah 还是 Ch 包含 Bh 。有没有办法指定诸如通过节点之类的东西(ANSI下的从Ah到Bh的链接可能利用了透明度。)

4

2 回答 2

4

labelloc 和 labeljust 对边缘没有意义。请参见此处,它分别将“GC”表示为 Graph、Cluster 或“N”表示为 Node。

但是,您可以考虑为每个带有标签的条件生成唯一节点。然后会有多个节点具有不同的“点 ID”,但具有相同的标签(条件文本),因此很清楚它是否包含A.hC.h包含B.h。我认为您会对结果感到满意,因为您已经说过它看起来不错。

祝你好运!

于 2009-05-06T17:57:36.953 回答
2

根据我所说明的内容,我使用具有相同标签的唯一节点取得了很多成功。根据需要获得边缘标签居中错觉的一种有趣方法是使用 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"
}
于 2009-05-27T16:09:05.650 回答