经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
可视化—gojs 超多超实用经验分享(三)
来源:cnblogs  作者:Echoyya、  时间:2024/7/17 11:09:32  对本文有异议

32.go.Palette 一排放两个

go.Palette 是 GoJS 库中的一个组件,用于显示一组预定义的图形元素,用户可以从中选择并将其拖放到画布中。如果要在一排中显示两个 go.Palette

一、可以使用 HTML 和 CSS 来控制它们的布局。使用display: inline-blockdiv 元素水平排列在同一行中

  1. <style>
  2. #palette1,
  3. #palette2 {
  4. display: inline-block;
  5. width: 200px;
  6. height: 300px;
  7. border: 1px solid black;
  8. margin-right: 20px;
  9. }
  10. </style>
  11. <div id="palette1"></div>
  12. <div id="palette2"></div>
  13. <script>
  14. var $ = go.GraphObject.make;
  15. var palette1 = $(go.Palette, "palette1");
  16. var palette2 = $(go.Palette, "palette2");
  17. </script>

二、(建议)还可以使用gojs自带的属性,完成go.Palette 自定义

  • alignment 属性设置为 go.GridLayout.Position: 使节点从左开始布局。
  • wrappingColumn 属性设置为 2,以确保节点布局为 2 列。
  • cellSizespacing 属性, 控制节点之间的间距和大小。
  1. const myPalette = $(go.Palette, "myPaletteDiv", {
  2. layout: $(go.GridLayout, {
  3. alignment: go.GridLayout.Position,
  4. wrappingColumn: 2,
  5. cellSize: new go.Size(100, 0),
  6. spacing: new go.Size(5, 5),
  7. }),
  8. });

33.go.Palette 基本用法

  1. <div id="myPaletteDiv"></div>
  1. const myPalette = $(go.Palette, "myPaletteDiv", {
  2. layout: $(go.GridLayout, {
  3. alignment: go.GridLayout.Position,
  4. cellSize: new go.Size(100, 0),
  5. wrappingColumn: 2
  6. })
  7. nodeTemplate: myDiagram.nodeTemplate,
  8. model: new go.GraphLinksModel([
  9. { key: "Alpha", text: "Alpha: Patron" },
  10. { key: "Beta", text: "Beta: Patron" },
  11. { key: "Gamma", text: "Gamma: Patron" },
  12. ]),
  13. });
  14. myPalette.groupTemplateMap.add('groupA', groupATemplate()) // 可以为多组
  15. myPalette.model = new go.GraphLinksModel([ ]) // 属性可以直接写在对象里,也可以后续修复

34.创建自己指向自己的连线

主要是在节点上设置两个属性,

  1. {
  2. fromLinkableSelfNode: true,
  3. toLinkableSelfNode: true,
  4. }

35.设置不同的 groupTemplate 和 linkTemplate

可以使用 Group 类型的 groupTemplate 属性来设置不同的组模板。groupTemplate 属性可以接受一个函数,该函数返回一个 Group 类型的模板。
定义了两个不同的组模板,分别使用不同的颜色。使用时会默认读取分组名称。
groupTemplate

  1. myDiagram.groupTemplateMap.add(
  2. "Group1",
  3. $(go.Group, "Auto", $(go.Shape, "Rectangle", { fill: "red" }))
  4. );
  5. myDiagram.groupTemplateMap.add(
  6. "Group2",
  7. $(go.Group, "Auto", $(go.Shape, "Rectangle", { fill: "green" }))
  8. );
  9. myDiagram.model.addNodeData({ key: 1, isGroup: true, category: "Group1" });
  10. myDiagram.model.addNodeData({ key: 2, isGroup: true, category: "Group2" });

linkTemplate

  1. myDiagram.linkTemplateMap.add(
  2. "straight", // 直线连接
  3. $(go.Link, $(go.Shape))
  4. );
  5. myDiagram.linkTemplateMap.add(
  6. "curved", // 曲线连接
  7. $(go.Link, { curve: go.Link.Bezier }, $(go.Shape))
  8. );
  9. myDiagram.model.addLinkData({ from: 1, to: 2, category: "straight" });
  10. myDiagram.model.addLinkData({ from: 3, to: 4, category: "curved" });

36.监听在图形对象 GraphObject 上的右键单击

也就是获取 右键点击的对象

  1. myDiagram.addDiagramListener("ObjectContextClicked", function (e) {
  2. var linkOrNode = myDiagram.findPartAt(e.diagram.firstInput.documentPoint);
  3. if (linkOrNode instanceof go.Link) {
  4. // TODO
  5. }
  6. if (linkOrNode instanceof go.Node) {
  7. // TODO
  8. }
  9. });

37.定义节点/连线/canvas 背景上的右键菜单

