仅在节点子集上布局 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;

    });