GoJs面板绘图模板go.Panel使用示例详解
作者:沅芷湘兰 发布时间:2024-05-21 10:14:08
前言
go.Panel
面板是gojs
重要的绘图模板,上文中我们提到的是可视化图形中的节点分组.而go.Panel
可以把节点内部分成很多的模块,并且各个模块之间相互不会影响。其内部可以存放其他的绘图模板,并且可以设置其组成部分的大小和位置。并且其内部的模板是按照顺序进行渲染。
go.Panel的使用
this.myDiagram.nodeTemplate = $$(
go.Node,
"Horizontal",
$$(go.Panel,"Horizontal",
$$(go.TextBlock,{background:"#67B73C",text:"这是Panel内部"}),
$$(go.Picture,{ width: 100, height: 100,margin:5,source:pic })
)
);
这就是go.Panel
的一个简单使用,可以看出。go.Panel
面板可以看做是节点内部的组。它可以把其他的绘图模板放到自己的内部,然后再内部进行不同位置的排列。
go.Panel的类型
go.Panel
提供了以下类型方便进行内部元器件的排列
go.panel.Auto //内部的自动布局
go.panel.Grid //网格化布局
go.panel.Graduated //刻度布局
go.panel.Horizontal //水平排列布局
go.panel.Position //定位布局
go.panel.Table //表格布局
go.panel.Spot //
go.panel.Vertical //竖直方向布局
go.panel.Viewbox //
go.panel.Auto类型
go.panel.Auto
为自动面板,其示例如下
$$(go.Panel,"Auto",{background:"#FF9900"},
$$(go.Picture,{ width: 100, height: 100,margin:5,source:pic })
),
$$(go.Panel,"Auto",{background:"#FF9900"},
$$(go.TextBlock,{background:"#67B73C",margin:5,text:"这是Panel内部"}),
),
$$(go.Panel,"Auto",{background:"#FF9900"},
$$(go.TextBlock,{background:"#67B73C",text:"这是Panel内部"}),
$$(go.Picture,{ width: 100, height: 100,margin:5,source:pic })
),
$$(go.Panel,"Auto",{background:"#FF9900"},
$$(go.Picture,{ width: 100, height: 100,margin:5,source:pic }),
$$(go.TextBlock,{background:"#67B73C",text:"这是Panel内部"})
)
可以看出 Auto
面板是以其内部的第一个元素为主进行填充,如果内部只有一个元素,包裹在元素周围。如果内部有多个元素,则以第一个元素为主,在图层的最上层,而后以内部最大的元素为界,进行包裹。其他元素则是默认上下左右居中显示。
go.panel.Grid类型
go.panel.Grid
为网格化面板,其一些配置属性如下
this.myDiagram.grid.visible = true;//开启背景网格
this.myDiagram.toolManager.draggingTool.isGridSnapEnabled = true;//拖拽的位移的最小单位,默认与背景格相同.
this.myDiagram.grid.gridCellSize = new go.Size(30, 20);//设置背景单元格的大小
this.myDiagram.toolManager.draggingTool.gridSnapCellSize = new go.Size(20, 20);//设置拖拽的最小位移单位,不用和背景网格宽度保持一致
通过上面的实例可以看出进行网格化的操作和单元格和位移单位的一些属性配置,我们还可以对网格进行一个自定义的操作
this.myDiagram.grid = $$(go.Panel, "Grid",
{ gridCellSize: new go.Size(25, 25) },
$$(go.Shape, "LineH", { stroke: "#ADD8E6" }),
$$(go.Shape, "LineV", { stroke: "#90EE90" }),
$$(go.Shape, "LineH", { stroke: "#67B73C", interval: 6 }),
$$(go.Shape, "LineV", { stroke: "#00FF00", interval: 6 })
)
可以通过go.Panel
的Grid
属性来自定义单元格,来对其进行一个样式上的修改。但是要注意这个地方的内部元素不能是go.TextBlock和go.Picture
。否则会报错。
go.panel.Graduated类型
go.panel.Graduated
是刻度面板,可以和go.Shape
几个图形结合
$$(
go.Panel,
"Graduated",
{
graduatedMin: 0, //标尺的最小刻度
graduatedMax: 140, //标尺的最大刻度
graduatedTickBase: 0, //起始点刻度线的值,如果与graduatedMin一样则是从起始点开始
graduatedTickUnit: 5, //为每格的刻度代表的值
background: "transparent",
},
$$(go.Shape, { geometryString: "M0 0 H450" }),
$$(go.Shape, { geometryString: "M0 0 V5" }),
$$(go.Shape, { geometryString: "M0 0 V10", interval: 4 }),
// 小刻度的标识
$$(go.TextBlock, {
interval: 2,
segmentOffset: new go.Point(0, 8),
stroke: "blue",
font: "7pt sans-serif",
}),
// 大刻度的标识
$$(go.TextBlock, {
interval: 4,
segmentOffset: new go.Point(0, 12),
stroke: "red",
font: "bold 12pt sans-serif",
})
)
可以根据刻度的不同,利用go.Shape
和go.TextBlock
来绘制自己想要的图形,不仅仅可以是直线,还可以是仪表盘形式的弧线型。
go.panel.Horizontal类型
go.panel.Horizontal
类型是水平排列面板,因此在内部元素不是等高的情况下,面板会以最高的元素为高。这样的话,其他的元素就可以在竖直方向上调整自己的显示位置。
$$(go.Panel,"Horizontal",{background:"#FF9900"},
$$(go.Picture,{ width: 100, height: 100,margin:5,source:pic }),
$$(go.TextBlock,{background:"#67B73C",text:"居上",alignment: go.Spot.Top}),
$$(go.TextBlock,{background:"#67B73C",text:"居中",alignment: go.Spot.Center }),
$$(go.TextBlock,{background:"#67B73C",text:"居下",alignment: go.Spot.Bottom })
),
go.panel.Position类型
go.panel.Position
类型为定位面板,与css
定位不同的是。其不是上下左右的边距,而是具体的坐标,类似垂直坐标系。从图中的数值可以看出,其坐标系是X轴向右,Y轴向下的垂直坐标系。
$$(go.Panel, "Position",
{ background: "#FF9900" },
$$(go.TextBlock, "(-100,0)", { position: new go.Point(-100, 0),background: "#67B73c" }),
$$(go.TextBlock, "(-100,-100)", { position: new go.Point(-100, -100),background: "#67B73c" }),
$$(go.TextBlock, "(0,-100)", { position: new go.Point(0, -100),background: "#67B73c" }),
$$(go.TextBlock, "(100,-100)", { position: new go.Point(100, -100),background: "#67B73c" }),
$$(go.TextBlock, "(0,0)", { position: new go.Point(0, 0),background: "#67B73c" }),
$$(go.TextBlock, "(100,0)", { position: new go.Point(100, 0),background: "#67B73c" }),
$$(go.TextBlock, "(100,100)", { position: new go.Point(100, 100),background: "#67B73c" }),
$$(go.TextBlock, "(0,100)", { position: new go.Point(0, 100),background: "#67B73c" }),
$$(go.TextBlock, "(-100,100)", { position: new go.Point(-100, 100),background: "#67B73c" }),
));
go.panel.Table类型
go.panel.Table
类型为表格面板,其实row
为行数,column
为列数。rowSpan
为行合并,columnSpan
为列合并。
$$(go.Panel, "Table",
$$(go.Panel, "Auto",{row:0,column:0},
$$(go.Shape, 'Rectangle', { stroke:"#FF9900"}),
$$(go.TextBlock,{background:"#67B73C",text:"0行0列"}),
),
$$(go.Panel, "Auto",{row:1,column:0},
$$(go.Shape, 'Rectangle', { stroke:"#FF9900"}),
$$(go.TextBlock,{background:"#67B73C",text:"1行0列"}),
),
$$(go.Panel, "Auto",{row:1,column:1},
$$(go.Shape, 'Rectangle', { stroke:"#FF9900"}),
$$(go.TextBlock,{background:"#67B73C",text:"1行1列"}),
),
$$(go.Panel, "Auto",{row:2,column:0,columnSpan:3},
$$(go.Shape, 'Rectangle', { stroke:"#FF9900"}),
$$(go.TextBlock,{background:"#67B73C",text:"2行列合并"}),
),
$$(go.Panel, "Auto",{row:0,column:1},
$$(go.Shape, 'Rectangle', { stroke:"#FF9900"}),
$$(go.TextBlock,{background:"#67B73C",text:"0行1列"}),
),
$$(go.Panel, "Auto",{row:0,column:2,rowSpan:3},
$$(go.Shape, 'Rectangle', { stroke:"#FF9900"}),
$$(go.TextBlock,{background:"#67B73C",text:"2列行合并"}),
),
))
可以看出,Table
面板是根据表格的几行几列对其内部的元素进行排列,通过rowSpan
和columnSpan
对第三行和第三列合并之后,第三行的三列为一个单元格,因此文字左右居中显示。而第三列的三个单元格也进行了合并其显示在上下居中第二行的单元格位置。
go.panel.Spot类型
go.panel.Spot
类型为点布局,其布局方式和position
(定位布局类似),但是其控制范围为0-1,即左上角为(0,0),右下角为(1,1)进行点的定位
$$(go.Panel, "Spot", // or "Position"
$$(go.Shape, 'Rectangle', { fill:"#FF9900",stroke: "#FF9900",width:200,height:200}),
$$(go.TextBlock, { alignment: new go.Spot(0,0),background: "#67B73c",text:"(0,0)" }),
$$(go.TextBlock, { alignment: new go.Spot(0.5,0),background: "#67B73c",text:"(0.5,0)" }),
$$(go.TextBlock, { alignment: new go.Spot(1,0),background: "#67B73c",text:"(1,0)" }),
$$(go.TextBlock, { alignment: new go.Spot(1,0.5),background: "#67B73c",text:"(1,0.5)" }),
$$(go.TextBlock, { alignment: new go.Spot(1,1,0,0),background: "#67B73c",text:"(1,1)" }),
$$(go.TextBlock, { alignment: new go.Spot(1,1,50,0),background: "#67B73c",text:"(1,2)" }),
$$(go.TextBlock, { alignment: new go.Spot(0.5,1),background: "#67B73c",text:"(0.5,1)" }),
$$(go.TextBlock, { alignment: new go.Spot(0,1),background: "#67B73c",text:"(0,1)" }),
$$(go.TextBlock, { alignment: new go.Spot(0,0.5),background: "#67B73c",text:"(0,0.5)" }),
$$(go.TextBlock, { alignment: new go.Spot(0.5,0.5),background: "#67B73c",text:"(0.5,0.5)" }),
));
由上图可以看出对应点的位置,new go.Spot()
可以传四个参数,前面两个是点在图中的方位,而后面两个参数则是在点的内部使用position
面板的方式对其进行定位,其显示效果为(1,1)点出的两个TextBlock
的显示。
go.panel.Vertical类型
与水平面板相似,竖直面板内的元素是竖直方向排列,因此会以面板内部最宽的元素为宽,而其他元素则可以调整水平方向上的位置。而通过把第三行和第三列用
$$(go.Panel,"Vertical",{background:"#FF9900"},
$$(go.Picture,{ width: 100, height: 100,margin:5,source:pic }),
$$(go.TextBlock,{background:"#67B73C",text:"居左",alignment: go.Spot.Left}),
$$(go.TextBlock,{background:"#67B73C",text:"居中",alignment: go.Spot.Center }),
$$(go.TextBlock,{background:"#67B73C",text:"居右",alignment: go.Spot.Right })
),
go.panel.Viewbox类型
go.panel.Viewbox
类型为视图框面板,其可以对原生进行缩放来适应对应的面板。
$$(go.Panel,"Horizontal",
$$(go.Panel,"Viewbox",{ width: 80, height: 80 },
$$(go.TextBlock, {background: "#67B73C",text: "这是Viewbox面板下的",alignment: go.Spot.Top,})
),
$$(go.Panel,"Auto",background: "#67B73C",text: "这是Auto面板下的",alignment: go.Spot.Top,})
)
)
由上图可以看出,视图框画板会根据自己的宽高对内部元素进行一个缩放,以保证对应的元素显示完整。
来源:https://juejin.cn/post/7222214389138686013


