如何自己实现一个丝滑的流程图绘制工具(三)自定义挂载vue组件

news2025/1/21 18:49:47

背景

bpmn-js是个流程图绘制的工具,但是现在我希望实现的是,绘制的不是节点而是一个vue组件。
保留线的拖拽和连接。

方案

那就说明不是依赖于节点的样式,找到了他有个属性,就是类似覆盖节点的操作。
思路就是用vue组件做遮罩,盖住原本的节点样式。

/**
     * 批量操作节点
     */
    handleAddOverlay() {
      const bpmnModeling = this.bpmnModeler.get('modeling')
      const contextPad = this.bpmnModeler.get('contextPad')
      this.bpmnModeler.on('import.done', () => {
        // 加载完成后每个元素遍历
        const elementRegistry = this.bpmnModeler.get('elementRegistry')
        elementRegistry.forEach(element => {
          if (['bpmn:Task'].includes(element.type)) {
            const parent = elementRegistry.getGraphics(element)

            bpmnModeling.resizeShape(element, {
              width: element.width || this.config.width || 60,
              height: element.height || this.config.height || 60,
              x: getDi(element).bounds.x,
              y: getDi(element).bounds.y
            })
            // 遍历任务节点,为每个节点添加 overlays
            if (this.isShowComponent) {
              bpmnModeling.setColor(element, { stroke: this.config.borderColor || '#eee' }) // 修改边框颜色
              bpmnModeling.setColor(element, { fill: this.config.fillColor || '#fff' }) // 修改边框颜色
              this.addOverlay(element, parent)
            }
          } 
        })
      })
    },

接下来是挂载覆盖物的重点,如何让覆盖物跟随节点的移动而移动

/**
     *
     * @param {*} element
     * 增加覆盖物节点操作
     */
    addOverlay(element, parent) {
      const __this = this
      const overlays = this.bpmnModeler.get('overlays')
      const bpmnModeling = this.bpmnModeler.get('modeling')
      const elementRegistry = this.bpmnModeler.get('elementRegistry')
      const index = this.data.nodeLists.findIndex(item => item.config.id === element.id)

      // 添加覆盖物 ------------------------------------- begin
      overlays.add(element, 'my-overlay', {
        position: __this.overlayPosition,
        show: {
          minZoom: 0.1
        },
        html: '<div id="my-component"></div>'
      })
      const Profile = Vue.extend(this.config.components)
      overlays.get({ element: element, type: 'my-overlay' })[0].htmlContainer.id = element.id

      new Profile({
        router,
        propsData: {
          element: element,
          node: index > -1 ? this.data.nodeLists[index] : {},
          func: this.func,
          ...this.props
        },
        mounted() {
          const component = this
          // 绑定鼠标按下事件
          component.$el.addEventListener('mousedown', event => {
            __this.isDrag = false
            event.preventDefault()
            if (!__this.disable) {
              dragMouseDown(event)
            }
          })
          // 自定义组件点击事件
          component.$el.addEventListener('click', () => {
            if (!__this.isDrag) {
              __this.showContextPad(element)
              const bpmnElement = elementRegistry.get(element.id)
              __this.currentElement = bpmnElement
              __this.$emit('click', bpmnElement) // 点击事件
            }
          })
        }
      }).$mount('#my-component')
      // 添加覆盖物 -------------------------------------end

      // 必须作为公共变量进行值更改
      let pos1 = 0
      let pos2 = 0
      let pos3 = 0
      let pos4 = 0

      /**
       *
       * @param {*} e
       * @param {*} overlayPosition
       * 鼠标按下开始
       */
      function dragMouseDown(e) {
        e = e || window.event
        e.preventDefault()
        pos3 = e.clientX
        pos4 = e.clientY
        document.onmousemove = event => {
          __this.isDrag = true
          elementDrag(event, __this.overlayPosition)
        }
        document.onmouseup = () => {
          __this.currentElement = null
          document.onmouseup = null
          document.onmousemove = null
        }
      }

      /**
       *
       * @param {*} e
       * @param {*} overlayPosition
       *  节点的拖拽
       */
      function elementDrag(e, overlayPosition) {
        e = e || window.event
        e.preventDefault()
        // 计算新的元素位置
        pos1 = pos3 - e.clientX
        pos2 = pos4 - e.clientY
        pos3 = e.clientX
        pos4 = e.clientY

        const bpmnElement = elementRegistry.get(element.id)
        const deltaX = overlayPosition.x + pos1
        const deltaY = overlayPosition.y + pos2

        // 移动父节点及其连接线
        moveParentNode(bpmnElement, deltaX, deltaY)

     }

      /**
       *
       * @param {*} element
       * @param {*} dx
       * @param {*} dy
       * 更改父节点操作
       */
      function moveParentNode(element, dx, dy) {
        const parent = element.parent
        if (!parent) {
          return
        }
        // // 更新父节点的位置信息
        bpmnModeling.moveElements([element], { x: -dx, y: -dy }, null)
        // 更新覆盖物的位置
        const overlay = overlays.get({ element: parent, type: 'my-overlay' })
        overlay.position = {
          top: overlay.top - dy,
          left: overlay.left - dx
        }
      }
    },

