【问题标题】:Layout DirectedGraph (dagre) only on a subset of nodes仅在节点子集上布局 DirectedGraph (dagre)
【发布时间】:2016-10-21 12:35:12
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript jointjs dagre rappid


    【解决方案1】:

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

    【讨论】:

    • 我应该补充一点,最后两行不是必需的(在元素的属性上设置元数据对象) - 我正在为其他目的维护元素对象上的一些额外元数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多