create-gojs-kit
Version:
A CLI for downloading GoJS samples, extensions, and docs
290 lines (251 loc) • 12.1 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"/>
<meta name="description" content="Show the visual elements of a simple diagram as a tree diagram -- each Node is data bound to an element of the other Diagram." />
<meta itemprop="description" content="Show the visual elements of a simple diagram as a tree diagram -- each Node is data bound to an element of the other Diagram." />
<meta property="og:description" content="Show the visual elements of a simple diagram as a tree diagram -- each Node is data bound to an element of the other Diagram." />
<meta name="twitter:description" content="Show the visual elements of a simple diagram as a tree diagram -- each Node is data bound to an element of the other Diagram." />
<link rel="preconnect" href="https://rsms.me/">
<link rel="stylesheet" href="../assets/css/style.css">
<!-- Copyright 1998-2025 by Northwoods Software Corporation. -->
<meta itemprop="name" content="Visual Tree of another Diagram" />
<meta property="og:title" content="Visual Tree of another Diagram" />
<meta name="twitter:title" content="Visual Tree of another Diagram" />
<meta property="og:image" content="https://gojs.net/latest/assets/images/screenshots/visualtree.png" />
<meta itemprop="image" content="https://gojs.net/latest/assets/images/screenshots/visualtree.png" />
<meta name="twitter:image" content="https://gojs.net/latest/assets/images/screenshots/visualtree.png" />
<meta property="og:url" content="https://gojs.net/latest/samples/visualTree.html" />
<meta property="twitter:url" content="https://gojs.net/latest/samples/visualTree.html" />
<meta name="twitter:card" content="summary_large_image" />
<meta property="og:type" content="website" />
<meta property="twitter:domain" content="gojs.net" />
<title>
Visual Tree of another Diagram | GoJS Diagramming Library
</title>
</head>
<body>
<!-- This top nav is not part of the sample code -->
<nav id="navTop" class=" w-full h-[var(--topnav-h)] z-30 bg-white border-b border-b-gray-200">
<div class="max-w-screen-xl mx-auto flex flex-wrap items-start justify-between px-4">
<a class="text-white bg-nwoods-primary font-bold !leading-[calc(var(--topnav-h)_-_1px)] my-0 px-2 text-4xl lg:text-5xl logo"
href="../">
GoJS
</a>
<div class="relative">
<button id="topnavButton" class="h-[calc(var(--topnav-h)_-_1px)] px-2 m-0 text-gray-900 bg-inherit shadow-none md:hidden hover:!bg-inherit hover:!text-nwoods-accent hover:!shadow-none" aria-label="Navigation">
<svg class="h-7 w-7 block" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
<path d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div id="topnavList" class="hidden md:block">
<div class="absolute right-0 z-30 flex flex-col items-end rounded border border-gray-200 p-4 pl-12 shadow bg-white text-gray-900 font-semibold
md:flex-row md:space-x-4 md:items-start md:border-0 md:p-0 md:shadow-none md:bg-inherit">
<a href="../learn/">Learn</a>
<a href="../samples/">Samples</a>
<a href="../intro/">Intro</a>
<a href="../api/">API</a>
<a href="../download.html">Download</a>
<a href="https://forum.nwoods.com/c/gojs/11" target="_blank" rel="noopener">Forum</a>
<a id="tc" href="https://nwoods.com/contact.html"
target="_blank" rel="noopener" onclick="getOutboundLink('https://nwoods.com/contact.html', 'contact');">Contact</a>
<a id="tb" href="https://nwoods.com/sales/index.html"
target="_blank" rel="noopener" onclick="getOutboundLink('https://nwoods.com/sales/index.html', 'buy');">Buy</a>
</div>
</div>
</div>
</div>
</nav>
<script>
window.addEventListener("DOMContentLoaded", function () {
// topnav
var topButton = document.getElementById("topnavButton");
var topnavList = document.getElementById("topnavList");
if (topButton && topnavList) {
topButton.addEventListener("click", function (e) {
topnavList
.classList
.toggle("hidden");
e.stopPropagation();
});
document.addEventListener("click", function (e) {
// if the clicked element isn't the list, close the list
if (!topnavList.classList.contains("hidden") && !e.target.closest("#topnavList")) {
topButton.click();
}
});
// set active <a> element
var url = window
.location
.href
.toLowerCase();
var aTags = topnavList.getElementsByTagName('a');
for (var i = 0; i < aTags.length; i++) {
var lowerhref = aTags[i]
.href
.toLowerCase();
if (lowerhref.endsWith('.html'))
lowerhref = lowerhref.slice(0, -5);
if (url.startsWith(lowerhref)) {
aTags[i]
.classList
.add('active');
break;
}
}
}
});
</script>
<div class="flex flex-col prose">
<div class="w-full max-w-screen-xl mx-auto">
<!-- * * * * * * * * * * * * * -->
<!-- Start of GoJS sample code -->
<script src="https://cdn.jsdelivr.net/npm/gojs@3.1.0"></script>
<div id="allSampleContent" class="p-4 w-full">
<script id="code">
function init() {
myDiagram = new go.Diagram('myDiagramDiv', {
'undoManager.isEnabled': true
});
// define the "sample" Node template
myDiagram.nodeTemplate =
new go.Node('Auto')
.bindTwoWay('location')
.add(
new go.Shape('RoundedRectangle', { fill: 'white', strokeWidth: 0 }) // define the node's outer shape
.bind('fill', 'color'),
new go.TextBlock({ margin: 8 }) // define the node's text
.bind('text')
);
myDiagram.linkTemplate =
new go.Link({ curve: go.Curve.Bezier })
.add(
new go.Shape({ strokeWidth: 1.5 }),
new go.Shape({ toArrow: 'Standard' })
);
myDiagram.model = new go.GraphLinksModel(
[
{ key: 1, text: 'Alpha', color: 'lightblue', location: new go.Point(0, 0) },
{ key: 2, text: 'Beta', color: 'pink', location: new go.Point(60, 80) }
],
[
{ from: 1, to: 2 },
{ from: 2, to: 1 }
]
);
// Now we can initialize a Diagram that looks at the visual tree that constitutes the Diagram above.
myVisualTree = new go.Diagram('myVisualTree', {
initialContentAlignment: go.Spot.Left,
initialAutoScale: go.AutoScale.Uniform,
isReadOnly: true, // do not allow users to modify or select in this view
allowSelect: false,
layout: new go.TreeLayout({ nodeSpacing: 5 }) // automatically laid out as a tree
});
myVisualTree.nodeTemplate =
new go.Node('Auto')
.add(
new go.Shape({ fill: 'white', stroke: null }), // assume a dark background
new go.TextBlock({
font: 'bold 13px monospace',
stroke: 'black',
margin: 3
})
// bind the text to the Diagram/Layer/Part/GraphObject converted to a string
.bind('text', '', x => {
// if the node represents a link, be sure to include the "to/from" data for that link
if (x instanceof go.Link) {
var s = 'Link#' + x.data.__gohashid;
s += '(' + x.data.from + ' to ' + x.data.to + ')';
return s;
} else return x.toString();
})
);
myVisualTree.linkTemplate =
new go.Link({ corner: 10 })
.add(
new go.Shape({ stroke: 'white', strokeWidth: 2 })
);
drawVisualTree();
}
function drawVisualTree() {
var visualNodeDataArray = [];
// recursively walk the visual tree, collecting objects as we go
function traverseVisualTree(obj, parent) {
obj.vtkey = visualNodeDataArray.length;
visualNodeDataArray.push(obj);
if (parent) {
obj.parentKey = parent.vtkey;
}
if (obj instanceof go.Diagram) {
var lit = obj.layers;
while (lit.next()) traverseVisualTree(lit.value, obj);
} else if (obj instanceof go.Layer) {
var pit = obj.parts;
while (pit.next()) traverseVisualTree(pit.value, obj);
} else if (obj instanceof go.Panel) {
var eit = obj.elements;
while (eit.next()) traverseVisualTree(eit.value, obj);
}
}
traverseVisualTree(myDiagram, null);
myVisualTree.model = new go.TreeModel({
nodeKeyProperty: 'vtkey',
nodeParentKeyProperty: 'parentKey',
nodeDataArray: visualNodeDataArray
});
}
window.addEventListener('DOMContentLoaded', init);
</script>
<div id="sample">
<b>myDiagram</b>, the diagram being inspected:<br />
<div id="myDiagramDiv" style="border: 1px solid black; width: 300px; height: 200px"></div>
<br />
<button onclick="drawVisualTree()">Draw Visual Tree</button>
<br />
<br />
<b>myVisualTree</b>, showing the Layers, Nodes and Links that are in <b>myDiagram</b> above:<br />
<div id="myVisualTree" style="border: 1px solid black; background: #1f4963; width: 100%; height: 400px"></div>
<p>
This sample shows the actual visual tree of a running Diagram. The Diagram that we inspect is named "myDiagramDiv" and initially contains two simple Nodes
and two Links. The Diagram below it is named "myVisualTree" and shows the visual tree of "myDiagramDiv".
</p>
<p>
You can also try selecting, copying, and deleting parts in <b>myDiagram</b> and then click on "Draw Visual Tree" again to see how the visual tree in
<b>myDiagram</b> changes.
</p>
<p>
The <b>traverseVisualTree</b> function is what walks the visual tree of "myDiagramDiv" and constructs the corresponding Nodes and Links used in
"myVisualTree". The text for each Node in "myVisualTree" is data-bound to the actual Diagram/Layer/Part/GraphObject object. That object is converted to a
text string by using the <b>toString</b> method.
</p>
<p>
See also the <a href="visualTreeGrouping.html">Visual Tree Using Groups</a> sample, to show the same visual tree using nested groups. For more uses of the
<a>TreeLayout</a>, see the <a href="DOMTree.html">DOM Tree</a> and <a href="classHierarchy.html">Class Hierarchy Tree</a> samples.
</p>
</div>
</div>
<!-- * * * * * * * * * * * * * -->
<!-- End of GoJS sample code -->
</div>
<div id="allTagDescriptions" class="p-4 w-full max-w-screen-xl mx-auto">
<hr/>
<h3 class="text-xl">GoJS Features in this sample</h3>
<!-- blacklist tags that do not correspond to a specific GoJS feature -->
<h4>Tree Layout</h4>
<p>
This predefined layout is used for placing Nodes of a tree-structured graph in layers (rows or columns).
For discussion and examples of the most commonly used properties of the <a href="../api/symbols/TreeLayout.html">TreeLayout</a>,
see the <a href="../intro/trees.html">Trees</a> page in the Introduction.
More information can be found in the <a href="../intro/layouts.html#TreeLayout">GoJS Intro</a>.
</p>
<p>
<a href="../samples/index.html#treelayout">Related samples</a>
</p>
<hr>
</div>
</div>
</body>
<!-- This script is part of the gojs.net website, and is not needed to run the sample -->
<script src="../assets/js/goSamples.js"></script>
</html>