国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何自己實現(xiàn)一個絲滑的流程圖繪制工具(七)bpmn-js 批量刪除、復制節(jié)點

這篇具有很好參考價值的文章主要介紹了如何自己實現(xiàn)一個絲滑的流程圖繪制工具(七)bpmn-js 批量刪除、復制節(jié)點。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

希望實現(xiàn)批量刪除和復制節(jié)點,因為bpmn-js是canvas畫的,所以不能像平時頁面上的復制一樣直接選擇范圍,會變成移動畫布。

思路是:

繪制一個選擇的效果框,這樣才可以看出來選的節(jié)點有哪些。
如何自己實現(xiàn)一個絲滑的流程圖繪制工具(七)bpmn-js 批量刪除、復制節(jié)點,bpmn-js,vue.js,流程圖,前端,javascript
上面的選中范圍框效果也是用canvas畫出來的
因為bpmn-js對鼠標直接選取范圍進行了攔截。所以我加了一個輔助按鍵進行選擇

一、 以下是繪制選擇框范圍的代碼:
     * @param {MouseEvent} e
     */
    onMousedown(e) {
      this.removeActiveClass()
      this.batchSelectedList = []   
      if (!e.metaKey && !e.altKey && !e.ctrlKey) {
        return
      }
      e.target.addEventListener('mouseup', this.onMouseup)

      if (!this.rectSelect) {
        const rect = this.$refs.canvas.getBoundingClientRect()
        this.startX = e.clientX - rect.left
        this.startY = e.clientY - rect.top

        const g = this.$el.getElementsByTagName('svg')[1]
        this.rectSelect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')
        this.rectSelect.setAttribute('fill', 'rgba(93,148,231,0.2)')
        this.rectSelect.setAttribute('stroke-width', '2px')
        this.rectSelect.setAttribute('stroke', 'rgba(93,148,231,0.2)')
        g.append(this.rectSelect)
      }
    },
    /**
     * @param {MouseEvent} e
     */
    onMousemove(e) {
      if (!this.enableBatchSelect) return
      this.currentMouseEvent = e

      if (!this.rectSelect) {
        return
      }
      e.stopPropagation()
      const canvasRect = this.$refs.canvas.getBoundingClientRect()
      const w = e.clientX - this.startX - canvasRect.left
      const h = e.clientY - this.startY - canvasRect.top
      const x = this.startX
      const y = this.startY
      this.rectSelect.setAttribute('x', w < 0 ? e.clientX - canvasRect.left : this.startX)
      this.rectSelect.setAttribute('y', h < 0 ? e.clientY - canvasRect.top : this.startY)
      this.rectSelect.setAttribute('width', `${Math.abs(w)}`)
      this.rectSelect.setAttribute('height', `${Math.abs(h)}`)

      const elementRegistry = this.bpmnModeler.get('elementRegistry')
      const canvas = this.bpmnModeler.get('canvas')
      const box = canvas.viewbox()

      const elementList = elementRegistry.getAll()
      const nodeList = elementList.filter(f => f.type === 'bpmn:Task')

      this.connectLineList = elementList.filter(f => f.type === 'bpmn:SequenceFlow')
      const boxX = box.x
      const boxY = box.y
      this.batchSelectedList = nodeList.filter(item => {
        const x1 = -(boxX - item.x) * box.scale
        const y1 = -(boxY - item.y) * box.scale

        const pointers = [
          { x: x, y: y },
          { x: x + w, y: y },
          { x: x + w, y: y + h },
          { x: x, y: y + h }
        ]
        return inRect(x1, y1, pointers)
      })
    },
    onMouseup(e) {
      if (this.rectSelect) {
        this.rectSelect.remove()
      }
      this.rectSelect = null
      e.target.removeEventListener('mouseup', this.onMouseup)
      const elementRegistry = this.bpmnModeler.get('elementRegistry')
      this.batchSelectedList.forEach(item => {
        const id = item.id
        const el = elementRegistry._elements[id]?.gfx
        if (el) {
          el.classList.add('batch-selected')
          this.activeIdList.push(id)
        }
      })
    },
    removeActiveClass() {
      const elementRegistry = this.bpmnModeler.get('elementRegistry')
      this.activeIdList.forEach(id => {
        const el = elementRegistry._elements[id]?.gfx
        if (el) {
          el.classList.remove('batch-selected')
        }
      })
      this.activeIdList = []
    }
