График DOT от суперсостояния до подсостояния - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы сгенерировать код DOT, чтобы нарисовать эквивалентную диаграмму конечного автомата, показанную на рисунке. Я собираюсь быть создан программно, у меня есть переходы между состояниями и суперсостояниями. Но мне нужно немного помочь с этим:

Example state machine diagram

Это дает мне начальный переход, но State1 должен быть кластером:

digraph {
compound=true;
node [shape=Mrecord]
rankdir="LR"

subgraph clusterOpen
        {
        label = "State1"
        State2
}

State1 -> State2 [style="solid"];
 node [shape = point label="" ] i ->State1
} 

enter image description here

1 Ответ

1 голос
/ 10 марта 2020

Обычно программы Graphviz стараются избегать размещения узлов поверх других узлов. Но вы можете размещать узлы где угодно, если вы явно предоставляете атрибут pos для каждого узла (см. https://graphviz.org/faq/#FaqDotWithNodeCoords).
Программа, которая создает ваши входные файлы, должна вычислить pos атрибут для каждого узла. (Помните, что pos координаты находятся в точках , а размеры узлов в дюймах !). Возможно, вы можете пропустить вычисление сплайнов для ребер и просто позвольте neato сделать это.
Эта программа:

digraph {
    graph [bb="0,0,482.8,337"];
    node [label="\N"];
    State1   [height=4.0139,
        label="{State 1|\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n}",
        pos="162,144.5",
        shape=Mrecord,
        width=4.5];
    State2   [height=1.3333,
        label="{State 2|\n\n\n\n}",
//      pos="403,144.5",
        pos="220,88",
        shape=Mrecord,
        width=1.6944];
    xp3  [height=0.05,
        label="",
//      pos="429,331",
        pos="0,194",
        shape=point,
//      style=dotted,
        style=invis,
        width=0.05];
    r1   [height=0.16667,
        label="",
//      pos="455,331",
        pos="154,194",
        shape=square,
        width=0.16667];
    xp4  [height=0.05,
        label="",
//      pos="481,331",
        pos="0,88",
        shape=point,
//      style=dotted,
        style=invis,
        width=0.05];
    xp1  [height=0.16,
        label="",
        pos="162,331",
        shape=point,
        width=0.16];
    xp1 -> State1:n  [pos="e,162,288.5 162,325.23 162,319.09 162,308.89 162,298.63",
        style=dashed];
    xp2  [height=0.16,
        label="",
//      pos="403,331",
        pos="220,194",
        shape=point,
        width=0.16];
    xp2 -> State2:n  [pos="e,403,192.5 403,325.19 403,307.39 403,251.8 403,202.57"];

// manually added:
  xp3 -> r1      [label="Trigger 1" dir=none ]    
  xp4 -> State2  [label="Trigger 2"  ]    
}

Запустить с этой командной строкой:
neato -n -Tpng stateDiagram.dot> stateDiagram.png

Создает этот график:
enter image description here

...