From 682de99bfea2567dc3d505516cd98aef0f2ab927 Mon Sep 17 00:00:00 2001
From: wente <329538422@qq.com>
Date: 星期五, 07 六月 2024 09:55:09 +0800
Subject: [PATCH] tabs

---
 web/src/views/modules/taskReliability/RBD-edit-img.vue | 1002 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 711 insertions(+), 291 deletions(-)

diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue
index 8984205..a236bc2 100644
--- a/web/src/views/modules/taskReliability/RBD-edit-img.vue
+++ b/web/src/views/modules/taskReliability/RBD-edit-img.vue
@@ -37,6 +37,13 @@
                 <i style="font-size: 1rem;" class="wt-iconfont icon-diduiqi"></i>
               </el-button>
             </el-form-item>
+            <el-form-item>
+              <el-button @click="undo()">鎾ら攢</el-button>
+              <el-button @click="redo()">閲嶅仛</el-button>
+            </el-form-item>
+            <el-form-item>
+              <zt-button type="delete" @click="deleteCompment()" />
+            </el-form-item>
           </el-form>
           <div id="containerImg" style="border: 1px solid #EAEBEE;border-radius: 6px;
         box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);height: 100%">
@@ -61,6 +68,7 @@
   import {setHartBeat} from '@/commonJS/common';
   import Cookies from 'js-cookie'
   import {getUUID} from '../../../../packages/utils'
+  import RBDDefault from './RBD-default.json'
 
   export default {
     name: 'RBD-edit-img',
@@ -122,18 +130,18 @@
             imgPath: 'parallel',
             imgName: 'parallel',
             nodeType: 'parallel',
-            imgWidth: 60,
-            imgHeight: 60,
+            imgWidth: 50,
+            imgHeight: 50,
             imgId: '9',
             data: {}
           },
-          {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}},
+          {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 50, imgHeight: 50, imgId: '6', data: {}},
           {
             imgPath: 'switch',
             imgName: 'switch',
             nodeType: 'switch',
-            imgWidth: 60,
-            imgHeight: 60,
+            imgWidth: 50,
+            imgHeight: 50,
             imgId: '5',
             data: {}
           },
@@ -141,24 +149,22 @@
             imgPath: 'bridgeConnection',
             imgName: 'bridgeConnection',
             nodeType: 'bridgeConnection',
-            imgWidth: 60,
-            imgHeight: 60,
+            imgWidth: 50,
+            imgHeight: 50,
             imgId: '10',
             data: {}
           },
-          {
-            imgPath: 'dashedBox',
-            imgName: 'dashedBox',
-            nodeType: 'dashedBox',
-            imgWidth: 60,
-            imgHeight: 60,
-            imgId: '10000',
-            data: {}
-          },
+          // {
+          //   imgPath: 'dashedBox',
+          //   imgName: 'dashedBox',
+          //   nodeType: 'dashedBox',
+          //   imgWidth: 60,
+          //   imgHeight: 60,
+          //   imgId: '10000',
+          //   data: {}
+          // },
         ],
-        imagesList2: [
-          // {imgPath:'logo',imgName:'logo',nodeType:'node',,nodeTypeExt:'',productType:'',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',dataId:'123456'},
-        ],
+        imagesList2: [],
         nodeType: '',
         first: true,
         shape: '',
@@ -175,28 +181,6 @@
           hasPublish: 0,
           urlPref: '',
         },
-        // emptyJson: {
-        //   // 鑺傜偣
-        //   nodes: [
-        //     {
-        //       id: 'node1', // String锛屽彲閫夛紝鑺傜偣鐨勫敮涓�鏍囪瘑
-        //       width: 500,   // Number锛屽彲閫夛紝鑺傜偣澶у皬鐨� width 鍊�
-        //       height: 300,  // Number锛屽彲閫夛紝鑺傜偣澶у皬鐨� height 鍊�
-        //       label: '璇ラ」鐩繕鏈厤缃巶瀹剁綉缁滃浘',
-        //       attrs: {
-        //         body: {
-        //           strokeWidth: 0
-        //         },
-        //       }
-        //       //   text: {
-        //       //     text: '璇ラ」鐩繕鏈紪鍒剁綉缁滃浘',
-        //       //     // fontSize: 56,
-        //       //     fill: 'rgba(0,0,0,0.7)'
-        //       //   },
-        //       // },
-        //     }
-        //   ],
-        // },
         type: '',
         id: '',
         graph: null,
@@ -331,6 +315,416 @@
               group: 'left',
             },
           ],
