如何自己实现一个丝滑的流程图绘制工具(六)bpmn删除、复制节点

news/2024/5/19 2:08:08 标签: 流程图, 前端

前言

需要对流程图支持键盘操作删除,复制节点的操作

1、删除节点

获取点击节点事件,把点中的节点存入变量

  eventBus.on('element.click', e => {
        const element = elementRegistry.get(e.element.id)
        this.currentElement = element
   })

监听键盘操作进行节点删除

 <div
   id="canvas"
   ref="canvas"   
   tabindex="0"      
   @keydown="onKeydown"
   @contextmenu.prevent
 ></div>
 onKeydown(e) {
      if (!this.enableCopy) return
      const code = e.keyCode
      if (code === 8 || e.key === 'Delete') {
        e.stopPropagation()
        this.batchDelete()
      }
    },
   batchDelete() {
   const bpmnModeling = this.bpmnModeler.get('modeling')
   if (this.currentElement && !this.activeIdList.length) {
     bpmnModeling.removeElements([this.currentElement])   
    }
 },

3、复制节点

复制节点是在自定义contextPad触发

CustomContextPadProvider.js

export default function ContextPadProvider(
  contextPad,
  config,
  injector,
  translate,
  bpmnFactory,
  elementFactory,
  create,
  modeling,
  connect,
  eventBus
) {
  this.create = create
  this.elementFactory = elementFactory
  this.translate = translate
  this.bpmnFactory = bpmnFactory
  this.modeling = modeling
  this.connect = connect
  this.eventBus = eventBus
  config = config || {}
  if (config.autoPlace !== false) {
    this.autoPlace = injector.get('autoPlace', false)
  }
  contextPad.registerProvider(this)
}

ContextPadProvider.$inject = [
  'contextPad',
  'config',
  'injector',
  'translate',
  'bpmnFactory',
  'elementFactory',
  'create',
  'modeling',
  'connect',
  'eventBus'
]

ContextPadProvider.prototype.getContextPadEntries = function(element) {
  const { autoPlace, eventBus, create, elementFactory, connect, translate, modeling } = this
  // 复制
  function handleCopyElement(event, element) {
    eventBus.fire('copy', { element: element })
  }

  function startConnect(event, element, autoActivate) {
    connect.start(event, element, autoActivate)
  }

  function copyElement() {
    return {
      group: 'edit',
      className: 'z-icon-document-copy',
      title: '复制',
      action: {
        click: handleCopyElement
      }
    }
  }
  function connectElement() {
    return {
      group: 'connect',
      className: 'bpmn-icon-connection',
      title: '连接线',
      action: {
        click: startConnect,
        dragstart: startConnect
      }
    }
  }
  if (!['label', 'bpmn:SequenceFlow'].includes(element.type)) {
    return {
      copy: copyElement(),
      connect: connectElement()
    }
  }
}

然后引入

// 复制功能的引入
import copyPasteModule from 'diagram-js/lib/features/copy-paste'
const additionalModules = [copyPasteModule]

   eventBus.on('copy', e => {
        const copyPaste = this.bpmnModeler.get('copyPaste')
        const element = elementRegistry.get(e.element.id)
        const rootElement = canvas.getRootElement()
        // 在这里处理按钮点击事件
        copyPaste.copy(element)
        // 获取当前视图框的信息
        const viewbox = canvas.viewbox()
        // 左上角的坐标
        const x = viewbox.x + this.config.width
        const y = viewbox.y + this.config.height
        const newElement = copyPaste.paste({
          element: rootElement,
          point: {
            x,
            y
          }
        })[0]      
      })

在这里插入图片描述


http://www.niftyadmin.cn/n/4967867.html

相关文章

“深入探索JVM内部机制:理解Java虚拟机的工作原理“

标题&#xff1a;深入探索JVM内部机制&#xff1a;理解Java虚拟机的工作原理 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;讲解JVM的工作原理&#xff0c;并通过示例代码帮助读者更好地理解JVM的工作过程。 正文&#xff1a;…

【Linux】ctime、mtime、atime

/etc/fstab中的noatime noatimedir 挂载选项linux下文件的ctime、mtime、atime一、/etc/fstab /etc/fstab是用来存放文件系统的静态信息的文件。 系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文件中…

代码随想录训练营二刷第二天 | 977.有序数组平方 209.长度最小的子数组 904. 水果成篮 59.螺旋矩阵II

代码随想录训练营二刷第二天 | 一、977.有序数组平方 题目链接 思路&#xff1a;数组是有序的&#xff0c;平方后最大值只会出现在数组两端&#xff0c;因此可以使用双指针法从两端选取最大值放在新数组的尾部。 class Solution {public int[] sortedSquares(int[] nums) {i…

Elasticsearch中的数据完全备份至另外的Elasticsearch

有两种方式实现&#xff1a; 1、快照和还原 2、导出和导入 一、快照和还原 1、在源Elasticsearch集群上创建快照存储库 PUT _snapshot/my_backup {"type": "fs","settings": {"location": "/path/to/backup/directory"}…

学习中ChatGPT的17种用法

ChatGPT本质上是一个聊天工具&#xff0c;旧金山的人工智能企业OpenAI于2022年11月正式推出ChatGPT。那么&#xff0c;ChatGPT与其他人工智能产品相比有什么特殊呢&#xff1f; 它除了可以回答结构性的问题&#xff0c;例如语法修正、翻译和查找答案之外。最关键的是它能够去解…

Redis的持久化机制是什么?各自的优缺点?

Redis拥有两种持久化机制&#xff1a;RDB(Redis Database)和AOF(Append-Only File)。 1.RDB(Redis Database)持久化机制 RDB是Redis的默认持久化方式&#xff0c;它通过将Redis在某个时间点的数据状态保存到磁盘上的二进制文件中。该文件是一个快照(snapshot)&#xff0c;包含…

Android12之ABuffer数据处理(三十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

什么是网络中的服务质量 (QoS),其相关技术和关键指标有哪些?

QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;指一个网络能够利用各种基础技术&#xff0c;为指定的网络通信提供更好的服务能力&#xff0c;是网络的一种安全机制&#xff0c;是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…