【问题标题】:Extracting Layers and Subgraph Clusters from Graphviz with gvpr使用 gvpr 从 Graphviz 中提取层和子图簇
【发布时间】:2018-12-01 13:57:34
【问题描述】:

我有一个大的 Graphviz 文件,我在其中将不同的节点和边放在不同的层上。多个节点组成一个子图集群。

这使得关注图表中重要的特定部分变得很容易,但是我现在想将每一层自动提取到自己的 DOT 文件中。

我一直在使用gvpr -i 'N[layer=="(*a*)"]' source.gv > a.gv,它通过提取节点和边来实现我想要的,但是它无法提取子图,所以我失去了节点的上下文。

以源图为例:

digraph {
    layers = "a:b";
    layerselect = "";

    subgraph cluster_alpha {
        label = "Alpha";
        a, b, c [layer = "a"];
    }

    subgraph cluster_beta {
        label = "Beta";
        d, e, f [layer = "b"];
    }

    g [layer = "a"];
    h [layer = "b"];

    g -> a [layer = "a"];
    h -> e [layer = "b"]
}

运行 gvpr -i 'N[layer=="(*a*)"]' source.gv > a.gv 会产生以下输出:

digraph gvpr_result {
    graph [layers="a:b:c",
        layerselect=""
    ];
    a    [layer=a];
    b    [layer=a];
    c    [layer=a];
    g    [layer=a];
    g -> a   [layer=a];
}

如果您比较输出,您会看到节点“a”、“b”和“c”周围的框以及标签“Alpha”缺失。

关于如何使用gvpr 也可以输出子图集群,或其他将给定层的节点、边和子图输出到 DOT 文件的策略有什么建议吗?

提前感谢您的任何提示。

【问题讨论】:

    标签: graphviz layer dot subgraph


    【解决方案1】:

    你想要的需要更多的代码:

    source.gvpr

    BEG_G
     {
      int i;
      int found;
      graph_t subgraphs[int];
      graph_t subgraph;
      subgraph = fstsubg($);
      i = 0;
      while (subgraph != NULL)
       {
        if (substr(subgraph.name, 0, 1) != "%")
         {
          subgraphs[i++] = subgraph;
         }
        subgraph = nxtsubg(subgraph);
       }
     }
    
    N[layer=="(*a*)"]
     {
      found = 0;
      for (i = 0; i < #subgraphs; ++i)
       {
        if (isSubnode(subgraphs[i], $))
         {
          graph_t sg = subg($T, subgraphs[i].name);
          copyA(subgraphs[i], sg);
          subnode(sg, $);
          ++found;
          break;
         }
       }
      if (found  == 0)
       {
        node_t newnode = node($T, $.name);
        copyA($, newnode);
       }
     }
    
    E[layer=="(*a*)"]
    

    运行这个:

    gvpr -f source.gvpr source.gv -o a.gv
    

    希望结果是你想要的:

    digraph gvpr_result {
      graph [layers="a:b",
        layerselect=""
      ];
      subgraph cluster_alpha {
        graph [label=Alpha,
          layers="a:b"
        ];
        a    [layer=a];
        b    [layer=a];
        c    [layer=a];
      }
      g  [layer=a];
      g -> a   [layer=a];
    }
    

    我正在为自己开发一个版本,该版本允许通过 gvpr 的命令行参数 (-a) 选择想要的层。此外,如果您希望它们在仅选择一个这样的层时消失,那么看起来需要为连接不同层节点的边设置一个单独的层。

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2018-08-26
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      相关资源
      最近更新 更多