猜你喜欢
- 可扩展标记语言 (XML) 是用于描述数据集内容以及应如何将数据输出到设备上或如何在 Web 页上显示数据的语言。标记语言的创建来源于出版商
- python time模块计算时间之间的差距练习题1. 当前月1号对应的0点的时间戳# 定义一个当前月分的一号0点字符串格式的时间 now_
- 1、远程服务器上安装jupyter notebook(配置jupyter_notebook_config.py文件)sudo pip ins
- 让我们重温一下JavaScript的一些基础知识,请先写出以下代码中问号处的答案,再运行比较!<script type=&q
- 最近稍稍有点空闲时间,于是重新温习了一下之前学习过的python基础。废话不多说,记录一下自己的所得。首先,安装什么的不在本人的温习范围,另
- 最近老婆大人的公司给老婆大人安排了一个根据关键词查询google网站排名的差事。老婆大人的公司是做seo的,查询的关键词及网站特别的多,看着
- 对于日期的操作可以说是比较常见的case了,日期与格式化字符串互转,日期与时间戳互转,日期的加减操作等,下面主要介绍下常见的需求场景如何实现
- MySQL创建用户并授权及撤销用户权限运行环境:MySQL5.0一、创建用户命令:CREATE USER 'username'
- 往mysql数据库中插入数据。以前常用INSERT INTO 表名 (列名1,列名2…) VALUES(列值1,列值2);如果在PHP程序中
- 1. UDPUDP是一种无连接的、不可靠的传输协议,相比于TCP,UDP具有数据传输速度快、传输延迟小等优点,但是不保证数据的可靠传输,需要
- 前言:如果使用进到的日志文件方法:logging.FileHandler,会导致日志信息全部存放在一个日志文件中,不利于后面对日志文件的使用
- 一个随机排列元素的方法, 其实之前是在摄影页面写的一个小效果.查看演示: 点此查看DEMO实现方法利用Math.random()产生随机数,
- ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC
- 一般来说,在Python中,类实例属性的访问规则算是比较直观的。但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是
- 如果我有个list,想判断其中的元素是否满一个条件,后面的元素大于或等于前面元素。Python中的写法就比较多了。下面就主要介绍下一般的写法
- 避坑1:RTX30系列显卡不支持cuda11.0以下版本,具体上限版本可自行查阅:方法一,在cmd中输入nvidia-smi查看方法二:由此
- 目的:是学习python 多线程的工作原理,及通过抓取400张图片这种IO密集型应用来查看多线程效率对比import requestsimp
- Linux RedHat下安装Python2.7、pip、ipython环境、eclipse和PyDev环境准备工作,源Python2.6备
- 对于当前数据库的监控方式有很多,分为数据库自带、商用、开源三大类,每一种都有各自的特色;而对于 mysql 数据库由于其有很高的社区活跃度,
- 昨天看到一片文章,说是某某旗下酒店数据库因为程序员不小心,把数据库明文密码上传到了GitHub上,导致酒店数据注册资料、入住信息,开房记录被