Antd G6实现自定义工具栏

       在使用g6实现知识图谱可视化中,产品经理提出了有关图谱操作的不少功能,需要放置在工具栏中,其中有些功能不在g6自带的功能里,且工具栏样式、交互效果也和官方自定义工具栏不同。那我们怎么去实现呢?

        g6官方的工具栏案例是这样:G6,提供了“重做”,”撤销“,”放大“,”缩小“,”适应屏幕“,”实际大小“的操作,配置项中也提供了有关样式及操作的回调功能,但是,远不能满足我们产品需要的样式及功能。

        产品的需求中,工具栏各操作需要有激活和未激活的效果,悬浮的效果等等。操作除了官方工具栏自带的操作,还需”高亮“,”鱼眼放大镜“,”布局“,”下载“,”关系标签显隐“的功能。

       那我们就给工具栏换个新包装吧!话不多说,看效果,上代码。

<div v-if="graphState.showTool" class="toolbar">
            <a-tooltip title="展开/收起" color="geekblue" placement="right">
              <div class="inactiveTool">
                <MenuUnfoldOutlined
                  v-if="graphState.collapse"
                  style="font-size: 20px"
                  @click="
                    () => {
                      graphState.collapse = !graphState.collapse;
                    }
                  "
                />
                <MenuFoldOutlined
                  v-else
                  style="font-size: 20px"
                  @click="
                    () => {
                      graphState.collapse = !graphState.collapse;
                    }
                  "
                />
              </div>
            </a-tooltip>
            <a-space v-show="!graphState.collapse" direction="horizontal">
              <a-tooltip title="放大" color="geekblue" placement="right">
                <div
                  code="zoomOut"
                  :class="graphState.activeTool == 'zoomOut' ? 'activeTool' : 'inactiveTool'"
                >
                  <ZoomInOutlined @click="handleClickTool('zoomOut')" style="font-size: 20px" />
                </div>
              </a-tooltip>
              <a-tooltip title="缩小" color="geekblue" placement="right">
                <div
                  code="realZoom"
                  :class="graphState.activeTool == 'zoomIn' ? 'activeTool' : 'inactiveTool'"
                >
                  <ZoomOutOutlined @click="handleClickTool('zoomIn')" style="font-size: 20px" />
                </div>
              </a-tooltip>
              <a-tooltip title="自适应" color="geekblue" placement="right">
                <div :class="graphState.activeTool == 'realZoom' ? 'activeTool' : 'inactiveTool'">
                  <OneToOneOutlined @click="handleClickTool('realZoom')" style="font-size: 20px" />
                </div>
              </a-tooltip>
              <a-tooltip title="视图居中" color="geekblue" placement="right">
                <div
                  :class="graphState.activeTool == 'autoZoom' ? 'activeTool' : 'inactiveTool'"
                  style="font-size: 20px"
                >
                  <PicCenterOutlined @click="handleClickTool('autoZoom')" style="font-size: 20px" />
                </div>
              </a-tooltip>
              <a-tooltip title="高亮相邻节点" color="geekblue" placement="right">
                <div :class="graphState.activeTool == 'relation' ? 'activeTool' : 'inactiveTool'">
                  <DeploymentUnitOutlined
                    @click="handleClickTool('relation')"
                    style="font-size: 20px"
                  />
                </div>
              </a-tooltip>
              <a-tooltip title="鱼眼放大镜" color="geekblue" placement="right">
                <div :class="graphState.activeTool == 'fishEye' ? 'activeTool' : 'inactiveTool'">
                  <EyeOutlined @click="handleClickTool('fishEye')" style="font-size: 20px" />
                </div>
              </a-tooltip>
              <a-popover
                title="布局方案"
                placement="right"
                @visibleChange="handleChangeVisibleLayout"
              >
                <template #content>
                  <a-radio-group
                    v-model:value="graphState.layout.type"
                    @change="handleChangeLayout"
                  >
                    <div>
                      <a-radio value="AI" :disabled="graphState.nodes.length >= 100">
                        多边散列排布(少量数据推荐)
                      </a-radio>
                    </div>
                    <div>
                      <a-radio value="gForce">gForce力导向布局</a-radio>
                    </div>
                    <div>
                      <a-radio value="force2">基础力导向布局</a-radio>
                    </div>
                    <div v-show="false">
                      <a-radio value="fruchterman">Fruchterman布局</a-radio>
                    </div>
                  </a-radio-group>
                </template>
                <div :class="graphState.activeTool == 'layout' ? 'activeTool' : 'inactiveTool'">
                  <LayoutOutlined style="font-size: 20px" />
                </div>
              </a-popover>
              <a-tooltip title="导出图片" color="geekblue" placement="right">
                <div :class="graphState.activeTool == 'download' ? 'activeTool' : 'inactiveTool'">
                  <DownloadOutlined @click="handleClickTool('download')" style="font-size: 20px" />
                </div>
              </a-tooltip>
              <a-tooltip title="关系标签显隐" color="geekblue" placement="right">
                <div
                  :class="
                    graphState.activeTool == 'relationVisible' ? 'activeTool' : 'inactiveTool'
                  "
                >
                  <ArrowRightOutlined
                    @click="handleClickTool('relationVisible')"
                    style="font-size: 20px"
                  />
                </div>
              </a-tooltip>
            </a-space>
          </div>

        上述代码中,我们根据业务需求做了工具栏整体的显示隐藏,展开收起,关系显隐,图片下载等功能。工具栏面板我们可以根据自己系统使用的组件库,ant design 、element ui或者其他。添加图标,提示框,选中等效果。这里不多赘述。

        那么,怎么将g6的功能添加到我们工具栏上面使用呢?

        我们定义了一组响应式对象,用来存储当前激活的工具或效果。

