当前位置: 首页 > news >正文

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 templatesdiagram =$(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>
http://www.lryc.cn/news/67728.html

相关文章:

  • 程序员该如何学习技术
  • springboot+vue交流互动系统(源码+文档)
  • 【2023华为OD笔试必会25题--C语言版】《01 预定酒店》——排序、二分查找
  • C语言实现队列--数据结构
  • 前端CSS经典面试题总结
  • cookie、session、token的区别是什么
  • leetcode分类刷题 -- 前缀和和哈希
  • 浅谈作为程序员如何写好文档:了解读者
  • 一文读懂国内首本《牛客2023金融科技校园招聘白皮书》
  • 深度学习03-卷积神经网络(CNN)
  • 你真正知道什么是品牌营销么?颠覆你旧有认知
  • pytorch 测量模型运行时间,GPU时间和CPU时间,model.eval()介绍
  • 十三、超时重试机制
  • JAVA常用API - Runtime和System
  • ANR实战案例 - FCM拉活启动优化
  • Kali-linux查看打开的端口
  • 判断浏览器是否支持webp图片
  • 【Qt编程之Widgets模块】-007:QTextStream类及QDataStream类
  • js对map排序,后端返回有序的LinkedHashMap类型时前端获取后顺序依旧从小到大的解决方法
  • JMX vs JFR:谁才是最强大的JVM监控利器?
  • Laravel Collection 基本使用
  • JUC并发编程19 | 读写锁
  • springboot_maven项目怎么引入mybatis
  • JAVA8的新特性——lambda表达式
  • 算法修炼之练气篇——练气六层
  • 利用GPU并行计算beta-NTI,大幅减少群落构建计算时间
  • Shiro框架漏洞分析与复现
  • (数字图像处理MATLAB+Python)第七章图像锐化-第一、二节:图像锐化概述和微分算子
  • C# | 内存池
  • 程序设计入门——C语言2023年5月10日