<style>
.djs-element.batch-selected .djs-outline {
  stroke: rgb(54, 147, 255) !important;
  visibility: visible !important;
}
</style>
二、然后是把選中的數(shù)據(jù)放入剪貼板
 async onCopy(isShowMessage = true) {
      if (this.copyData.length === 0) return
      try {
        await navigator.clipboard.writeText(JSON.stringify(copyData))
        isShowMessage && this.$message.success(`已復制${copyData.length}個節(jié)點`)
      } catch (e) {
        this.$message.error('寫入剪切板失敗')
        console.error(e)
      }
    },
三、粘貼的操作
    /**
     * 粘貼
     * @param {KeyboardEvent} e
     */
    async onPaste(e) {
      const text = await navigator.clipboard.readText()
      try {
        const copyData = JSON.parse(text)
        const canvas = this.bpmnModeler.get('canvas')
        const box = canvas.viewbox()
        const elementFactory = this.bpmnModeler.get('elementFactory')
        const elementRegistry = this.bpmnModeler.get('elementRegistry')
        const parent = elementRegistry.find(el => el.type === 'bpmn:Process')
        const modeling = this.bpmnModeler.get('modeling')

        if (!copyData.nodes.length) return

        const rect = this.$el.getBoundingClientRect()
        const mouseX = this.currentMouseEvent.clientX - rect.x
        const mouseY = this.currentMouseEvent.clientY - rect.y

        // 計算第0個元素和當前鼠標所在位置的差值
        const first = copyData.nodes[0]
        const diffX = first.x - mouseX
        const diffY = first.y - mouseY

        copyData.nodes.forEach(item => {
          const x = item.x + box.x - diffX
          const y = item.y + box.y - diffY

          const shape = elementFactory.createShape({
            type: 'bpmn:Task',
            x: x,
            y: y
          })
          modeling.createShape(shape, { x: x, y: y }, parent)
          shape.data = item.data
          if (item.data.name) {
            this.createLabel(shape, item.data.name)
          }
          this.pateShapeMap[item.id] = shape
        })

        copyData.lines.forEach(line => {
          const startShape = this.pateShapeMap[line.sourceId]
          const targetShape = this.pateShapeMap[line.targetId]
          if (startShape && targetShape) {
            const lines = modeling.connect(startShape, targetShape)
            lines.data = line.data
            if (lines.data.name) {
              this.createLabel(lines, lines.data.name)
            }
            this.pateLineMap[lines.id] = lines
          }
        })
       } catch (e) {
        console.error(e)
      }
    },

如何自己實現(xiàn)一個絲滑的流程圖繪制工具(七)bpmn-js 批量刪除、復制節(jié)點,bpmn-js,vue.js,流程圖,前端,javascript

以上就是批量復制的步驟

批量刪除
如何自己實現(xiàn)一個絲滑的流程圖繪制工具(七)bpmn-js 批量刪除、復制節(jié)點,bpmn-js,vue.js,流程圖,前端,javascript文章來源地址http://www.zghlxwxcb.cn/news/detail-683264.html

  batchDelete() {
      const bpmnModeling = this.bpmnModeler.get('modeling')
      this.activeIdList.forEach(nodeId => {
        const element = this.bpmnModeler.get('elementRegistry').get(nodeId)
        bpmnModeling.removeElements([element])
      })  
   },

