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

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

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

一、技术选型

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

•基本满足

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

最终的视觉

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伦茨科技宣布ST17H6x芯片已通过Apple Find My「查找」认证

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

MPEG4Extractor

1、readMetaData 必须要找到 Moov box&#xff0c;找到 Mdat box或者 Moof box&#xff0c;并且创建了 ItemTable 大端 box 分为 box header 和 box content&#xff1a; box header由8个字节组成&#xff0c;前面四个字节表示这个box 的大小&#xff08;包含这个头的8字节&a…

MySQL数据库,子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。很多时候查询需要从结果集中获取数据&#xff0c;或者需要从同一个表中先计算得出一个数据结果&#xff0c;然后与这个数据结果&#xff08;可能是某个标量&#xff0c;也可能是某个集合&#xff09;进行比较。 例&#…

微信小程序适配方案:rpx(responsive pixel响应式像素单位)

小程序适配单位&#xff1a;rpx 规定任何屏幕下宽度为750rpx 小程序会根据屏幕的宽度自动计算rpx值的大小 Iphone6下&#xff1a;1rpx 1物理像素 0.5css 小程序编译后&#xff0c;rpx会做一次px换算&#xff0c;换算是以375个物理像素为基准&#xff0c;也就是在一个宽度…

通用基础模型+提示词是否能胜过微调模型?医学案例研究

论文链接在末尾 摘要 通用基础模型,如GPT-4,在各种领域和任务中展现出令人惊讶的能力。然而,普遍存在这样一种假设,即它们在没有专业知识深度训练的情况下无法达到专业能力。例如,迄今为止对医学竞赛基准的大多数探索都利用了领域特定的训练,正如在BioGPT和Med-PaLM等项…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1&#xff09;数据介绍2&#xff09;数据测试3&#xff09;数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff0c;在读者…

ooTD I 这么精致优雅的套装也太好看了吧

精致到每一个细节的国风套装 领口袖口拼接环保毛条 精美的绣花增添浓重的高级感 外套90白鸭绒填充 敲暖和裙子的门襟处 也是做了定制盘扣&#xff0c;外套和裙子单独来穿也很精致

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月&#xff0c;Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾&#xff0c;在 NEARCON2023 的多链网络主题沙龙中发言&#xff1a;我们依然处于区…

主存储器与CPU的连接

目录 一. 单块存储芯片与CPU的连接二. 多块存储芯片与CPU的连接2.1 位扩展2.2 字扩展2.3 字位扩展 三. 译码器知识点的补充 \quad 一. 单块存储芯片与CPU的连接 \quad \quad \quad 暴露出的引脚都是与CPU连接的 上面这个是88位的存储芯片 我们可以看到有8个字, 每个字的字长是8…

Git提交代码时出现: ‘LF will be replaced by CRLF the next time Git touches it‘

遇到的问题 windows平台进行 git add 时&#xff0c;控制台打印警告 问题分析 1. Dos/Windows平台默认换行符&#xff1a;回车&#xff08;CR&#xff09;换行&#xff08;LF&#xff09;&#xff0c;即’\r\n’ 2. Mac/Linux平台默认换行符&#xff1a;换行&#xff08;LF&…

imazing正在查找最新的apple mobile device组件

​ Apple Mobile Device是macOS的一个组件&#xff0c;它允许您在Mac上与iOS设备进行无缝连接和通信。因此&#xff0c;无法直接在苹果设备上下载和安装Apple Mobile Device&#xff0c;需要借助管理工具进行下载安装后启动。 如果您需要与iOS设备进行通信和同步&#xff0c;…

javascript实现Stack(栈)数据结构

上一篇文章我们理解了List这种数据结构&#xff0c;知道了它的特点和一些使用场景&#xff0c;这篇文章我们就来看一下栈这种数据结构&#xff0c;这里的栈可不是客栈哦&#xff0c;哈哈 栈其实和List非常像&#xff0c;使用javascript实现都是基于数组来实现 尝试理解Stack …

10 大 Android 手机系统修复软件深度评测

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而&#xff0c;随着时间的推移&#xff0c;您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 10 大 Android 手机系统修复软件 好吧&#xff0c;…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…

LeetCode力扣每日一题(Java):26、删除有序数组中的重复项

一、题目 二、解题思路 1、我的思路 我一开始的思路是创建一个ArrayList对象&#xff0c;然后将数组中的元素追加到ArrayList中&#xff0c;再通过ArrayList提供的API去解题&#xff0c;但是发现题目中提到了原地删除重复的元素&#xff0c;所以这种方法是行不通的 那就只能…

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

使用LangSmith来快速学习LangChain

好风凭借力&#xff0c;送我上青云&#xff01; 什么是LangSmith LangSmith is a platform for building production-grade LLM applications. It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly int…

【数据结构】——队列实现二叉树的功能

前言&#xff1a;二叉树的实现方式多种多样&#xff0c;有数组实现满二叉树&#xff0c;有链表实现完全二叉树&#xff0c;今天我们就用队列来实现二叉树。 创建二叉树&#xff1a; typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中&#xff0c;同时不断着力提升自己的 AI 技能。 面对 AI 问题&#xff0c;工程师首先要了解什么是 AI&#xff0c;以及如何将它纳入当前工作流&#xff0c;这看似简单&#xff0c;实则未必容易。在 Google 中搜…