当前位置: 首页 > 知识库问答 >
问题:

前端 - G6谁了解。加我一下。问个东西。我写不出来了啊?

陶琦
2023-08-31

G6谁了解。加我一下。问个东西。我写不出来了啊?
image.png

import { PageContainer } from '@ant-design/pro-components/es';import { Modal } from 'antd';import React, { useEffect, useState } from 'react';import './index.less';import G6 from '@antv/g6';const Audit: React.FC = () => {  const { confirm } = Modal;  const [isModalOpen, setIsModalOpen] = useState(false);  const [formData, setFormData] = useState<any>({});  useEffect(() => {    init();  }, []);  async function init() {    const data = {      nodes: [        {          id: '1', // String,该节点存在则必须,节点的唯一标识          label: '1.采购入库明细', // String,节点标签          comboId: 'A', // String,所属的 combo 的 id          x: 10,          y: 100,        },        {          id: '2',          label: '2.销售出库明细',          comboId: 'A',        },        {          id: '3',          label: '3.内部采购入库明细表',          comboId: 'A',        },        {          id: '4',          label: '4.内部销售出库明细表',          comboId: 'A',        },        {          id: '5',          label: '5.采购退货明细表',          comboId: 'A',        },        {          id: '6',          label: '6.销售退货明细表',          comboId: 'A',        },        {          id: '7',          label: '7.返货核销表',          comboId: 'A',          labelCfg: {            // 标签配置属性            style: {              // 包裹标签样式属性的字段 style 与标签其他属性在数据结构上并行              fontSize: 12, // 标签的样式属性,文字字体大小              fill: 'rgba(0,0,0,0.25)', // 标签的样式属性,文字颜色            },          },          // ...,               // 其他属性          style: {            // 包裹样式属性的字段 style 与其他属性在数据结构上并行            fill: 'rgba(0,0,0,0.04)', // 样式属性,元素的填充色            stroke: 'rgba(0,0,0,0.04)', // 样式属性,元素的描边色            // ...              // 其他样式属性          },        },        {          id: '8',          label: '8.返货核销汇总表',          comboId: 'A',        },        {          id: '9',          label: '9.货品返货金额表',          comboId: 'A',        },        {          id: '10',          label: '10.采购入库汇总表',        },        {          id: '11',          label: '11.加权平均单价表',        },        {          id: '12',          label: '12.销售出库汇总表',        },        {          id: '13',          label: '13.期末库存余额表',        },      ],      combos: [        {          id: 'A', // String,该 combo 存在则必须,combo 的唯一标识          label: ' ', // String,combo 的显示标签          // size: [1200, 800],          style: {            // Object,可选,combo 的样式配置            stroke: '#ccc', // String,描边色          },        },      ],      edges: [        {          source: '1', // String,必须,起始点 id          target: '2', // String,必须,目标点 id        },        {          source: '2',          target: '3',        },        {          source: '3',          target: '4',        },        {          source: '3',          target: '5',        },        {          source: '5',          target: '6',        },        {          source: '5',          target: '7',        },        {          source: '7',          target: '8',        },        {          source: '8',          target: '9',        },        {          source: 'A',          target: '11',        },        {          source: 'A',          target: '10',        },        {          source: '10',          target: '13',        },        {          source: '13',          target: '11',        },        {          source: '11',          target: '12',        },        {          source: '12',          target: '13',        },      ],    };    const width = window.innerWidth;    const height = window.innerHeight;    const graph = new G6.Graph({      container: 'g6_audit_container', // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身      width: width - 200, // Number,必须,图的宽度      height: height, // Number,必须,图的高度      fitView: true, // 居中适配      fitViewPadding: 20, // 指定四周的留白      modes: {        default: [          // 'drag-canvas',          // 'drag-node',          // 'drag-combo',          // {          //   type: 'collapse-expand-combo',          //   relayout: false,          // },        ],      },      defaultCombo: {        type: 'rect',        style: {          fillOpacity: 0.1,        },      },      // 布局配置      layout: {        type: 'dagre', // 指定为树形结构        // type: predictLayout, // ai 预测布局        // type: 'force',        preventOverlap: true, // 防止节点重叠        nodeSize: 200, // 节点大小        rankdir: 'LR', // 自左至右布局,可选,默认为图的中心 'TB' / 'BT' / 'LR' / 'RL'        align: 'UL', // 节点对齐方式,可选 :'UL' | 'UR' | 'DL' | 'DR' | undefined        controlPoints: true, // 是否保留布局连线的控制点        nodesepFunc: () => 1, // 节点之间间距        ranksepFunc: () => 1, // 每一层节点之间间距      },      // 节点在默认状态下的样式配置(style)和其他配置      defaultNode: {        size: [160, 80], // 节点大小 width,height        type: 'rect',        style: {          lineWidth: 2,          stroke: '#5B8FF9',          fill: '#C6E5FF',          // 节点上的标签文本配置          labelCfg: {            // 节点上的标签文本样式配置            style: {              fontSize: 16,            },          },        },      },      defaultEdge: {        type: 'polyline',        size: 1,        color: '#e2e2e2',        style: {          endArrow: {            path: 'M 0,0 L 8,4 L 8,-4 Z',            fill: '#e2e2e2',          },          radius: 20,        },      },    });    graph.data(data); // 读取 Step 2 中的数据源到图上    graph.render(); // 渲染图    // 监听节点点击事件    graph.on('node:click', (evt) => {      const node = evt.item; // 被点击的节点元素      const shape = evt.target; // 被点击的图形,可根据该信息作出不同响应,以达到局部响应效果      const edge = evt.item;      const model = edge!.getModel(); // 获取边的数据模型 data nodes[i] 的数据模型      const { id } = model;      console.log('node:click,点击了第几个的id', id);    });  }  return (    <PageContainer>      <div id="g6_audit_container"></div>    </PageContainer>  );};export default Audit;

结果我画的是这样的image.png

共有1个答案

乜建柏
2023-08-31

好像搞出来了。但是代码来看看,也太垃圾了吧。肯定是我的方法不对
image.png

/* eslint-disable @typescript-eslint/no-this-alias */// @ts-nocheckimport { PageContainer } from '@ant-design/pro-components/es';import { Modal } from 'antd';import React, { useEffect, useState } from 'react';import './index.less';import G6 from '@antv/g6';const Audit: React.FC = () => {  const { confirm } = Modal;  const [isModalOpen, setIsModalOpen] = useState(false);  const [formData, setFormData] = useState<any>({});  useEffect(() => {    setTimeout(() => {      init();    }, 1000);  }, []);  async function init() {    G6.registerEdge('bootomToTop', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', startPoint.x + 80, startPoint.y + 40], // 开始点          ['L', endPoint.x + 80, endPoint.y - 40], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    G6.registerEdge('bootomToTop11', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', 610, endPoint.y - 145], // 开始点          ['L', 610, endPoint.y - 40], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    G6.registerEdge('bootomToTop10', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', 310, endPoint.y - 245], // 开始点          ['L', 310, endPoint.y - 40], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    G6.registerEdge('bootomToTop10_13', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', 310, endPoint.y - 200], // 开始点          ['L', 310, endPoint.y - 50], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    G6.registerEdge('bootomToTop13_11', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', startPoint.x - 360, startPoint.y - 50], // 开始点          ['L', startPoint.x - 360, startPoint.y - 255], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    G6.registerEdge('bootomToTop11_12', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', startPoint.x, startPoint.y], // 开始点          ['L', startPoint.x + 210, startPoint.y], // 拐点          ['L', startPoint.x + 210, startPoint.y + 55], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    G6.registerEdge('bootomToTop12_13', {      options: {        style: {          stroke: '#e2e2e2',        },      },      draw(cfg, group) {        console.log('cfg', cfg);        const startPoint = cfg.startPoint;        const endPoint = cfg.endPoint;        const stroke = this.options.style.stroke;        const endArrow = (cfg.style && cfg.style.endArrow) || undefined;        console.log('endArrow', endArrow);        const path = [          ['M', startPoint.x + 80, startPoint.y], // 开始点          ['L', startPoint.x + 80, startPoint.y + 155], // 结束点        ];        console.log('path', path);        const shape = group.addShape('path', {          attrs: {            stroke,            path,            endArrow,          },          name: 'path-shape',        });        return shape;      },    });    const data = {      nodes: [        {          id: '1', // String,该节点存在则必须,节点的唯一标识          label: '1.采购入库明细', // String,节点标签          comboId: 'A', // String,所属的 combo 的 id          x: 10,          y: 100,        },        {          id: '2',          label: '2.销售出库明细',          comboId: 'A',          x: 310,          y: 100,        },        {          id: '3',          label: '3.内部采购入库明细表',          comboId: 'A',          x: 610,          y: 100,        },        {          id: '4',          label: '4.内部销售出库明细表',          comboId: 'A',          x: 610,          y: 300,        },        {          id: '5',          label: '5.采购退货明细表',          comboId: 'A',          x: 910,          y: 100,        },        {          id: '6',          label: '6.销售退货明细表',          comboId: 'A',          x: 910,          y: 300,        },        {          id: '7',          label: '7.返货核销表',          comboId: 'A',          x: 1210,          y: 100,          labelCfg: {            // 标签配置属性            style: {              // 包裹标签样式属性的字段 style 与标签其他属性在数据结构上并行              fontSize: 12, // 标签的样式属性,文字字体大小              fill: 'rgba(0,0,0,0.25)', // 标签的样式属性,文字颜色            },          },          // ...,               // 其他属性          style: {            // 包裹样式属性的字段 style 与其他属性在数据结构上并行            fill: 'rgba(0,0,0,0.04)', // 样式属性,元素的填充色            stroke: 'rgba(0,0,0,0.04)', // 样式属性,元素的描边色            // ...              // 其他样式属性          },        },        {          id: '8',          label: '8.返货核销汇总表',          comboId: 'A',          x: 1210,          y: 300,        },        {          id: '9',          label: '9.货品返货金额表',          comboId: 'A',          x: 1210,          y: 500,        },        {          id: '10',          label: '10.采购入库汇总表',          x: 310,          y: 800,        },        {          id: '11',          label: '11.加权平均单价表',          x: 610,          y: 700,        },        {          id: '12',          label: '12.销售出库汇总表',          x: 900,          y: 800,        },        {          id: '13',          label: '13.期末库存余额表',          x: 600,          y: 1000,          size: [740, 90],        },      ],      combos: [        {          id: 'A', // String,该 combo 存在则必须,combo 的唯一标识          label: ' ', // String,combo 的显示标签          // size: [1200, 800],          style: {            // Object,可选,combo 的样式配置            stroke: '#ccc', // String,描边色          },        },      ],      edges: [        {          source: '1', // String,必须,起始点 id          target: '2', // String,必须,目标点 id        },        {          source: '2',          target: '3',        },        {          source: '3',          target: '4',          type: 'bootomToTop', // 边的类型 自定义的        },        {          source: '3',          target: '5',        },        {          source: '5',          target: '6',          type: 'bootomToTop',        },        {          source: '5',          target: '7',        },        {          source: '7',          target: '8',          type: 'bootomToTop',        },        {          source: '8',          target: '9',          type: 'bootomToTop',        },        {          source: 'A',          target: '11',          type: 'bootomToTop11',        },        {          source: 'A',          target: '10',          type: 'bootomToTop10',        },        {          source: '10',          target: '13',          type: 'bootomToTop10_13',        },        {          source: '13',          target: '11',          type: 'bootomToTop13_11',        },        {          source: '11',          target: '12',          type: 'bootomToTop11_12',        },        {          source: '12',          target: '13',          type: 'bootomToTop12_13',        },      ],    };    const width = window.innerWidth;    const height = window.innerHeight;    G6.registerLayout('layoutName', {      /**       * 定义自定义行为的默认参数,会与用户传入的参数进行合并       */      getDefaultCfg() {        return {};      },      /**       * 初始化       * @param {Object} data 数据       */      init(data) {        const self = this;        self.nodes = data.nodes;        self.edges = data.edges;      },      /**       * 执行布局       */      execute() {        // TODO      },      /**       * 根据传入的数据进行布局       * @param {Object} data 数据       */      layout(data) {        const self = this;        self.init(data);        self.execute();      },      /**       * 更新布局配置,但不执行布局       * @param {Object} cfg 需要更新的配置项       */      updateCfg(cfg) {        const self = this;        Util.mix(self, cfg);      },      /**       * 销毁       */      destroy() {        const self = this;        self.positions = null;        self.nodes = null;        self.edges = null;        self.destroyed = true;      },    });    const graph = new G6.Graph({      container: 'g6_audit_container', // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身      width: width - 400, // Number,必须,图的宽度      height: height - 200, // Number,必须,图的高度      fitView: true, // 居中适配      fitViewPadding: [40, 120], // 指定四周的留白      modes: {        default: [          // 'drag-canvas',          // 'drag-node',          // 'drag-combo',          // {          //   type: 'collapse-expand-combo',          //   relayout: false,          // },        ],      },      defaultCombo: {        type: 'rect',        style: {          fillOpacity: 0.1,        },      },      // 布局配置      layout: {        type: 'layoutName', // 指定为树形结构        // type: predictLayout, // ai 预测布局        // type: 'force',        preventOverlap: true, // 防止节点重叠        nodeSize: 200, // 节点大小        rankdir: 'LR', // 自左至右布局,可选,默认为图的中心 'TB' / 'BT' / 'LR' / 'RL'        align: 'UL', // 节点对齐方式,可选 :'UL' | 'UR' | 'DL' | 'DR' | undefined        controlPoints: true, // 是否保留布局连线的控制点        nodesepFunc: () => 1, // 节点之间间距        ranksepFunc: () => 1, // 每一层节点之间间距      },      // 节点在默认状态下的样式配置(style)和其他配置      defaultNode: {        size: [160, 80], // 节点大小 width,height        type: 'rect',        style: {          lineWidth: 2,          stroke: '#5B8FF9',          fill: '#C6E5FF',          // 节点上的标签文本配置          labelCfg: {            // 节点上的标签文本样式配置            style: {              fontSize: 16,            },          },        },      },      // 2个元素直接的连线样式配置      defaultEdge: {        type: 'polyline',        size: 1,        color: '#e2e2e2',        style: {          endArrow: {            path: 'M 0,0 L 8,4 L 8,-4 Z',            fill: '#e2e2e2',          },          radius: 20,        },      },    });    graph.data(data); // 读取 Step 2 中的数据源到图上    graph.render(); // 渲染图    // 监听节点点击事件    graph.on('node:click', (evt) => {      const node = evt.item; // 被点击的节点元素      const shape = evt.target; // 被点击的图形,可根据该信息作出不同响应,以达到局部响应效果      const edge = evt.item;      const model = edge!.getModel(); // 获取边的数据模型 data nodes[i] 的数据模型      const { id } = model;      console.log('node:click,点击了第几个的id', id);    });  }  return (    <PageContainer>      <div id="g6_audit_container"></div>    </PageContainer>  );};export default Audit;
 类似资料:
  • 问题内容: 我正在练习 自我连接 ,这是我编写查询时不了解的事情。 我有桌子 雇员表包含三个记录。 最后一列manager_id是指使Ahmed和Tove成为Ola经理的第一列ID。 如果我这样写查询 结果使艾哈迈德和托夫经理。然而 正确无误,有人可以解释吗? 问题答案: 自联接就像内部联接,其中同一表的两个或更多实例通过公共数据类型的列/字段联接在一起。这种连接(内部连接)根据连接条件给出公共行

  • 我的项目的整个依赖关系如下代码所示: 我想用来计算两个格式为'yyyy-mm-ss hh:mm:ss.ss'的输入日期字符串之间的时间间隔(例如'2017-12-26 00:00:02.044'),结果将加倍,精度达到毫秒,例如,当我传递“2017-12-26 00:00:02.044”、“2017-12-26 00:00:03.045”给时,结果将是1.001秒,然后附带Java代码段: 使用的

  • 本文向大家介绍吐槽一下我所了解的Node.js,包括了吐槽一下我所了解的Node.js的使用技巧和注意事项,需要的朋友参考一下 首先是性能,用起来感觉 Node.js 的性能并没有想象中那么好。内存占用差不多和 Ruby 一个等级,比 Python, PHP 要多。计算性能(即 CPU 使用)上,纯计算并没有太大优势,但因为可以很好地控制异步流程,所以总体表现上来看性能要比 PHP 好很多。个人觉

  • 在运行这个命令时,我能够安装其他的pip库而不是pycopg2--pip install psycopg2。我使用的是Azure Linux VM-Ubuntu18.04LTS,并在settings.py中设置了数据库配置。以下是一个问题: 错误:无效命令“BDIST_WHEAL” psycopg2生成轮失败,运行setup.py clean for psycopg2生成psycopg2失败,安装

  • 没有显示activity_main.xml 我花了3个小时安装所有要求的东西,但我不知道如何修复这个错误。有人有什么建议吗?

  • 我要离开一个网站(https://realpython.com/how-to-make-a-discord-bot-python/#how-to-make-a-discord-bot-in-python)和我下面的步骤,但我一直得到一个错误msg Traceback(最近一次调用最后一次): File"C:\用户\Bryce.Persello346\Desktop\bot.py",第15行,cli