3

我正在寻找一种使用 JointJS / Rappid 图表库仅布局有向图节点子集的方法。

我需要图表中的一些“固定”节点并布置“其他”节点,假设它们可以相互连接或与一些固定节点连接(图表已经添加到论文中)。

由于joint.layout.DirectedGraph.layout必须在图形对象上使用 API,我想知道在布局计算期间是否有任何机制可以“固定”图形的某些节点(例如,在单元对象中添加一些属性)。类似这样的东西也可以,但是 getSubgraph API 不应检索传入和传出链接

var subGraph = graph.getSubgraph([A, B]);
joint.layout.DirectedGraph.layout(subGraph, layoutOpt);

查看文档我无法识别这种功能。如果不支持此功能,还有其他方法可以用来实现我的目标吗?(当然我也可以布局整个图表并在操作结束时应用我的固定和弦,但我正在寻找比这更好的东西)。

4

1 回答 1

3

所以我很确定使用 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;

    });
于 2016-06-22T10:10:28.747 回答