Метки краев GraphViz

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

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

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

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


person LB40    schedule 06.05.2009    source источник
comment
Используете ли вы rankdir по умолчанию (= TB?) Какова длина меток краев?   -  person Paweł Polewicz    schedule 06.05.2009
comment
да, я использую rankdir по умолчанию ... Ярлыки могут быть довольно длинными, если у вас объединено несколько параметров конфигурации. Это тоже одна проблема (но я мог бы добавить новую строку с помощью \ l или \ n ..)   -  person LB40    schedule 06.05.2009


Ответы (2)


labelloc и labeljust не имеют смысла для ребер. См. здесь, здесь написано "GC" как График, Кластер или «N» в качестве узла соответственно.

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

Удачи!

person Paweł Polewicz    schedule 06.05.2009
comment
спасибо за ответ ... кажется, это хорошая идея ... я попробую это - person LB40; 07.05.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"
}
person Andy Dent    schedule 27.05.2009
comment
проблема в том, что у меня есть отношения. Если ac включает ah, если у меня есть CONFIG_X, а bc включает bh с тем же CONFIG_X ... У меня была бы одна ссылка от ac к CONFIG_X, одна от bc к CONFIG_X и две ссылки от CONFIG_X к ah и bh ... посмотрев на График, как мне узнать, является ли это ac или bc, который включает ah и bh? - person LB40; 27.05.2009
comment
В этом случае я бы просто использовал CONFIG_X в качестве метки включения на границе от a.c до a.h ИЛИ, если вы используете подход с открытым текстом, имел бы два узла с открытым текстом: CONFIG_X_A и CONFIG_X_B, оба с label = CONFIG_X. - person Andy Dent; 27.05.2009