流程画布开发技术方案归档(G6)

news2024/11/30 2:36:21

🎨 在理想的最美好世界中,一切都是为最美好的目的而设。 —— 伏尔泰

如果可以实现记得点赞分享,谢谢老铁~

一、技术选型

•从可维护性和可拓展性出发

•基本满足

1:链接: https://github.com/hukaibaihu/vue-org-tree

•线条用canvas绘画,其他元素用HTML实现。

2:https://segmentfault.com/a/1190000021972969

•便于后期灵活拓展,优先选择

3: http://antv-2018.alipay.com/zh-cn/g6/3.x/index.html

二、Graph G6

创建一个 G6 的关系图仅需要下面几个步骤:

1.创建关系图的 HTML 容器;

2.数据准备;

3.创建关系图;

4.配置数据源,渲染。

Step 1 创建容器

需要在 HTML 中创建一个用于容纳 G6 绘制的图的容器,通常为 div 标签。G6 在绘制时会在该容器下追加 canvas 标签,然后将图绘制在其中。

HTML

Step 2 数据准备

引入 G6 的数据源为 JSON 格式的对象。该对象中需要有节点(nodes)和边(edges)字段,分别用数组表示:

const data = {

  // 点集

  nodes: [{

    id: 'node1', // String,该节点存在则必须,节点的唯一标识
    
    x: 100,      // Number,可选,节点位置的 x 值
    
    y: 200       // Number,可选,节点位置的 y 值

  },{

    id: 'node2', // String,该节点存在则必须,节点的唯一标识
    
    x: 300,      // Number,可选,节点位置的 x 值
    
    y: 200       // Number,可选,节点位置的 y 值

 }],

  // 边集

  edges: [{

    source: 'node1', // String,必须,起始点 id
    
    target: 'node2'  // String,必须,目标点 id

  }]

};

注意

•nodes 数组中包含节点对象,唯一的 id 是每个节点对象中必要的属性,x、 y 用于定位;

•edges 数组中包含边对象,source 和 target 是每条边的必要属性,分别代表了该边的起始点 id 与 目标点 id。

•点和边的其他属性参见链接:G6 的内置节点和边。

Step 3 创建关系图

创建关系图(实例化)时,至少需要为图设置容器、宽和高:

const graph = new G6.Graph({

  container: 'mountNode',  // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身

  width: 800,              // Number,必须,图的宽度

  height: 500              // Number,必须,图的高度

});

Step 4 配置数据源,渲染

graph.data(data);  // 读取 Step 2 中的数据源到图上

graph.render();    // 渲染图

最终的结果
在这里插入图片描述

三、项目应用

如何自定义节点,自定义样式?

第一种:通过 图形 Shape 内置节点类型自定义节点

•会按照addShape顺序来解析节点


G6.registerNode(

  'nodeName',

  {

    options: {
    
      style: {},
    
      stateStyles: {
    
        hover: {},
    
        selected: {},
    
      },
    
    },
    
    /**
    
     * 绘制节点,包含文本
    
     * @param  {Object} cfg 节点的配置项
    
     * @param  {G.Group} group 图形分组,节点中图形对象的容器
    
     * @return {G.Shape} 返回一个绘制的图形作为 keyShape,通过 node.get('keyShape') 可以获取。
    
     * 关于 keyShape 可参考文档 核心概念-节点/边/Combo-图形 Shape 与 keyShape
    
     */
    
    draw:(cfg, group) => {  
    
        // 最外面的那层
    
        group.addShape('rect', {
    
          attrs: {
    
              x: 0,
    
              y: 0,
    
              width: 125,
    
              height: 40,
    
              fill: cfg.style.fill, // 填充色
    
              stroke: '', // 边框
    
              radius: 8
    
           },
    
          // must be assigned in G6 3.3 and later versions. it can be any value you want
    
          name: 'rect-shape',
    
          zIndex: 1,
    
        });
    
        // 里面的那层
    
        group.addShape('rect', {
    
          draggable: true,
    
          attrs: {
    
              x: 5,
    
              y: 0,
    
              width: 120,
    
              height: 40,
    
              fill: '#fff', // 填充色
    
              stroke: '', // 边框
    
              radius: 6
    
            }
    
          });
    
         // 文字
    
         group.addShape('text', {
    
            attrs: {
    
              // textBaseline: 'center',
    
              y: 25,
    
              x: 24,
    
              lineHeight: 10,
    
              text: cfg.label,
    
              fill: '#000'
    
            }
    
         });
    
    },

  },

  // 继承内置节点类型的名字,例如基类 'single-node',或 'circle', 'rect' 等

  // 当不指定该参数则代表不继承任何内置节点类型

  extendedNodeName,

);

第二种:使用 DOM 自定义节点

SVG 与 DOM 图形在 V3.3.x 中不支持。 仅在 Graph 的 renderer 为 ‘svg’ 时可以使用 DOM 自定义节点。

⚠️ 注意:

