Странное расположение ребер в Graphviz Dot - PullRequest
4 голосов
/ 05 ноября 2010

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

digraph {
node [shape = record];
n0[label="{<name> entry | <body> store i, 0\nstore sum, 0\ngoto test | {<target> target}}"];
n1[label="{<name> test | <body> t2 = load i\nif t4, body,   done | {<true> true | <false> false}}"]
n2[label="{<name> body | <body> t5 = load sum\ngoto test | {<target> target}}"];
n3[color=firebrick3, label="{<name> done | <body> t9 = load sum\nret t9}}"];
n0:target:s -> n1:name:n
n1:true:s -> n2:name:n
n1:false:s -> n3:name:n
n2:target:s -> n1:name:n
}

И изображение:

http://img529.imageshack.us/img529/3780/graphviz.png

Что можно сделать, чтобы крайот 'target' до 'test' находится слева?

1 Ответ

9 голосов
/ 21 декабря 2010

Самый простой способ, не связанный с гуру, - это заставить эту своенравную связь присоединиться к «западным» сторонам.

n2:target:w -> n1:name:w

Это может работать нормально для этого случая. Более общий способ, но требует больше размышлений и кодирования, но позволил бы ребру присоединиться к: s и: n, если вы этого хотите, это добавить невидимый узел нулевого размера (цвет = белый, или может быть видимость атрибут) и получить от n2 до n1, используя два ребра. Держите стрелку только на одном из них. Невидимый узел должен был бы сидеть слева от n1 или n2. Увы, мой графвис-фу недостаточно силен, чтобы создать работающий пример; может быть, кто-то еще может его создать.

alt text

...