到了這里,關(guān)于如何自己實現(xiàn)一個絲滑的流程圖繪制工具(七)bpmn-js 批量刪除、復制節(jié)點的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 流程圖如何制作?5步快速畫出好看的流程圖!

    流程圖如何制作?5步快速畫出好看的流程圖!

    流程圖是一種圖形化工具,描述某個過程或者操作的步驟,以及某種業(yè)務(wù)系統(tǒng)的具體流程。流程圖通常由各種圖形符號、形狀、箭頭組成,可以清晰的表示出流程或系統(tǒng)中各種步驟、每個環(huán)節(jié)之間的關(guān)系、條件判斷、數(shù)據(jù)的流動和處理過程等。 ? ? ? ? ? 對于負責策劃的職場

    2024年02月14日
    瀏覽(19)
  • 發(fā)現(xiàn)一個高顏值流程圖 - 億圖圖示

    發(fā)現(xiàn)一個高顏值流程圖 - 億圖圖示

    今天給各位小伙伴們測試了一款高顏值的流程圖制作工具——億圖圖示。 對了,它不僅可以制作流程圖,還可以制作思維導圖、組織結(jié)構(gòu)圖、泳道圖等等哦。接下來讓我們一起測試學習下吧 億圖圖示(Wondershare EdrawMax)是一款功能強大且易于使用的圖形表達工作臺,不僅可以

    2024年02月09日
    瀏覽(22)
  • 流程圖實現(xiàn),基于vue2實現(xiàn)的流程圖

    流程圖實現(xiàn),基于vue2實現(xiàn)的流程圖

    flex布局 + 偽元素實現(xiàn)豎直的連接線+組件遞歸 2.1基礎(chǔ)的(未截全,大致長這樣) ?2.2帶有收縮功能的,可以展開和收縮并顯示數(shù)量 ? ? 4.項目源碼地址 GitHub - yft-code/flow: 流程圖 純css實現(xiàn)流程圖

    2024年02月16日
    瀏覽(27)
  • 如何在 XMind 中繪制流程圖

    如何在 XMind 中繪制流程圖

    XMind 是專業(yè)強大的思維導圖軟件,由于其結(jié)構(gòu)沒有任何限制,很多朋友特別喜歡用它來繪制流程圖。禁不住大家的多次詢問,今天 XMind 醬就將這簡單的流程圖繪圖方法分享給大家。 在 XMind 中,繪制流程圖的主角是「自由主題」和「聯(lián)系」。它們可以打破思維導圖的限制,讓

    2024年02月10日
    瀏覽(27)
  • 論文的技術(shù)路線流程圖如何繪制?

    論文的技術(shù)路線流程圖如何繪制?

    ??本文介紹基于 Visio 軟件繪制 技術(shù)路線圖 、 流程圖 、 工作步驟圖 等的方法。 ??首先打開 Visio 。我們可以直接選擇“ 基本框圖 ”進行繪制。 ??也可以選用一些模板。 ??本次我們就以“流程圖”為例來繪制。 ??因為要繪制論文的技術(shù)路線圖,因此各種形狀簡

    2024年02月05日
    瀏覽(21)
  • python如何自動生成流程圖

    Python中有多個庫可以用來生成流程圖,其中最常用的是graphviz庫。graphviz是一個開源的流程圖繪制工具,可以使用Python的graphviz庫來自動生成流程圖。下面是使用graphviz庫生成流程圖的步驟: 安裝graphviz庫:在終端或命令提示符中使用pip命令安裝graphviz庫,如下所示: 以下是一

    2024年02月12日
    瀏覽(97)
  • 如何使用drawio畫流程圖以及導入導出

    如何使用drawio畫流程圖以及導入導出

    你可以在線使用drawio, 或者drawon創(chuàng)建很多不同類型的圖表。 如何使用編輯器,讓我們以一個最基本的流程圖開始。 流程圖,就是讓你可視化的描述一個過程或者系統(tǒng)。 圖形和很少部分的文字表達就可以讓讀者很快的理解他們需要什么。 為了便于大家更直觀的理解,我們在

    2024年02月07日
    瀏覽(20)
  • 如何利用ProcessOn 做資產(chǎn)管理流程圖

    如何利用ProcessOn 做資產(chǎn)管理流程圖

    資產(chǎn)管理 是一家公司最重要的管理活動。好的資產(chǎn)管理可以讓資源最優(yōu)化利用,實現(xiàn)資產(chǎn)價值的最大化。可以幫助組織管理和降低風險。同時當需要決策的時候,對資產(chǎn)數(shù)據(jù)進行分析和評估,也可以幫助做出更明智的決策,如優(yōu)化資產(chǎn)配置、更新技術(shù)設(shè)備等。 一、資產(chǎn)流程

    2024年02月09日
    瀏覽(40)
  • 前端Web實戰(zhàn):從零打造一個類Visio的流程圖拓撲圖繪圖工具

    前端Web實戰(zhàn):從零打造一個類Visio的流程圖拓撲圖繪圖工具

    大家好,本系列從Web前端實戰(zhàn)的角度,給大家分享介紹如何從零打造一個自己專屬的繪圖工具,實現(xiàn)流程圖、拓撲圖、腦圖等類Visio的繪圖工具。 免費好用、 專屬自己的繪圖工具 前端項目實戰(zhàn)學習 如何從0搭建一個前端項目等基礎(chǔ)框架 項目設(shè)計思路及優(yōu)雅的架構(gòu)技巧 開源項

    2024年02月16日
    瀏覽(33)
  • 如何制作流程圖?教你從零到一制作

    如何制作流程圖?教你從零到一制作

    如何 制作流程圖 ? 在當今快節(jié)奏、信息化的社會,流程圖已經(jīng)成為了一種非常重要的溝通工具。它能夠幫助我們清晰地表達復雜的過程、系統(tǒng)和思路。那么,如何從零開始制作流程圖呢?本文將為你提供一份詳細的指南。 一、明確目的和內(nèi)容 在開始制作流程圖之前,首先

    2024年01月24日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包