•只支持原生 HTML DOM,不支持各类 react、vue 组件;

•使用 ‘dom’ 进行自定义的节点或边,不支持 G6 的交互事件,请使用原生 DOM 的交互事件;

•在 Safari 中,若 dom 节点被设置了 position:relative,将会导致渲染异常。Issus。



G6.registerNode(
  'dom-node',
  {

    draw: (cfg: ModelConfig, group: Group) => {
    
      const shape = group.addShape('dom', {
    
        attrs: {
    
          x: 0,
    
          y: 0,
    
          width: 100,
    
          height: 24,
    
          html: `
    
            <div id=${cfg.id} class='dom-node' style="background-color: #fff; border: 2px solid red; border-radius: 5px; width: 300px; height: 200px; display: flex;">
    
              <div style="height: 100%; width: 33%; background-color: #CDDDFD">
    
                <img alt="" style="line-height: 100%; margin-left: 7px;" src="https://xxxx" width="20" height="20" />
    
              </div>
    
              <span style="margin:auto; padding:auto; color: #5B8FF9">${cfg.label}</span>
    
            </div>`
    
        }
    
      });
    
      return shape;
    
    },

  },

  'single-node',

);

第三种:使用类 JSX 语法定义 G6 节点

在 G6 3.7.0 及以后的版本中,用户以使用类似 JSX 的语法来定义节点。只需要在使用 G6.registerNode 自定义节点时,将第二个参数设置为字符串或一个返回值为 string 的 function。

推荐用法

•在最外层包裹 group 标签,保证节点里面图形树结构完整

•字符串最好使用单引号包裹,以免遇到解析错误

•style 中随 node 变化的变量推荐使用 ${} 的模板语法加入

•图形内的相对定位推荐使用 marginTop 和 marginLeft 进行设置,x 与 y 会破坏层级关系定位

•如果涉及到需要横向排列的元素,在上一个元素使用next: inline来实现下一个元素跟随在上个元素后方

import { groupXML } from '../xml/groupXML.js'

G6.registerNode('rect-xml', {

    jsx: groupXML

 })


export const rootXML = (cfg) =>`

   <rect style={{

        width: 520,
    
        height: 40,
    
        textAlign: 'center',
    
        fill:  ${cfg.account_type == '' ? cfg.rootTitleColor : '#2D8CF0'},
    
        radius: [10, 10, 0, 0],
    
        name: 'rootHeader'
    
      }}>
    
        <text style={{
    
          marginTop: 10,
    
          marginLeft: 230,
    
          fontWeight: '500',
    
          fontSize: '16',
    
          fill: '#FFFFFF' }}> ${cfg.nameHeader}</text>

  </rect>`

第四种:使用React直接定义节点

下载依赖安装包

npm install @antv/g6-react-node

最终的视觉

在这里插入图片描述

收工!谢谢老铁们的点赞收藏~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 手写设计HashMap源码,让面试官膜拜

Java 手写HashMap源码&#xff0c;让面试官膜拜 一&#xff0c;手写源码 这是一个模仿HashMap的put&#xff0c;get功能的自定义的MyHashMap package cn.wxs.demo;import java.io.Serializable; import java.util.*; import java.util.function.BiConsumer;class MyHashMap&…

【解密考研英语:Python数据分析与可视化】

解密考研英语&#xff1a;Python数据分析与可视化 背景数据集技术选型功能实现创新点 大家好&#xff0c;欢迎阅读我的CSDN博客&#xff01;今天我将分享一项有关考研英语真题的数据分析与可视化项目&#xff0c;希望对考研学子提供更有针对性的复习帮助。 背景 作为考研学子…

【TwinCAT学习笔记 1】TwinCAT开发环境搭建

写在前面 作为技术开发人员&#xff0c;开启任何一项开发工作之前&#xff0c;首先都要搭建好开发环境&#xff0c;所谓磨刀不误砍材工&#xff0c;一定要有耐心&#xff0c;一次不行卸载再装。我曾遇到过一个学生&#xff0c;仅搭建环境就用了两周&#xff0c;这个过程也是一…

Docker容器的可视化管理工具—DockerUI本地部署与远程访问

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

3接上篇 我的自定义GPTs的改进优化 与物理世界连接成功 GPTs的创建与使用定义和执行特定任务的功能模块 通过API与外部系统或服务的交互

https://blog.csdn.net/chenhao0568/article/details/134875067?spm1001.2014.3001.5502 从服务器日志里看到请求多了一个“location” 23.102.140.123 - - [08/Dec/2023:14:02:20 0800] "GET /getWeather.php?location&locationNewYork HTTP/1.1" 200 337 &…

公式识别任务各个链条全部打通

目录 引言公式识别任务是什么&#xff1f;公式识别任务解决方案初探使用建议写在最后 引言 随着LaTeX-OCR模型转换问题的解决&#xff0c;公式识别任务中各个链条已经全部打通。小伙伴们可以放开膀子干了。 解决业界问题的方案&#xff0c;并不是单独训练一个模型就完事了&am…

