32.go.Palette 一排放两个

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

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

<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 列。
  • cellSizespacing 属性, 控制节点之间的间距和大小。
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方法来实现移动时改变所有点的位置。具体实现步骤如下:

  1. 获取被移动的部件的所有连接线(links)。
  2. 遍历连接线,获取连接线的路径(path)。
  3. 遍历路径的所有点(points),将每个点的位置加上移动的距离(deltaX 和 deltaY)。
  4. 将修改后的点数组设置回路径的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 超多超实用经验分享(三)的更多相关文章

  1. 关于写SpringBoot+Mybatisplus+Shiro项目的经验分享三:问题2

    框架: SpringBoot+Mybatisplus+Shiro 简单介绍:关于写SpringBoot+Mybatisplus+Shiro项目的经验分享一:简单介绍 搜索框是该项目重要的一环,由于涉及 ...

  2. MySQL 性能优化的最佳20多条经验分享(三)(转)

    16. 垂直分割 "垂直分割"是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的.(以前,在银行做过项目,见过一张表有100多个字段, ...

  3. APICloud超实用经验分享——平台功能

    从2016年开始使用APICloud进行app项目开发,到现在也有五六年了.在此过程中伴随着APICloud一起成长,踩过一些坑,自己的技术也提升不少.在APICloud 推出avm框架一年之后,ID ...

  4. 总结ThinkPHP使用技巧经验分享(三)

    add方法返回主键(id)的值在往数据表中添加数据时调用add方法,默认返回值就是刚添加的id值,就不用再去查询了. save方法返回值的判断在修改数据时,如果修改成功返回的是被修改的记录数0,1,2 ...

  5. 好文推荐:转载一篇别人kaggle的经验分享

    转载:https://www.toutiao.com/i6435866304363627010/ 笔者参加了由Quora举办的Quora Question Pairs比赛,并且获得了前1%的成绩.这是 ...

  6. 使用latex撰写博士,硕士学位论文(浙大博士经验分享)

    使用latex撰写博士,硕士学位论文(浙大博士经验分享) 浙大博士:  个人感觉,还是要用latex来写.因为之前发过几篇word排版的中文论文,在参考文献的引用.文字格式调整上,实在是难受.如果坚持 ...

  7. Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量

    Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量 from:https://www.leiphone.com/news/201712/zbX22Ye5wD6CiwCJ.html 导语 ...

  8. 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)

    简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...

  9. Splunk大数据分析经验分享

    转自:http://www.freebuf.com/articles/database/123006.html Splunk大数据分析经验分享:从入门到夺门而逃 Porsche 2016-12-19 ...

  10. Kaggle 数据挖掘比赛经验分享(转)

     原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...

随机推荐

  1. jpype-python调用java的方法

    环境准备: 部署环境准备: sed -i.ori '$a export JAVA_HOME=/opt/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bi ...

  2. HTML——标签语法

    <标签名 属性1="属性值1" 属性2="属性值2"-->内容部分</标签名> <标签名 属性1="属性值1" ...

  3. 一文了解JVM面试篇(上)

    Java内存区域 1.如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存.内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存 ...

  4. CF题解合集

    CF 比赛题解合集 目录 CF 比赛题解合集 1952 A. Ntarsis' Set B. Imbalanced Arrays C. Ina of the Mountain D. Miriany a ...

  5. 为什么魂斗罗只有128KB却能实现那么长的剧情有答案了

    PPU 首发公号:Rand_cs 本文继续讲述 NES 的基本原理,承接上文的 CPU,本文来讲述 PPU,较为复杂,慢慢来看.例子基本都是使用的魂斗罗,看完本文相信对那问题"为什么魂斗罗只 ...

  6. kettle从入门到精通 第六十四课 ETL之kettle kettle中执行SQL脚本步骤,使用需当心

    1.群里有不定时会有同学反馈执行SQL脚本步骤使用有问题,那么咱们今天一起来学习下该步骤.trans中的执行SQL脚本有两方面功能,使用时需小心,不然很容易踩坑. 官方定义: 翻译: 您可以使用此步骤 ...

  7. C# .NET MVC 表单提交前校验数据等

    页面上写2个button,一个普通button,另一个是submit,submit的这个隐藏.校验函数写在普通button里,普通button click函数中去提交表单. 页面: <input ...

  8. EF CORE 遇到“无法打开登录所请求的数据库 "win7bc"。登录失败。”

    报错内容:ex:An exception has been raised that is likely due to a transient failure. Consider enabling tr ...

  9. CRP关键渲染路径笔记

    关键渲染路径CRP笔记 关键渲染路径(Critical Render Process)是浏览器将HTML.CSS和JavaScript代码转换为屏幕上像素的步骤序列,它包含了DOM(Document ...

  10. Tomcat问题修复系列之后台缓存不足

    系统运维时,在tomcat窗口发现一个警告 后台缓存收回进程无法释放上下文的缓存的10%-请考虑增加缓存的最大大小.在逐出之后,缓存中约保留XXX KB的数据. 无法将位于[/WEB-INF/view ...