+        },
+        initJson: {
+          "cells": [
+            {
+              "position": {
+                "x": -600,
+                "y": 0
+              },
+              "size": {
+                "width": 60,
+                "height": 60
+              },
+              "attrs": {
+                "text": {
+                  "refY": "100%",
+                  "textVerticalAnchor": "top",
+                  "text": "start",
+                  "refY2": 4
+                },
+                "image": {
+                  "xlink:href": "/modelImg/start.svg"
+                }
+              },
+              "visible": true,
+              "shape": "image",
+              "id": "10000",
+              "data": {
+                "type": "imageNodes",
+                "endNodeId": "20000",
+                "dataId": "",
+                "nodeType": "start",
+                "nodeTypeExt": "",
+                "voteNum": ""
+              },
+              "ports": {
+                "groups": {
+                  "top": {
+                    "position": {
+                      "name": "top"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "right": {
+                    "position": {
+                      "name": "right"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "bottom": {
+                    "position": {
+                      "name": "bottom"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "left": {
+                    "position": {
+                      "name": "left"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  }
+                },
+                "items": [
+                  {
+                    "id": "top1",
+                    "group": "top"
+                  },
+                  {
+                    "id": "right1",
+                    "group": "right"
+                  },
+                  {
+                    "id": "bottom1",
+                    "group": "bottom"
+                  },
+                  {
+                    "id": "left1",
+                    "group": "left"
+                  }
+                ]
+              },
+              "zIndex": 1
+            },
+            {
+              "position": {
+                "x": 0,
+                "y": 0
+              },
+              "size": {
+                "width": 100,
+                "height": 60
+              },
+              "attrs": {
+                "text": {
+                  "refY": "100%",
+                  "textVerticalAnchor": "top",
+                  "text": "dashedBox",
+                  "refY2": 4
+                },
+                "image": {
+                  "xlink:href": "/modelImg/dashedBox.svg"
+                }
+              },
+              "visible": true,
+              "shape": "image",
+              "id": 15000,
+              "data": {
+                "type": "imageNodes",
+                "dataId": "",
+                "nodeType": "dashedBox",
+                "nodeTypeExt": "",
+                "voteNum": ""
+              },
+              "ports": {
+                "groups": {
+                  "top": {
+                    "position": {
+                      "name": "top"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "right": {
+                    "position": {
+                      "name": "right"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "bottom": {
+                    "position": {
+                      "name": "bottom"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "left": {
+                    "position": {
+                      "name": "left"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  }
+                },
+                "items": [
+                  {
+                    "id": "top1",
+                    "group": "top"
+                  },
+                  {
+                    "id": "right1",
+                    "group": "right"
+                  },
+                  {
+                    "id": "bottom1",
+                    "group": "bottom"
+                  },
+                  {
+                    "id": "left1",
+                    "group": "left"
+                  }
+                ]
+              },
+              "zIndex": 2
+            },
+            {
+              "position": {
+                "x": 600,
+                "y": 0
+              },
+              "size": {
+                "width": 60,
+                "height": 60
+              },
+              "attrs": {
+                "text": {
+                  "refY": "100%",
+                  "textVerticalAnchor": "top",
+                  "text": "end",
+                  "refY2": 4
+                },
+                "image": {
+                  "xlink:href": "/modelImg/end.svg"
+                }
+              },
+              "visible": true,
+              "shape": "image",
+              "id": "20000",
+              "data": {
+                "type": "imageNodes",
+                "startNodeId": "10000",
+                "dataId": "",
+                "nodeType": "end",
+                "nodeTypeExt": "",
+                "voteNum": ""
+              },
+              "ports": {
+                "groups": {
+                  "top": {
+                    "position": {
+                      "name": "top"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "right": {
+                    "position": {
+                      "name": "right"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "bottom": {
+                    "position": {
+                      "name": "bottom"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  },
+                  "left": {
+                    "position": {
+                      "name": "left"
+                    },
+                    "attrs": {
+                      "circle": {
+                        "r": 4,
+                        "magnet": true,
+                        "stroke": "#5F95FF",
+                        "strokeWidth": 1,
+                        "fill": "#fff",
+                        "style": {
+                          "visibility": "hidden"
+                        }
+                      }
+                    }
+                  }
+                },
+                "items": [
+                  {
+                    "id": "top1",
+                    "group": "top"
+                  },
+                  {
+                    "id": "right1",
+                    "group": "right"
+                  },
+                  {
+                    "id": "bottom1",
+                    "group": "bottom"
+                  },
+                  {
+                    "id": "left1",
+                    "group": "left"
+                  }
+                ]
+              },
+              "zIndex": 3
+            },
+            {
+              "shape": "edge",
+              "id": "66c81c68-0827-4a3c-8343-e2c453d3e9e7",
+              "router": {
+                "name": "manhattan"
+              },
+              "connector": {
+                "name": "rounded"
+              },
+              "source": {
+                "cell": "10000",
+                "port": "right1"
+              },
+              "target": {
+                "cell": 15000,
+                "port": "left1"
+              },
+              "zIndex": 4
+            },
+            {
+              "shape": "edge",
+              "id": "a0f3cf90-6d37-4ee0-a254-90b4ec2b6a7f",
+              "router": {
+                "name": "manhattan"
+              },
+              "connector": {
+                "name": "rounded"
+              },
+              "source": {
+                "cell": 15000,
+                "port": "right1"
+              },
+              "target": {
+                "cell": "20000",
+                "port": "left1"
+              },
+              "zIndex": 5
+            }
+          ]
         }
       }
     },
@@ -367,11 +761,7 @@
         if (res.data !== null && (res.data.content != null)) {
           this.dataForm = res.data
           this.diagramJson = JSON.parse(this.dataForm.content)
-          if (this.diagramJson.cells.length !== 0) {
-            this.graph.fromJSON(this.diagramJson)
-          } else {
-            this.initCells()
-          }
+          this.graph.fromJSON(this.diagramJson)
           this.isFirstLoad = false;
           console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length')
 
@@ -379,13 +769,16 @@
           // this.graph.centerContent()
           // this.graph.zoomToFit()
         } else {
-          await this.clearDiagram()
+          this.graph.fromJSON(RBDDefault)
+          this.isFirstLoad = false
         }
       },
       async clearDiagram() {
         this.dataForm.id = null
         // this.graph.fromJSON(this.emptyJson)
-        this.graph.fromJSON('')
+        this.graph.fromJSON(RBDDefault)
+        this.graph.positionContent('left')
+        this.isFirstLoad = false;
         // this.graph.centerContent()
         // this.graph.zoomToFit()
         // this.graph.freeze()
@@ -520,7 +913,7 @@
           getDropNode: (node) => {
             const {width, height} = node.size()
             if (node.getData().type && node.getData().nodeType === 'dashedBox') {
-              return node.clone().size(100, 80)
+              return node.clone().size(100, 60)
             }
             if (node.getData().type && node.getData().type === 'imageNodes2') {
               return node.clone({keepId: true})
@@ -546,7 +939,7 @@
             {
               title: '杩愮畻绗﹀彿',
               name: 'group1',
-              graphHeight: 260,
+              graphHeight: 200,
             },
             {
               title: '璁惧鑺傜偣',
@@ -605,10 +998,12 @@
         let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params})
         this.imagesList2 = res.data
         console.log(this.imagesList2, 'getProduct(productId)234567890')
+        let urlObject = window.URL || window.webkitURL || window;
+
         const imageNodes2 = this.imagesList2.map((item) =>
           this.graph.createNode({
             shape: 'image',
-            imageUrl: `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getProductImg?token=${Cookies.get('token')}&id=${item.imgPath}`,
+            //imageUrl: `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getProductImg?token=${Cookies.get('token')}&id=${item.imgPath}`,
             width: 60,
             height: 60,
             id: item.dataId, // 鎵嬪姩璁剧疆鑺傜偣鐨� ID
@@ -631,6 +1026,10 @@
               voteNum: '',
             },
             attrs: {
+              image: {
+                'xlink:href': `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getSvgImage?token=${Cookies.get('token')}&id=${item.imgPath}`,
+                //'xlink:href': urlObject.createObjectURL(new Blob([item.svgContent])),
+              },
               text: {
                 text: item.imgName,
                 fontSize: 14,
@@ -694,21 +1093,6 @@
           }
           return false
         })
-//undo redo
-        this.graph.bindKey(['meta+z', 'ctrl+z'], () => {
-          if (this.graph.history.canUndo()) {
-            this.graph.history.undo()
-          }
-          return false
-        })
-
-        this.graph.bindKey(['meta+shift+z', 'ctrl+shift+z'], () => {
-          if (this.graph.history.canRedo()) {
-            this.graph.history.redo()
-          }
-          return false
-        })
-
 // select all
         this.graph.bindKey(['meta+a', 'ctrl+a'], () => {
           const nodes = this.graph.getNodes()
@@ -718,85 +1102,7 @@
         })
 //delete
         this.graph.bindKey('delete', () => {
-          const cells = this.graph.getSelectedCells()
-          console.log(cells, 'cells')
-          if (cells.length === 1) {
-            let node = cells[0]
-            if (!node.isNode()) {
-              this.$message({message: '璇烽�変腑鑺傜偣', type: 'warning'})
-              return false; // 鍙栨秷鎿嶄綔
-            }
-            let nodeType = node.getData().nodeType
-            let deleteType = 0
-            if (nodeType === 'node' || nodeType === 'dashedBox') {
-              deleteType = 1
-            } else if ('parallel,switch,vote,bridge'.indexOf(nodeType) > -1) {
-              deleteType = 2
-            }
-            let canDelete = false
-            if (nodeType === 'start' || nodeType === 'end') {
-              this.$message({message: '鏃犳硶鍒犻櫎璧峰鍜岀粨鏉熻妭鐐�', type: 'warning'})
-              return false; // 鍙栨秷鎿嶄綔
-            }
-            if (deleteType > 0) {
-              let startNode = null
-              if (deleteType === 1) {
-                startNode = node
-              } else if (deleteType === 2) {
-                startNode = this.graph.getCellById(node.getData().startNodeId)
-              }
-              let isSeriesNode = this.isSeriesNode(startNode, node)
-              if (isSeriesNode) {
-                let inLine = this.getInLinesOfNode(startNode)
-                let outLine = this.getOutLinesOfNode(node)
-                let inLineIsToLine = this.hasOtherLineToMyLine(inLine[0].id)
-                let inNode = isSeriesNode.inNode
-                let outNode = isSeriesNode.outNode
-                console.log(inLine, outLine, 'inLine,outLine')
-                console.log(inNode, outNode, 'inNode,outNode')
-                if (inLineIsToLine) {
-                  inLine[0].target = {cell: outNode.id, port: 'left1'}
-                } else {
-                  outLine[0].source = {cell: inNode.id, port: 'right1'}
-                }
-                //鎻愮ず鏄惁瑕佸垹闄�
-                this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
-                  confirmButtonText: '纭畾',
-                  cancelButtonText: '鍙栨秷',
-                  type: 'warning'
-                }).then(() => {
-                  if (deleteType === 1){
-                    node.remove()
-                  }
-                  else{
-                    this.deleteCombination(node)
-                  }
-                  this.$message({
-                  type: 'success',
-                  message: '鍒犻櫎鎴愬姛!'
-                })
-                }).catch(() => {
-                  this.$message({
-                    type: 'info',
-                    message: '宸插彇娑堝垹闄�'
-                  })
-                })
-              }
-              if (this.isMultipleBrach(node)) {
-                //鎻愮ず鏄惁瑕佸垹闄�
-                if (deleteType === 1)
-                  node.remove()
-                else
-                  this.deleteCombination(node)
-                return
-              }
-            }
-            //鎻愮ず涓嶈兘鍒犻櫎
-          } else {
-            //鎻愮ず涓嶈兘鍒犻櫎
-            this.$message({message: '鍙兘閫変腑涓�涓妭鐐�', type: 'warning'})
-            return false; // 鍙栨秷鎿嶄綔
-          }
+          this.deleteCompment()
         })
 // zoom
         this.graph.bindKey(['ctrl+1', 'meta+1'], () => {
@@ -858,12 +1164,7 @@
             this.getBridgeConnection()
           }*/
         });
-        // 鐩戝惉鑺傜偣浣嶇疆鏀瑰彉浜嬩欢
-        // this.graph.on('node:change:position', ({node}) => {
-        //   this.hasMoveNode = true
-        //   this.hasMoveSingleNode = node
-        // });
-        this.graph.on('cell:click', ({cell}) => {
+        this.graph.on('cell:contextmenu', ({cell}) => {
           // this.type.value = cell.isNode() ? "node" : "edge"
           this.type = cell.isNode() ? 'node' : 'edge'
           this.shape = cell.shape
@@ -991,6 +1292,130 @@
             },
           })
         })
+      },
+      deleteCompment() {
+        const cells = this.graph.getSelectedCells()
+        console.log(cells, 'cells')
+        if (cells.length === 1) {
+          let node = cells[0]
+          if (!node.isNode()) {
+            this.$confirm('鏄惁鍒犻櫎璇ヨ繛鎺ョ嚎?', '鎻愮ず', {
+              confirmButtonText: '纭畾',
+              cancelButtonText: '鍙栨秷',
+              type: 'warning'
+            }).then(() => {
+              node.remove()
+              this.$message({
+                type: 'success',
+                message: '鍒犻櫎鎴愬姛!'
+              })
+            }).catch(() => {
+              this.$message({
+                type: 'info',
+                message: '宸插彇娑堝垹闄�'
+              })
+            })
+            // this.$message({message: '璇烽�変腑鑺傜偣', type: 'warning'})
+            return false; // 鍙栨秷鎿嶄綔
+          }
+          let nodeType = node.getData().nodeType
+          let deleteType = 0
+          if (nodeType === 'node' || nodeType === 'dashedBox') {
+            deleteType = 1
+          } else if ('parallel,switch,vote,bridge'.indexOf(nodeType) > -1) {
+            deleteType = 2
+          }
+
+          let canDelete = false
+          if (nodeType === 'start' || nodeType === 'end') {
+            this.$message({message: '涓嶅厑璁稿垹闄よ捣濮嬪拰缁撴潫鑺傜偣', type: 'warning'})
+            return false; // 鍙栨秷鎿嶄綔
+          }
+          if (deleteType > 0) {
+            let startNode = null
+            if (deleteType === 1) {
+              startNode = node
+            } else if (deleteType === 2) {
+              startNode = this.graph.getCellById(node.getData().startNodeId)
+            }
+
+            let isSeriesNode = this.isSeriesNode(startNode, node)
+            let isMultipleBrach = this.isMultipleBrach(node)
+            if (isSeriesNode) {
+              //涓茶仈
+              let inLine = this.getInLinesOfNode(startNode)
+              let outLine = this.getOutLinesOfNode(node)
+              let inLineIsToLine = this.hasOtherLineToMyLine(inLine[0].id)
+              let inNode = isSeriesNode.inNode
+              let outNode = isSeriesNode.outNode
+              console.log(inLine, outLine, 'inLine,outLine')
+              console.log(inNode, outNode, 'inNode,outNode')
+              //鎻愮ず鏄惁瑕佸垹闄�
+              this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning'
+              }).then(() => {
+                if (inLineIsToLine) {
+                  inLine[0].target = {cell: outNode.id, port: 'left1'}
+                } else {
+                  outLine[0].source = {cell: inNode.id, port: 'right1'}
+                }
+                if (deleteType === 1) {
+                  node.remove()
+                } else {
+                  this.deleteCombination(node)
+                }
+                this.$message({
+                  type: 'success',
+                  message: '鍒犻櫎鎴愬姛!'
+                })
+              }).catch(() => {
+                this.$message({
+                  type: 'info',
+                  message: '宸插彇娑堝垹闄�'
+                })
+                return false
+              })
+            }else if (this.isMultipleBrach(node)) {
+              //鎻愮ず鏄惁瑕佸垹闄�
+              this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning'
+              }).then(() => {
+                /*                  if (inLineIsToLine) {
+                                    inLine[0].target = {cell: outNode.id, port: 'left1'}
+                                  } else {
+                                    outLine[0].source = {cell: inNode.id, port: 'right1'}
+                                  }*/
+                if (deleteType === 1)
+                  node.remove()
+                else
+                  this.deleteCombination(node)
+                this.$message({
+                  type: 'success',
+                  message: '鍒犻櫎鎴愬姛!'
+                })
+
+              }).catch(() => {
+                this.$message({
+                  type: 'info',
+                  message: '宸插彇娑堝垹闄�'
+                })
+                return false
+              })
+            }else {
+              //鎻愮ず涓嶈兘鍒犻櫎
+              this.$message({message: '璇ユ潯绾胯矾涓婂彧鏈夎鑺傜偣锛屾棤娉曞垹闄�', type: 'warning'})
+              return false; // 鍙栨秷鎿嶄綔
+            }
+          }
+        } else {
+          //鎻愮ず涓嶈兘鍒犻櫎
+          this.$message({message: '鍙兘閫変腑涓�涓妭鐐�', type: 'warning'})
+          return false; // 鍙栨秷鎿嶄綔
+        }
       },
       async search() {
         await this.getDiagram();
@@ -1156,14 +1581,16 @@
         let graphNodeType = graphNode.getData().nodeType
 
         let dragNodeType = dragNode.getData().nodeType
-        let offHeight = 60
+        let offHeight = 50
         if (dragNodeType === 'node') {
           offHeight = 60
         } else if (dragNodeType === 'bridgeConnection') {
-          offHeight = 230
+          offHeight = 175
         } else {
           offHeight = 70
         }
+        let centerX = 0, centerY = 0;
+
         if (graphNodeType === 'dashedBox') { //铏氭
           const edges = this.graph.getConnectedEdges(graphNode); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾�
           let inEdges = edges.filter(edge => edge.target.cell === graphNode.id)
@@ -1179,10 +1606,24 @@
             endNode = this.graph.getCellById(endNodeId)
           }
           if (startNode && endNode) {
-            let centerY = graphNode.position().y
-            let result = this.addNodeAndConnect(startNode, endNode, dragNode, dragNode.position().x, centerY)
-            inEdges[0].target = {cell: result.newStartNode.id, port: 'left1'}
-            outEdges[0].source = {cell: result.newEndNode.id, port: 'right1'}
+            centerX = graphNode.position().x + graphNode.getBBox().width / 2
+            centerY = graphNode.position().y + graphNode.getBBox().height / 2
+            let result = this.addNodeAndConnect(graphNode, dragNode, centerX, centerY)
+            if (!result) {
+              dragNode.remove()
+              this.$message({message: '娌℃湁瓒冲鐨勭┖闂存斁缃鑺傜偣锛岃鎵╁ぇ鍓╀綑绌洪棿', type: 'warning'})
+              return
+            }
+
+            let startPort = 'right1'
+            let endPort = 'left1'
+            if ((inEdges[0].target.port == 'top1' || outEdges[0].source.port == 'bottom1') && ('parallel,switch,vote,bridge'.indexOf(dragNodeType)) == -1) {
+              startPort = 'bottom1'
+              endPort = 'top1'
+            }
+
+            inEdges[0].target = {cell: result.newStartNode.id, port: endPort}
+            outEdges[0].source = {cell: result.newEndNode.id, port: startPort}
             graphNode.remove()
           }
         } else { //骞惰缁撴瀯
@@ -1193,20 +1634,26 @@
           let maxY = graphNode.position().y + graphNode.getBBox().height
 
           const edges = this.graph.getConnectedEdges(graphNode); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾�
+          // 鑾峰彇杩炴帴绾跨殑璺緞鏁版嵁
           let inEdges = edges.filter(edge => edge.target.cell === graphNode.id)
           //閬嶅巻杩欎釜缁勫悎閲岄潰鎵�鏈夎妭鐐癸紝 淇敼minY锛宮axY
-
           let pointXY = {minY: minY, maxY: maxY}
           console.log(pointXY, 'old')
           this.getYRange(inEdges, graphNodeStartNode, pointXY)
           console.log(pointXY, 'new')
 
-          let minX = graphNodeStartNode.position().x + graphNodeStartNode.getBBox().width
+          let minX = graphNodeStartNode.position().x + graphNode.getBBox().width + 15
           let maxX = graphNode.position().x
           let centerX = minX + (maxX - minX) / 2
-          let centerY = graphNodeY - pointXY.minY > pointXY.maxY - graphNodeY ? pointXY.maxY + 30 : pointXY.minY - offHeight - 30
+          let centerY = graphNodeY + graphNode.getBBox().height / 2 - pointXY.minY > pointXY.maxY - (graphNodeY + graphNode.getBBox().height / 2) ?
+            pointXY.maxY + offHeight / 2 + 30 : pointXY.minY - offHeight / 2 - 30
 
-          let result = this.addNodeAndConnect(graphNodeStartNode, graphNode, dragNode, minX, centerY)
+          let result = this.addNodeAndConnect(null, dragNode, minX, centerY)
+          if (!result) {
+            dragNode.remove()
+            this.$message({message: '娌℃湁瓒冲鐨勭┖闂存斁缃鑺傜偣锛岃鎵╁ぇ鍓╀綑绌洪棿', type: 'warning'})
+            return
+          }
           this.graph.addEdge({
             source: {cell: graphNodeStartNode, port: 'right1'},
             target: {cell: result.newStartNode, port: 'left1'},
@@ -1221,25 +1668,69 @@
           })
         }
       },
-      addNodeAndConnect(startNode, endNode, dragNode, leftX, centerY) { // graphCell鏄敾甯冧笂鍘熸湁鐨勮妭鐐广�俤ragNode鏄綋鍓嶆嫋鎷界殑鑺傜偣
+      addNodeAndConnect(targetNode, dragNode, centerX, centerY) { // graphCell鏄敾甯冧笂鍘熸湁鐨勮妭鐐广�俤ragNode鏄綋鍓嶆嫋鎷界殑鑺傜偣
+        let width = 100,
+          height = 80,
+          leftTopX = centerX,
+          leftTopY = centerY
         let dragNodeType = dragNode.getData().nodeType
+        if (dragNodeType === 'node') {
+          width = 60
+          height = 60
+        } else if (dragNodeType === 'dashedBox') {
+          width = 100
+          height = 60
+        } else if (dragNodeType === 'bridgeConnection') {
+          width = 550
+          height = 175
+        } else {
+          width = 270
+          height = 60
+        }
+        leftTopX = centerX - width / 2
+        leftTopY = centerY - height / 2
+        if (!this.canPlace(targetNode, dragNode, {leftTopX, leftTopY, width, height})) {
+          return false
+        }
+
         if (dragNodeType === 'node' || dragNodeType === 'dashedBox') {
-          dragNode.position(leftX + 50, centerY);
+          dragNode.position(leftTopX, leftTopY)
           return {newStartNode: dragNode, newEndNode: dragNode}
         } else if (dragNodeType === 'bridgeConnection') {
-          return this.createBridgeConnection(leftX, centerY, startNode, endNode, dragNode)
+          return this.createBridgeConnection(leftTopX, leftTopY, dragNode)
         } else {
-          return this.createParallelBrach(leftX, centerY, startNode, endNode, dragNode)
+          return this.createParallelBrach(leftTopX, centerY, dragNode)
         }
       },
       // 鐩镐氦鐨勮竟
       addNodeAndInsertEdge(graphEdge, dragNode) {
+        const source = graphEdge.getSourceCell()
+        const target = graphEdge.getTargetCell()
+
+        let centerX = 0
+        let centerY = 0
+        if (!source.isNode() || !target.isNode()) {
+          if (source.isNode()) {
+            centerX = source.position().x + source.getBBox().width / 2
+            centerY = dragNode.position().y + dragNode.getBBox().height / 2
+          } else {
+            centerX = target.position().x + target.getBBox().width / 2
+            centerY = dragNode.position().y + dragNode.getBBox().height / 2
+          }
+        } else {
+          centerX = dragNode.position().x + dragNode.getBBox().width / 2
+          centerY = source.position().y + source.getBBox().height / 2
+          if (target.getData().nodeType === 'node') {
+            centerY = target.position().y + target.getBBox().height / 2
+          }
+        }
+
         let startNodeId = graphEdge.source.cell
         let startNode = this.graph.getCellById(startNodeId)
         let endNodeId = graphEdge.target.cell
         let endNode = this.graph.getCellById(endNodeId)
+
         if (startNode && endNode) {
-          let centerY = dragNode.position().y
           let isRight = true;
           let startPort = 'right1'
           let endPort = 'left1'
@@ -1247,15 +1738,22 @@
             startPort = 'bottom1'
             endPort = 'top1'
           }
+
           if (this.hasOtherLineToMyLine(graphEdge.id)) {
             let leftX = startNode.position().x + startNode.getBBox().width
             let rightX = endNode.position().x
-            let centerX = dragNode.position().x + dragNode.getBBox().width / 2
+            // let centerX = dragNode.position().x + dragNode.getBBox().width / 2
             if (centerX - leftX < rightX - centerX) {
               isRight = false
             }
           }
-          let result = this.addNodeAndConnect(startNode, endNode, dragNode, dragNode.position().x, centerY)
+
+          let result = this.addNodeAndConnect(null, dragNode, centerX, centerY)
+          if (!result) {
+            dragNode.remove()
+            this.$message({message: '娌℃湁瓒冲鐨勭┖闂存斁缃鑺傜偣锛岃鎵╁ぇ鍓╀綑绌洪棿', type: 'warning'})
+            return
+          }
           if (isRight) {
             graphEdge.target = {cell: result.newStartNode.id, port: endPort}
             this.graph.addEdge({
@@ -1264,7 +1762,6 @@
               router: {name: 'manhattan'},
               connector: {name: 'rounded'}
             })
-
           } else {
             this.graph.addEdge({
               source: {cell: startNode, port: startPort},
@@ -1276,111 +1773,6 @@
           }
           // graphEdge.remove()
         }
-      },
-      initCells() {
-        const startNode = this.graph.addNode({
-          shape: 'image',
-          // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
-          width: 60,
-          height: 60,
-          id: '10000',
-          data: {
-            type: 'imageNodes',
-            endNodeId: '20000',
-            dataId: '',
-            nodeType: 'start',
-            nodeTypeExt: '',
-            voteNum: ''
-          },
-          attrs: {
-            image: {
-              'xlink:href': '/modelImg/start.svg',
-            },
-            text: {
-              text: 'start',
-              fontSize: 14,
-              refX: 0.5,
-              refY: '100%',
-              refY2: 4,
-              textAnchor: 'middle',
-              textVerticalAnchor: 'top',
-            },
-          },
-          ports: {...this.ports},
-        })
-        const dashedBox = this.graph.addNode({
-          shape: 'image',
-          // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
-          width: 100,
-          height: 80,
-          id: 15000,
-          data: {
-            type: 'imageNodes',
-            dataId: '',
-            nodeType: 'dashedBox',
-            nodeTypeExt: '',
-            voteNum: ''
-          },
-          attrs: {
-            image: {
-              'xlink:href': '/modelImg/dashedBox.svg',
-            },
-            text: {
-              text: 'dashedBox',
-              fontSize: 14,
-              refX: 0.5,
-              refY: '100%',
-              refY2: 4,
-              textAnchor: 'middle',
-              textVerticalAnchor: 'top',
-            },
-          },
-          ports: {...this.ports},
-        })
-        const endNode = this.graph.addNode({
-          shape: 'image',
-          width: 60,
-          height: 60,
-          id: '20000',
-          data: {
-            type: 'imageNodes',
-            startNodeId: '10000',
-            dataId: '',
-            nodeType: 'end',
-            nodeTypeExt: '',
-            voteNum: ''
-          },
-          attrs: {
-            image: {
-              'xlink:href': '/modelImg/end.svg',
-            },
-            text: {
-              text: 'end',
-              fontSize: 14,
-              refX: 0.5,
-              refY: '100%',
-              refY2: 4,
-              textAnchor: 'middle',
-              textVerticalAnchor: 'top',
-            },
-          },
-          ports: {...this.ports},
-        })
-        startNode.position(-600, 0);
-        dashedBox.position(0, (startNode.size().height - dashedBox.size().height) / 2);
-        endNode.position(600, 0);
-        this.graph.addEdge({
-          source: {cell: startNode, port: 'right1'},
-          target: {cell: dashedBox, port: 'left1'},
-          router: {name: 'manhattan'},
-          connector: {name: 'rounded'}
-        })
-        this.graph.addEdge({
-          source: {cell: dashedBox, port: 'right1'},
-          target: {cell: endNode, port: 'left1'},
-          router: {name: 'manhattan'},
-          connector: {name: 'rounded'}
-        })
       },
       findIntersectsEdge(graph, node) {
         const edges = graph.getEdges()
@@ -1406,7 +1798,7 @@
           return false
         }
       },
-      createParallelBrach(x, y, startNode, endNode, dragNode) {
+      createParallelBrach(x, y, dragNode) {
         dragNode.position(x + 320, y - dragNode.size().height / 2)
         const connectNode = this.createConnectNode(x + 50, y)
         const dashedBox = this.createDashedBox(x + 150, y)
@@ -1438,16 +1830,17 @@
                   connector: {name: 'rounded'}
                 })*/
       },
-      createBridgeConnection(x, y, startNode, endNode, dragNode) {
-        const leftTopDashedBox = this.createDashedBox(x + 120, y)
-        const rightTopDashedBox = this.createDashedBox(x + 400, y)
+      createBridgeConnection(x, y, dragNode) {
+        console.log(x, y, 'leftX centerY')
+        const leftTopDashedBox = this.createDashedBox(x + 40, y)
+        const rightTopDashedBox = this.createDashedBox(x + 380, y)
 
-        const leftConnectNode = this.createConnectNode(x + 50, y + 80)
-        const alignCenterDashedBox = this.createDashedBox(x + 260, y + 80)
-        const rightConnectNode = this.createBridgeNode(x + 550, y + 80)
+        const leftConnectNode = this.createConnectNode(x, y + 87)
+        const alignCenterDashedBox = this.createDashedBox(x + 210, y + 87)
+        const rightConnectNode = this.createBridgeNode(x + 530, y + 87)
 
-        const leftBottomDashedBox = this.createDashedBox(x + 120, y + 160)
-        const rightBottomDashedBox = this.createDashedBox(x + 400, y + 160)
+        const leftBottomDashedBox = this.createDashedBox(x + 50, y + 160)
+        const rightBottomDashedBox = this.createDashedBox(x + 370, y + 160)
 
         rightConnectNode.setData({startNodeId: leftConnectNode.id})
         leftConnectNode.setData({endNodeId: rightConnectNode.id})
@@ -1557,9 +1950,8 @@
         const dragNodeId = getUUID().toString()
         let connectNode = this.graph.addNode({
           shape: 'image',
-          // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
-          width: 30,
-          height: 30,
+          width: 10,
+          height: 10,
           id: connectId,
           data: {
             isSelfCreated: true,
@@ -1592,10 +1984,10 @@
       createBridgeNode(x, y) {
         const connectId = getUUID().toString()
         const dragNodeId = getUUID().toString()
-        let connectNode = this.graph.addNode({
+        let bridgeNode = this.graph.addNode({
           shape: 'image',
-          width: 50,
-          height: 50,
+          width: 30,
+          height: 30,
           id: connectId,
           data: {
             isSelfCreated: true,
@@ -1622,8 +2014,8 @@
           },
           ports: {...this.ports},
         })
-        connectNode.position(x, y - connectNode.size().height / 2)
-        return connectNode
+        bridgeNode.position(x, y - bridgeNode.size().height / 2)
+        return bridgeNode
       },
       getYRange(inEdges, startNode, pointXY) {
         for (let inEdge of inEdges) {
@@ -1769,6 +2161,34 @@
         console.log(edges, '鑾峰彇鐢诲竷涓婄殑缁撴潫鑺傜偣鎵�鏈夌殑绾� edges')
         return edges.filter(edge => edge.source.cell === node.id)
       },
+      canPlace(targetNode, dragNode, box2) {
+        const nodes = this.graph.getNodes()
+        let intersectNodes = []
+        // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜�
+        for (const otherNode of nodes) {
+          if (otherNode === dragNode || otherNode === targetNode) continue;
+          const bbox1 = otherNode.getBBox();
+          if (bbox1.x < box2.leftTopX + box2.width &&
+            bbox1.x + bbox1.width > box2.leftTopX &&
+            bbox1.y < box2.leftTopY + box2.height &&
+            bbox1.y + bbox1.height > box2.leftTopY) {
+            intersectNodes.push(otherNode);
+          }
+        }
+        console.log(box2, 'box2')
+        console.log(intersectNodes, 'intersectNodes')
+        return intersectNodes.length <= 0;
+      },
+      undo() {
+        if (this.graph.history.canUndo()) {
+          this.graph.history.undo()
+        }
+      },
+      redo() {
+        if (this.graph.history.canRedo()) {
+          this.graph.history.redo()
+        }
+      }
     },
   }
 </script>

--
Gitblit v1.9.1