const graphState = reactive({
      layout: {
        type: 'force2',
        advanceWeight: false,
        damping: 0.8,
        kr: 1000,
        preset: {
          minNodeSpacing: 10,
          nodeSize: 10,
          type: 'concentric',
        },
        clustering: true,
        animate: false,
        preventOverlap: true,
        clusterNodeStrength: 35,
        distanceThresholdMode: 'max',
        minMovement: 10,
        maxSpeed: 1000,
        linkDistance: 50,
        edgeStrength: 200,
        nodeStrength: 1000,
        nodeWeightFieldScale: 1,
        nodeWeightFromType: 'node',
        fitCenter: true,
      },
      showTool: false,
      activeTool: '',  //当前激活的工具
      enableFishEye: false, //是否启用鱼眼放大镜
      relation: false, //是否开启高亮相邻节点
      enableLegend: false, //是否开启图例
      relationVisible: true, //关系标签显示隐藏
      collapse: false,  //展开或折叠工具栏
    });

           引入G6,定义graph,用来初始化G6实例,再初始化G6的工具栏 

import G6 from '@antv/g6';
let graph;
let toolbar = new G6.ToolBar({
      className: 'g6-component-toolbar',
    });

         通过动态的给graph 实例添加插件、添加行为动作,达到调用工具栏功能的目的。

const handleClickTool = code => {
      if (toolbar.destroyed) {
        toolbar = new G6.ToolBar({
          className: 'g6-component-toolbar',
        });
        graph.addPlugin(toolbar);
      }
      if (code === 'zoomOut') {
        toolbar.zoomOut();
        //...
      } else if (code === 'zoomIn') {
        toolbar.zoomIn();
       //...
      } 
      //...
      graph.fitCenter();
      graphState.activeTool = code;
    };

           其他功能实现读者可查询G6官网API自行实现。这里只简述思路和原理。

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

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

相关文章

香港和美国节点服务器的测试IP哪里有?

在选择服务器时&#xff0c;我们通常需要进行一些测试来评估其性能和稳定性。当然&#xff0c;这其中一个重要的测试指标就是服务器的 IP 地址。通过测试 IP 地址&#xff0c;我们可以了解到服务器所在地区以及网络连接质量等信息。作为香港及亚太数据中心领先服务商恒创科技&a…

解决Python并发访问共享资源引起的竞态条件、死锁、饥饿问题的策略

目录 一、概述 二、竞态条件 三、死锁 四、饥饿 五、总结 一、概述 在Python中&#xff0c;多线程和多进程可以有效地提高程序的并发性能。然而&#xff0c;当多个线程或进程需要访问共享资源时&#xff0c;可能会引发竞态条件、死锁和饥饿等问题。这些问题可能会导致程序…

敏捷战略实施方法-资深组织发展专家实践秘笈

要怎样才能生成敏捷战略呢&#xff1f;作者基于多年的组织发展实践&#xff0c;总结出如下公式&#xff1a;敏捷战略 战略共创 迭代进化 即要得到一个好的敏捷战略&#xff0c;首先要做好战略共创&#xff0c;并在战略实施过程中对战略进行持续迭代&#xff0c;两者不可偏废…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼&#xff0c;头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作&#xff0c;会有一种浮在云端的虚无感 但是如果要实际操作&#xff0c;我又不想直接调用库包 可是…如果不直接调包&#xff0c;感…

一种优雅的调用第三方接口的思路及实现

