Group相关问题-组内节点限制移动范围

1.在节点中定义dragComputation,限制节点的移动范围

注意事项

  • 组节点不定义go.Placeholder ,设置了占位符后组内节点移动将改变组节点位置
  • dragComputation中自定义stayInGroup计算规则是根据groupNode的resizeObject计算
    如果开启了resizable:true,建议指定其改变大的零部件resizeObjectName: “PH”,
<!DOCTYPE html>
<html>

	<head lang="en">
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			canvas {
				border: 0px;
				outline: none;
			}
		</style>
		<script src="js/go-2.0.11.js"></script>
		<script src="js/jquery-1.12.4.min.js"></script>
		<script type="text/javascript">
			$(function() {
				gojsInit();
			});

			function gojsInit() {
				var $ = go.GraphObject.make; // for conciseness in defining templates
				diagram =
					$(go.Diagram, "myDiagram", // must name or refer to the DIV HTML element
						{
							initialContentAlignment: go.Spot.Center, //初始位置
							initialScale: 1.5, //初始比例
						});
				diagram.nodeTemplate =
					$(go.Node, {
							dragComputation: stayInGroup
						},
						new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
						$(go.TextBlock,
							new go.Binding("text", "key"))
					);

				diagram.groupTemplate =
					$(go.Group, "Vertical", {
							selectionObjectName: "PH",
							locationObjectName: "PH",
							resizeObjectName: "PH",
							resizable:true
						},
						new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
						$(go.TextBlock, // group title
							{
								font: "Bold 12pt Sans-Serif"
							},
							new go.Binding("text", "key")),
						$(go.Shape, // using a Shape instead of a Placeholder
							{
								name: "PH",
								fill: "lightyellow"
							},
							new go.Binding("desiredSize", "size", go.Size.parse))
					);

				var nodeDataArray = [{
						key: "Alpha",
						loc: "0 0"
					},
					{
						key: "Beta",
						group: "Omega",
						loc: "75 75"
					},
					{
						key: "Gamma",
						group: "Omega",
						loc: "125 75"
					},
					{
						key: "Omega",
						isGroup: true,
						loc: "50 50",
						size: "150 50"
					},
					{
						key: "Delta",
						loc: "200 0"
					}
				];
				var linkDataArray = [{
						from: "Alpha",
						to: "Beta"
					}, // from outside the Group to inside it
					{
						from: "Beta",
						to: "Gamma"
					}, // this link is a member of the Group
					{
						from: "Omega",
						to: "Delta"
					} // from the Group to a Node
				];
				diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

				function stayInGroup(part, pt, gridpt) {
					// 获取节点所在组
					const grp = part.containingGroup;
					if(grp === null) return pt;
					// 获取组节点访问
					const back = grp.resizeObject;
					if(back === null) return pt;
					// 如果按下Shift键,则允许将节点拖出组
					if(part.diagram.lastInput.shift) return pt;
					const r = back.getDocumentBounds();
					const b = part.actualBounds;
					const loc = part.location;
					// 限制节点移动范围
					const x = Math.max(r.x, Math.min(pt.x, r.right - b.width - 1)) + (loc.x - b.x);
					const y = Math.max(r.y, Math.min(pt.y, r.bottom - b.height - 1)) + (loc.y - b.y);
					return new go.Point(x, y);
				}

			}

			function save() {
				document.getElementById("mySavedModel").value = diagram.model.toJson();
				diagram.isModified = false;
			}

			function load() {
				diagram.model = go.Model.fromJson(document.getElementById("mySavedModel").value);
			}
		</script>
	</head>

	<body>
		<div id="sample">
			<div style="width:100%; white-space:nowrap;">
				<span style="display: inline-block; vertical-align: top; padding: 5px; width:95%">
      			<div  id="myDiagram" style="border: solid 1px gray; height: 400px"></div>
      			<button id="saveModel" onclick="save()">Save</button>
    			<button id="loadModel" onclick="load()">Load</button>
    		</span>
			</div>
			<textarea id="mySavedModel" style="width:100%;height:300px">
  	 		 </textarea>
		</div>
	</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值