Spring Bean基础

写在最前面: 本文运行的示例在我github项目中的spring-bean模块&#xff0c;源码位置: spring-bean 前言 为什么要先掌握 Spring Bean 的基础知识&#xff1f; 我们知道 Spring 框架提供的一个最重要也是最核心的能力就是管理 Bean 实例。以下是其原因&#xff1a; 核心组件…

data_loader返回的每个batch的数据大小是怎么计算得到的?

data_loader是一个通用的术语&#xff0c;用于表示数据加载器或数据批次生成器。它是在机器学习和深度学习中常用的一个概念。 一、data loader 数据加载器&#xff08;data loader&#xff09;是一个用于加载和处理数据集的工具&#xff0c;它可以将数据集划分为小批次&#…

Oracle 中换行chr(10)、回车chr(13)

一、前言 chr(n)&#xff1a;返回 ascii 值对应的字符。 ascii(char)&#xff1a;返回字符 char对应的ascii 值。 chr(n) 和 ascii(char) 作用刚好是相反的。 SQL> select chr(65) from dual; 控制台显示&#xff1a;ASQL> select ascii(A) from dual; 控制台显示&am…

Oracle高可用一家老小全在这里

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

FL Studio2024永久免费体验版下载

FL Studio中文绿色21版是一款无需要安装的汉化版本&#xff0c;它是一款非常专业的音频编辑软件&#xff0c;可以让你的音乐突破想象力的限制哦&#xff0c;FL Studio21中文版可以制作出不同音律的节奏&#xff0c;FL Studio内置众多电子合成音色&#xff0c;只Styrus可以让人激…

鸿蒙开发组件之ForEach列表

一、ForEach函数 ForEach函数是一个迭代函数&#xff0c;需要传递两个必须参数和一个可选参数。主要通过迭代来获取参数arr中的数据不断的生成单个Item来生成鸿蒙中的列表样式 二、先创建单个的Item的UI 通过嵌套Row与Column来实现单个Item的UI。例如图中没有折扣的可以看成一…

C++-引用和指针区别

文章目录 1.变量的组成2.指针2.1 定义2.2 使用指针操作变量2.3 为什么使用指针 3.引用3.1 定义3.2 引用注意事项 4.引用和指针的区别 1.变量的组成 变量的组成&#xff1a;变量地址&#xff0c;变量名&#xff0c;变量值 例&#xff1a; int i 12;2.指针 2.1 定义 指针用于存…

【Python】简单的翻译软件

用translate包和tkinter写一个简单的桌面翻译软件。 1、窗口设置&引入包&#xff1a; from tkinter import * from tkinter.ttk import * from tkinter.messagebox import * import translatewinTk() win.title(翻译) win.geometry("600x400")win.mainloop() …

【Linux系统编程】初步运用git工具

介绍&#xff1a; 使用git之前首先要先认识gitee/github&#xff0c;gitee/github是一个远程仓库网站。git是平台专门开发的一个操控工具&#xff0c;是一个开源的分布式版本控制系统&#xff0c;我们使用git工具来与gitee/github来取得联系。 git的推送使用&#xff1a; git既…

解决electron修改主进程后需要重启才生效

nodemon 是一种工具&#xff0c;可在检测到目录中的文件更改时通过自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序 nodemon 特性 自动重新启动应用程序。检测要监视的默认文件扩展名。默认支持 node&#xff0c;但易于运行任何可执行文件&#xff0c;如 python、…

uniapp获取wifi连接状态

当使用Uniapp开发移动应用时&#xff0c;我们经常需要获取设备的连接状态&#xff0c;特别是WiFi连接状态。下面是一个简短的关于在Uniapp中获取WiFi连接状态的博客&#xff1a; 在Uniapp中&#xff0c;要获取设备的WiFi连接状态&#xff0c;我们可以利用uni.getNetworkType接…

【HarmonyOS开发】详解常见容器的使用

声明式UI提供了以下8种常见布局&#xff0c;开发者可根据实际应用场景选择合适的布局进行页面开发。 布局 应用场景 线性布局&#xff08;Row、Column&#xff09; 如果布局内子元素超过1个&#xff0c;且能够以某种方式线性排列时优先考虑此布局。 层叠布局&#xff08;St…

2023-12-05 Qt学习总结8

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十三 QSqlDatabase数据库二十四 cmake工程管理文件总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 二十三 QSqlDatabase数据库 QSqlDatabase 是 Qt 框架中关于数据库的统一封装&#xff0c;它支持…

【Hexo】自动在中英文之间添加空格

本文首发于 ❄️慕雪的寒舍 如题&#xff0c;中英文添加空格是比较规范的写法&#xff0c; 但是我个人实在是懒&#xff0c;每次都要这么弄太累了。想找找hexo有没有对应的插件&#xff0c;还是有的 npm install hexo-filter-auto-spacing --save安装了之后&#xff0c;在hexo的…