用gvpr从Graphviz中提取层和子图簇
我有一个很大的Graphviz文件,我把不同的节点和边放在不同的层上。许多节点被分组到一个子图簇中 这使得我们可以很容易地将重点放在图形中重要的特定部分,但是我现在想自动将每个层提取到它自己的点文件中 我一直在使用用gvpr从Graphviz中提取层和子图簇,graphviz,layer,dot,subgraph,Graphviz,Layer,Dot,Subgraph,我有一个很大的Graphviz文件,我把不同的节点和边放在不同的层上。许多节点被分组到一个子图簇中 这使得我们可以很容易地将重点放在图形中重要的特定部分,但是我现在想自动将每个层提取到它自己的点文件中 我一直在使用gvpr-I'N[layer==”(*a*)“]'source.gv>a.gv,它通过提取节点和边来实现我想要的,但它无法提取子图,因此我丢失了节点的上下文 例如,对于源图形: digraph { layers = "a:b"; layerselect = "";
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
同时输出子图簇,或使用其他策略将给定层的节点、边和子图输出到点文件,有何建议
提前感谢您提供的任何提示。您需要更多的代码: 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*)"]
结果将有望成为您想要的:
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)选择想要的层。此外,如果希望在仅选择其中一个层时节点消失,则需要为连接不同层的节点的边设置单独的层
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];
}