Проблема с "rank=same" в подграфах и кластерах

При переключении с «обычных» подграфов на кластеры rank=same больше не работает.

Чтобы показать мою проблему, взгляните на следующий пример графика.

digraph INV_X1 {
    rankdir = "LR";
    edge [penwidth = "2"];

/* Component styles */
    M_i_0 [shape=none;image = "res/nmos.jpg"];
    M_i_1 [shape=none;image = "res/pmos.jpg"];

/* Node styles */
    A [style=filled;color=green];
    ZN [style=filled;color=green];

/* Connections */
    M_i_0:n -> ZN;
    A -> M_i_0:w;
    /* Put M_i_0 and _VSS_0 on the same rank. */
    subgraph g_VSS_0 {
        rank=same;
        label = "_VSS_0";
        _VSS_0 [shape=none;image = "res/gnd.jpg";label = ""];
        M_i_0 -> _VSS_0 [arrowhead=none];
    }
    M_i_1:s -> ZN;
    A -> M_i_1:w;
    /* Put M_i_1 and _VDD_1 on the same rank. */
    subgraph g_VDD_1 {
        rank=same;
        label = "_VDD_1";
        _VDD_1 [shape=none;image = "res/pwr.jpg";label = ""];
        _VDD_1 -> M_i_1 [arrowhead=none];
    }
}

Результат показан на следующем рисунке. Я надеюсь, что это не слишком запутанно, так как я использовал несколько изображений для узлов. Я создал два подграфа, чтобы сгруппировать по два узла в каждом и поместить их в один и тот же ранг. Один подграф находится в центре вверху, другой — в центре внизу.

Проблема с "rank=same" в подграфах и кластерах

Теперь я хочу переключиться с подграфов на кластеры, чтобы убедиться, что сгруппированные узлы всегда расположены близко друг к другу, и я хочу иметь границы и метки, чтобы сделать кластеры видимыми. Но когда я просто меняю имена подграфов на "cluster_...", это выглядит так.

Проблема с "rank=same" в подграфах и кластерах

В чем проблема? Почему rank=same больше не работает должным образом? Также данный положение порта больше не работает должным образом (край больше не соединен с югом/севером узла).

Я попытался вытащить rank=same из кластера в собственное выражение, но это, кажется, полностью перезаписывает предыдущее выражение кластера, поскольку граница и метки исчезают. Кроме того, я пытался использовать constraint=false для соединений узлов, но это искажало порядок узлов, поэтому меня не очень удовлетворил такой подход.

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
436
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы правы, поскольку документация состояния, атрибут "ранг" работает Только с подграфами (кластер больше не является подграфом). Но в чем проблема, поместите внутрь своего кластера еще один подграф!

digraph INV_X1 {
    rankdir = "LR";
    edge [penwidth = "2"];

/* Component styles */
    M_i_0 [shape=none;image = "res/nmos.jpg"];
    M_i_1 [shape=none;image = "res/pmos.jpg"];

/* Node styles */
    A [style=filled;color=green];
    ZN [style=filled;color=green];

/* Connections */
    M_i_0:n -> ZN;
    A -> M_i_0:w;
    subgraph cluster_a{
    /* Put M_i_0 and _VSS_0 on the same rank. */
        label = "_VSS_0";
        subgraph g_VSS_0 {
            rank=same;
            _VSS_0 [shape=none;image = "res/gnd.jpg";label = ""];
            _VSS_0 -> M_i_0 [arrowhead=none];
        }
    }
    M_i_1:s -> ZN;
    A -> M_i_1:w;
    /* Put M_i_1 and _VDD_1 on the same rank. */
    subgraph cluster_b {
        label = "_VDD_1";
        subgraph g_VDD_1 {
            rank=same;
            _VDD_1 [shape=none;image = "res/pwr.jpg";label = ""];
            M_i_1 -> _VDD_1 [arrowhead=none];
        }
    }
}

Также обратите внимание, что я изменил порядок ваших ребер M_i_1 -> _VDD_1 и _VSS_0 -> M_i_0, по какой-то причине они были перевернуты.

Результат:

Другие вопросы по теме