下面是一个SDK的实例:
if (typeof(wlNgApp) === "undefined")
wlNgApp = angular.module("wl.controls", []);
/**
* 定义wl-study-nodefig组件该组件可以挂接以下几个事件
*/
wlNgApp.directive("wlPlanNodefig", function() {
return {
templateUrl: WLJS.getWebRoot() + '/resources/comp/wl-study/wl-study-nodefig-gojs/nodefigtemplate.html',
restrict: 'E',
replace: true,
scope: { //创建一个新的“隔离”scope,通过绑定与父scope通信
readonly: "@", //单向绑定
theme: "@",
methods: "=wlPlanNodefig", //双向绑定、供外部调用方法集
saveFig: "&onSaveFig", //当directive中有什么动作需要更新到父scope中的时候,可以调用父scope的定义的nodefigOnsavefig(figureId)方法
createNode: "&onCreateNode",
nodeOnClick: "&onClickNode",
saveNode: "&onSaveNode",
removeNode: "&onRemoveNode",
editNode: "&onEditNode",
nodeFocusOut: "&onNodeFocusOut",
showWindow: "&onShowWindow",
},
controller: function($scope, $element, $http, $filter) {
this.$filter = $filter;
$(".icon-fullscreen").fadeOut(1);
$scope.expandToolBar = true;
$scope.$watch('readonly', function() {//监听
if ($scope.readonly == 'true') {
$scope.readonly = true;
} else if ($scope.readonly == 'false') {
$scope.readonly = false;
}
if ($scope.readonly == true) {
$(".icon-fullscreen").fadeOut(1);
$("#paletteDraggable").fadeOut(1);
//连线
nodeFigDiagram.allowLink = false;
//节点移动
nodeFigDiagram.allowMove = false;
// //节点选择
// nodeFigDiagram.allowSelect = true;
} else {
$(".icon-fullscreen").fadeOut(1);
$("#paletteDraggable").fadeIn(500);
nodeFigDiagram.allowMove = true;
// nodeFigDiagram.allowSelect = true;
}
});
//展开工具
$scope.toolExpand = function() {
if ($scope.expandToolBar) {
$("#paletteDraggable").fadeOut(1);
$(".icon-fullscreen").fadeIn(500);
} else {
$(".icon-fullscreen").fadeOut(1);
$("#paletteDraggable").fadeIn(500);
}
$scope.expandToolBar = !$scope.expandToolBar;
}
//保存流程图
$scope.saveFigInner = function(data) {
$scope.saveFig({ figureId: $scope.figureId });
};
$scope.saveFigInner();
//保存节点
$scope.saveNodeInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.saveNode({ nodeData: data });
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
/** GOJS监听:新增节点 */
$scope.createNodeInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.createNode({ nodeData: data });
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//单击节点
$scope.nodeOnClickInner = function(data) {
$scope.nodeOnClick({ nodeData: data });
}
//删除节点
$scope.removeNodeInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.removeNode({ nodeData: data });
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//删除线
$scope.removeLineInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
// $scope.removeNode({nodeData: data});
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//删除本次流程图
$scope.deleteFigureInner = function(data) {
if ($scope.figureId) {
var deleteFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/deleteFigure?figureId=";
$http.post(deleteFigure + $scope.figureId).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.figureId = undefined;
$scope.load();
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//编辑节点信息
$scope.editNodeInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.editNode({ nodeData: data });
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//点击背景一次,即离开节点
$scope.nodeFocusOutInner = function() {
$scope.nodeFocusOut();
}
//打开节点文本编辑框
$scope.showWindowInner = function(data) {
if (data.key) {
$scope.showWindow({ nodeData: data });
}
}
//移动节点位置
$scope.moveNodeInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.editNode({ nodeData: data });
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//编辑线
$scope.editLineInner = function(data) {
if ($scope.figureId) {
var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, nodeFigDiagram.model.toJson()).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.editNode({ nodeData: data });
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
}
}
//加载数据
$scope.load = function() {
if ($scope.figureId) {
var getFigureById = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/getFigureById?figureId=";
$.post(getFigureById + $scope.figureId, function(res) {
if (res.ret == 'ok') {
// var flowNodeData = JSON.parse(res.content);
if (res.content) {
nodeFigDiagram.model = go.Model.fromJson(res.content);
} else {
nodeFigDiagram.model = go.Model.fromJson({});
}
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});
/* var modelData={
"class": "go.GraphLinksModel",
"linkFromPortIdProperty": "fromPort",
"linkToPortIdProperty": "toPort",
"nodeDataArray": [
{"key": -1, "loc": "175 0", "text": "Start21"},
{
"key": 1,
"loc": "175 100",
"text": "In a bowl, blend: 1 cup margarine, 1.5 teaspoon vanilla, 1 teaspoon salt"
}
],
"linkDataArray": [
{"from": -1, "to": 1}
]
};*/
} else {
nodeFigDiagram.model = go.Model.fromJson({});
}
}
},
link: function(scope, elem, attr) { //如果使用compile,link会被忽略
console.log();
},
compile: function(tele, tattrs, $filter, $http) { //compile返回的是一个函数,即link函数
return {
pre: function($scope, ele, attrs, $filter) {//在controller之前执行
$filter = $filter.$filter;
$scope.methods = {//定义供外部调用的方法集
setFigureId: function(figureId) {//定义供外部调用的方法
$scope.figureId = figureId;
$scope.load();
},
setFigNodeName: function(key, nodeName) {//定义供外部调用的方法
var node = nodeFigDiagram.model.findNodeDataForKey(key);
if (node) {
node.text = nodeName;
//更新节点
nodeFigDiagram.model.updateTargetBindings(node); // 这种更新似乎不会通知raiseDataChanged
// nodeFigDiagram.model.setDataProperty(node, "text", nodeName); // 也不更新,$apply还报错。
// nodeFigDiagram.layoutDiagram(false); //格式化画布,会自动变成横向
$scope.saveNodeInner();
// 手动重新加载
nodeFigDiagram.model = go.Model.fromJson(nodeFigDiagram.model.toJson());
}
},
setFigureData: function(figureData) {//定义供外部调用的方法
console.log("保存流程图");
// TODO 保存model
nodeFigDiagram.model = go.Model.fromJson(figureData);
$scope.saveNodeInner();
/*var saveFigure = WLJS.getWebRoot() + "/rest/inner/platform/nodefig/saveFigure?figureId=";
$http.post(saveFigure + $scope.figureId, figureData).success(function(res) {
if (res.ret == WLJS.ResultStatus.OK) {
$scope.load();
} else {
console.log("后台请求错误");
alert("后台请求错误");
}
}).error(function() {
console.log("数据请求错误");
alert("数据请求错误");
});*/
},
deleteFigure: function() {//定义供外部调用的方法
$scope.deleteFigureInner();
},
deleteFigNode: function(key) { // 删除流程节点、定义供外部调用的方法
var node = nodeFigDiagram.model.findNodeDataForKey(key);
nodeFigDiagram.model.removeNodeData(node);
$scope.saveNodeInner();
}
};
$scope.init = function() {//初始化
//判断选取主题
if ($scope.theme == 'darkBlue') {
var nodefigTheme = darkBlue;
} else if ($scope.theme == 'blueWhite') {
var nodefigTheme = blueWhite;
} else {
var nodefigTheme = blueWhite;
}
document.getElementById("myDiagramDiv").style.backgroundColor = nodefigTheme.hbbjs;//流程框
document.getElementById("myDiagramDiv").style.opacity = nodefigTheme.hbbjtmd;
document.getElementById("myPaletteDiv").style.backgroundColor = nodefigTheme.gjlbjs;//操作框
document.getElementById("paletteDraggable").style.backgroundColor = nodefigTheme.gjlbjs;//操作框边框
document.getElementById("paletteDraggable").style.borderColor = nodefigTheme.gjlbks;
//判断赋值画布高度、整个流程图范围
var wlPlanNodefigObj = document.getElementById("nodefigObj");
if (wlPlanNodefigObj.offsetHeight < 100) {
wlPlanNodefigObj.style.height = "350px";
}
// ? 无用 if (window.goSamples) goSamples(); // init for these samples -- you don't need to call this
var $ = go.GraphObject.make; // for conciseness in defining templates
nodeFigDiagram =
$(go.Diagram, "myDiagramDiv", // must name or refer to the DIV HTML element
{
initialContentAlignment: go.Spot.Center,//对齐方式居中
allowDrop: true, // must be true to accept drops from the Palette 必须从操作框往外拖拽
"draggingTool.dragsLink": true, //允许线从面板拖动
"relinkingTool.isUnconnectedLinkValid": true, //允许线连接到节点
"LinkDrawn": showLinkLabel, // this DiagramEvent listener is defined below
"LinkRelinked": showLinkLabel,
scrollsPageOnFocus: false,//在焦点上滚动页面
// "clickCreatingTool.archetypeNodeData": {text: "Node", color: "white"},// allow double-click in background to create a new node
"undoManager.isEnabled": false, // enable undo & redo 支持 Ctrl-Z 和 Ctrl-Y 操作
isReadOnly: ($scope.readonly == true ? true : false), //只读
//禁止横竖拖动和鼠标滚动,流程图整体的拖动
allowHorizontalScroll: false,
allowVerticalScroll: false,
//默认不可连线,选盘选中直线才可
allowLink: false,
//移动节点
allowMove: true,
layout: $(go.LayeredDigraphLayout, {//布局
isInitial: false,
isOngoing: false, //?是否连续
layerSpacing: 50 // 层间隔
}),
//禁止组团
allowGroup: false,
//设置最大选择数
maxSelectionCount: 1,
//延时布局
delaysLayout: true,
//禁止鼠标左键拖动多选
"dragSelectingTool.isEnabled": false,
//定义节点不可周边自行连线,只能从选盘拖动线
allowLink: false,
});
// nodeFigDiagram.layoutDiagram(true);//重新加载画布
// To simplify this code we define a function for creating a context menu button:
function makeButton(text, action, visiblePredicate) {
return $("ContextMenuButton",
$(go.TextBlock, text), { click: action },
// don't bother with binding GraphObject.visible if there's no predicate
visiblePredicate ? new go.Binding("visible", "", function(o, e) {
return o.diagram ? visiblePredicate(o, e) : false;
}).ofObject() : {});
} // a context menu is an Adornment with a bunch of buttons in them
var partContextMenu =
$(go.Adornment, "Vertical",
makeButton("文本编辑",
function(e, obj) {
$scope.showWindowInner();
e.diagram.commandHandler.editTextBlock();
},
function(o) {
var temp = o.part.data.key;
if (temp) {
return true;
}
return false;
}),
makeButton("删除",
function(e, obj) {
e.diagram.commandHandler.deleteSelection();
$scope.removeNodeInner();
},
function(o) {
return o.diagram.commandHandler.canDeleteSelection();
}),
);
// when the document is modified, add a "*" to the title and enable the "Save" button
nodeFigDiagram.addDiagramListener("Modified", function(e) {
var idx = document.title.indexOf("*");
if (nodeFigDiagram.isModified) {
if (idx < 0) document.title += "*";
} else {
if (idx >= 0) document.title = document.title.substr(0, idx);
}
}); // helper definitions for node templates
function nodeStyle() {
return [
// The Node.location comes from the "loc" property of the node data,
// converted by the Point.parse static method.
// If the Node.location is changed, it updates the "loc" property of the node data,
// converting back using the Point.stringify static method.
new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
{
// the Node.location is at the center of each node
locationSpot: go.Spot.Center
}
];
} // Define a function for creating a "port" that is normally transparent.
// The "name" is used as the GraphObject.portId,
// the "align" is used to determine where to position the port relative to the body of the node,
// the "spot" is used to control how links connect with the port and whether the port
// stretches along the side of the node,
// and the boolean "output" and "input" arguments control whether the user can draw links from or to the port.
function makePort(name, align, spot, output, input) {
var horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
// the port is basically just a transparent rectangle that stretches along the side of the node,
// and becomes colored when the mouse passes over it
return $(go.Shape, {
fill: "transparent", // changed to a color in the mouseEnter event handler 变色
strokeWidth: 0, // no stroke
width: horizontal ? NaN : 8, // if not stretching horizontally, just 8 wide 水平拉伸
height: !horizontal ? NaN : 8, // if not stretching vertically, just 8 tall 垂直拉伸
alignment: align, // align the port on the main Shape
stretch: (horizontal ? go.GraphObject.Horizontal : go.GraphObject.Vertical),
portId: name, // declare this object to be a "port"
fromSpot: spot, // declare where links may connect at this port 声明链接可以在此端口连接的位置
fromLinkable: output, // declare whether the user may draw links from here 声明用户是否可以从此处绘制链接
toSpot: spot, // declare where links may connect at this port 声明链接可以在此端口连接的位置
toLinkable: input, // declare whether the user may draw links to here 声 明用户是否可以从此处绘制链接
// cursor: "pointer", // show a different cursor to indicate potential link point
mouseEnter: function(e, port) { // the PORT argument will be this Shape
// if (!e.diagram.isReadOnly) port.fill = "rgba(255,0,255,0.5)";
if (!e.diagram.isReadOnly) port.fill = "transparent";
},
mouseLeave: function(e, port) {
port.fill = "transparent";
}
});
} //重写复制ctrl+c
nodeFigDiagram.commandHandler.copySelection = function(obj) {
// go.CommandHandler.prototype.copySelection.call(nodeFigDiagram.commandHandler);//注意,这句话就是调用原有API提供的操作进行复制。
} function textStyle() {
return {
font: nodefigTheme.jdzcztys,
stroke: nodefigTheme.jdztys,
isMultiline: false,
//省略过长文本
maxLines: 1,
overflow: go.TextBlock.OverflowEllipsis,
width: 160
}
} //选中修饰
var nodeSelectionAdornmentTemplate = $(go.Adornment, "Auto",
$(go.Shape, "Rectangle", {
fill: "#00A1FD",
stroke: null,
strokeWidth: 1,
width: 140
}),
$(go.Placeholder),
$(go.TextBlock, {
stroke: "#FFFFFF",
font: nodefigTheme.jdxzztys,
isMultiline: false,
maxLines: 1,
overflow: go.TextBlock.OverflowEllipsis,
width: 140
}, {
margin: 8,
maxSize: new go.Size(130, NaN),
wrap: go.TextBlock.WrapFit,
editable: true
},
new go.Binding("text").makeTwoWay()), { // this tooltip Adornment is shared by all nodes
toolTip: $(go.Adornment, "Auto",
$(go.Shape, { fill: "#FFFFCC" }),
$(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
new go.Binding("text", "", nodeInfo))
),
},
); function nodeInfo(d) { // Tooltip info for a node data object
return d.text;
} // define the Node templates for regular nodes
nodeFigDiagram.nodeTemplateMap.add("", // the default category
$(go.Node, "Table", nodeStyle(),
// the main object is a Panel that surrounds a TextBlock with a rectangular Shape
$(go.Panel, "Auto",
$(go.Shape, "Rectangle", {
fill: nodefigTheme.hbbjs,
stroke: nodefigTheme.jdbkys,
strokeWidth: nodefigTheme.jdbkkd,
width: 140,
height: 50,
},
new go.Binding("figure", "figure"),
new go.Binding("fill", "fill")
),
$(go.TextBlock, textStyle(), {
margin: 8,
maxSize: new go.Size(130, NaN),
wrap: go.TextBlock.WrapFit,
editable: true
// editable: false
},
new go.Binding("text").makeTwoWay()),
// { // this tooltip Adornment is shared by all nodes
// // this context menu Adornment is shared by all nodes
// contextMenu: partContextMenu
// },
), { //设置其可选择
selectable: true,
selectionAdornmentTemplate: nodeSelectionAdornmentTemplate
},
// four named ports, one on each side:
makePort("T", go.Spot.Top, go.Spot.TopSide, false, true),
makePort("L", go.Spot.Left, go.Spot.LeftSide, true, true),
makePort("R", go.Spot.Right, go.Spot.RightSide, true, true),
makePort("B", go.Spot.Bottom, go.Spot.BottomSide, true, false), {
mouseLeave: function(e, node) {
console.log(node.part.data);
// angular.element("#myDiagramDiv").scope().nodeFocusOut(node.part.data);
// $scope.nodeFocusOutInner();
},
//选择节点变色
selectionChanged: function(part) {
//更新节点文本
nodeFigDiagram.model.updateTargetBindings(part.data);
},
}, { // this tooltip Adornment is shared by all nodes
toolTip: $(go.Adornment, "Auto",
$(go.Shape, { fill: "#FFFFCC" }),
$(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
new go.Binding("text", "", nodeInfo))
),
},
)); nodeFigDiagram.nodeTemplateMap.add("Start",
$(go.Node, "Table", nodeStyle(),
$(go.Panel, /*"Vertical",*/ "Auto",
$(go.Shape,
// "Circle",
// {maxSize: new go.Size(25, 25), fill: "#DC3C00", strokeWidth: 0}//整圆,不是圆环
{
geometryString: "F1 M 0,0 a10,10 0 1,0 1,0 z F1 M 0,-3 a13,13 0 1,0 1,0 z",
fill: "#49CC12",
margin: 0,
strokeWidth: 2,
stroke: "white",
}),
// $(go.TextBlock, textStyle(), {
// margin: 8,
// maxSize: new go.Size(160, NaN),
// wrap: go.TextBlock.WrapFit,
// editable: true
// // editable: false
// },
// new go.Binding("text").makeTwoWay()),
), { //设置其可选择
selectable: true,
selectionAdornmentTemplate: $(go.Adornment, "Auto",
$(go.Shape, {
fill: null,
stroke: "deepskyblue",
strokeWidth: 2,
}),
$(go.Placeholder))
},
// three named ports, one on each side except the top, all output only:
makePort("L", go.Spot.Left, go.Spot.Left, true, false),
makePort("R", go.Spot.Right, go.Spot.Right, true, false),
makePort("B", go.Spot.Bottom, go.Spot.Bottom, true, false)
)); nodeFigDiagram.nodeTemplateMap.add("End",
$(go.Node, "Table", nodeStyle(),
$(go.Panel, "Vertical",
$(go.Shape,
// "Circle",
// {maxSize: new go.Size(25, 25), fill: "#DC3C00", strokeWidth: 0}//整圆,不是圆环
{
geometryString: "F1 M 0,0 a10,10 0 1,0 1,0 z F1 M 0,-3 a13,13 0 1,0 1,0 z",
fill: "#DC3C00",
margin: 0,
strokeWidth: 2,
stroke: "white",
}),
), { //设置其可选择
selectable: true,
selectionAdornmentTemplate: $(go.Adornment, "Auto",
$(go.Shape, {
fill: null,
stroke: "deepskyblue",
strokeWidth: 2,
}),
$(go.Placeholder))
},
// three named ports, one on each side except the bottom, all input only:
makePort("T", go.Spot.Top, go.Spot.Top, false, true),
makePort("L", go.Spot.Left, go.Spot.Left, false, true),
makePort("R", go.Spot.Right, go.Spot.Right, false, true)
)); // replace the default Link template in the linkTemplateMap
nodeFigDiagram.linkTemplate =
$(go.Link, // the whole link panel
{
// routing: go.Link.AvoidsNodes,//线段都是垂直的线
routing: go.Link.Bezier, //线段都是直(曲)线
curve: go.Link.JumpOver,
corner: 5,
toShortLength: 4,
relinkableFrom: true,
relinkableTo: true,
reshapable: true,
resegmentable: true,
// mouse-overs subtly highlight links:
mouseEnter: function(e, link) {
link.findObject("HIGHLIGHT").stroke = "rgba(30,144,255,0.2)";
},
mouseLeave: function(e, link) {
link.findObject("HIGHLIGHT").stroke = "transparent";
},
selectionAdorned: false
},
new go.Binding("points").makeTwoWay(), //显示线的坐标
$(go.Shape, // the highlight shape, normally transparent
{ isPanelMain: true, strokeWidth: 8, stroke: "transparent", name: "HIGHLIGHT" }),
$(go.Shape, // the link path shape
{ isPanelMain: true, stroke: "#27AFFC", strokeWidth: 2 },
new go.Binding("stroke", "isSelected", function(sel) {
return sel ? "dodgerblue" : "#27AFFC";
}).ofObject()),
$(go.Shape, // the arrowhead
{ toArrow: "standard", strokeWidth: 0, fill: "#27AFFC" }),
$(go.Panel, "Auto", // the link label, normally not visible
{ visible: false, name: "LABEL", segmentIndex: 2, segmentFraction: 0.5 },
new go.Binding("visible", "visible").makeTwoWay(),
$(go.Shape, "RoundedRectangle", // the label shape
{ fill: "#F8F8F8", strokeWidth: 0 }),
$(go.TextBlock, "Yes", // the label
{
textAlign: "center",
font: "14px helvetica, arial, sans-serif",
stroke: "#333333",
editable: true
},
new go.Binding("text").makeTwoWay())
),
);
// Make link labels visible if coming out of a "conditional" node.
// This listener is called by the "LinkDrawn" and "LinkRelinked" DiagramEvents.
function showLinkLabel(e) {
var label = e.subject.findObject("LABEL");
if (label !== null) label.visible = (e.subject.fromNode.data.category === "Conditional");
} // temporary links used by LinkingTool and RelinkingTool are also orthogonal:
nodeFigDiagram.toolManager.linkingTool.temporaryLink.routing = go.Link.Orthogonal;
nodeFigDiagram.toolManager.relinkingTool.temporaryLink.routing = go.Link.Orthogonal;
$scope.load(); // load an initial diagram from some JSON text
//选盘连线选中事件
function onSelectionChanged(allowLink) {
//定义节点不可周边自行连线,只能从选盘拖动线
nodeFigDiagram.allowLink = false;
console.log(allowLink.Ai);
//选中选盘的直线时,不可选择移动节点
if (allowLink.Ai == null) { //null时为选中选盘直线状态
nodeFigDiagram.allowMove = false;
} else { //反之
nodeFigDiagram.allowMove = true;
}
} // initialize the Palette that is on the left side of the page
nodeFigPalette =
$(go.Palette, "myPaletteDiv", // must name or refer to the DIV HTML element
{
maxSelectionCount: 1,
scrollsPageOnFocus: false,
// nodeTemplateMap: nodeFigDiagram.nodeTemplateMap, // share the templates used by nodeFigDiagram//下面重写面板Palette的节点样式,字体在节点下面
linkTemplate: // simplify the link template, just in this Palette
$(go.Link, {
selectionChanged: onSelectionChanged
}, { // because the GridLayout.alignment is Location and the nodes have locationSpot == Spot.Center,
// to line up the Link in the same manner we have to pretend the Link has the same location spot
locationSpot: go.Spot.Top,
selectionAdornmentTemplate: $(go.Adornment, "Link", { locationSpot: go.Spot.Top },
$(go.Shape, {
isPanelMain: true,
fill: null,
stroke: "deepskyblue",
strokeWidth: 0,
}),
$(go.Shape, // the arrowhead
{ toArrow: "Standard", stroke: null, fill: "deepskyblue" })
),
}, {
routing: go.Link.AvoidsNodes,
curve: go.Link.JumpOver,
corner: 5,
toShortLength: 4,
},
new go.Binding("points"),
$(go.Shape, // the link path shape
{
isPanelMain: true,
strokeWidth: 2,
stroke: nodefigTheme.gjlztys,
}),
$(go.Shape, // the arrowhead
{
toArrow: "Standard",
stroke: nodefigTheme.gjlztys,
fill: nodefigTheme.gjlztys
}),
$(go.TextBlock, {
margin: 0,
font: nodefigTheme.gjlzcztys,
stroke: nodefigTheme.gjlztys,
spacingAbove: 10, //上面距离
spacingBelow: -28, //下距离
// wrap: go.TextBlock.OverflowEllipsis,
// width: 72,
// textAlign: "center"
},
new go.Binding('text', 'text')),
),
},
);
nodeFigPalette.nodeTemplate =
$(go.Node, "Vertical", {
locationObjectName: "TB",
locationSpot: go.Spot.Center,
selectionAdornmentTemplate: $(go.Adornment, "Auto",
$(go.Shape, {
margin: 0,
fill: null,
stroke: "deepskyblue",
strokeWidth: 2
}),
$(go.Placeholder)
),
},
$(go.Shape, {
width: 25,
height: 20,
fill: nodefigTheme.hbbjs,
stroke: nodefigTheme.gjlztys
},
new go.Binding("fill", "color")
),
$(go.TextBlock, {
font: nodefigTheme.gjlzcztys,
stroke: nodefigTheme.gjlztys,
}, {
margin: 3,
maxSize: new go.Size(160, NaN),
wrap: go.TextBlock.WrapFit,
editable: true,
// editable: false
wrap: go.TextBlock.OverflowEllipsis,
// width: 72,
textAlign: "center"
},
new go.Binding("text").makeTwoWay()),
); nodeFigPalette.nodeTemplateMap.add("Start",
$(go.Node, "Table", nodeStyle(), {
selectionAdornmentTemplate: $(go.Adornment, "Auto",
$(go.Shape, {
margin: 0,
fill: null,
stroke: "deepskyblue",
strokeWidth: 2
}),
$(go.Placeholder)
),
},
$(go.Panel, "Vertical",
$(go.Shape,
// "Circle",
// {maxSize: new go.Size(25, 25), fill: "#DC3C00", strokeWidth: 0}//整圆,不是圆环
{
geometryString: "F1 M 0,0 a10,10 0 1,0 1,0 z F1 M 0,-3 a13,13 0 1,0 1,0 z",
fill: "#49CC12",
margin: 0,
strokeWidth: 2,
stroke: "white",
}),
$(go.TextBlock, "Start", {
font: nodefigTheme.gjlzcztys,
stroke: nodefigTheme.gjlztys,
wrap: go.TextBlock.OverflowEllipsis,
// width: 72,
textAlign: "center"
},
new go.Binding("text"))
),
// three named ports, one on each side except the top, all output only:
makePort("L", go.Spot.Left, go.Spot.Left, true, false),
makePort("R", go.Spot.Right, go.Spot.Right, true, false),
makePort("B", go.Spot.Bottom, go.Spot.Bottom, true, false)
)); nodeFigPalette.nodeTemplateMap.add("End",
$(go.Node, "Table", nodeStyle(), {
selectionAdornmentTemplate: $(go.Adornment, "Auto",
$(go.Shape, {
margin: 0,
fill: null,
stroke: "deepskyblue",
strokeWidth: 2
}),
$(go.Placeholder)
),
},
$(go.Panel, "Vertical",
$(go.Shape,
// "Circle",
// {maxSize: new go.Size(25, 25), fill: "#DC3C00", strokeWidth: 0}//整圆,不是圆环
{
geometryString: "F1 M 0,0 a10,10 0 1,0 1,0 z F1 M 0,-3 a13,13 0 1,0 1,0 z",
fill: "#DC3C00",
margin: 0,
strokeWidth: 2,
stroke: "white",
}),
$(go.TextBlock, "End", {
font: nodefigTheme.gjlzcztys,
stroke: nodefigTheme.gjlztys,
wrap: go.TextBlock.OverflowEllipsis,
// width: 72,
textAlign: "center"
},
new go.Binding("text"))
),
// three named ports, one on each side except the bottom, all input only:
makePort("T", go.Spot.Top, go.Spot.Top, false, true),
makePort("L", go.Spot.Left, go.Spot.Left, false, true),
makePort("R", go.Spot.Right, go.Spot.Right, false, true)
)); //选盘model赋值
setTimeout(function() {
nodeFigPalette.model = new go.GraphLinksModel([ // specify the contents of the Palette
{
category: "Start",
text: $filter('translate')('Start') /*开始*/
},
{
category: "End",
text: $filter('translate')('End') /*结束*/
},
{
text: $filter('translate')('Disposal') /*处置*/
},
], [
// the Palette also has a disconnected Link, which the user can drag-and-drop
{
points: new go.List(go.Point).addAll([new go.Point(25, 0), new go.Point(0, 20)]),
text: $filter('translate')('ConnectingLine'), //连线
},
]);
}, 300); //工具条
nodeFigPalette.addDiagramListener("InitialLayoutCompleted", function(diagramEvent) {
var pdrag = document.getElementById("paletteDraggable");
var palette = diagramEvent.diagram;
pdrag.style.width = palette.documentBounds.width + 28 + "px"; // account for padding/borders
// pdrag.style.width = "86px"; // account for padding/borders
pdrag.style.height = palette.documentBounds.height + 23 + "px";
}); //监听新拖拽到画布的节点
nodeFigPalette.addModelChangedListener(function(evt) {
// ignore unimportant Transaction events
if (!evt.isTransactionFinished) return;
var txn = evt.object; // a Transaction
if (txn === null) return;
// iterate over all of the actual ChangedEvents of the Transaction
txn.changes.each(function(e) {
console.log(" removed node with key");
});
});
//监听新拖拽的连线
nodeFigPalette.addModelChangedListener(function(evt) {
// ignore unimportant Transaction events
if (!evt.isTransactionFinished) return;
var txn = evt.object; // a Transaction
if (txn === null) return;
// iterate over all of the actual ChangedEvents of the Transaction
txn.changes.each(function(e) {
console.log("removed link");
});
});
//第二种
/*节点生成事件 externalobjectsdropped
线生成事件 LinkDrawn
线重新连接事件 LinkRelinked
删除后事件 SelectionDeleted
删除前事件 SelectionDeleting 例子入口
节点移动事件 SelectionMoved
*/
//节点或线的正在删除事件监听
nodeFigDiagram.addDiagramListener("SelectionDeleting", function(e) {
e.subject.each(function(n) {
//n为删除节点或线的对象
console.log(n.data);
//只读模式,不可删除
if ($scope.readonly == true) {
//不允许删除,给e.cancel赋值
e.cancel = true;
}
});
});
//节点或线的删除完成事件监听
nodeFigDiagram.addDiagramListener("SelectionDeleted", function(e) {
var allDeleteDataArray = [];
e.subject.each(function(n) {
console.log(n.data.key);
console.log("节点或线的删除事件监听");
allDeleteDataArray.push(n.data);
if (n.data.key) {
$scope.removeNodeInner(n.data);
} else {
$scope.removeLineInner(n.data);
}
});
});
//移动完成监听
nodeFigDiagram.addDiagramListener("SelectionMoved", function(e) {
e.subject.each(function(n) {
console.log(n.data.key);
console.log("移动完成监听");
$scope.moveNodeInner(n.data);
});
});
//画线完成监听
nodeFigDiagram.addDiagramListener("LinkDrawn", function(e) {
console.log(e.subject.part.data);
console.log("画线完成监听");
var data = e.subject.part.data;
setTimeout(function() {
if (data.from && data.to) {
$scope.editLineInner(data);
} else {
e.diagram.commandHandler.redo();
}
}, 100);
});
//重新画线指派完成监听
nodeFigDiagram.addDiagramListener("LinkRelinked", function(e) {
console.log(e.subject.part.data);
console.log("重新画线指派完成监听");
var data = e.subject.part.data;
setTimeout(function() {
if (data.from && data.to) {
$scope.editLineInner(data);
} else {
e.diagram.commandHandler.redo();
}
}, 100);
});
var times = null;
//点击节点监听
nodeFigDiagram.addDiagramListener("ObjectSingleClicked", function(e) {
// 取消上次延时未执行的方法
clearTimeout(times);
times = setTimeout(function() {
if (e.subject.part.data.key) {
console.log("点击节点监听");
$scope.nodeOnClickInner(e.subject.part.data);
}
}, 300);
});
//节点新增监听-双击
nodeFigDiagram.addDiagramListener("PartCreated", function(e) {
console.log(e.subject.part);
console.log("节点新增监听");
});
//节点新增监听-拖拽
nodeFigDiagram.addDiagramListener("ExternalObjectsDropped", function(e) {
console.log(e.subject.Ea.value.$d);
console.log("节点新增监听");
if (e.subject.Ea.value.$d.key) {
$scope.createNodeInner(e.subject.Ea.value.$d);
}
});
//节点文本修改完成监听
nodeFigDiagram.addDiagramListener("TextEdited", function(e) {
console.log(e.subject.part.data);
console.log("节点文本修改完成监听");
// nodeFigDiagram.layoutDiagram(true);//重新加载画布
$scope.editNodeInner(e.subject.part.data);
$scope.saveNodeInner(e.subject.part.data);
});
//右键事件
nodeFigDiagram.addDiagramListener("ObjectContextClicked", function(e) {
console.log(e.subject.part.data);
console.log("右键事件监听");
/*if ($scope.readonly != true) {
$scope.showWindowInner(e.subject.part.data);
}*/
});
//背景点击一次
nodeFigDiagram.addDiagramListener("BackgroundSingleClicked", function(e) {
console.log("节点文本修改完成监听");
$scope.nodeFocusOutInner();
});
//双击节点重命名(编辑)会先执行单击的监听,再执行双击的监听
nodeFigDiagram.addDiagramListener("ObjectDoubleClicked", function(e) {
// 取消上次延时未执行的方法
clearTimeout(times);
console.log("双击节点编辑监听");
if ($scope.readonly != true) {
$scope.showWindowInner(e.subject.part.data);
}
});
} // end init
$scope.init();
},
post: function($scope, ele, attrs) {
console.log();
}
}
}
}
});