var node = {};
node["key"] = "节点Key";
node["loc"] = "0 0";//节点坐标
node["text"] = "节点名称";
// 添加节点 通过按钮点击,添加新的节点到画布
myDiagram.model.addNodeData(node);
if (myDiagram.commandHandler.canDeleteSelection()) {
// 删除选中节点或线,页面上有个按钮点击,可以删除选择的节点和线
myDiagram.commandHandler.deleteSelection();
return;
}
// 获得当前画布的json,获取当前画布的所有元素的json,用来保存
var model= myDiagram.model.toJson();
//model=eval('('+model+')');若格式异常抓一下
var nodes=model.nodeDataArray;取出所有节点
var Links=model.linkDataArray;取出所有线
// 加载json刷新画布,一般用来刷新和加载画布上的元素
model=myDiagram.model.toJson()
myDiagram.model = go.Model.fromJson(model);
// 通过节点key获取节点,知道节点key ,拿到这个节点的详细信息
var node = myDiagram.model.findNodeDataForKey('key');
var node = myDiagram.model.findNodeDataForKey('key');
//首先拿到这个节点的对象
myDiagram.model.setDataProperty(node, 'color', "#ededed");
//然后对这个对象的属性进行更改,更改节点属性值,更改节点的颜色,或者大小等
// 获取获得焦点的第一个元素,可为节点或者线
var node=myDiagram.selection.first();
console.log(node.data.key);
//用例获取选中的节点或线
var nodeOrLinkList=myDiagram.selection;
nodeOrLinkList.each(function(nodeOrLink) {
console.log(nodeOrLink.data);
});
// 获取画布所有节点对象myDiagram.nodes获取所有获得焦点的节点
var items='';
for(var nit=myDiagram.nodes;nit.next();){
var node=nit.value;
if(node.isSelected){
items+=node.data.key+",";
}
}
console.log(items);
// 遍历整个画布的节点信息写法
for(var nit=myDiagram.nodes;nit.next();){
var node=nit.value;
var key=node.data.key;
var text=node.data.text;
}
// 给节点添加线
myDiagram.model.addLinkData({ from: "节点的Key", to: "连到另一节点的key" })
// 删除线
myDiagram.model.removeLinkData(linkData);

//批量删除线

{Array|iterator} removeLinks

removeLinkDataCollection(removeLinks);

var removeLinks=[];
//首先拿到这个节点的对象
var node = myDiagram.findNodeForKey('key');
//获取节点所有线
node.findLinksConnected().each(function(link) { 
     removeLinks.push(link.data);
    }
 );
myDiagram.model.removeLinkDataCollection(removeLinks);
// 模糊获取线(版本1.68以上)注意值类型,字符串和数值 匹配 方式和模糊获取节点的规则一致

myDiagram.findLinksByExample(data);

//注意值类型,字符串和数值

//如果json中是from:1.1,写成from:"1.1"就会查询不到

var links=myDiagram.findLinksByExample({from:1.1, to:2.1});

links.iterator.each(function (link) {

console.log(link.data);

});

