Как верстать Graphviz / точечный макет и заказать вопрос - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь использовать точечную нотацию и установить порядок элементов.в приведенном ниже примере я бы хотел, чтобы FLIP / FLOPA были сверху, а FLIP / FLOPB - снизу.Также было бы хорошо выстроить все в ряд.

enter image description here

Я немного запутался, как могут работать невидимые края?

вот где я:


digraph G {
graph [pad ="1", rankdir = LR, splines=ortho];
size = "16.66,8.33!"; // 1200x600 at 72px/in, "!" to force 
ratio = "fill";


node[shape=record];


flipa[label="FLIPA", height=3];
flopa[label="FLOPA", height=3];


flipb[label="FLIPB", height=3];
flopb[label="FLOPB", height=3];


source1[shape=rarrow];
source2[shape=rarrow];


sink1[shape=rarrow];
sink2[shape=rarrow];


source1 -> flipa;
flipa -> flopa [label="red" color=red,penwidth=3.0];
flipa -> flopa [label="blue" color=blue,penwidth=3.0];
flopa -> sink1;


source2 -> flipb;
flipb -> flopb [label="red" color=red,penwidth=3.0]; 
flipb -> flopb [label="blue" color=blue,penwidth=3.0];
flopb -> sink2;




label="Graph";
labelloc=top;
labeljust=left; 


}

Заранее спасибо

Нил

1 Ответ

0 голосов
/ 11 апреля 2019

Порядок, в котором вы упоминаете узлы в макете, важен.

Если у вас горизонтальный макет (rankdir=LR), узлы появляются в вашем макете снизу вверх, посмотрите на это, например:

digraph {
    rankdir=LR

    node1
    node2
    node3
}

В результате:

Теперь, если мы изменим порядок:

digraph {
    rankdir=LR

    node3
    node2
    node1
}

Мы получаем это:

PS: я не рекомендую использовать орто-сплайны, они могут вызывать всевозможные артефакты, включая очень плохую обработку краевых меток. Вы проблемы с выстраиванием в линию могут быть вызваны ими. Даже когда я компилирую ваш код на моей машине, узлы выстроены правильно.


Чтобы ответить на ваш вопрос в комментариях:

Как реализовать параллельные ребра без splines=ortho Но позвольте мне предупредить вас, это очень некрасиво.

В Graphviz вы можете использовать HTML-подобный синтаксис для определения некоторых структур, наиболее важными из которых являются таблицы. Любой достаточно старый пользователь скажет вам, что вы можете создавать почти что угодно , используя таблицы. Я часто их использую при работе с графвизом.

Что вы можете сделать в вашей ситуации: вместо ваших простых прямоугольных узлов разместите таблицу с тремя рядами. Верхний ряд и нижний ряд будут пустыми. Средний будет содержать ваш ярлык: FLIPA или FLOPA.

Далее вы назначаете атрибут port для всех ячеек. Таким образом, вы сможете соединить определенные строки таблиц вместе, используя headport и tailport (или их синонимы, синтаксис двоеточия, который я использовал в пример ниже).

Вот пример:

digraph G {
graph [pad ="1", rankdir = LR];
size = "16.66,8.33!"; // 1200x600 at 72px/in, "!" to force 
ratio = "fill";

node[shape=record];

flipb[
    shape=plain
    label=<
        <table border="1" cellspacing="0" cellborder="0">
            <tr>
                <td height="80" port="upper"> </td>
            </tr>
            <tr>
                <td height="80" port="middle">FLIPB</td>
            </tr>
            <tr>
                <td height="80" port="bottom"> </td>
            </tr>
        </table>
    >
];
flopb[
    shape=plain
    label=<
        <table border="1" cellspacing="0" cellborder="0">
            <tr>
                <td height="80" port="upper"> </td>
            </tr>
            <tr>
                <td height="80" port="middle">FLOPB</td>
            </tr>
            <tr>
                <td height="80" port="bottom"> </td>
            </tr>
        </table>
    >
];

flipa[
    shape=plain
    label=<
        <table border="1" cellspacing="0" cellborder="0">
            <tr>
                <td height="80" port="upper"> </td>
            </tr>
            <tr>
                <td height="80" port="middle">FLIPA</td>
            </tr>
            <tr>
                <td height="80" port="bottom"> </td>
            </tr>
        </table>
    >
];
flopa[
    shape=plain
    label=<
        <table border="1" cellspacing="0" cellborder="0">
            <tr>
                <td height="80" port="upper"> </td>
            </tr>
            <tr>
                <td height="80" port="middle">FLOPA</td>
            </tr>
            <tr>
                <td height="80" port="bottom"> </td>
            </tr>
        </table>
    >
];

source1[shape=rarrow];
source2[shape=rarrow];

sink1[shape=rarrow];
sink2[shape=rarrow];

source1 -> flipa;
flipa:upper -> flopa:upper [label="red" color=red,penwidth=3.0];
flipa:bottom -> flopa:bottom [label="blue" color=blue,penwidth=3.0];
flopa -> sink1;

source2 -> flipb;
flipb:upper -> flopb:upper [label="red" color=red,penwidth=3.0]; 
flipb:bottom -> flopb:bottom [label="blue" color=blue,penwidth=3.0];
flopb -> sink2;

label="Graph";
labelloc=top;
labeljust=left;

}

Результат:

...