GoJs面板绘图模板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面板是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.PanelGrid属性来自定义单元格,来对其进行一个样式上的修改。但是要注意这个地方的内部元素不能是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.Shapego.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面板是根据表格的几行几列对其内部的元素进行排列,通过rowSpancolumnSpan对第三行和第三列合并之后,第三行的三列为一个单元格,因此文字左右居中显示。而第三列的三个单元格也进行了合并其显示在上下居中第二行的单元格位置。

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,})
      )
 )

由上图可以看出,视图框画板会根据自己的宽高对内部元素进行一个缩放,以保证对应的元素显示完整。

总结

go.Panel(面板)的引入,极大的拓展了节点内部布局的拓展空间,如果前面的go.TextBlockgo.Shapego.Picture是节点内元素的堆砌的话。那么go.panel就是让这些元素进行分块,然后让他们显示到合适的地方。让节点显示的内容更合理,也更加好看。

以上就是GoJs面板绘图模板go.Panel使用示例详解的详细内容,更多关于GoJs面板绘图go.Panel的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解GoJs节点的折叠展开实现

    目录 前言 节点折叠展开的不同情况 树形布局特有的属性后代节点的折叠展开 go.Group(组)的内部元素的展开折叠 go.Panel(面板)的内部元素的展开折叠 总结 前言 前面的文章中提到了提示信息(toolTip)在节点信息内容过多的时候,需要节点信息的内容进行隐藏,在鼠标移入的时候进行未显示信息的提示框形式的选中,本文讲从另外的角度处理在画布上的可视化图形的内容过多的时候的处理情况,一种是把节点的内部的折叠和展开,另外一种就是对部分节点进行折叠和展开. 节点折叠展开的不同情况 对于节点的

  • GoJs中使用HTML方法示例

    目录 前言 使用html的方式 提示信息的html交互 右键菜单的html交互 文本编辑的html交互 总结 前言 在gojs中因为有自己的绘图模板和一些语法限制,实际上都是在canvas标签的特性上进行的封装.但是有些时候其拓展就不能满足需求的时候,可以对其和html结构进行一些交互,达到自己显示上的特殊需求的展示. 使用html的方式 本文将从提示信息.右键菜单.和文本编辑三个方面来体现gojs和html之间的交互.而对于html的使用交互过程中,最主要考虑到的就是html信息何时展示,何时

  • GoJs连线上的信息展示使用详解

    目录 前言 连线上的信息怎么使用 连线上的文字信息的默认显示 对连线显示的信息增加其他绘图模板 修改文字和连线方向平行 两个节点之间有多个关系 总结 前言 在可视化图像中.节点是信息写的单元,而连线就是这些这些信息单元的联系.在有些情况下,不止需要知道两个节点之间有关系并且还需要知道两个节点之间的关系进行一个描述.这个时候就需要在连线上展示一些信息. 连线上的信息怎么使用 连线上的文字信息的默认显示 在之前的go.Link一文中提到过,是通过linkTemplate连线进行配置.下面对连线上的配

  • GoJs分组绘图模板go.Group使用示例详解

    目录 前言 Group的使用 Group的属性 handlesDragDropForMembers.isSubGraphExpanded属性 isSubGraphExpanded属性 ungroupable.wasSubGraphExpanded属性 结语 前言 在可视化图形中,很多的节点和连线都有某一个特征或者属于某些分类,为了在使用可视化图形的时候更加直观的看出相同类型节点的集合,我们就会用到分组的绘图模板. Group的使用 //data nodes: [ { key: "1",

  • GoJs连线绘图模板Link使用示例详解

    目录 前言 go.link的简单使用 go.Link的属性配置 routing属性 curve属性 corner.toEndSegmentLength.fromEndSegmentLength.fromShortLength.toShortLength属性 selectable.fromSpot.toSpot属性 总结 前言 可视化图形中除了携带很多信息的节点(node)之外,还需要知道他们之间的关系,而链接他们之间的连线在gojs中是使用go.link进行绘制.在渲染的时候我们根据数据的fro

  • 详解GoJs节点的选中高亮实现示例

    目录 前言 gojs节点选中高亮的使用 只选中节点内部分元素的选中样式 定制的选中样式 节点选中时候增加操作按钮 修改选中节点的内部样式 总结 前言 上文中我们说到了,节点之间的文字描述.在有些时候我们要看两个节点之间的关系,在数据量比较大的时候就需要给两个节点给一个选中的样式.在使用的过程中,gojs默认给了一个节点的选中样式,就是一个蓝色的边框. gojs节点选中高亮的使用 //data myDiagram: null, nodes:[ { key: "1", color: &qu

  • Django模板过滤器和继承示例详解

    目录 模板过滤器 模板的继承 模板继承样例 总结 模板过滤器 定义:在变量输出时对变量的值进行处理 作用:可以通过使用过滤器来改变变量的输出显示 语法:{{变量 | 过滤器:'参数值1' | 过滤器2:'参数值2' ...}} 常用的过滤器 过滤器 说明 lower 将字符串全部转换为小写 upper 将字符串全部转换为大写 safe 默认不对变量内的字符串进行 html 转义 add:"n" 将calue值增加n truncatechars:'n' 如果字符多于指定的字符数量,那么会

  • GoJs 图片绘图模板Picture使用示例详解

    目录 前言 go.Picture的使用 go.Picture的属性 width.height.desiredSize属性 source属性 flip属性 imageStretch.imageAlignment属性 拓展 结语 前言 前面已经说过了通过go.TextBlock(文本)和go.Shape(集合图形)来丰富节点内部的显示内容.而有些时候需要在节点内部上传一些说明材料,恰好这些材料又是图片材料.如果拿图片和节点信息对照观看的话,一一对照会特别麻烦.如果能够在节点内部显示缩略图的话.在信息

  • GoJs图形绘图模板Shape示例详解

    目录 前言 Shape的使用 width和height属性 fill属性 stroke.strokeWidth.strokeDashArray属性 geometry属性 angle.scale属性 strokeCap strokeJoin属性 拓展 结语 前言 在可视化图形的展示过程中,节点内部往往不只是有文字描述,这样看起来很往往比较枯燥.在这个时候我们就可以在图形的节点内部加入一些几何图形.然后实现图形和文字的结合使用的话,不仅可以让节点内的内容更加形象,而且还可以通过图形标记对不同类型的节

  • GoJs基本使用示例详解

    目录 使用gojs背景 gojs的引入 去除水印 使用gojs背景 因为公司业务需要,需要完成一个树形的关系图,并且在后续过程中会对树形关系图进行很多的交互来拓展树形图的展示.因此在研究了D3,antV G6,cytoscape和go.js之后,决定使用gojs实现.因为gojs的交互功能封装比较完善,能够很快的搭建出想要的关系图之外,还有很多封装好的交互功能.例如可以使用键盘进行节点的复制和粘贴,通过textEdited属性实现节点内文字的双击编辑等等. gojs的引入 我们可以直接引入js的

  • Go语言基础模板设计模式示例详解

    目录 概述 模板模式生活案例 策略模式涉及到两个角色 UML 总结 示例 概述 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤 确定了步骤的执行顺序,单某些步骤因环境或人等因素具体实现是未知的 模板模式生活案例 请客吃饭[点菜->吃东西->结账],每个人点菜不一样,吃东西不一样,结账也不一样从某地到某地[起点->出行方式->终点]起点和终点不一一样,但是每个人出行方式是不一样的 Go没有封装.

  • Python实现双X轴双Y轴绘图的示例详解

    诈尸人口回归.这一年忙着灌水忙到头都掉了,最近在女朋友的提醒下终于想起来博客的账号密码,正好今天灌水的时候需要画一个双X轴双Y轴的图,研究了两小时终于用Py实现了.找资料的过程中没有发现有系统的文章,反正代码都整理出来了,我决定顺势水一篇. 目前找到的plt实现双X轴双Y轴绘图方式有两种: 使用fig.add_subplot方式将两对坐标系叠加在一个fig上实现双X轴双Y轴效果.所有调整均可完美实现,推荐该方式 通过axes.twinx().twiny()方式实现双X轴双Y轴图形绘制.问题在于对

  • 关于Python可视化Dash工具之plotly基本图形示例详解

    Plotly Express是对 Plotly.py 的高级封装,内置了大量实用.现代的绘图模板,用户只需调用简单的API函数,即可快速生成漂亮的互动图表,可满足90%以上的应用场景. 本文借助Plotly Express提供的几个样例库进行散点图.折线图.饼图.柱状图.气泡图.桑基图.玫瑰环图.堆积图.二维面积图.甘特图等基本图形的实现. 代码示例 import plotly.express as px df = px.data.iris() #Index(['sepal_length', '

  • Java实现经典大富翁游戏的示例详解

    目录 前言 主要设计 功能截图 代码实现 总结 前言 大富翁,又名地产大亨.是一种多人策略图版游戏.参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地.建楼以赚取租金.英文原名monopoly意为“垄断”,因为最后只得一个胜利者,其余均破产收场. <大富翁>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可多人参与的大富翁游戏,玩家有初始资金,通过掷骰子,玩家移动指定骰子点数步骤,根据对应格子上的交易策略,来决定是赚钱还是亏钱,其他玩家破

随机推荐