var newdata = { "text":"AAAA", "key":-33,"loc":"0 0" };
myDiagram.model.addNodeData(newdata);
var newdat2= myDiagram.model.findNodeDataForKey('-3');
console.log(newdat2);
var node = myDiagram.findNodeForData(newdat2);
console.log(node);
myDiagram.select(node);//选中节点
// 特殊案例API用法
myDiagram.findNodeForData(objNode);
myDiagram.findLinkForData(objLink);
// 其中objNode或者objLink,只能从画布的json 对象取出,不能直接手写例如
var newdata={"text":"AAAA","key":-33,"loc":"0 0"};
var node = myDiagram.findNodeForData(newdat2);
// 除了刚好是新建的节点外,,不然是获取不到这个对象的,因为添加节点时,gojs会自动给节点或者线添加一个属性
// 节点选中改变事件 selectionChanged: 回调的函数方法名
//该属性要写在$(go.Node,)内用大括号括起来
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ selectionChanged: nodeSelectionChanged },
//节点选中改变事件,nodeSelectionChanged为回调的方法名
$(go.Panel, "Auto",
$(go.Shape,//节点形状和背景颜色的设置
{ fill: "#1F4963" },
new go.Binding("fill", "color")
),
)
);//go.Node的括号 //回调方法 节点选中的时候是一种颜色,取消选中是另一种颜色
function nodeSelectionChanged(node) {
if(node.isSelected) {//
//节点选中执行的内容
console.log(node.data);//节点的属性信息
console.log(node.data.key);//拿到节点的Key,拿其他属性类似
var node1 = myDiagram.model.findNodeDataForKey(node.data.key);
myDiagram.model.setDataProperty(node1, "fill", "#ededed");
} else {
//节点取消选中执行的内容
var node1 = myDiagram.model.findNodeDataForKey(node.data.key);
myDiagram.model.setDataProperty(node1, 'fill', "1F4963 ");
}
}
// 节点双击事件
doubleClick : function(e, node){
//node为当前双击的节点的对象信息
}
//该属性要写在$(go.node,)内用大括号括起来
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
$(go.Panel, "Auto",
$(go.Shape,//节点形状和背景颜色的设置
{ fill: "#1F4963" },
new go.Binding("fill", "color")
),
{doubleClick : function(e, node){// 双击事件
handlerDC(e, node);//双击执行的方法
}
}
)
);//go.Node的括号 //双击执行的方法
function handlerDC(e, obj) {
var node = obj.part;//拿到节点的json对象,后面要拿什么值就直接.出来
var procTaskId = node.data.key;
var procTaskName = node.data.text;
var description = node.data.description;
var procTmplId = node.data.tmplId;
}
// 该例子主要应用场景为,双击节点,得到节点的详细信息,弹出窗口修改节点的信息
// 从Palette拖过来节触发的事件
myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
console.log(e);
}); myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
e.subject.each(function(n){
//得到从Palette拖过来的节点
console.log(n.data.key);
});
});
// 当前画布被拖动的节点     未测试
myDiagram.addDiagramListener("Modified", function(e) {
myDiagram.isModified = false; iter = myDiagram.selection.iterator; while (iter.next()) {
var part = iter.value;
if (part instanceof go.Link) {
if ( ( part.data.from == 0 || part.data.from == undefined) || ( part.data.to == 0 || part.data.to == undefined ) ) {
myDiagram.model.setDataProperty(part.data, 'link-color', 'red');
console.log(part.data);
console.log("非法");
} else if(part.data.from > 0 || part.data.from < 0 ) {
var node = myDiagram.findNodeForKey(part.data.from);
if (!node) {
console.log("非法");
}
}else if(part.data.to > 0 || part.data.to < 0 ) {
var node = myDiagram.findNodeForKey(part.data.to);
if (!node) {
console.log("非法");
}
}
}
}
var $ = go.GraphObject.make;
// 定义画布的基本属性 这里绑定画布所用的div,并保存在myDiagram中,后续的节点设置均使用这个变量,意思是在这个画布上定义节点和操作节点
myDiagram = $(go.Diagram, "myDiagram", //画布绑定的Div的ID
{
initialContentAlignment: go.Spot.Center, // 画布的位置设置(居中,靠左等)
allowDrop: true, // must be true to accept drops from the Palette
"LinkDrawn": showLinkLabel, //
"LinkRelinked": showLinkLabel,
"animationManager.duration": 600, // 画布刷新的加载速度
"undoManager.isEnabled": true, // "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
allowZoom: true // 允许缩放,false为否
isReadOnly: false // 是否禁用编辑 false否,
true是 //ismodelfied:true //禁止拖拽 });
// 定义单种节点
myDiagram.nodeTemplate=$(go.Node,***)
//***为对节点的定义
myDiagram.nodeTemplate =
$(go.Node, "Horizontal",
{ selectionChanged: nodeSelectionChanged },
//节点选中改变事件,nodeSelectionChanged为回调的方法名
$(go.Panel, "Auto",
$(go.Shape,//节点形状和背景颜色的设置
{ fill: "#1F4963", stroke: null }
),
$(go.TextBlock,
{ font: "bold 13px Helvetica, bold Arial, sans-serif",//字体
editable:true,
stroke: "white",//颜色
margin: 3 },
new go.Binding("text", "key")
)//go.TextBlock,的括号
)//go.Panel 的括号
);//go.Node的括号
// 定义多种节点(画布上有多种节点)
myDiagram.nodeTemplateMap.add("A种节点",$(go.Node,***))
//一种类型的节点
myDiagram.nodeTemplateMap.add("Start",
$(go.Node, "Spot",
$(go.Panel, "Auto",
$(go.Shape, "Circle", {
minSize: new go.Size(40, 40),
fill: "#79C900",
stroke: null
})
)
)//go.Node的括号
);
//另一种类型的节点
myDiagram.nodeTemplateMap.add("End",
$(go.Node, "Spot",
$(go.Panel, "Auto",
$(go.Shape, "Circle", {
minSize: new go.Size(40, 40),
fill: "#DC3C00",
stroke: null
})
)
)//go.Node的括号
); //添加不同种类的节点
var node = {};
node["text"] = "2222";
node["key"] = "33";
node["loc"] = "0 0";
node["category"] = "Start";//category
myDiagram.model.addNodeData(node);
// 定义线
myDiagram.linkTemplate=$(go.Link,***);
//添加监听节点生成事件
myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
e.subject.each(function(n){
console.log(n.data.key);
});
});
//添加监听线生成事件
myDiagram.addDiagramListener("LinkDrawn", function(e) {
console.log(e.subject.data.to);
})
//监听节点删除事件
myDiagram.addDiagramListener("SelectionDeleted", function(e) {
e.subject.each(function(n){
console.log(n.data.key);
});
})
//节点
//获取节点实际边界(宽高)
node.naturalBounds 返回值Rect(0,0,126,31)
//添加节点
myDiagram.model.addNodeData(nodeData);
//删除节点
myDiagram.model.removeNodeData(nodeData);
//选中单个节点或线
myDiagram.select(node);
//更改属性值
myDiagram.model.setDataProperty(nodeData, 'color', "#ededed");
//根据节点数据对象更改节点属性
myDiagram.model.updateTargetBindings(nodeData);
var nodeData = myDiagram.model.findNodeDataForKey('4.1');
nodeData.text = "2333"
nodeData.color = "#000000";
myDiagram.model.updateTargetBindings(nodeData);
//获取节点对象
var node=myDiagram.findNodeForKey('key');
//获取节点data
var nodeData=myDiagram.model.findNodeDataForKey('key');
//批量删除节点
myDiagram.model.removeNodeDataCollection(nodes)
var removeNodes = []; 
var aNodeData = myDiagram.model.findNodeDataForKey('Akey');
var bNodeData = myDiagram.model.findNodeDataForKey('Bkey');
removeNodes.push(aNodeData );
removeNodes.push(bNodeData);
myDiagram.model.removeNodeDataCollection(removeNodes); //模糊获取节点(版本1.68以上)注意值类型,字符串和数值
myDiagram.findNodesByExample(data);
匹配方式默认为===运算符进行比较。
/abc/ 匹配包含“abc”的任何字符串
/abc/i 匹配包含“abc”的任何字符串,忽略大小写
/^no/i 匹配任何以“no”开头的字符串,忽略大小写
/ism$/匹配任何以“ism”结尾的字符串
/(green|red) apple/ 匹配包含“green apple”或“red apple”的字符串 //注意值类型,字符串和数值,
//如果json中是1.1,写成"1.1"就会查询不到
var data={};
   data.text="设计";
// data.text=/设计/;
// data.text=/设计/i;
// data.text=/^设计/;
// data.text=/设计$/;
// data.text=/(勘|察)设计/;
var nodes = myDiagram.findNodesByExample(data);
    nodes.iterator.each(function (node) {
      console.log(node.data);
});
//更改属性值
myDiagram.model.setDataProperty(linkData, 'from', "-2");
//获取节点的线
{string | null =} PID 端口ID
findLinksConnected(PID)
var node=myDiagram.findNodeForKey('key');
node.findLinksConnected().each(function(link) {console.log(link.data)});
//获取进入节点的线
{string | null =} PID 端口ID
findLinksInto(PID)
var node=myDiagram.findNodeForKey('key');
node.findLinksInto().each(function(link) {console.log(link.data)});
//获取从节点出来的线
{string | null =} PID 端口ID
findLinksOutOf(PID)
var node=myDiagram.findNodeForKey('key');
node.findLinksOutOf().each(function(link) {console.log(link.data)});
//获取A-B节点之间的线
{node } othernode B节点对象
{string | null =} PID 端口ID
{string | null =} otherPID B节点端口ID
findLinksBetween(othernode, PID, otherPID)
var nodeA=myDiagram.findNodeForKey('key');
var nodeB=myDiagram.findNodeForKey('key');
nodeA.findLinksBetween(nodeB).each(function(link) {console.log(link.data)});
//树节点
//根据甲,找甲的所有父级(包括甲)
node.findTreeParentChain();
node.findTreeParentChain().each(function(pNode) {
console.log(pNode.data)
});
//根据甲,找甲的所有子级(包括甲)
node.findTreeParts();
node.findTreeParts().each(function(sNode) {
console.log(sNode.data)
});
//根据甲,找甲的父亲
node.findTreeParentNode();  
var pNode=node.findTreeParentNode();  
//根据甲,找甲的孩子们
node.findTreeChildrenNodes();
node.findTreeChildrenNodes().each(function(cNode) {
console.log(cNode.data)
});
基础画布定义API
//画布初始位置
initialContentAlignment: go.Spot.Center,
//画布位置,定义后就不能拖动画布了,画布位置交由gojs管理 contentAlignment:go.Spot.Center,
//初始坐标
initialPosition: new go.Point(0, 0)
//禁止移动节点
allowMove:false
//禁止复制
allowCopy: false
//禁止删除
allowDelete:false
//禁止选中
allowSelect:false
//禁止缩放
allowZoom: false
//禁止撤销和重做
"undoManager.isEnabled": false
//禁止水平滚动条
allowHorizontalScroll: false
//禁止垂直滚动条
allowVerticalScroll: false
//只读
isReadOnly: true
//画布初始化动画时间
"animationManager.duration": 600
//禁止画布初始化动画
"animationManager.isEnabled": false
//画布比例
scale:1.5
//画布比例自适应
autoScale:go.Diagram.Uniform,
//画布比例自适应
autoScale:go.Diagram.UniformToFill,
//默认值不自适应
autoScale:go.Diagram.None,
//画布最小比例
minScale:1.2,
//画布最大比例
maxScale:2.0,
//显示网格
"grid.visible":true,
//画布边距
padding
padding:80或者new go.Margin(2, 0)或new go.Margin(1, 0, 0, 1) 画布节点连线定义
//只允许有一个父节点
validCycle:go.Diagram.CycleDestinationTree validCycle:go.Diagram.CycleNotUndirected validCycle:go.Diagram.CycleNotDirected validCycle:go.Diagram.CycleSourceTree //禁止鼠标拖动区域选中
dragSelectingTool "dragSelectingTool.isEnabled" : false,
//或者在画布对象myDiagram创建后再调用
myDiagram.toolManager.dragSelectingTool.isEnabled = false ; validCycle
默认无限制 validCycle:go.Diagram.CycleAll 节点之间连线随便连
一个节点只允许有一个父节点,并且没有定向循环(仅允许维护树结构的链接) validCycle:go.Diagram.CycleDestinationTree
禁止A→C,B→C 节点的有效链接不会在图中产生有向循环
validCycle:go.Diagram.CycleNotDirected 禁止A-B-C-A
节点的有效链接不会在图中产生无向循环
validCycle:go.Diagram.CycleNotUndirected 一个节点只允许有一个子节点并且没有定向循环。 validCycle:go.Diagram.CycleSourceTree 禁止A→B,A→C 画布监听事件API
节点生成事件 externalobjectsdropped
线生成事件 LinkDrawn
线重新连接事件 LinkRelinked
删除后事件 SelectionDeleted
删除前事件 SelectionDeleting 例子入口
节点移动事件 SelectionMoved
//监听节点或线的删除事件
myDiagram.addDiagramListener("SelectionDeleted", function(e) {
e.subject.each(function(n){
console.log(n.data.key);
});
})

自动布局API

//网格布局
go.GridLayout
//力导向布局
go.ForceDirectedLayout
//树形布局
go.TreeLayout
//径向布局(需要引RadialLayout.js)
RadialLayout
// 用例定义画布节点为网格布局
myDiagram =
$(go.Diagram, "myDiagramDiv", // 画布定义
{
layout: $(go.GridLayout, //自动布局定义,设置为网格布局
{
comparer: go.GridLayout.smartComparer, //设置从小到大排序
spacing: go.Size.parse("20 20"), //设置节点间隔
comparer: function (a, b) {
//重写布局算法,根据其他属性值重新增设置顺序
var ay = a.data.type;
var by = b.data.type;
if (!!ay && !!by) {
if (ay > by) return -1;
if (ay < by) return 1;
} else if (!!ay) {
return -1;
} else if (!!by) {
return 1;
}
}
});
});

GoJS API

GoJS API学习的更多相关文章

  1. Openstack api 学习文档 & restclient使用文档

    Openstack api 学习文档 & restclient使用文档 转载请注明http://www.cnblogs.com/juandx/p/4943409.html 这篇文档总结一下我初 ...

  2. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  3. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  4. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  5. NSData所有API学习

      www.MyException.Cn  网友分享于:2015-04-24  浏览:0次   NSData全部API学习. 学习NSData,在网上找资料竟然都是拷贝的纯代码,没人去解释.在这种网上 ...

  6. Node.js API 学习笔记

    常用 API 学习笔记 url 函数 url.parse: 解析 url 地址 url.resolve: 向 url 地址添加或替换字段 url.format: 生成 url 地址 querystri ...

  7. 框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)

    一.Spring事务管理的特点 Spring框架为事务管理提供一套统一的抽象,带来的好处有:1. 跨不同事务API的统一的编程模型,无论你使用的是jdbc.jta.jpa.hibernate.2. 支 ...

  8. RESTful API 学习

    /********************************************************************************* * RESTful API 学习 ...

  9. Windows录音API学习笔记

    Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD      wMid; 用于波形 ...

随机推荐

  1. Flask - flask-mail

    flasky中git reset --hard 8e 问题 使用flask-mail通过163邮箱的smtp服务发送token认证邮件,要关闭TLS才能发送 原理 还在研究中 结果

  2. Lesson 16 The modern city

    What is the author's main argument about the modern city? In the organization of industrial life the ...

  3. MSSQL2005数据库快照(SNAPSHOT)初探

    定义:数据库快照是数据库(称为“源数据库”)的只读静态视图.在创建时,每个数据库快照在事务上都与源数据库一致.多个快照可以位于一个源数据库中,并且可以作为数据库始终驻留在同一服务器实例上.在创建数据库 ...

  4. linux jar 启动shell 脚本

    #!/bin/bash APP_NAME=/data/wwwroot/app.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh app.sh [sta ...

  5. idea 添加 阿里代码规范

    参考: https://blog.csdn.net/weixin_39220472/article/details/80077803

  6. Mark Grover

    https://www.ibm.com/developerworks/cn/data/library/bd-zookeeper/

  7. SRS源码——调用FFmpeg参数问题

    在SRS的Ingest功能中,会调用本地FFmpeg进行拉流转码, 调用的核心代码在srs_app_ffmpeg.cpp 的 SrsFFMPEG::start() 中: // memory leak ...

  8. exec函数的执行对用户ID的影响

    exec不会创建新进程,只是分析加载程序文件或者shell执行文件,替换父进程的代码段.数据段.栈段,一个进程可以执行多个exec来执行多个程序,但进程只有一个 父进程经常是waitpid,获取子进程 ...

  9. 全球定位IP位置 2018(离线版)

    球定位IP位置 2018(离线版) 这次写的软件使用Python写的,所以体积可能有点大 我特地写了GUI打包成了Exe可执行文件,方便小白使用== 只要输入目标ip就能显示目标所在的国家城市和经纬度 ...

  10. 无需密码攻击 Microsoft SQL Server

    最近的一次渗透测试里,在我们捕获的一些数据包中发现了一些未经加密的 Microsoft SQL Server(MSSQL) 流量.起初,我们认为这样就可以直接嗅探到认证凭证,然而,MSSQL 加密了认 ...