在这里插入图片描述

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

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

相关文章

element ui - el-select获取点击项的整个对象item

1.背景 在使用 el-select 的时候&#xff0c;经常会通过 change 事件来获取当前绑定的 value &#xff0c;即对象中默认的某个 value 值。但在某些特殊情况下&#xff0c;如果想要获取的是点击项的整个对象 item&#xff0c;该怎么做呢&#xff1f; 2.实例 elementUI 中是可…

四信房屋建筑监测解决方案

方案背景 房屋建筑安全是人们生产、经营、居住等经济生活和人身安全的基本保证。由于房屋安全事故倒塌的案例频繁发生&#xff0c;造成了人员安全和极大财产损失。导致原因可能是房屋在建设结构设计、建造、施工等监管方面可能存在缺陷&#xff0c;再加上房屋年久材料环境等因…

Android 查看签名文件的MD5 SHA1值

1.找到存放签名文件所在的文件夹 2.输入命令&#xff1a;keytool -list -v -keystore atui.jks 3.输入口令&#xff08;keystore.jks签名文件的密码&#xff09;

Mybatis-分页与动态字符

目录 一.Mybatis动态分页 什么是动态分页&#xff1a; 导入pom依赖 配置拦截器 编写Bookmapper文件 配置pageBean文件 配置BookBiz接口类 配置BookBizImpl实现接口类 编写实现类demo 测试结果 ​编辑 不走插件&#xff0c;不会分页 二.Mybatis的特殊字符 编写一个Book…

EMERSON PR6423010-140+CON021传感器

测量类型&#xff1a;这个传感器可能用于测量不同类型的物理量&#xff0c;如温度、压力、流量、液位、湿度等&#xff0c;具体取决于应用需求。 高精度&#xff1a;通常&#xff0c;这种传感器具有高精度&#xff0c;以确保准确的测量结果。 通信接口&#xff1a;一些型号的…

SpringBootWeb案例 Part3

目录 1. 新增员工 1.1 需求 1.2 接口文档 1.3 思路分析 PostMapping RequestBody //把前端传递的JSON数据填充到实体类中 1.4 功能开发 1.5 功能测试 1.6 前后端联调 2. 文件上传 2.1 文件上传简介 Spring中提供了一个API&#xff1a;MultipartFile&#xff0c;使…

智能微型断路器;智慧用电在线监控装置;故障电弧探测器在金融行业中的应用-安科瑞黄安南

【摘要】&#xff1a;基于人工智能、物联网、云计算、大数据等新ICT技术的智慧用电安全管理服务平台&#xff0c;通过云计算、人工智能对营业网点、办公大楼、紫湖银行等区域的电气检测数据进行分析、预警和控制&#xff0c;实现电气火灾的在线综合治理。 【关键词】&#xff…

python+tkinter实现多页面多菜单的demo实例

本篇文章主要讲解,python+tkinter多页面多菜单的demo实例,支持一个新窗口弹出、多页面切换,顶部菜单构建及事件绑定。 日期:2023年8月25日 版本:python3.9.6 实际效果 消息菜单-具体效果: 页面菜单具体效果: 事件菜单具体效果: 环境及依赖 python 3.9.6 依赖信息: …

beego框架项目实例

