引入相关文件
<script src="gojs/go-debug.js"></script>//开发版
<script src="gojs/go.js"></script>//正式版
除去水印
在文件go.js或者go-debug.js中搜索”7ca11abfd022028846”;将水印代码注释掉
每个 GoJS 图形实例都需要一个 HTML 容器 <div>
并明确指定其大小
<!-- 图形的容器 div 需要明确指定大小,否则无法显示,本例子中我们还给该 DIV 添加了一个背景颜色,可以很方便的查看其大小。 -->
<div id="diagramDiv" style="width:400px; height:150px; background-color: #DAE4E4;"></div>
在 JS 代码中,需要将 <div>
的 id
作为参数来创建图形。
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "diagramDiv",
{
initialContentAlignment: go.Spot.TopLeft,
grid: $(go.Panel, "Grid",
{ gridCellSize: CellSize },
$(go.Shape, "LineH", { stroke: "lightgray" }),
$(go.Shape, "LineV", { stroke: "lightgray" })
),
// 在拖动和调整大小时支持栅格捕捉
"draggingTool.isGridSnapEnabled": true,
"draggingTool.gridSnapCellSpot": go.Spot.Center,
"resizingTool.isGridSnapEnabled": true,
"animationManager.isEnabled": false,
"undoManager.isEnabled": true
});
这样就创建了一个空的画布。
图的节点和链接是由模型管理的数据的可视化。GoJS有一个模型-视图体系结构,其中模型保存描述节点和链接的数据(JavaScript对象数组),图表充当视图,使用实际的节点和链接对象可视化这些数据。模型,而不是图表,是您在编辑后加载并保存的内容。在模型中的数据对象上添加应用程序所需的任何属性;您不会向关系图和GraphObject类的原型添加属性或修改原型。
创建一个模型的过程
var $ = go.GraphObject.make;
//模型配置
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{
"undoManager.isEnabled": true // 启用Ctrl-Z以撤消,启用Ctrl-Y以重做
});
// 在模型数据中,每个节点由一个JavaScript对象表示:
myDiagram.model = new go.GraphLinksModel([
{ key: "Alpha" },
{ key: "Beta" },
{ key: "Gamma" }
]);
- 单击并拖动上图中的背景以平移视图。
- 单击一个节点以选择它,或按下并拖动一个节点来移动它。
- 要创建选择框,请单击并按住背景,然后开始拖动。
- 使用 CTRL-C 和 CTRL-V 或控制拖放来制作选择的副本。
- 按 Delete 键删除选定的节点。
由于撤消管理器已启用,CTRL-Z 和 CTRL-Y 将撤消和重做移动以及复制和删除。
节点模板
通过创建由 GraphObject 组成的模板并在这些对象上设置属性来设置节点的样式。
Shape,显示带有颜色的预定义或自定义几何图形
- TextBlock,以各种字体显示(可能可编辑)文本
- Picture, 显示图片
- Panel,用于容纳其他对象的集合的容器,这些对象可以根据 Panel 的类型以不同的方式定位和调整大小(如桌子、垂直堆栈和拉伸容器)
所有这些构建块都派生自GraphObject抽象类,因此我们随便将它们称为 GraphObjects 或对象或元素。请注意,GraphObject_不是_HTML DOM 元素,因此在创建或修改此类对象时没有那么多开销。
一个包含一个 TextBlock 的 Node。TextBlock 的text
属性和模型数据的key
属性之间存在数据绑定。
myDiagram.nodeTemplate =
$(go.Node,
$(go.TextBlock, // TextBlock.text 绑定到 Node.data.key new go.Binding( "text" , "key" ))
);
TextBlocks、Shapes 和 Pictures 是GoJS的原始构建块。
TextBlocks 不能包含图像;
形状不能包含文本。
如果您希望节点显示一些文本,则必须使用 TextBlock。
如果要绘制或填充一些几何图形,则必须使用 Shape。
连线模板
Link 的主要元素是 Link 的形状,并且必须是一个形状,其几何形状将由GoJS动态计算。我们的链接将仅由这种形状组成,其笔触比正常粗一点,深灰色而不是黑色。与默认链接模板不同,我们没有箭头。
我们将 Linkrouting
属性从 Normal更改为 Orthogonal,并为其指定一个corner
值,以便使直角转弯变得圆润。
// 定义一个正交路由的链接模板,没有箭头
myDiagram.linkTemplate =
$(go.Link, // 默认路由是 go.Link.Normal // 默认角为 0
{ routing : go.Link.Orthogonal, corner : 5 },
$(go.Shape, { strokeWidth : 3 , stroke : "#555" }) // 链接形状// 如果我们想要一个箭头,我们还可以添加另一个定义了 toArrow 的形状:// $(go.形状, { toArrow: "Standard", stroke: null }
);
将 Link 模板与 Node 模板、TreeModel 和 TreeLayout 结合起来,就有了一个完整的组织图。
var $ = go.GraphObject.make;
var myDiagram =
$(go.Diagram, "myDiagramDiv",
{
"undoManager.isEnabled": true, // 启用 Ctrl-Z 撤消和 Ctrl-Y 重做
layout: $(go.TreeLayout, // 指定一个 Diagram.排列树木的布局
{ angle: 90, layerSpacing: 35 })
});
// 之前定义的模板
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ background: "#44CCFF" },
$(go.Picture,
{ margin: 10, width: 50, height: 50, background: "red" },
new go.Binding("source")),
$(go.TextBlock, "Default Text",
{ margin: 12, stroke: "white", font: "bold 16px sans-serif" },
new go.Binding("text", "name"))
);
// 定义一个正交路由的链接模板,没有箭头
myDiagram.linkTemplate =
$(go.Link,
{ routing: go.Link.Orthogonal, corner: 5 },
$(go.Shape, { strokeWidth: 3, stroke: "#555" })); //链接形状
var model = $(go.TreeModel);
model.nodeDataArray =
[
{ key: "1", name: "Don Meow", source: "/images/learn/cat1.png" },
{ key: "2", parent: "1", name: "Demeter", source: "/images/learn/cat2.png" },
{ key: "3", parent: "1", name: "Copricat", source: "/images/learn/cat3.png" },
{ key: "4", parent: "3", name: "Jellylorum", source: "/images/learn/cat4.png" },
{ key: "5", parent: "3", name: "Alonzo", source: "/images/learn/cat5.png" },
{ key: "6", parent: "2", name: "Munkustrap", source: "/images/learn/cat6.png" }
];
myDiagram.model = model;
监听事件
//添加监听节点生成事件
myDiagram.addDiagramListener("externalobjectsdropped",function(e) {
e.subject.each(function(n){
if(n.data.key.indexOf("FTPIN") != -1||n.data.key.indexOf("MQTTIN") != -1||n.data.key.indexOf("HTTPIN") != -1||n.data.key.indexOf("RTSPIN") != -1){
myDiagram.model.addLinkData({ from: n.data.key, to: 1 });
}
if(n.data.key.indexOf("FTPOUT") != -1||n.data.key.indexOf("MQTTOUT") != -1||n.data.key.indexOf("HTTPOUT") != -1){
myDiagram.model.addLinkData({ from:1 , to: n.data.key });
}
});
});