graphviz - предотвращает перекрытие узлов и ребер без сплайнов - PullRequest
0 голосов
/ 19 января 2020

У меня есть простой график fdp, выложенный в graphviz, с кучей узлов (прямоугольной и ромбовидной), имеющих фиксированные позиции, а некоторые из этих узлов имеют дочерние узлы (овальной формы), которые я хочу расположить вокруг них автоматически .

Я хочу, чтобы все ребра в нем были прямыми, без кривых, полилиний или чего-либо еще (т. Е. Как указано splines=false), но я также хочу, чтобы эти дочерние узлы не перекрывались с ребрами между узлами с фиксированным позиции. Фиксированные позиции используются, так как мне нужны края между фиксированными узлами, чтобы они были полностью вертикальными или горизонтальными. Это то, чего я, вероятно, могу достичь, перебирая различные значения start и надеясь, что у следующего не будет перекрытий, но пока это немного утомительно.

digraph G {

###GRAPH
layout=fdp
overlap=false
dpi=150
splines=false
inputscale=0.4
# fdp specific:
K=0.50
maxiter=2000
start=1251

###OBJECTS
node[shape=rectangle width=1.0 height=0.4 fixedsize=true]

vendor[label="Поставщик" pos="3,1!"
]

item[label="Товар" pos="0,2!"
]

post[label="Поставка" pos="2,2!"
]

check[label="Чек" pos="1,1!"
]

prod[label="Продажа" pos="0,0!"
]


###SUBOBJECTS
node[shape=oval width=1.5 height=0.5]
edge[arrowhead=none]

{
vendork[label=<<u>ID поставщика</u>>] "Название\nпоставщика" "Контакт\nдля связи"
}->vendor

{
itemk[label=<<u>ID товара</u>>]
Название Тип Подтип Характеристики "Розничная цена"
}->item

{
postk[label=<<u>ID записи</u>>] post1[label="ID товара"]
post2[label="Кол-во"]       post3[label="Цена поставки"]
post4[label="Дата"]     post5[label="Квитанция"]
}->post

{
prodk[label=<<u>ID продажи</u>>]    prod1[label="ID товара"]
prod2[label="Кол-во"]           prod3[label="Цена\nпродажи"]
prod4[label="Чек"]
}->prod

{
checkk[label=<<u>ID чека</u>>] Дата Кассир "Сумма" "НДС" "Итого" "Вид оплаты"
}->check

###CONNECTIONS
node[shape=diamond]
edge[arrowhead=open]

vendorpost[label="Поставляет" pos="3,2!"
]
vendorpost->vendor
vendorpost->post[arrowhead=openopen]

postitem[label="Поставлен" pos="1,2!"
]
postitem->item
postitem->post[arrowhead=openopen]

itemprod[label="Продан" pos="0,1!"
]
itemprod->item
itemprod->prod[arrowhead=openopen]

prodcheck[label="Включает" pos="1,0!"
]
prodcheck->prod[arrowhead=openopen]
prodcheck->check
}

(простите за кириллицу)

Я компилирую без дополнительных параметров (например, dot -Tpng graph.gv > graph.png). До сих пор я получаю это.

Result with fdp

Я также пытался использовать Neato, но, в большинстве случаев, это дает довольно странный результат где кажется, что он полностью игнорирует фиксированные позиции узлов, и dr aws дочерние узлы, где он хочет:

Result with neato

Я прошел через список атрибутов в документации , и пока ни один из них, похоже, не решает проблему перекрытия узлов / ребер, кроме splines (если я что-то не пропустил). Что я должен сделать, чтобы достичь результата, которого я ищу?

Ответы [ 2 ]

0 голосов
/ 30 января 2020

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

###NO VERTICAL/HORIZONTAL EDGE/NODE INTERSECT HACK
node[style=invis]
node[width=0.1 height=2.0]
t1[label="" pos="0,1.5!"]
t2[label="" pos="0,0.5!"]
t3[label="" pos="1,0.5!"]
t4[label="" pos="3,1.5!"]
node[width=2.0 height=0.1]
t5[label="" pos="2.5,2!"]
t6[label="" pos="1.5,2!"]
t7[label="" pos="0.5,2!"]
t8[label="" pos="0.5,0!"]
node[style=normal]

И это делает то, что я хочу, то есть удаляет все перекрытия с фиксированными ребрами:

result with support beam hack

Однако это ограничивается только ребрами, которые находятся вертикально горизонтальный (обратите внимание, что в «дочерних» узлах все еще есть как минимум 1 перекрытие), и в целом это выглядит как действительно хакерское решение, так как мне приходится добавлять / изменять эти «опорные балки» каждый раз, когда я добавляю / изменяю больше узлов в своем графике , Есть ли лучшее решение для этого?

0 голосов
/ 29 января 2020

Существует несколько проблем:

  • layout = fdp вызывает использование механизма компоновки fdp независимо от того, что говорит командная строка
  • Use neato -n , если вы хотите закрепить позицию узла (см. Ниже)
  • , добавив ! к позиции, которую вы прибиваете по позиции (она выиграла) t change)
  • точка здесь не нужна, она направленная (сверху вниз)

Если вы удалите все ! Я думаю, вы получите то, что вы хотите. enter image description here

...