如何創建具有多個父節點的樹


大多數樹結構都是作為層次結構構建的:節點的數量在每個級別上都增加。在我們的示例中,我們將查看一棵樹,其中並非所有分支的節點數量都比其前輩更高。在我們的樹中,某些節點將具有多個父節點,例如,有些節點具有多個祖先。

您可以在線嘗試示例:

 

為了構建該應用程序,我們使用MindFusion Diagramming for JavaScript庫。

I.常規設置

在網頁中,我們添加了初始化Canvas的代碼。我們給畫布一個id:

<div style="overflow: visible; height: 100%; margin: 1px; padding: 0px;">
    <canvas id="diagram" width="2100" height="2500">
        This page requires a browser that supports HTML 5 Canvas element.
    </canvas>
</div>

我們添加了對提供圖表功能的兩個JavaScipt文件的引用:MindFusion.Diagramming和MindFusion.Common。我們還添加了對代碼隱藏文件的引用,該文件包含我們應用程序的JavaScript代碼:

 

<script src="Scripts/MindFusion.Common.js" type="text/javascript"></script>
<script src="Scripts/MindFusion.Diagramming.js" type="text/javascript"></script>
<script src="MultipleParentNodes.js" type="text/javascript"></script>

我們已將這些文件放在名為Scripts的子文件夾中,該子文件夾位於我們的主應用程序文件夾中。

二.圖表設置

我們在window.onload事件處理程序中創建該圖。我們要確保所有腳本都已加載:

window.onload = function(e)
{
    var diagramEl = document.getElementById('diagram');
    // create a Diagram component that wraps the "diagram" canvas
    diagram = AbstractionLayer.createControl(Diagram, null, null, null, diagramEl);
    diagram.setAllowInplaceEdit(true);
    diagram.setRouteLinks(true);
    diagram.setShowGrid(true);
    diagram.setRoundedLinks(true);
    diagram.setBounds(new Rect(0, 0, 2000,2500));
}

我們使用對網頁中Canvas的DOM元素的引用來創建圖。我們將其allowInplaceEdit屬性設置為true,這使用戶可以交互式地編輯節點和鏈接。我們使用showGrid渲染背景網格,以幫助對齊節點和鏈接。我們使用setBounds方法設置setRoundedLinks並為圖表做大工作。

 

二.創建圖節點

我們在單獨的方法中創建DiagramNode -s,在創建控件並完成所有設置后調用該方法:

function onLoaded()
{
    var nodes = {};

    for(var i = 0; i < 5; i++)
    {
        nodes[i] = diagram.getFactory().createShapeNode(new Rect(20, 20, 20, 12));
        nodes[i].setShape('Rectangle');
        nodes[i].setBrush({ type: 'SolidBrush', color: '#567939' });
    };

我們初始化一個列表,在其中我們將動態存儲我們要引用的那些節點。首先,我們創建5個ShapeNode -s,它們是樹的第一層。我們使用Factory的createShapeNode方法創建ShapeNode -s和DiagramLink -s。注意,我們將創建所有具有相等邊界的節點。我們不必擔心它們的位置,因為我們將在最后應用自動布局。

 

通過Diagram的getFactory方法可以使用Factory。通常,您不創建類,而是通過Diagram實例獲取其實例。

我們使用setShape為我們希望節點采用的圖表形狀提供ID。可以在在線幫助中找到帶有可用圖表形狀及其ID的列表。

我們還使用setBrush來指定ShapeNode的填充。在我們的例子中,我們使用SolidBrush,但是還有其他選項可供選擇。

然后,我們將創建一個ShapeNode,它將成為下一個級別:

var node5 = diagram.getFactory().createShapeNode(new Rect(20, 20, 20, 12 ));
node5.setShape('Rectangle');
node5.setBrush({ type: 'SolidBrush', color: '#6f9c49' });

我們用比第一級節點略淺的綠色着色。然后,我們再次使用Factory類在第一級的5個節點和第二級的一個節點之間創建DiagramLink -s:

    for(var i = 0; i <5; i ++)
    { 
        var link = diagram.getFactory()。createDiagramLink(nodes [i],node5); 
        link.setHeadShape(“ Triangle”);
        link.setText(“ 20%”);
        link.setHeadShapeSize(3.0);
        link.setHeadBrush({type:'SolidBrush',color:'#7F7F7F'});
    };

DiagramLink類的setText和setHeadShape方法允許我們在最后指定鏈接的標簽及其形狀。還有setBaseShape,它允許我們在DiagramLink的開始處指定形狀。

 

關於Factory類的妙處在於,它會自動將新創建的DiagramItem -s(例如節點和鏈接)添加到圖的項目集合中。您還可以分別將新創建的DiagramNode -s和DiagramLink -s分別作為節點和鏈接集合的成員。

現在,我們具有從第一級到第二級的所有5個節點的5個鏈接:

 

多父节点

我們以相同的方式繼續進行其余的圖表。我們創建ShapeNode與-s 廠,然后綁定與節點廠。

 

三.布局

我們使用LayeredLayout布置圖的所有節點。由於該圖不是典型的樹,因此我們首選LayeredLayout而不是TreeLayout

var lLayout = new MindFusion.Graphs.LayeredLayout();
diagram.arrange(lLayout);

在圖上應用任何其他算法真的很容易-您只需要創建它的一個實例,然后調用圖的range方法來應用該實例。您可以快速更改布局並進行實驗,看看哪種布局效果最好。

 

在我們的例子中,LayeredLayout看起來不錯,到此,我們就完成了樹的構建。

關於JavaScript繪圖:此本地JavaScript庫為開發人員提供了創建和自定義任何類型的圖,決策樹,流程圖,類層次結構,圖,家譜樹,BPMN圖等的能力。該控件提供了豐富的事件集,眾多的自定義選項,動畫,圖形操作,樣式和主題。您有100多個預定義節點,表節點和15多種自動布局算法。通過https://mindfusion.eu/javascript-diagram.html了解有關JavaScript制圖的更多信息。

APS幫助提升企業生產效率,真正實現生產計划可視化呈現與控制,快速有效響應不同場景的生產計划,提高准時交貨能力,提高產能和資源利用率
想要了解甘特圖或慧都APS系統,請登錄慧都網咨詢在線客服,解決您的問題!
本文章轉載自【慧都科技】evget歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,尊重他人勞動成果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM