可视化—gojs 超多超实用经验分享(三)
32.go.Palette 一排放两个
go.Palette 是 GoJS 库中的一个组件,用于显示一组预定义的图形元素,用户可以从中选择并将其拖放到画布中。如果要在一排中显示两个 go.Palette,
一、可以使用 HTML 和 CSS 来控制它们的布局。使用display: inline-block 将 div 元素水平排列在同一行中
<style>
#palette1,
#palette2 {
display: inline-block;
width: 200px;
height: 300px;
border: 1px solid black;
margin-right: 20px;
}
</style>
<div id="palette1"></div>
<div id="palette2"></div>
<script>
var $ = go.GraphObject.make;
var palette1 = $(go.Palette, "palette1");
var palette2 = $(go.Palette, "palette2");
</script>
二、(建议)还可以使用gojs自带的属性,完成go.Palette 自定义
- alignment 属性设置为 go.GridLayout.Position: 使节点从左开始布局。
- wrappingColumn 属性设置为 2,以确保节点布局为 2 列。
- cellSize 和 spacing 属性, 控制节点之间的间距和大小。
const myPalette = $(go.Palette, "myPaletteDiv", {
layout: $(go.GridLayout, {
alignment: go.GridLayout.Position,
wrappingColumn: 2,
cellSize: new go.Size(100, 0),
spacing: new go.Size(5, 5),
}),
});
33.go.Palette 基本用法
<div id="myPaletteDiv"></div>
const myPalette = $(go.Palette, "myPaletteDiv", {
layout: $(go.GridLayout, {
alignment: go.GridLayout.Position,
cellSize: new go.Size(100, 0),
wrappingColumn: 2
})
nodeTemplate: myDiagram.nodeTemplate,
model: new go.GraphLinksModel([
{ key: "Alpha", text: "Alpha: Patron" },
{ key: "Beta", text: "Beta: Patron" },
{ key: "Gamma", text: "Gamma: Patron" },
]),
});
myPalette.groupTemplateMap.add('groupA', groupATemplate()) // 可以为多组
myPalette.model = new go.GraphLinksModel([ ]) // 属性可以直接写在对象里,也可以后续修复
34.创建自己指向自己的连线
主要是在节点上设置两个属性,
{
fromLinkableSelfNode: true,
toLinkableSelfNode: true,
}
35.设置不同的 groupTemplate 和 linkTemplate
可以使用 Group 类型的 groupTemplate 属性来设置不同的组模板。groupTemplate 属性可以接受一个函数,该函数返回一个 Group 类型的模板。
定义了两个不同的组模板,分别使用不同的颜色。使用时会默认读取分组名称。
groupTemplate
myDiagram.groupTemplateMap.add(
"Group1",
$(go.Group, "Auto", $(go.Shape, "Rectangle", { fill: "red" }))
);
myDiagram.groupTemplateMap.add(
"Group2",
$(go.Group, "Auto", $(go.Shape, "Rectangle", { fill: "green" }))
);
myDiagram.model.addNodeData({ key: 1, isGroup: true, category: "Group1" });
myDiagram.model.addNodeData({ key: 2, isGroup: true, category: "Group2" });
linkTemplate
myDiagram.linkTemplateMap.add(
"straight", // 直线连接
$(go.Link, $(go.Shape))
);
myDiagram.linkTemplateMap.add(
"curved", // 曲线连接
$(go.Link, { curve: go.Link.Bezier }, $(go.Shape))
);
myDiagram.model.addLinkData({ from: 1, to: 2, category: "straight" });
myDiagram.model.addLinkData({ from: 3, to: 4, category: "curved" });
36.监听在图形对象 GraphObject 上的右键单击
也就是获取 右键点击的对象
myDiagram.addDiagramListener("ObjectContextClicked", function (e) {
var linkOrNode = myDiagram.findPartAt(e.diagram.firstInput.documentPoint);
if (linkOrNode instanceof go.Link) {
// TODO
}
if (linkOrNode instanceof go.Node) {
// TODO
}
});
37.定义节点/连线/canvas 背景上的右键菜单
可以结合 右键点击的对象,进行一些操作,对右键的对象,进行一些 contextMenu 中的操作
myDiagram = $(go.Diagram, "myDiagramDiv", {
contextMenu: createContextMenu(),
});
myDiagram.nodeTemplate.contextMenu = createContextMenu();
myDiagram.linkTemplate.contextMenu = createContextMenu();
function groupContextMenu() {
return $(
"ContextMenu",
"Vertical",
$(
"ContextMenuButton",
$(
go.Panel,
"Horizontal",
{
alignment: go.Spot.Left,
},
$(go.Picture, "图片src,如果不需要图片可删除", {
desiredSize: new go.Size(60, 30),
margin: new go.Margin(5, 5, 5, 10),
}),
$(go.TextBlock, "文本")
),
{
click: (event, obj) => {}, // 右键菜单面板点击事件
}
)
);
}
38.从节点动态拉出一根连线时,判断其方向是左还是右?
可以通过判断连线的起点和终点的位置来确定其方向。具体来说,可以通过比较起点和终点的 x 坐标来判断连线的方向,如果起点的 x 坐标小于终点的 x 坐标,则连线是从左向右的,反之则是从右向左的。
重写了insertLink方法,当用户在节点上开始拖动连线时,会调用该方法。在该方法中首先调用了go.LinkingTool.prototype.insertLink.call(this)来执行默认的连线操作,然后根据起点和终点的位置来设置连线的样式。如果起点的 x 坐标小于终点的 x 坐标,则将连线的颜色设置为绿色,否则将其设置为红色。
// 连线基本模板配置
myDiagram.linkTemplate = $(
MessageLink,
{ selectionAdorned: true, curviness: 0 },
$(go.Shape, "Rectangle", new go.Binding("stroke", "stroke").makeTwoWay()),
$(
go.Shape,
{ toArrow: "OpenTriangle" },
new go.Binding("stroke", "stroke").makeTwoWay()
)
);
// insertLink
go.LinkingTool.prototype.insertLink = function (
fromnode,
fromport,
tonode,
toport
) {
var newlink = go.LinkingTool.prototype.insertLink.call(
this,
fromnode,
fromport,
tonode,
toport
);
if (newlink !== null) {
var model = this.diagram.model;
if (fromnode.position.x < tonode.position.x) {
model.setDataProperty(newlink.data, "stroke", "green"); // 从左向右的连线
} else {
model.setDataProperty(newlink.data, "stroke", "red"); // 从左向右的连线
}
}
return newlink;
};
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方法来实现移动时改变所有点的位置。具体实现步骤如下:
- 获取被移动的部件的所有连接线(links)。
- 遍历连接线,获取连接线的路径(path)。
- 遍历路径的所有点(points),将每个点的位置加上移动的距离(deltaX 和 deltaY)。
- 将修改后的点数组设置回路径的
part.points属性中。
MessageDraggingTool.prototype.moveParts = function (parts, offset, check) {
go.DraggingTool.prototype.moveParts.call(this, parts, offset, check);
var it = parts.iterator;
while (it.next()) {
if (it.key instanceof go.Link) {
var link = it.key;
var path = link.path;
var points = path.part.points;
if (points.length == 3) {
// 表示直线
var startX = it.value.point.x;
var startY = it.value.point.y;
var x = startX + offset.x;
var y = startY + offset.y;
link.diagram.model.set(link.data, "表示连线定位的字段x", "当前位置x");
link.diagram.model.set(link.data, "表示连线定位的字段y", "当前位置y");
} else {
// 表示曲线
var pointArray: any = [];
for (var i = 0; i < points.length; i++) {
var point = points._dataArray[i];
pointArray.push(new go.Point(point.x + offset.x, point.y + offset.y));
}
path.part.points = pointArray;
}
}
}
};
可视化—gojs 超多超实用经验分享(三)的更多相关文章
- 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享三:问题2
框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 搜索框是该项目重要的一环,由于涉及 ...
- MySQL 性能优化的最佳20多条经验分享(三)(转)
16. 垂直分割 "垂直分割"是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段, ...
- APICloud超实用经验分享——平台功能
从2016年开始使用APICloud进行app项目开发,到现在也有五六年了.在此过程中伴随着APICloud一起成长,踩过一些坑,自己的技术也提升不少.在APICloud 推出avm框架一年之后,ID ...
- 总结ThinkPHP使用技巧经验分享(三)
add方法返回主键(id)的值在往数据表中添加数据时调用add方法,默认返回值就是刚添加的id值,就不用再去查询了. save方法返回值的判断在修改数据时,如果修改成功返回的是被修改的记录数0,1,2 ...
- 好文推荐:转载一篇别人kaggle的经验分享
转载:https://www.toutiao.com/i6435866304363627010/ 笔者参加了由Quora举办的Quora Question Pairs比赛,并且获得了前1%的成绩.这是 ...
- 使用latex撰写博士,硕士学位论文(浙大博士经验分享)
使用latex撰写博士,硕士学位论文(浙大博士经验分享) 浙大博士: 个人感觉,还是要用latex来写.因为之前发过几篇word排版的中文论文,在参考文献的引用.文字格式调整上,实在是难受.如果坚持 ...
- Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量
Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量 from:https://www.leiphone.com/news/201712/zbX22Ye5wD6CiwCJ.html 导语 ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- Splunk大数据分析经验分享
转自:http://www.freebuf.com/articles/database/123006.html Splunk大数据分析经验分享:从入门到夺门而逃 Porsche 2016-12-19 ...
- Kaggle 数据挖掘比赛经验分享(转)
原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...
随机推荐
- 7款优秀的AI搜索引擎工具推荐
AI搜索引擎不仅能够理解复杂的查询语句,还能够通过学习用户的搜索习惯和偏好,提供更加个性化的搜索结果.本篇文章将介绍7款在这一领域表现出色的AI搜索引擎工具,它们各有特色,但都致力于为用户提供更加智能 ...
- ALL IN AI | 第六届金蝶云·苍穹追光者开发大赛正式启动报名!
2024年5月,第六届金蝶云·苍穹追光者开发大赛x第十三届"中国软件杯"金蝶赛道正式启动报名! 当下,人工智能正以其空前的速度.广度和深度,引领着新一轮科技革命和产业变革,重塑着经 ...
- mysql通过binlog来恢复被删除的数据库
binlog日志 查询: MariaDB [(none)]> show variables like 'log_bin'; +---------------+-------+ | Variabl ...
- Opencv笔记(13)积分图
积分图时一种允许子区域快速求和的数据结构,这种求和在很多方面都很有用,值得一提的是haar小波的计算,它用于人脸识别和类似的算法.Opencv支持积分图的三种变体,分别是总和.平方求和以及倾斜求和.每 ...
- 详解在Linux中同时安装配置并使用 MySQL5.7 和 MySQL8.0
最近需要使用mysql8.0版本,但是原本的mysql5.7版本已经被多个服务依赖,于是想想能不能同一台服务器装多个版本的mysql,一查确实可行,这里做一个记录方便自己后期回忆 阅读本文前请注意!! ...
- LeetCode 678. Valid Parenthesis String 有效的括号字符串 (C++/Java)
题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to ...
- Bean Searcher v4.3.0 重大更新!
往期阅读: 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍 最近火起的 Bean Searcher 与 MyBatis Plus 倒底有啥区别? Bean Searcher v3.8 ...
- reactHooks的组件通信
父组件调用子组件的方法 // 父组件 import React, { useEffect, useRef, useState } from 'react'; import StopModal from ...
- rabbitMq消息接收转换对象,Json解析字符串报错syntax error, expect {, actual string, pos 0, fastjson-version 1.2.62解决
Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ syntax error, expect {, actual string ...
- Arduino实现温湿度传感器以及数据上传到云(乐维互联)
0 准备材料 0.1 ESP-01S 引脚及定义 官方定义: 序号 pin 功能 1 GND 地线 2 IO0/GPIO0 工作模式选择:①悬空:Flash Boot,工作模式 ②下拉:UART Do ...