1、创建项目 cd /root/go/src/ bee new myproject 2、运行项目 cd /root/go/src/myproject bee run 通过浏览器访问: http://localhost:8080 , 可以看到如下效果&#xff1a; 3、项目路由设置

C#__使用Thread启动线程和传输数据

class Program{static void Test(){Console.WriteLine("Start……");Thread.Sleep(2000); // 1s等于1000ms&#xff0c;暂停2sConsole.WriteLine("end");}static void Download(Object ob){string str ob as string; // 遍历传递过来的ob字符串Console.Wr…

抖音换脸小程序开发方案

【引言】随着抖音平台的风靡&#xff0c;换脸功能成为用户们最为喜爱的特色之一。为了满足用户的需求&#xff0c;开发一款抖音换脸小程序成为了迫切的任务。本文将深入探讨抖音换脸小程序的开发方案&#xff0c;结合专业性和创新之处&#xff0c;为读者提供一份全面的解决方案…

【安装】Linux安装MongoDB过程记录

一、下载 MongoDB 安装包 Install MongoDB Community Kubernetes Operator | MongoDB 下载 复制下载地址 cd /usr/local/ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.1-rc0.tgz 二、解压 MongoDB 安装包 cd /usr/local tar -zxvf mongodb-li…

windows IIS 站点迁移

为实现负载平衡或者服务器迁移时&#xff0c;我们可能会使用多个 Web 服务器&#xff0c;也就会需要给多个 IIS配置同样的站点和应用程序池。根据需求一个一个重新建吗?当然不用!那得花费多少时间!我们只需要执行一些简单的命令即可在 IIS 上进行这些配置的导出导入~ 当我们在…

C语言学习笔记(完整版)

文章目录 算法算法的基本概念算法的特征算法的优劣 描述算法三种基本结构流程图N-S流程图伪代码 常量和变量了解数据类型常量整形常量实型常量字符型常量转义字符符号常量 变量整形变量实型变量字符型变量 表达式与运算符赋值运算符和赋值表达式变量赋初值强制类型转换 算术运算…

Android | 关于 OOM 的那些事儿

作者&#xff1a;345丶 前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…

P19~20 含有运算放大器的电阻电路——列方程解方程即据已知推未知,再由已推出的未知推剩余未知

后续学习电容电感后可以做出求导、积分、微分运算 1、简介 运放是线性元件 加入负反馈会增加频带和减小非线性失真。 倒向输入端&#xff1a;用负号表示 非倒向输入端&#xff1a;用正号表示 电源端&#xff1a; 输出端 外接调零电位器&#xff1a;外接电容电感处理放大…

【UE5:CesiumForUnreal】——3DTiles数据属性查询和单体高亮

目录 0.1 效果展示 0.2 实现步骤 1 数据准备 2 属性查询 2.1 射线检测 2.2 获取FeatureID 2.3 属性查询 2.4 属性显示 3 单体高亮 3.1 构建材质参数集 3.2 材质参数设置 3.3 添加Cesium Encode Metadata插件 3.4 从纹理中取出特定FeatureId属性信息 3.5 创建…

FL Studio 21.1.0 Build 3713中文破解免费下载安装激活

FL Studio 21是一个功能齐全、开放式的PC音乐创作和制作环境。它具有基于音乐序列器的图形用户界面。 这个数字音频工作站将您所需的一切整合在一个包中&#xff0c;用于创作、编排、录制、编辑、混音和掌握专业质量的音乐。 FL Studio 21是从你的大脑到扬声器的最快方式。制作…

01-jupyter notebook的使用方法

一、Tab补全 在shell中输入表达式&#xff0c;按下Tab&#xff0c;会搜索已输入变量&#xff08;对象、函数等等&#xff09;的命名空间&#xff1a; 除了补全命名、对象和模块属性&#xff0c;Tab还可以补全其它的。当输入看似文件路径时 &#xff08;即使是Python字符串&…

gyp verb check python checking for Python executable “python2“ in the PATH

当我们的前端项目中用到 node-sass 时&#xff0c;有时候汇报这个错&#xff1a; gyp verb check python checking for Python executable “python2” in the PATH 1.先看看我们系统的python 是什么版本 python --version # 3.x.x如果是 3.x 版本的&#xff0c;需要装一个 2…