仅在节点子集上布局 DirectedGraph (dagre)
Layout DirectedGraph (dagre) only on a subset of nodes
我正在寻找一种使用 JointJS/Rappid 图表库仅布置有向图节点子集的方法。
我需要图表中的一些 "fixed" 节点并布置 "others",假设它们可以相互连接或与一些固定节点相连(图表已经添加到纸)。
由于joint.layout.DirectedGraph.layout
API 必须在图形对象上使用,我想知道是否有任何机制可以在布局计算期间拥有图形的某些节点 "fixed" (例如,要在单元格对象中添加一些属性)。
类似这样的事情也可以,但是 getSubgraph API
不应检索传入和传出链接
var subGraph = graph.getSubgraph([A, B]);
joint.layout.DirectedGraph.layout(subGraph, layoutOpt);
查看文档时我无法识别此类功能。
如果不支持此功能,还有其他方法可以用来实现我的目标吗? (当然我也可以布局整个图形并在操作结束时应用我的固定和弦,但我一直在寻找比这更好的东西)。
所以我很确定使用 Dagre 的自动布局功能现在仅在联合 js 的 Rappid 版本中可用(即付费)。我所做的是单独使用 Dagre 来执行布局计算,然后遍历元素并使用 Dagre 输出手动更改它们的位置。不理想,但它确实允许您在仅查看节点子集方面做任何您想做的事情。下面的基本代码(graphObj 是 jointjs 图形对象),如果你想使用元素和链接的子集,你应该能够以此为起点:
var nodes = [];
var edges = [];
var elements = graphObj.getElements();
elements.forEach(function(element){
element.label = element.id;
element.width = element.attributes.size.width;
element.height = element.attributes.size.height;
});
var links = graphObj.getLinks();
links.forEach(function(link){
edges.push({source: link.getSourceElement(), target: link.getTargetElement()});
});
dagre.layout()
.nodeSep(150)
.edgeSep(100)
.rankSep(150)
.rankDir("LR")
.nodes(elements)
.edges(edges)
.run();
elements.forEach(function(element){
element.position(element.dagre.x, element.dagre.y);
element.attributes.prop.metadata.x = element.dagre.x;
element.attributes.prop.metadata.y = element.dagre.y;
});
我正在寻找一种使用 JointJS/Rappid 图表库仅布置有向图节点子集的方法。
我需要图表中的一些 "fixed" 节点并布置 "others",假设它们可以相互连接或与一些固定节点相连(图表已经添加到纸)。
由于joint.layout.DirectedGraph.layout
API 必须在图形对象上使用,我想知道是否有任何机制可以在布局计算期间拥有图形的某些节点 "fixed" (例如,要在单元格对象中添加一些属性)。
类似这样的事情也可以,但是 getSubgraph API
var subGraph = graph.getSubgraph([A, B]);
joint.layout.DirectedGraph.layout(subGraph, layoutOpt);
查看文档时我无法识别此类功能。 如果不支持此功能,还有其他方法可以用来实现我的目标吗? (当然我也可以布局整个图形并在操作结束时应用我的固定和弦,但我一直在寻找比这更好的东西)。
所以我很确定使用 Dagre 的自动布局功能现在仅在联合 js 的 Rappid 版本中可用(即付费)。我所做的是单独使用 Dagre 来执行布局计算,然后遍历元素并使用 Dagre 输出手动更改它们的位置。不理想,但它确实允许您在仅查看节点子集方面做任何您想做的事情。下面的基本代码(graphObj 是 jointjs 图形对象),如果你想使用元素和链接的子集,你应该能够以此为起点:
var nodes = [];
var edges = [];
var elements = graphObj.getElements();
elements.forEach(function(element){
element.label = element.id;
element.width = element.attributes.size.width;
element.height = element.attributes.size.height;
});
var links = graphObj.getLinks();
links.forEach(function(link){
edges.push({source: link.getSourceElement(), target: link.getTargetElement()});
});
dagre.layout()
.nodeSep(150)
.edgeSep(100)
.rankSep(150)
.rankDir("LR")
.nodes(elements)
.edges(edges)
.run();
elements.forEach(function(element){
element.position(element.dagre.x, element.dagre.y);
element.attributes.prop.metadata.x = element.dagre.x;
element.attributes.prop.metadata.y = element.dagre.y;
});