使用 gvpr 从 Graphviz 中提取图层和子图簇

问题描述 投票:0回答:1

我有一个很大的 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个回答
4
投票

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

来源.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) 选择所需的图层。此外,如果您希望在仅选择其中一层时它们消失,则需要为连接不同层的节点的边缘设置一个单独的层。

© www.soinside.com 2019 - 2024. All rights reserved.