可以结合 右键点击的对象,进行一些操作,对右键的对象,进行一些 contextMenu 中的操作

  1. myDiagram = $(go.Diagram, "myDiagramDiv", {
  2. contextMenu: createContextMenu(),
  3. });
  4. myDiagram.nodeTemplate.contextMenu = createContextMenu();
  5. myDiagram.linkTemplate.contextMenu = createContextMenu();
  6. function groupContextMenu() {
  7. return $(
  8. "ContextMenu",
  9. "Vertical",
  10. $(
  11. "ContextMenuButton",
  12. $(
  13. go.Panel,
  14. "Horizontal",
  15. {
  16. alignment: go.Spot.Left,
  17. },
  18. $(go.Picture, "图片src,如果不需要图片可删除", {
  19. desiredSize: new go.Size(60, 30),
  20. margin: new go.Margin(5, 5, 5, 10),
  21. }),
  22. $(go.TextBlock, "文本")
  23. ),
  24. {
  25. click: (event, obj) => {}, // 右键菜单面板点击事件
  26. }
  27. )
  28. );
  29. }

38.从节点动态拉出一根连线时,判断其方向是左还是右?

可以通过判断连线的起点和终点的位置来确定其方向。具体来说,可以通过比较起点和终点的 x 坐标来判断连线的方向,如果起点的 x 坐标小于终点的 x 坐标,则连线是从左向右的,反之则是从右向左的。

重写了insertLink方法,当用户在节点上开始拖动连线时,会调用该方法。在该方法中首先调用了go.LinkingTool.prototype.insertLink.call(this)来执行默认的连线操作,然后根据起点和终点的位置来设置连线的样式。如果起点的 x 坐标小于终点的 x 坐标,则将连线的颜色设置为绿色,否则将其设置为红色。

  1. // 连线基本模板配置
  2. myDiagram.linkTemplate = $(
  3. MessageLink,
  4. { selectionAdorned: true, curviness: 0 },
  5. $(go.Shape, "Rectangle", new go.Binding("stroke", "stroke").makeTwoWay()),
  6. $(
  7. go.Shape,
  8. { toArrow: "OpenTriangle" },
  9. new go.Binding("stroke", "stroke").makeTwoWay()
  10. )
  11. );
  12. // insertLink
  13. go.LinkingTool.prototype.insertLink = function (
  14. fromnode,
  15. fromport,
  16. tonode,
  17. toport
  18. ) {
  19. var newlink = go.LinkingTool.prototype.insertLink.call(
  20. this,
  21. fromnode,
  22. fromport,
  23. tonode,
  24. toport
  25. );
  26. if (newlink !== null) {
  27. var model = this.diagram.model;
  28. if (fromnode.position.x < tonode.position.x) {
  29. model.setDataProperty(newlink.data, "stroke", "green"); // 从左向右的连线
  30. } else {
  31. model.setDataProperty(newlink.data, "stroke", "red"); // 从左向右的连线
  32. }
  33. }
  34. return newlink;
  35. };

39.linkTemplate routing 取值

linkTemplate 是用于定义连接线的模板。而 routing 是用于定义连接线的路径的属性之一

如果没有设置 routing 属性,连接线的默认路径是 go.Link.Normal。表示连接线会直接从起点到终点的位置。这种路径适用于大多数情况,但在某些情况下可能需要更复杂的路径。 以下值 :

  • go.Link.Normal:连接线会直接从起点到终点的位置。
  • go.Link.JumpOver:连接线会跳过节点,但可能会穿过其他连接线。
  • go.Link.AvoidsNodes:连接线会避开节点,但可能会穿过其他连接线。
  • go.Link.Orthogonal:连接线会沿着水平和垂直方向移动,直到到达目标节点的位置。

40.在移动连线时,改变所有点的位置

在 gojs 中,可以通过重写go.DraggingTool.prototype.moveParts方法来实现移动时改变所有点的位置。具体实现步骤如下:

  1. 获取被移动的部件的所有连接线(links)。
  2. 遍历连接线,获取连接线的路径(path)。
  3. 遍历路径的所有点(points),将每个点的位置加上移动的距离(deltaX 和 deltaY)。
  4. 将修改后的点数组设置回路径的part.points属性中。
  1. MessageDraggingTool.prototype.moveParts = function (parts, offset, check) {
  2. go.DraggingTool.prototype.moveParts.call(this, parts, offset, check);
  3. var it = parts.iterator;
  4. while (it.next()) {
  5. if (it.key instanceof go.Link) {
  6. var link = it.key;
  7. var path = link.path;
  8. var points = path.part.points;
  9. if (points.length == 3) {
  10. // 表示直线
  11. var startX = it.value.point.x;
  12. var startY = it.value.point.y;
  13. var x = startX + offset.x;
  14. var y = startY + offset.y;
  15. link.diagram.model.set(link.data, "表示连线定位的字段x", "当前位置x");
  16. link.diagram.model.set(link.data, "表示连线定位的字段y", "当前位置y");
  17. } else {
  18. // 表示曲线
  19. var pointArray: any = [];
  20. for (var i = 0; i < points.length; i++) {
  21. var point = points._dataArray[i];
  22. pointArray.push(new go.Point(point.x + offset.x, point.y + offset.y));
  23. }
  24. path.part.points = pointArray;
  25. }
  26. }
  27. }
  28. };

原文链接:https://www.cnblogs.com/echoyya/p/17941400

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号