之前的项目调用第三方接口时&#xff0c;往往用HttpUtils类似的静态方法调用。比较丑&#xff0c;不通用。如下&#xff0c;这是截取项目中某人调用的一段代码&#xff0c;非常不雅&#xff1a; 经改进后&#xff0c;采用了动态代理技术来实现&#xff0c;效果如下&#xff1a…

RabbitMQ的 五种工作模型

RabbitMQ 其实一共有六种工作模式&#xff1a; 简单模式&#xff08;Simple&#xff09;、工作队列模式&#xff08;Work Queue&#xff09;、 发布订阅模式&#xff08;Publish/Subscribe&#xff09;、路由模式&#xff08;Routing&#xff09;、通配符模式&#xff08;Topi…

网络安全-黑客技术-小白学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

VScode + opencv(cmake编译) + c++ + win配置教程

1、下载opencv 2、下载CMake 3、下载MinGW 放到一个文件夹中 并解压另外两个文件 4、cmake编译opencv 新建文件夹mingw-build 双击cmake-gui 程序会开始自动生成Makefiles等文件配置&#xff0c;需要耐心等待一段时间。 简单总结下&#xff1a;finish->configuring …

【图论实战】 Boost学习 03:dijkstra_shortest_paths

文章目录 示例代码 示例 最短路径: A -> C -> D -> F -> E -> G 长度 16 代码 #include <iostream> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/graph/graphviz.h…

状态机实现RGB灯跳变

1.项目功能梗概 因为原本使用的为for循环进行遍历&#xff0c;然后依次执行代码&#xff0c;但是由于看门狗的存在&#xff0c;不能使用delay_ms这种死延时。所以现在打算定时器回调函数控制状态机状态这种方法。 2.状态机 作用 当系统需要执行某个任务时&#xff0c;可以根据…

力扣字符串--总结篇

前言 字符串学了三天&#xff0c;七道题。初窥kmp&#xff0c;已经感受到算法的博大精深了。 内容 对字符串的操作可以归结为以下几类&#xff1a; 字符串的比较、连接操作&#xff08;不同编程语言实现方式有所不同&#xff09;&#xff1b; 涉及子串的操作&#xff0c;比…

Python数据结构: 列表(List)详解

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种有序、可变的数据类型&#xff0c;被广泛用于存储和处理多个元素。列表是一种容器&#xff0c;可以包含任意数据类型的元素&#xff0c;包括数字、字符串、列表、字典等。本文将深入讨论列表的各个方面&#xff0…

strcat()用法

描述 头文件&#xff1a;<string.h>char *strcat&#xff08;char *dest&#xff0c; const char *src&#xff09;功能&#xff1a;将src字符串加到dest上&#xff0c;并返回指向dest字符串的指针。 举例 #include<stdio.h> #include<string.h> int mai…

基恩士软件的基本操作(一)

今天就来学习基恩士软件的基础操作&#xff0c;欢迎大家的指正&#xff01;&#xff01;&#xff01; 基本操作 KV STUDIO 基恩士编程软件的名称就KV STUDIO。安装软件地址KV STUDIO的安装与实践 项目的创建 1&#xff0c;双击KV STUDIO. 2&#xff0c;新建项目 单元编辑器…

【MATLAB源码-第74期】基于matlab的OFDM-IM索引调制系统不同频偏误码率对比,对比OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

【docker:容器提交成镜像】

容器创建部分请看&#xff1a;点击此处查看我的另一篇文章 容器提交为镜像 docker commit -a "sinwa lee" -m "首页变化" mynginx lxhnginx:1.0docker run -d -p 88:80 --name lxhnginx lxhnginx:1.0为啥没有变啊&#xff0c;首页&#xff1f; 镜像打包 …

SMART PLC模拟量上下限报警功能块(梯形图代码)

博途PLC模拟量偏差报警功能块请参考下面的文章链接: 模拟量偏差报警功能块(SCL代码)_RXXW_Dor的博客-CSDN博客文章浏览阅读594次。工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下:PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數…

ElasticSearch7.x - HTTP 操作 - 文档操作

创建文档(添加数据) 索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数 据库中的表数据,添加的数据格式为 JSON 格式 向 ES 服务器发 POST 请求 :http://192.168.254.101:9200/shopping/_doc 请求体内容为: {"title":"小…

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测

多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测 目录 多维时序 | MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SOM-BP自组织映射结合BP神经网络的多变量时…

Dell戴尔灵越Inspiron 7700 AIO一体机电脑原厂预装Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1-slgR9t4Df_eko0Y6xaeyw?pwdmk0p 提取码&#xff1a;mk0p 灵越7700一体机原装出厂系统自带声卡驱动、无线网卡驱动、面部识别等所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 由于时间关系,…