Насколько я знаю, это требует небольшого обходного решения; Я буду делать это только на языке Graphviz DOT. Сначала я дам вам решение, а затем объясню, как вы можете его расширить.
Это итоговая цифра:
Это код Graphviz, создающий фигуру:
graph atree {
Item1 [shape=none,label="Item 1",pos="2.2,1.1!"];
Item2 [shape=none,label="Item 2",pos="2.2,0.1!"];
Item3 [shape=none,label="Item 3",pos="2.9,-0.3!"];
A [shape=box,color=lightblue,style=filled,pos="2,3!"];
B [shape=box,color=lightblue,style=filled,pos="1,2.1!"];
C [shape=box,color=lightblue,style=filled,pos="3,2.1!"];
D [shape=box,color=lightblue,style=filled,pos="1.5,1.5!"];
E [shape=box,color=lightblue,style=filled,pos="1.5,0.5!"];
D0 [style=invisible,fixedsize=true,width=0,height=0,pos="2,2.5!",label=""];
D1 [style=invisible,fixedsize=true,width=0,height=0,pos="1,2.5!",label=""];
D2 [style=invisible,fixedsize=true,width=0,height=0,pos="3,2.5!",label=""];
D3 [style=invisible,fixedsize=true,width=0,height=0,pos="1,1.5!",label=""];
D4 [style=invisible,fixedsize=true,width=0,height=0,pos="1,0.5!",label=""];
D5 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,1.1!",label=""];
D6 [style=invisible,fixedsize=true,width=0,height=0,pos="1.5,0.1!",label=""];
D7 [style=invisible,fixedsize=true,width=0,height=0,pos="2.2,-0.3!",label=""];
A -- D0 -- D1 -- B -- D3 -- D4 -- E [color=blue];
E -- D6 -- Item2 -- D7 -- Item3 [color=blue];
D0 -- D2 -- C [color=blue];
D3 -- D -- D5 -- Item1 [color=blue];
}
Если вы поместите его в файл с именем inputfile.dot
, вы можете получить полученный файл изображения с помощью команды neato -Tpng inputfile.dot > outfile.png
.
Теперь пара комментариев о том, как это работает: код, строящий дерево с A, B, C, D, E, Item1, Item2, Item3
, прост (атрибуты просто задают цвета и стили ящиков). Хитрость для получения прямых и ортогональных линий состоит в 1) добавлении невидимых узлов с нулевым размером к графику и 2) позиционировании всех объектов в абсолютных координатах на холсте. Вспомогательные узлы D1, D2, D3, D4, D5, D6, D7
необходимы для шага 1), а опции pos="x,y!"
необходимы для шага 2). Обратите внимание, что вам нужен знак !
в конце команды pos
, так как в противном случае позиции не будут считаться окончательными, а расклад все равно будет изменен.
Вы можете добавить дополнительные узлы, сначала разместив новый узел (используя код для узлов A ... Item3
в качестве шаблона), добавив невидимый вспомогательный узел (с pos
таким образом, чтобы все соединения с ним и с него были ортогональный), а затем добавление соединения к графику через <StartingNode> -- <AuxiliaryNode> -- <NewNode>
.