2016-08-05 16 views
14

Я создаю несколько диаграмм активности UML с dot-graphviz, а ребра/стрелки (2+) сходятся в одной и той же точке, когда целевая фигура является суженным прямоугольником (H = 0,5, W = 0,05). Эта проблема не возникает, если целевой формой является квадрат (H = 0,5, W = 0,5).Увеличьте разделение ребер в graphviz

Ниже приведенная точка пример:

digraph G { 
graph [ ranksep = 0.5, rankdir = LR ] 
A4 [ shape = "record", height = 0.5, fontsize = 10, margin = "0.20,0.05", label = "Output\ to\rPreviewer", style = "rounded" ] 
A5 [ shape = "rectangle", height = 0.5, width = 0.05, margin = "0,0", style = "filled", label = "" ] 
A4 -> A5 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
A6 [ shape = "diamond", height = 0.5, width = 0.5, margin = "0,0", label = "" ] 
A6 -> A5 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10, label = "[generate: false]" ] 
A7 [ shape = "record", height = 0.5, fontsize = 10, margin = "0.20,0.05", label = "Output\ to\rFile", style = "rounded" ] 
A6 -> A7 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10, label = "[generate: true]" ] 
A8 [ shape = "doublecircle", height = 0.3, width = 0.3, margin = "0,0", label = "" ] 
A7 -> A5 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
A5 -> A8 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
} 

текст выше генерирует следующий график в http://webgraphviz.com

Current output

Желательный выход следующий

Desired output

+1

Вы можете попробовать 'A6 -> A5: nw' и 'A7 -> A5: sw'. Не дает вам точно ваш желаемый результат, но по крайней мере отделяет края. – vaettchen

+0

@vaettchen, это не похоже на универсальное решение и очень специфично для приведенного примера. Это не помогло бы, если бы было 4 ребра. – Jaime

+0

Правильно - я попробовал решение для этого конкретного вопроса. Возможно, вы отредактируете свое сообщение, говоря, что ищете универсальное решение для большего количества ребер/стрелок. – vaettchen

ответ

2

Я нашел твик, который производит хороший выход, но требует много обработки и края счетов и направление сознания:

digraph G { 
graph [ ranksep = 0.5, rankdir = LR ] 
A4 [ shape = "record", height = 0.5, fontsize = 10, margin = "0.20,0.05", label = "Output\ to\rPreviewer", style = "rounded" ] 
A5 [ shape = "record", height = 0.5, width = 0.05, margin = "0,0", style = "filled", label = "<f0>|<f1>|<f2>", fillcolor="black" ] 
A4 -> A5:f0:w [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
A6 [ shape = "diamond", height = 0.5, width = 0.5, margin = "0,0", label = "" ] 
A6 -> A5:f1:w [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10, label = "[generate: false]" ] 
A7 [ shape = "record", height = 0.5, fontsize = 10, margin = "0.20,0.05", label = "Output\ to\rFile", style = "rounded" ] 
A6 -> A7 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10, label = "[generate: true]" ] 
A8 [ shape = "doublecircle", height = 0.3, width = 0.3, margin = "0,0", label = "" ] 
A7 -> A5:f2:w [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
A5 -> A8 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
} 

Это выход:

enter image description here

Я еще бы как узнать, есть ли более простое решение.

+0

Я принимаю свой собственный ответ, поскольку он дал лучший результат и может быть расширен до любого количества ребер. – Jaime

1

Вы можете указать порт вывода всех ребер в east и получить preaty хороший результат (по крайней мере, для этого случая):

digraph G { 
     graph [ ranksep = 0.5, rankdir = LR ] 
     edge [tailport=e]     # <----- added this line 
     A4 [ shape = "record", height = 0.5, fontsize = 10, margin = "0.20,0.05", label = "Output\ to\rPreviewer", style = "rounded" ] 
     A5 [ shape = "rectangle", height = 0.5, width = 0.05, margin = "0,0", style = "filled", label = "" ] 
     A4 -> A5 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
     A6 [ shape = "diamond", height = 0.5, width = 0.5, margin = "0,0", label = "" ] 
     A6 -> A5 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10, label  = "[generate: false]" ] 
     A7 [ shape = "record", height = 0.5, fontsize = 10, margin = "0.20,0.05", label = "Output\ to\rFile", style = "rounded" ] 
     A6 -> A7 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10, label  = "[generate: true]" ] 
     A8 [ shape = "doublecircle", height = 0.3, width = 0.3, margin = "0,0", label = "" ] 
     A7 -> A5 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
     A5 -> A8 [ shape = "edge", dir = "both", style = "solid", arrowtail = "none", arrowhead = "vee", labeldistance = 1, fontsize = 10 ] 
} 

продукции:

results

+0

Привет, Огад, это была хорошая альтернатива - первый взгляд, но это просто совпадение для приведенного примера. Попробуйте прокомментировать строку 'A7 -> A5', и исходный эффект снова появится. – Jaime

+0

Хотя это не совпадение, вы правы, это не решение для всех случаев –