кластер подграфа, занимающий место в точке

Я пытаюсь использовать graphviz на медиа Wiki как инструмент документации для программного обеспечения.

Во-первых, я зарегистрировал некоторые отношения класса, которые работали хорошо. Все оценивалось вертикально как ожидалось.

Но, затем, некоторые наши модули являются dlls, который я хотел разделить в поле. Когда я добавил узлы к кластеру, они были ограничены, но кластеры, кажется, имеют правило рейтинга LR. Или быть добавленным к кластеру повредило рейтинг ТБ узлов, поскольку кластер теперь появляется на стороне графика.

Этот график представляет то, что я пытаюсь сделать: в данный момент cluster1 и cluster2 появляются справа от cluster0.

Я хочу/нуждаюсь, чтобы они появились ниже.

<graphviz>
digraph d {
    subgraph cluster0 {
      A -> {B1 B2}
      B2 -> {C1 C2 C3}
      C1 -> D;
    }
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }
    subgraph cluster2 { 
      C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}
</graphviz>

12
задан Motti 10 June 2010 в 12:39
поделиться

2 ответа

Макет - это попытка Dot минимизировать общую высоту.

Одной из причин более компактного, чем требуется, расположения является использование края, идущего в обратном направлении от dll1_a к B1. Оно пытается вытянуть кластер как можно ближе к узлу назначения. Чтобы это ребро не влияло на граф, либо ослабьте ограничение на восходящих ребрах, как показано на рисунке, либо нарисуйте ребро в прямом направлении и используйте атрибут dir для обратного хода стрелки.

Это поможет при многих компоновках, но одного этого недостаточно для исправления приведенного примера. Чтобы предотвратить сохранение компактной компоновки, которую предпочитает Dot, вы можете добавить атрибут minlen к краям, которые должны оставаться (почти) вертикальными. Это может быть трудно вычислить в общем случае, но практично для макетов, настраиваемых вручную.

digraph d {
    subgraph cluster0 {
        A -> {B1 B2}    
        B2 -> {C1 C2 C3}
        C1 -> D;
    }
    subgraph cluster1 {
        C2 -> dll1_A [minlen = 2];
        dll1_A -> B1 [constraint = false];
        /* B1 -> dll1_A [dir = back]; */
    }
    subgraph cluster2 {
        C3 -> dll2_A;
    }
    dll1_A -> dll2_A;
}

Corrected layout

12
ответ дан 2 December 2019 в 19:53
поделиться

Это создаст график, который вы ищете:

digraph d {
  subgraph cluster0 {
    A -> {B1 B2}
    B2 -> {C1 C2 C3}
    C1 -> D;
  }

  subgraph {
    rankdir="TB"
    subgraph cluster1 {
      C2 -> dll1_A;
      dll1_A -> B1;
    }

    subgraph cluster2 {
      C3 -> dll2_A;
    }
  }
  dll1_A -> dll2_A;
}

Это создает подграф, который используется только для целей макета, чтобы обеспечить желаемый порядок сверху вниз.

0
ответ дан 2 December 2019 в 19:53
поделиться