From a87b49ca0801a52f58a72085f75143ab668ba6ca Mon Sep 17 00:00:00 2001
From: wente <329538422@qq.com>
Date: 星期五, 26 四月 2024 10:07:52 +0800
Subject: [PATCH] 流程图组合

---
 web/src/views/modules/taskReliability/RBD-edit-img.vue | 1917 +++++++++++++++++++++++++++++++---------------------------
 1 files changed, 1,022 insertions(+), 895 deletions(-)

diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue
index dcaa6b1..1beb7ca 100644
--- a/web/src/views/modules/taskReliability/RBD-edit-img.vue
+++ b/web/src/views/modules/taskReliability/RBD-edit-img.vue
@@ -3,7 +3,7 @@
     <el-row :gutter="[8,8]">
       <el-col :span="4">
         <div :style="'height:' +left_p+'px'">
-          <div  style="height: 100%">
+          <div style="height: 100%">
             <div id="stencilImg"></div>
           </div>
         </div>
@@ -12,13 +12,13 @@
         <div class="fa-card-a">
           <el-form :inline="true">
             <el-form-item>
-              妯″瀷鍚嶇О锛歿{modelName}}
+              妯″瀷鍚嶇О锛歿{ modelName }}
             </el-form-item>
             <el-form-item>
               <el-button type="primary" @click="saveDiagram()">鏆傚瓨</el-button>
               <el-button type="primary" @click="analyzeDiagram()">淇濆瓨</el-button>
               <el-button type="primary" @click="clearDiagram()">娓呯┖鍥惧舰</el-button>
-              <el-button  @click="leftAlign()">
+              <el-button @click="leftAlign()">
                 <i style="font-size: 1rem;" class="wt-iconfont icon-zuoduiqi"></i>
               </el-button>
               <el-button @click="centerAlign()">
@@ -37,51 +37,9 @@
                 <i style="font-size: 1rem;" class="wt-iconfont icon-diduiqi"></i>
               </el-button>
             </el-form-item>
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="宸﹀榻�" placement="left">-->
-<!--                <el-button class="" style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF;" @click="leftAlign()">-->
-<!--                  <i style="font-size: 2rem;" class="wt-iconfont icon-zuoduiqi"></i>-->
-<!--                </el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="灞呬腑瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="centerAlign()"><i style="font-size: 2rem;"-->
-<!--                                                     class="wt-iconfont icon-chuizhiduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="鍙冲榻�" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="rightAlign()"><i style="font-size: 2rem;"-->
-<!--                                                    class="wt-iconfont icon-youduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="椤堕儴瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="topAlign()"><i style="font-size: 2rem;"-->
-<!--                                                  class="wt-iconfont icon-dingduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="姘村钩瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="shuipingAlign()"><i style="font-size: 2rem;"-->
-<!--                                                       class="wt-iconfont icon-shuipingduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </el-form-item>-->
-<!--            <el-form-item>-->
-<!--              <el-tooltip class="item" effect="dark" content="搴曢儴瀵归綈" placement="left">-->
-<!--                <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF"-->
-<!--                           @click="bottomAlign()"><i style="font-size: 2rem;"-->
-<!--                                                     class="wt-iconfont icon-diduiqi"></i></el-button>-->
-<!--              </el-tooltip>-->
-<!--            </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%);">
+        box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);height: 100%">
           </div>
           <config-node v-show="type === 'node'" :id="id" :diagramId="diagramId" :globalGridAttr="globalGridAttr"
                        :graph="graph"
@@ -96,479 +54,502 @@
 </template>
 
 <script>
-  import {Graph, Shape, Addon, Cell} from '@antv/x6'
-  import ConfigNode from './ConfigNode/index.vue'
-  import ConfigEdge from './ConfigEdge/index.vue'
-  import {removeCurrentTabHandle} from '@/commonJS/common'
-  import {setHartBeat} from '@/commonJS/common';
-  import Cookies from 'js-cookie'
+import {Graph, Shape, Addon, Cell} from '@antv/x6'
+import ConfigNode from './ConfigNode/index.vue'
+import ConfigEdge from './ConfigEdge/index.vue'
+import {removeCurrentTabHandle} from '@/commonJS/common'
+import {setHartBeat} from '@/commonJS/common';
+import Cookies from 'js-cookie'
 
-  export default {
-    name: 'RBD-edit-img',
-    /*props: {
+export default {
+  name: 'RBD-edit-img',
+  /*props: {
 
-    },*/
-    props: {
-      projectId: {
-        type: String
-      },
-      diagarmId: {
-        type: String
-      },
-      pageCode: {
-        default: 'wlt_pz'
-      },
-      flowCode: {
-        type: String,
-        default: 'wltFlow'
-      },
+  },*/
+  props: {
+    projectId: {
+      type: String
     },
-    components: {
-      ConfigNode,
-      ConfigEdge
+    diagarmId: {
+      type: String
     },
-    data() {
-      return {
-        modelId: '',
-        modelName: '',
-        modelType: '',
-        timer: null,
-        imgsList: [
-          {imgPath: 'start', imgName: 'start', nodeType: 'start', imgWidth: 60, imgHeight: 60, imgId: '1', data: {}},
-          {imgPath: 'end', imgName: 'end', nodeType: 'end', imgWidth: 60, imgHeight: 60, imgId: '2', data: {}},
-          {
-            imgPath: 'connect',
-            imgName: 'connect',
-            nodeType: 'connect',
-            imgWidth: 20,
-            imgHeight: 20,
-            imgId: '3',
-            data: {}
-          },
-          // {imgPath:'parallelLeft',imgName:'parallelLeft',nodeType:'parallelLeft',imgWidth:60,imgHeight:60,imgId:'3',data:{}},
-          // {imgPath:'parallelRight',imgName:'parallel',nodeType:'parallel',imgWidth:60,imgHeight:60,imgId:'4',data:{}},
-          {
-            imgPath: 'switchRight',
-            imgName: 'switch',
-            nodeType: 'switch',
-            imgWidth: 60,
-            imgHeight: 60,
-            imgId: '5',
-            data: {}
-          },
-          {imgPath: 'voteRight', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}},
-        ],
-        imgsList2: [
-          // {imgPath:'logo',imgName:'logo',nodeType:'node',,nodeTypeExt:'',productType:'',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',dataId:'123456'},
-        ],
-        nodeType: '',
-        first: true,
-        shape: '',
-        projectList: [],
-        diagramList: [],
-        diagramId: '',
-        projectId: '',
-        diagramJson: '',
-        diagramIdDisabled: false,
-        dataForm: {
-          id: null,
-          content: null,
-          publishContent: null,
-          hasPublish: 0,
-          urlPref: '',
+    pageCode: {
+      default: 'wlt_pz'
+    },
+    flowCode: {
+      type: String,
+      default: 'wltFlow'
+    },
+  },
+  components: {
+    ConfigNode,
+    ConfigEdge
+  },
+  data() {
+    return {
+      nodeAdded: false,
+      connectNode: {},
+      modelId: '',
+      modelName: '',
+      modelType: '',
+      timer: null,
+      imgsList: [
+        {imgPath: 'start', imgName: 'start', nodeType: 'start', imgWidth: 60, imgHeight: 60, imgId: '1', data: {}},
+        {imgPath: 'end', imgName: 'end', nodeType: 'end', imgWidth: 60, imgHeight: 60, imgId: '2', data: {}},
+        {
+          imgPath: 'connect',
+          imgName: 'connect',
+          nodeType: 'connect',
+          imgWidth: 30,
+          imgHeight: 30,
+          imgId: '3',
+          data: {}
         },
-        // 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,
-        globalGridAttr: {
-          productType:'',
-          voteNum: '',
-          repairMttcr: '',
-          repairMttcrOther: '',
-          repairDistribType: '',
-          reliabDistribType: '',
-          taskMtbcfOther: '',
-          isRepair: 0,
-          taskMtbcf: '',
-          numberInputValue: '',
-          statusImg: '',
-          nodeTypeExt: '',
-          type: 'mesh',
-          size: 10,
-          color: '#e5e5e5',
-          thickness: 1,
-          colorSecond: '#d0d0d0',
-          thicknessSecond: 1,
-          factor: 4,
-          bgColor: '#e5e5e5',
-          showImage: true,
-          repeat: 'watermark',
-          position: 'center',
-          bgSize: JSON.stringify({width: 150, height: 150}),
-          opacity: 0.1,
-
-          stroke: '#5F95FF',
-          strokeWidth: 1,
-          connector: 'normal',
-          label: '',
-          nodeStroke: '#5F95FF',
-          nodeStrokeWidth: 1,
-          nodeFill: '#ffffff',
-          nodeFontSize: 12,
-          nodeColor: '#080808',
-          nodeText: '',
-          nodeDate: '',
-          nodeUsers: '',
-          nodeDataDate: '',
-          nodeDataText: '',
-          dataId: '',
-          inspectName: '',
-          distance: 0.5,
-          angle: 0,
+        {
+          imgPath: 'switch',
+          imgName: 'switch',
+          nodeType: 'switch',
+          imgWidth: 60,
+          imgHeight: 60,
+          imgId: '5',
+          data: {}
         },
-        isReady: false,
-        curCel: Cell,
-        left_p: document.documentElement.clientHeight - 100,
-        ports: {
-          groups: {
-            top: {
-              position: 'top',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
-                },
-              },
-            },
-            right: {
-              position: 'right',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
-                },
-              },
-            },
-            bottom: {
-              position: 'bottom',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
-                },
-              },
-            },
-            left: {
-              position: 'left',
-              attrs: {
-                circle: {
-                  r: 4,
-                  magnet: true,
-                  stroke: '#5F95FF',
-                  strokeWidth: 1,
-                  fill: '#fff',
-                  style: {
-                    visibility: 'hidden',
-                  },
+        {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}},
+      ],
+      imgsList2: [
+        // {imgPath:'logo',imgName:'logo',nodeType:'node',,nodeTypeExt:'',productType:'',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',dataId:'123456'},
+      ],
+      combiningImages: [
+        {
+          imgPath: 'switch',
+          imgName: 'switch',
+          nodeType: 'switch',
+          imgWidth: 60,
+          imgHeight: 60,
+          imgId: '5',
+          data: {}
+        },
+        {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}}
+      ],
+      nodeType: '',
+      first: true,
+      shape: '',
+      projectList: [],
+      diagramList: [],
+      diagramId: '',
+      projectId: '',
+      diagramJson: '',
+      diagramIdDisabled: false,
+      dataForm: {
+        id: null,
+        content: null,
+        publishContent: null,
+        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,
+      globalGridAttr: {
+        productType: '',
+        voteNum: '',
+        repairMttcr: '',
+        repairMttcrOther: '',
+        repairDistribType: '',
+        reliabDistribType: '',
+        taskMtbcfOther: '',
+        isRepair: 0,
+        taskMtbcf: '',
+        numberInputValue: '',
+        statusImg: '',
+        nodeTypeExt: '',
+        type: 'mesh',
+        size: 10,
+        color: '#e5e5e5',
+        thickness: 1,
+        colorSecond: '#d0d0d0',
+        thicknessSecond: 1,
+        factor: 4,
+        bgColor: '#e5e5e5',
+        showImage: true,
+        repeat: 'watermark',
+        position: 'center',
+        bgSize: JSON.stringify({width: 150, height: 150}),
+        opacity: 0.1,
+
+        stroke: '#5F95FF',
+        strokeWidth: 1,
+        connector: 'rounded',
+        router: 'manhattan',
+        label: '',
+        nodeStroke: '#5F95FF',
+        nodeStrokeWidth: 1,
+        nodeFill: '#ffffff',
+        nodeFontSize: 12,
+        nodeColor: '#080808',
+        nodeText: '',
+        nodeDate: '',
+        nodeUsers: '',
+        nodeDataDate: '',
+        nodeDataText: '',
+        dataId: '',
+        inspectName: '',
+        distance: 0.5,
+        angle: 0,
+      },
+      isReady: false,
+      curCel: Cell,
+      left_p: document.documentElement.clientHeight - 100,
+      ports: {
+        groups: {
+          top: {
+            position: {name: 'top'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
                 },
               },
             },
           },
-          items: [
-            {
-              group: 'top',
+          right: {
+            position: {name: 'right'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
+                },
+              },
             },
-            {
-              group: 'right',
+          },
+          bottom: {
+            position: {name: 'bottom'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
+                },
+              },
             },
-            {
-              group: 'bottom',
+          },
+          left: {
+            position: {name: 'left'},
+            attrs: {
+              circle: {
+                r: 4,
+                magnet: true,
+                stroke: '#5F95FF',
+                strokeWidth: 1,
+                fill: '#fff',
+                style: {
+                  visibility: 'hidden',
+                },
+              },
             },
-            {
-              group: 'left',
-            },
-          ],
-        }
+          },
+        },
+        items: [
+          {
+            id: 'top1',
+            group: 'top',
+          },
+          {
+            id: 'right1',
+            group: 'right',
+          },
+          {
+            id: 'bottom1',
+            group: 'bottom',
+          },
+          {
+            id: 'left1',
+            group: 'left',
+          },
+        ],
       }
+    }
+  },
+  watch: {
+    '$route.params.configId'() {
+      // alert('$route.params.projectId change')
+      this.projectId = this.$route.params.projectId
+      //this.diagramId = this.$route.params.diagramId
+      console.log(this.$route.params.projectId, 'this.$route.params.projectId')
+      console.log(this.$route.params.diagramId, 'this.$route.params.diagramId')
+    }
+  },
+  mounted() {
+    //this.initDigram()
+    this.type = 'grid'
+  },
+  methods: {
+    init(row) {
+      this.modelName = row.modelName
+      this.dataForm.id = row.id
+      // this.productId = row.productId
+      // this.getProduct(row.productId)
+      this.initDigram(row.productId)
+      console.log(this.dataForm, 'init(row){')
     },
-    watch: {
-      '$route.params.configId'() {
-        // alert('$route.params.projectId change')
-        this.projectId = this.$route.params.projectId
-        //this.diagramId = this.$route.params.diagramId
-        console.log(this.$route.params.projectId, 'this.$route.params.projectId')
-        console.log(this.$route.params.diagramId, 'this.$route.params.diagramId')
+    async getDiagram(modelId) {
+      let params = {
+        modelId: modelId,
+        urlPref: window.SITE_CONFIG['apiURL'],
+        token: Cookies.get('token'),
       }
-    },
-    mounted() {
-      //this.initDigram()
-      this.type = 'grid'
-    },
-    methods: {
-      init(row) {
-        this.modelName = row.modelName
-        this.dataForm.id = row.id
-        // this.productId = row.productId
-        // this.getProduct(row.productId)
-        this.initDigram(row.productId)
-        console.log(this.dataForm, 'init(row){')
-      },
-      async getDiagram(modelId) {
-        let params = {
-          modelId: modelId,
-          urlPref: window.SITE_CONFIG['apiURL'],
-          token: Cookies.get('token'),
+      let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params})
+      console.log(res, 'async getDiagram( res')
+      if (res.data !== null && (res.data.content != null)) {
+        this.dataForm = res.data
+        console.log(this.dataForm, 'this.dataForm in getDiagram')
+        if (this.dataForm.content != '') {
+          this.diagramJson = JSON.parse(this.dataForm.content)
         }
-        let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params})
-        console.log(res, 'async getDiagram( res')
-        if (res.data !== null && (res.data.content != null)) {
-          this.dataForm = res.data
-          console.log(this.dataForm, 'this.dataForm in getDiagram')
-          if(this.dataForm.content!=''){
-            this.diagramJson = JSON.parse(this.dataForm.content)
-          }
-          // console.log(this.dataForm.content,'this.Diagram content')
-          console.log(this.diagramJson, 'this.Diagram json')
-          this.graph.fromJSON(this.diagramJson)
-          this.graph.positionContent('left')
-          // this.graph.centerContent()
-          // this.graph.zoomToFit()
-        } else {
-          await this.clearDiagram()
-        }
-      },
-      async clearDiagram() {
-        this.dataForm.id = null
-        // this.graph.fromJSON(this.emptyJson)
-        this.graph.fromJSON('')
+        // console.log(this.dataForm.content,'this.Diagram content')
+        console.log(this.diagramJson, 'this.Diagram json')
+        this.graph.fromJSON(this.diagramJson)
+        this.graph.positionContent('left')
         // this.graph.centerContent()
         // this.graph.zoomToFit()
-        // this.graph.freeze()
-      },
-      async initDigram(productId) {
-        this.timer = setHartBeat(10, 240);
-        console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
-        console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
-        this.graph = new Graph({
-          container: document.getElementById('containerImg'),
-          width: document.documentElement.clientWidth,
-          height: document.documentElement.clientHeight - 200,
-          // async: true,
-          grid: {
-            visible: true,
+      } else {
+        await this.clearDiagram()
+      }
+    },
+    async clearDiagram() {
+      this.dataForm.id = null
+      // this.graph.fromJSON(this.emptyJson)
+      this.graph.fromJSON('')
+      // this.graph.centerContent()
+      // this.graph.zoomToFit()
+      // this.graph.freeze()
+    },
+    async initDigram(productId) {
+      this.timer = setHartBeat(10, 240);
+      console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
+      console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
+      this.graph = new Graph({
+        container: document.getElementById('containerImg'),
+        width: document.documentElement.clientWidth,
+        height: document.documentElement.clientHeight - 200,
+        // async: true,
+        grid: {
+          visible: true,
+        },
+        autoResize: true,
+        history: {
+          enabled: true,
+          beforeAddCommand(event, args) {
+            if (args.key === 'tools') {
+              console.log(args.key, 'event, args')
+              return false
+            }
           },
+        },
+        // panning: {
+        //   enabled: true,
+        // },
+        scroller: {
+          enabled: true,
+          pageVisible: true,
           autoResize: true,
-            history: {
-                enabled: true,
-                beforeAddCommand(event, args) {
-                    if (args.key==='tools') {
-                        console.log(args.key,'event, args')
-                        return false
-                    }
-                },
-            },
-          // panning: {
-          //   enabled: true,
-          // },
-          scroller: {
-            enabled: true,
-            pageVisible: true,
-            pageBreak: true,
-            pannable: true,
-            minVisibleWidth: 200,
-            minVisibleHeight: 200,
-            modifiers: 'shift',
+          pageBreak: true,
+          pannable: true,
+          minVisibleWidth: 200,
+          minVisibleHeight: 200,
+          modifiers: 'shift',
+        },
+        mousewheel: {
+          enabled: true,
+          zoomAtMousePosition: true,
+          modifiers: 'ctrl',
+          minScale: 0.5,
+          maxScale: 3,
+        },
+        connecting: {
+          router: {
+            name: 'manhattan',
+            // args: {
+            //   padding: 1,
+            // },
           },
-          // panning: {
-          //   enabled: true,
-          //   modifiers: 'shift',
-          // },
-          mousewheel: {
-            enabled: true,
-            zoomAtMousePosition: true,
-            modifiers: 'ctrl',
-            minScale: 0.1,
-            maxScale: 10,
-          },
-          connecting: {
-            router: {
-              name: 'normal',
-              // args: {
-              //   padding: 1,
-              // },
+          connector: {
+            name: 'rounded',
+            args: {
+              radius: 5,
             },
-            connector: {
-              name: 'rounded',
-              args: {
-                radius: 8,
+          },
+          anchor: 'center',
+          connectionPoint: 'anchor',
+          allowBlank: false,
+          snap: {
+            radius: 20,
+          },
+          createEdge() {
+            return new Shape.Edge({
+              attrs: {
+                line: {
+                  stroke: '#A2B1C3',
+                  strokeWidth: 2,
+                  targetMarker: 'classic'
+                }
               },
-            },
-            // anchor: 'center',
-            connectionPoint: 'anchor',
-            allowBlank: false,
-            snap: {
-              radius: 20,
-            },
-            createEdge() {
-              return new Shape.Edge({
+              labels: [{
                 attrs: {
-                  line: {
-                    stroke: '#A2B1C3',
-                    strokeWidth: 2,
-                    targetMarker: 'classic'
+                  body: {
+                    stroke: '#5F95FF',
+                  },
+                  text: {
+                    text: ''
                   }
                 },
-                labels: [{
-                  attrs: {
-                    body: {
-                      stroke: '#5F95FF',
-                    },
-                    text: {
-                      text: ''
-                    }
-                  },
-                  position: {
-                    distance: 0.5,
-                    angle: 180,
-                    options: {
-                      keepGradient: true,
-                      ensureLegibility: true
-                    }
+                position: {
+                  distance: 0.5,
+                  angle: 180,
+                  options: {
+                    keepGradient: true,
+                    ensureLegibility: true
                   }
-                }],
-                tools: {
-                  name: 'segments',
-                  args: {
-                    attrs: { fill: '#666' },
-                  },
+                }
+              }],
+              tools: {
+                name: 'segments',
+                args: {
+                  attrs: {fill: '#666'},
                 },
-                zIndex: 0,
-              })
-            },
-            validateConnection({targetMagnet}) {
-              return !!targetMagnet
-            },
+              },
+              zIndex: 0,
+            })
           },
-          highlighting: {
-            magnetAdsorbed: {
-              name: 'stroke',
-              args: {
-                attrs: {
-                  fill: '#5F95FF',
-                  stroke: '#5F95FF',
-                },
+          validateConnection({targetMagnet}) {
+            return !!targetMagnet
+          },
+        },
+        highlighting: {
+          magnetAdsorbed: {
+            name: 'stroke',
+            args: {
+              attrs: {
+                fill: '#5F95FF',
+                stroke: '#5F95FF',
               },
             },
           },
-          resizing: {
-            enabled: true,
-            restricted: true
-          },
-          rotating: true,
-          selecting: {
-            enabled: true,
-            rubberband: true,
-            rubberEdge: true,
-            // showNodeSelectionBox: true,
-          },
-          snapline: true,
-          keyboard: true,
-          clipboard: true,
-        })
-        this.graph.centerContent()
-        const stencil = new Addon.Stencil({
-          getDragNode: (node) => node.clone({ keepId: true }),
-          getDropNode(node) {
-            let {width, height} = node.size()
-            if (node.getData().imgWidth) {
-              width = node.getData().imgWidth
+        },
+        resizing: true,
+        rotating: true,
+        selecting: {
+          enabled: true,
+          rubberband: true,
+          rubberEdge: true,
+          // showNodeSelectionBox: true,
+        },
+        snapline: true,
+        keyboard: true,
+        clipboard: true,
+      })
+      this.graph.centerContent()
+      const stencil = new Addon.Stencil({
+        getDragNode: (node) => node.clone({keepId: true}),
+        getDropNode: (node) => {
+          if (node.getData().type && node.getData().type === 'imageNodes2') {
+            return node.clone({keepId: true})
+          } else {
+            return node.clone()
+          }
+        },
+        validateNode: (node) => {
+          const existingNodes = this.graph.getNodes(); // 鑾峰彇鐢诲竷涓婃墍鏈夎妭鐐�
+          for (const existingNode of existingNodes) {
+            if (existingNode.id === node.id) {
+              this.$message({message: '璇ヨ澶囪妭鐐瑰凡鍦ㄧ敾甯冧笂锛屾棤娉曞啀娆$粯鍒�', type: 'warning'})
+              return false; // 鍙栨秷娣诲姞鑺傜偣鎿嶄綔
             }
-            if (node.getData().imgHeight) {
-              height = node.getData().imgHeight
-            }
-            return node.clone({ keepId: true }).size(width, height)
+          }
+        },
+        title: '',
+        target: this.graph,
+        stencilGraphWidth: 200,
+        stencilGraphHeight: 280,
+        collapsable: true,
+        groups: [
+          {
+            title: '杩愮畻绗﹀彿',
+            name: 'group1',
           },
-            validateNode(node){
-              console.log(node.id)
+          {
+            title: '缁勫悎鍥�',
+            name: 'combiningImages',
+            graphHeight: 100,
+          },
+          {
+            title: '璁惧鑺傜偣',
+            name: 'group2',
+            graphHeight: '',
+            layoutOptions: {
+              rowHeight: 90,
             },
-          title: '',
-          target: this.graph,
-            stencilGraphWidth: 200,
-            stencilGraphHeight: 280,
-            collapsable: true,
-          groups: [
-            {
-              title: '杩愮畻绗﹀彿',
-              name: 'group1',
-            },
-            {
-              title: '璁惧鑺傜偣',
-              name: 'group2',
-                graphHeight: '',
-                layoutOptions: {
-                    rowHeight: 90,
-                },
-            }
-          ],
-          layoutOptions: {
-            columns: 2,
-            columnWidth: 105,
-          },
-        })
-        document.getElementById('stencilImg').appendChild(stencil.container)
-        const imageNodes = this.imgsList.map((item) =>
+          }
+        ],
+        layoutOptions: {
+          columns: 2,
+          columnWidth: 105,
+        },
+      })
+      document.getElementById('stencilImg').appendChild(stencil.container)
+      const imageNodes = this.imgsList.map((item) =>
           this.graph.createNode({
             shape: 'image',
-            imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
+            // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
             width: item.imgWidth,
             height: item.imgHeight,
             data: {
+              type: 'imageNodes',
               dataId: '',
               nodeType: item.nodeType,
               nodeTypeExt: '',
-              voteNum:''
+              voteNum: ''
             },
             attrs: {
+              image: {
+                'xlink:href': '/modelImg/' + item.imgPath + '.svg',
+              },
               text: {
                 text: item.imgName,
                 fontSize: 14,
@@ -584,14 +565,47 @@
             },
             ports: {...this.ports},
           }),
-        )
-        let params = {
-          productId: productId
-        }
-        let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params})
-        this.imgsList2 = res.data
-        console.log(this.imgsList2, 'getProduct(productId)234567890')
-        const imageNodes2 = this.imgsList2.map((item) =>
+      )
+      const combiningImages = this.combiningImages.map((item) =>
+          this.graph.createNode({
+            shape: 'image',
+            // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
+            width: item.imgWidth,
+            height: item.imgHeight,
+            data: {
+              type: 'imageNodes',
+              dataId: '',
+              nodeType: item.nodeType,
+              nodeTypeExt: '',
+              voteNum: ''
+            },
+            attrs: {
+              image: {
+                'xlink:href': '/modelImg/' + item.imgPath + '.svg',
+              },
+              text: {
+                text: item.imgName,
+                fontSize: 14,
+                style: {
+                  color: this.globalGridAttr.nodeColor
+                },
+                refX: 0.5,
+                refY: '100%',
+                refY2: 4,
+                textAnchor: 'middle',
+                textVerticalAnchor: 'top',
+              },
+            },
+            ports: {...this.ports},
+          }),
+      )
+      let params = {
+        productId: productId
+      }
+      let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params})
+      this.imgsList2 = res.data
+      console.log(this.imgsList2, 'getProduct(productId)234567890')
+      const imageNodes2 = this.imgsList2.map((item) =>
           this.graph.createNode({
             shape: 'image',
             imageUrl: `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getProductImg?token=${Cookies.get('token')}&id=${item.imgPath}`,
@@ -599,6 +613,7 @@
             height: 60,
             id: item.dataId, // 鎵嬪姩璁剧疆鑺傜偣鐨� ID
             data: {
+              type: 'imageNodes2',
               isRepair: item.isRepair,
               dataId: item.dataId,
               nodeType: item.nodeType,
@@ -613,7 +628,7 @@
               taskMtbcfOther: item.taskMtbcfOther,
               imgHeight: item.imgHeight,
               imgWidth: item.imgWidth,
-              voteNum:'',
+              voteNum: '',
             },
             attrs: {
               text: {
@@ -652,450 +667,562 @@
             ],
             ports: {...this.ports},
           }),
-        )
-        stencil.load(imageNodes, 'group1')
-        stencil.load(imageNodes2, 'group2')
+      )
+      stencil.load(imageNodes, 'group1')
+      stencil.load(imageNodes2, 'group2')
+      stencil.load(combiningImages, 'combiningImages')
 
+      this.graph.bindKey(['meta+c', 'ctrl+c'], () => {
+        const cells = this.graph.getSelectedCells()
+        if (cells.length) {
+          this.graph.copy(cells)
+        }
+        return false
+      })
 
-        this.graph.bindKey(['meta+c', 'ctrl+c'], () => {
-          const cells = this.graph.getSelectedCells()
-          if (cells.length) {
-            this.graph.copy(cells)
-          }
-          return false
-        })
-
-        this.graph.bindKey(['meta+x', 'ctrl+x'], () => {
-          const cells = this.graph.getSelectedCells()
-          if (cells.length) {
-            this.graph.cut(cells)
-          }
-          return false
-        })
-        this.graph.bindKey(['meta+v', 'ctrl+v'], () => {
-          if (!this.graph.isClipboardEmpty()) {
-            const cells = this.graph.paste({offset: 32})
-            this.graph.cleanSelection()
-            this.graph.select(cells)
-          }
-          return false
-        })
+      this.graph.bindKey(['meta+x', 'ctrl+x'], () => {
+        const cells = this.graph.getSelectedCells()
+        if (cells.length) {
+          this.graph.cut(cells)
+        }
+        return false
+      })
+      this.graph.bindKey(['meta+v', 'ctrl+v'], () => {
+        if (!this.graph.isClipboardEmpty()) {
+          const cells = this.graph.paste({offset: 32})
+          this.graph.cleanSelection()
+          this.graph.select(cells)
+        }
+        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+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
-        })
+      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()
-          if (nodes) {
-            this.graph.select(nodes)
-          }
-        })
+      this.graph.bindKey(['meta+a', 'ctrl+a'], () => {
+        const nodes = this.graph.getNodes()
+        if (nodes) {
+          this.graph.select(nodes)
+        }
+      })
 //delete
-        this.graph.bindKey('delete', () => {
-          const cells = this.graph.getSelectedCells()
-          if (cells.length) {
-            this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
-              confirmButtonText: '纭畾',
-              cancelButtonText: '鍙栨秷',
-              type: 'warning'
-            }).then(() => {
-              this.$message({
-                type: 'success',
-                message: '鍒犻櫎鎴愬姛!'
-              })
-              this.graph.removeCells(cells)
-            }).catch(() => {
-              this.$message({
-                type: 'info',
-                message: '宸插彇娑堝垹闄�'
-              })
+      this.graph.bindKey('delete', () => {
+        const cells = this.graph.getSelectedCells()
+        if (cells.length) {
+          this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', {
+            confirmButtonText: '纭畾',
+            cancelButtonText: '鍙栨秷',
+            type: 'warning'
+          }).then(() => {
+            this.$message({
+              type: 'success',
+              message: '鍒犻櫎鎴愬姛!'
             })
-          }
-        })
+            this.graph.removeCells(cells)
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '宸插彇娑堝垹闄�'
+            })
+          })
+        }
+      })
 // zoom
-        this.graph.bindKey(['ctrl+1', 'meta+1'], () => {
-          const zoom = this.graph.zoom()
-          if (zoom < 1.5) {
-            this.graph.zoom(0.1)
+      this.graph.bindKey(['ctrl+1', 'meta+1'], () => {
+        const zoom = this.graph.zoom()
+        if (zoom < 1.5) {
+          this.graph.zoom(0.1)
+        }
+      })
+
+      this.graph.bindKey(['ctrl+2', 'meta+2'], () => {
+        const zoom = this.graph.zoom()
+        if (zoom > 0.5) {
+          this.graph.zoom(-0.1)
+        }
+      })
+
+      this.graph.on('blank:click', ({cell}) => {
+        this.reset()
+        // this.type.value = "grid"
+        this.type = 'grid'
+        // this.id = cell.id
+      })
+      // 鐩戝惉鑺傜偣娣诲姞浜嬩欢
+      this.graph.on('node:added', ({node}) => {
+        const nodeId = node.id; // 鑾峰彇鑺傜偣鐨勫敮涓� ID
+        const nodeObj = node
+        const intersectNodes = [];
+        // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜�
+        for (const otherNode of this.graph.getNodes()) {
+          if (otherNode === node) continue;
+          const bbox1 = node.getBBox();
+          const bbox2 = otherNode.getBBox();
+          if (this.isIntersect(bbox1, bbox2)) {
+            intersectNodes.push(otherNode);
           }
-        })
-
-        this.graph.bindKey(['ctrl+2', 'meta+2'], () => {
-          const zoom = this.graph.zoom()
-          if (zoom > 0.5) {
-            this.graph.zoom(-0.1)
-          }
-        })
-
-        this.graph.on('blank:click', ({cell}) => {
-          this.reset()
-          // this.type.value = "grid"
-          this.type = 'grid'
-          // this.id = cell.id
-        })
-
-        this.graph.on('cell:click', ({cell}) => {
-          // this.type.value = cell.isNode() ? "node" : "edge"
-          this.type = cell.isNode() ? 'node' : 'edge'
-          this.shape = cell.shape
-          this.id = cell.id
-          if (this.type === 'node') {
-            this.nodeType = cell.getData().nodeType
-            console.log(this.nodeType,cell.id,'this.nodeType')
-          }
-          console.log(this.shape, 'this.shape')
-          // this.nodeOpt(this.id, this.globalGridAttr)
-        })
-        //鍗曞嚮杈硅妭鐐�
-        this.graph.on('edge:click', ({edge}) => {
-          this.reset()
-          edge.attr('line/stroke', 'orange')
-          edge.prop('labels/0', {
-            attrs: {
-              body: {
-                stroke: 'orange',
-              },
-            },
-
+        }
+        if (intersectNodes.length > 0) {
+          // console.log('Nodes intersect with node:', node.id);
+          console.log('Intersecting nodes:', intersectNodes.map(n => n)); // 鐩镐氦鑺傜偣鐨勫璞�
+          intersectNodes.map(node => {
+            this.addNodeAndConnect(node, nodeObj);
           })
-        })
-        // 鍗曞嚮node鑺傜偣
-        this.graph.on('node:click', ({node}) => {
-          this.reset()
-          node.attr('line/stroke', 'orange')
-          node.prop('labels/0', {
-            attrs: {
-              body: {
-                stroke: 'orange',
-              },
+        }
+      });
+      this.graph.on('cell:click', ({cell}) => {
+        // this.type.value = cell.isNode() ? "node" : "edge"
+        this.type = cell.isNode() ? 'node' : 'edge'
+        this.shape = cell.shape
+        this.id = cell.id
+        if (this.type === 'node') {
+          this.nodeType = cell.getData().nodeType
+          console.log(this.nodeType, cell.id, 'this.nodeType')
+        }
+        console.log(this.shape, 'this.shape')
+        // this.nodeOpt(this.id, this.globalGridAttr)
+      })
+      //鍗曞嚮杈硅妭鐐�
+      this.graph.on('edge:click', ({edge}) => {
+        this.reset()
+        edge.attr('line/stroke', 'orange')
+        edge.prop('labels/0', {
+          attrs: {
+            body: {
+              stroke: 'orange',
             },
-          })
+          },
+
         })
-        // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌
-        this.graph.on('node:delete', ({view, e}) => {
+      })
+      // 鍗曞嚮node鑺傜偣
+      this.graph.on('node:click', ({node}) => {
+      })
+      // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌
+      this.graph.on('node:delete', ({view, e}) => {
+        e.stopPropagation()
+        view.cell.remove()
+      })
+
+      this.graph.on('node:customevent', ({name, view, e}) => {
+        if (name === 'node:delete') {
           e.stopPropagation()
           view.cell.remove()
-        })
-
-        this.graph.on('node:customevent', ({name, view, e}) => {
-          if (name === 'node:delete') {
-            e.stopPropagation()
-            view.cell.remove()
-          }
-        })
-        // 鍙屽嚮缂栬緫
-        this.graph.on('cell:dblclick', ({cell, e}) => {
-          const isNode = cell.isNode()
-          const name = cell.isNode() ? 'node-editor' : 'edge-editor'
-          cell.removeTool(name)
-          cell.addTools({
-            name,
-            args: {
-              event: e,
-              attrs: {
-                backgroundColor: isNode ? '#EFF4FF' : '#FFF',
-                text: {
-                  fontSize: 16,
-                  fill: '#262626',
-                },
-              },
-            },
-          })
-        })
-
-        this.graph.on('node:mouseenter', ({node}) => {
-          const container = document.getElementById('containerImg')
-          const ports = container.querySelectorAll(
-            '.x6-port-body',
-          )
-          this.showPorts(ports, true)
-        })
-
-        this.graph.on('node:mouseleave', ({node}) => {
-          // if (node.hasTool('button-remove')) {
-          //   node.removeTool('button-remove')
-          // }
-          const container = document.getElementById('containerImg')
-          const ports = container.querySelectorAll(
-            '.x6-port-body',
-          )
-          this.showPorts(ports, false)
-        })
-
-        this.graph.on('edge:mouseenter', ({cell}) => {
-          // alert(123)
-          cell.addTools([
-            {
-              name: 'source-arrowhead',
-            },
-            {
-              name: 'target-arrowhead',
-              args: {
-                attrs: {
-                  fill: 'red',
-                },
-              },
-            },
-              {
-                  name: 'segments',
-                  args: {snapRadius: 20, attrs: {fill: '#444'}}
-              },
-          ])
-        })
-
-        this.graph.on('edge:mouseleave', ({cell}) => {
-          cell.removeTools()
-        })
-
-        await this.getDiagram(this.dataForm.id)
-      },
-      showPorts(ports, show) {
-        for (let i = 0, len = ports.length; i < len; i = i + 1) {
-          ports[i].style.visibility = show ? 'visible' : 'hidden'
         }
-      },
-      reset() {
-        this.graph.drawBackground({color: '#fff'})
-        const nodes = this.graph.getNodes()
-        const edges = this.graph.getEdges()
-        nodes.forEach((node) => {
-          node.attr('body/stroke', '#5F95FF')
-        })
-        edges.forEach((edge) => {
-          edge.attr('line/stroke', '#5F95FF')
-          edge.prop('labels/0', {
+      })
+      // 鍙屽嚮缂栬緫
+      this.graph.on('cell:dblclick', ({cell, e}) => {
+        const isNode = cell.isNode()
+        const name = cell.isNode() ? 'node-editor' : 'edge-editor'
+        cell.removeTool(name)
+        cell.addTools({
+          name,
+          args: {
+            event: e,
             attrs: {
-              body: {
-                stroke: '#5F95FF',
+              backgroundColor: isNode ? '#EFF4FF' : '#FFF',
+              text: {
+                fontSize: 16,
+                fill: '#262626',
               },
             },
-          })
+          },
         })
-      },
-      // nodeOpt(id, globalGridAttr) {
-      //   this.curCel = null
-      //   if (id) {
-      //     let cell = this.graph.getCellById(id)
-      //     console.log(cell, 'let cell 123456')
-      //     if (!cell || !cell.isNode()) {
-      //       return
-      //     }
-      //     this.curCel = cell
-      //     globalGridAttr.nodeStroke = cell.attr('body/stroke')
-      //     globalGridAttr.nodeStrokeWidth = cell.attr('body/strokeWidth')
-      //     globalGridAttr.nodeFill = cell.attr('body/fill')
-      //     globalGridAttr.nodeFontSize = cell.attr('text/fontSize')
-      //     globalGridAttr.nodeFontSize = cell.attr('title/fontSize')
-      //     globalGridAttr.nodeColor = cell.attr('text/fill')
-      //     globalGridAttr.nodeColor = cell.attr('title/fill')
-      //     globalGridAttr.nodeColor = cell.attr('text/style/color')
-      //     globalGridAttr.nodeColor =  cell.attr('title/style/color')
-      //     globalGridAttr.nodeUsers = cell.attr('approve/users')
-      //     globalGridAttr.nodeText = cell.attr('text/text')
-      //     globalGridAttr.nodeDate = cell.attr('title/text')
-      //     // let data={
-      //     //   dataId:this.projectId,
-      //     //   finishDate: globalGridAttr.nodeDate,
-      //     // }
-      //     cell.getData()
-      //     console.log( cell.getData(),' cell.getData() 909')
-      //   }
-      //   return this.curCel;
-      // },
-      async search() {
-        await this.getDiagram();
-      },
-      async saveDiagram() {
-        console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
-        this.dataForm.content = JSON.stringify(this.graph.toJSON())
-        this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
-        console.log(this.dataForm, 'dataFrom')
-        await this.$http[this.dataForm.id === null ? 'post' : 'put'](`/taskReliability/ModelLine/`, this.dataForm).then(async res => {
-          if (res.msg === 'success') {
-            this.$alert('淇濆瓨鎴愬姛', '鎻愮ず', {
-              confirmButtonText: '纭畾'
-            })
-          }
-        })
-      },
-      async analyzeDiagram() {
-        console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
-        this.dataForm.content = JSON.stringify(this.graph.toJSON())
-        this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
-        await this.$http['post'](`/taskReliability/ModelLine/analyze`, this.dataForm).then(async res => {
-          if (res.msg === 'success') {
-            this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', {
-              confirmButtonText: '纭畾'
-            })
-          }
-        })
-      },
-      // AlignmentsChanges(val){
-      //   console.log(val,'align.value')
-      //     if(val ==='閫夐」1'){
-      //       console.log(val,'align.value')
-      //        this.leftAlign()
-      //     }
-      //     if(val ==='閫夐」2') {
-      //       console.log('鍙冲榻�','align.value')
-      //        this.rightAlign()
-      //     }
-      // },
-      leftAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let leftX = null
-        for (let a of NODE) {
-          if (leftX == null || a.getBBox().x < leftX) {
-            leftX = a.getBBox().x
-          }
-        }
-        for (let a of NODE) {
-          let y = a.getBBox().y
-          a.position(leftX, y)
-          // console.log(leftX, ':', y, '  x:y')
-        }
-      },
-      topAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let topY = null
-        for (let a of NODE) {
-          console.log(a.getBBox(), 'a.getBBox()')
-          if (topY == null || a.getBBox().y < topY) {
-            topY = a.getBBox().y
-          }
-        }
-        for (let a of NODE) {
-          let x = a.getBBox().x
-          a.position(x, topY)
-          // console.log(leftX, ':', y, '  x:y')
-        }
-      },
-      centerAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let rightX = null
-        let leftX = null
-        for (let a of NODE) {
-          if (leftX == null || a.getBBox().x < leftX) {
-            leftX = a.getBBox().x
-          }
-        }
-        for (let a of NODE) {
-          if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
-            rightX = a.getBBox().x + a.getBBox().width
-          }
-        }
+      })
 
-        let centerX = leftX + (rightX - leftX) / 2
+      this.graph.on('node:mouseenter', ({node}) => {
+        const container = document.getElementById('containerImg')
+        const ports = container.querySelectorAll(
+            '.x6-port-body',
+        )
+        this.showPorts(ports, true)
+      })
 
-        for (let a of NODE) {
-          let y = a.getBBox().y
-          a.position(centerX - a.getBBox().width / 2, y)
-          // console.log(leftX, ':', y, '  x:y')
-        }
-      },
-      shuipingAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let bottomY = null
-        let topY = null
-        for (let a of NODE) {
-          if (topY == null || a.getBBox().y || 0 < topY) {
-            topY = a.getBBox().y
-          }
-        }
-        for (let a of NODE) {
-          if (bottomY == null || a.getBBox().y + a.getBBox().height > bottomY) {
-            bottomY = a.getBBox().y + a.getBBox().height
-          }
-        }
+      this.graph.on('node:mouseleave', ({node}) => {
+        // if (node.hasTool('button-remove')) {
+        //   node.removeTool('button-remove')
+        // }
+        const container = document.getElementById('containerImg')
+        const ports = container.querySelectorAll(
+            '.x6-port-body',
+        )
+        this.showPorts(ports, false)
+      })
 
-        let centerY = topY + (bottomY - topY) / 2
-        for (let a of NODE) {
-          let x = a.getBBox().x
-          let centerHei = a.getBBox().height / 2
-          a.position(x, centerY - centerHei)
-        }
-      },
-      rightAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let rightX = null
-        for (let a of NODE) {
-          if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
-            rightX = a.getBBox().x + a.getBBox().width
-          }
-        }
-        for (let a of NODE) {
-          let y = a.getBBox().y
-          a.position(rightX - a.getBBox().width, y)
-        }
-      },
-      bottomAlign() {
-        const NODE = this.graph.getSelectedCells()
-        let bottomY = null
-        for (let a of NODE) {
-          if (bottomY == null || (a.getBBox().y + a.getBBox().height) > bottomY) {
-            bottomY = a.getBBox().y + a.getBBox().height
-          }
-        }
+      this.graph.on('edge:mouseenter', ({cell}) => {
+        // alert(123)
+        cell.addTools([
+          {
+            name: 'source-arrowhead',
+          },
+          {
+            name: 'target-arrowhead',
+            args: {
+              attrs: {
+                fill: 'red',
+              },
+            },
+          },
+          {
+            name: 'segments',
+            args: {snapRadius: 20, attrs: {fill: '#444'}}
+          },
+        ])
+      })
 
-        for (let a of NODE) {
-          let x = a.getBBox().x
-          a.position(x, bottomY - a.getBBox().height)
-        }
-      },
-      close() {
-        if (this.timer) {
-          window.clearInterval(this.timer)
-        }
-      },
+      this.graph.on('edge:mouseleave', ({cell}) => {
+        cell.removeTools()
+      })
+
+      await this.getDiagram(this.dataForm.id)
     },
+    showPorts(ports, show) {
+      for (let i = 0, len = ports.length; i < len; i = i + 1) {
+        ports[i].style.visibility = show ? 'visible' : 'hidden'
+      }
+    },
+    reset() {
+      this.graph.drawBackground({color: '#fff'})
+      const nodes = this.graph.getNodes()
+      const edges = this.graph.getEdges()
+      nodes.forEach((node) => {
+        node.attr('body/stroke', '#5F95FF')
+      })
+      edges.forEach((edge) => {
+        edge.attr('line/stroke', '#5F95FF')
+        edge.prop('labels/0', {
+          attrs: {
+            body: {
+              stroke: '#5F95FF',
+            },
+          },
+        })
+      })
+    },
+    async search() {
+      await this.getDiagram();
+    },
+    async saveDiagram() {
+      console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
+      this.dataForm.content = JSON.stringify(this.graph.toJSON())
+      this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
+      console.log(this.dataForm, 'dataFrom')
+      await this.$http[this.dataForm.id === null ? 'post' : 'put'](`/taskReliability/ModelLine/`, this.dataForm).then(async res => {
+        if (res.msg === 'success') {
+          this.$alert('淇濆瓨鎴愬姛', '鎻愮ず', {
+            confirmButtonText: '纭畾'
+          })
+        }
+      })
+    },
+    async analyzeDiagram() {
+      console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
+      this.dataForm.content = JSON.stringify(this.graph.toJSON())
+      this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
+      await this.$http['post'](`/taskReliability/ModelLine/analyze`, this.dataForm).then(async res => {
+        if (res.msg === 'success') {
+          this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', {
+            confirmButtonText: '纭畾'
+          })
+        }
+      })
+    },
+    leftAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let leftX = null
+      for (let a of NODE) {
+        if (leftX == null || a.getBBox().x < leftX) {
+          leftX = a.getBBox().x
+        }
+      }
+      for (let a of NODE) {
+        let y = a.getBBox().y
+        a.position(leftX, y)
+        // console.log(leftX, ':', y, '  x:y')
+      }
+    },
+    topAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let topY = null
+      for (let a of NODE) {
+        console.log(a.getBBox(), 'a.getBBox()')
+        if (topY == null || a.getBBox().y < topY) {
+          topY = a.getBBox().y
+        }
+      }
+      for (let a of NODE) {
+        let x = a.getBBox().x
+        a.position(x, topY)
+        // console.log(leftX, ':', y, '  x:y')
+      }
+    },
+    centerAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let rightX = null
+      let leftX = null
+      for (let a of NODE) {
+        if (leftX == null || a.getBBox().x < leftX) {
+          leftX = a.getBBox().x
+        }
+      }
+      for (let a of NODE) {
+        if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
+          rightX = a.getBBox().x + a.getBBox().width
+        }
+      }
 
-  }
+      let centerX = leftX + (rightX - leftX) / 2
+
+      for (let a of NODE) {
+        let y = a.getBBox().y
+        a.position(centerX - a.getBBox().width / 2, y)
+        // console.log(leftX, ':', y, '  x:y')
+      }
+    },
+    shuipingAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let bottomY = null
+      let topY = null
+      for (let a of NODE) {
+        if (topY == null || a.getBBox().y || 0 < topY) {
+          topY = a.getBBox().y
+        }
+      }
+      for (let a of NODE) {
+        if (bottomY == null || a.getBBox().y + a.getBBox().height > bottomY) {
+          bottomY = a.getBBox().y + a.getBBox().height
+        }
+      }
+
+      let centerY = topY + (bottomY - topY) / 2
+      for (let a of NODE) {
+        let x = a.getBBox().x
+        let centerHei = a.getBBox().height / 2
+        a.position(x, centerY - centerHei)
+      }
+    },
+    rightAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let rightX = null
+      for (let a of NODE) {
+        if (rightX == null || a.getBBox().x + a.getBBox().width > rightX) {
+          rightX = a.getBBox().x + a.getBBox().width
+        }
+      }
+      for (let a of NODE) {
+        let y = a.getBBox().y
+        a.position(rightX - a.getBBox().width, y)
+      }
+    },
+    bottomAlign() {
+      const NODE = this.graph.getSelectedCells()
+      let bottomY = null
+      for (let a of NODE) {
+        if (bottomY == null || (a.getBBox().y + a.getBBox().height) > bottomY) {
+          bottomY = a.getBBox().y + a.getBBox().height
+        }
+      }
+
+      for (let a of NODE) {
+        let x = a.getBBox().x
+        a.position(x, bottomY - a.getBBox().height)
+      }
+    },
+    close() {
+      if (this.timer) {
+        window.clearInterval(this.timer)
+      }
+    },
+    // 瀹氫箟鍑芥暟鏉ユ鏌ヤ袱涓寘鍥存鏄惁鐩镐氦
+    isIntersect(bbox1, bbox2) {
+      return (
+          bbox1.x < bbox2.x + bbox2.width &&
+          bbox1.x + bbox1.width > bbox2.x &&
+          bbox1.y < bbox2.y + bbox2.height &&
+          bbox1.y + bbox1.height > bbox2.y
+      )
+    },
+    addNodeAndConnect(node, nodeObj) { // node鏄敾甯冨師鏈夌殑鑺傜偣銆俷odeObj鏄綋鍓嶆嫋鎷界殑鑺傜偣
+      const nodeType = node.getData().nodeType  // 鑾峰彇鑺傜偣绫诲瀷
+      const edges = this.graph.getConnectedEdges(node); // 鑾峰彇涓庡師鑺傜偣鐩稿叧鑱旂殑鎵�鏈夎繛鎺ョ嚎
+      let TopSum = 0 // 鍦ㄥ師鑺傜偣涓婃柟
+      let BottomSum = 0 // 鍦ㄥ師鑺傜偣涓嬫柟
+      const edgesSum = edges.length
+      if (nodeType !== 'node') {
+        if (edges.length === 0) {
+          if (!this.nodeAdded) {
+            // 娣诲姞鑺傜偣鐨勬搷浣�
+            this.connectNode = this.graph.addNode({
+              shape: 'image',
+              // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'),
+              width: 30,
+              height: 30,
+              data: {
+                type: 'imageNodes',
+                dataId: '',
+                nodeType: 'connect',
+                nodeTypeExt: '',
+                voteNum: ''
+              },
+              attrs: {
+                image: {
+                  'xlink:href': '/modelImg/connect.svg',
+                },
+                text: {
+                  text: 'connect',
+                  fontSize: 14,
+                  refX: 0.5,
+                  refY: '100%',
+                  refY2: 4,
+                  textAnchor: 'middle',
+                  textVerticalAnchor: 'top',
+                },
+              },
+              ports: {...this.ports},
+            })
+            // 璁剧疆鏍囪涓� true锛岃〃绀哄凡缁忔坊鍔犺繃鑺傜偣
+            this.nodeAdded = true;
+          }
+          nodeObj.position(node.position().x - 240, node.position().y - (120 * edgesSum));
+          this.connectNode.position(node.position().x - 480, node.position().y + (node.size().height - this.connectNode.size().height) / 2);
+        } else if (edges.length === 1) {
+          // 灏嗚妭鐐圭Щ鍔ㄥ埌鎸囧畾鐨勪綅缃�
+          nodeObj.position(node.position().x - 240, node.position().y - (120 * edgesSum));
+        } else {
+          for (const edge of edges) {
+            const sourcePointY = edge.getSourcePoint().y; // 鑾峰彇杩炴帴绾跨殑璧峰鐐箉鍧愭爣
+            const targetPointY = edge.getTargetPoint().y; // 鑾峰彇杩炴帴绾跨殑缁撴潫鐐箉鍧愭爣
+            console.log('鍘熻妭鐐筜鍧愭爣' + node.position().y, '杩炴帴绾胯捣濮媃鍧愭爣' + sourcePointY)
+            if (targetPointY > sourcePointY) {
+              TopSum++
+            } else if (targetPointY < sourcePointY) {
+              BottomSum++
+            }
+          }
+          console.log('鍦ㄥ師鑺傜偣涓婃柟鐨勮繛鎺ョ嚎鏁伴噺:' + TopSum, '鍦ㄥ師鑺傜偣涓嬫柟鐨勮繛鎺ョ嚎鏁伴噺:' + BottomSum)
+          if (TopSum > BottomSum) {
+            nodeObj.position(node.position().x - 240, node.position().y + (120 + (120 * BottomSum)))
+          } else {
+            nodeObj.position(node.position().x - 240, node.position().y - (120 + (120 * TopSum)));
+          }
+        }
+        this.graph.addEdge({
+          source: {cell: nodeObj, port: 'right1'},
+          target: {cell: node, port: 'left1'},
+          router: {name: 'manhattan'},
+          connector: {name: 'rounded'}
+        })
+        if (this.nodeAdded) {
+          console.log(this.connectNode, 'connectNode')
+          this.graph.addEdge({
+            source: {cell: this.connectNode, port: 'right1'},
+            target: {cell: nodeObj, port: 'left1'},
+            router: {name: 'manhattan'},
+            connector: {name: 'rounded'}
+          })
+        }
+      } else {
+          // 閬嶅巻鎵�鏈夎繛鎺ョ嚎骞跺垹闄や笌缁欏畾鑺傜偣瀵硅薄鐩稿叧鐨勮繛鎺ョ嚎
+        console.log(edges, '鎵�鏈夋湁鍏宠仈鐨勮繛鎺ョ嚎 edge')
+        if(edges.length === 0){
+          this.graph.addEdge({
+            source: {cell: node, port: 'right1'},
+            target: {cell: nodeObj, port: 'left1'},
+            router: {name: 'manhattan'},
+            connector: {name: 'rounded'}
+          })
+           return nodeObj.position(node.position().x +node.getBBox().width+50, node.position().y);
+        }else {
+          for (const edge of edges) {
+            console.log(edge, '鎵�鏈夋湁鍏宠仈鐨勮繛鎺ョ嚎 edge')
+            if (edge.source.cell === node.id) { // 濡傛灉杩炴帴绾跨殑璧峰鑺傜偣绛変簬褰撳墠鐢诲竷鐩爣鑺傜偣鐨処D
+              const sourceNode = this.graph.getCellById(edge.source.cell); // 鑾峰彇杩炴帴绾跨殑婧愯妭鐐瑰璞�
+              const targetNode = this.graph.getCellById(edge.target.cell) // 鑾峰彇杩炴帴绾跨殑鐩爣鑺傜偣瀵硅薄
+              console.log(sourceNode, targetNode, 'targetNode 鐩爣鑺傜偣瀵硅薄')
+              // edge.remove(); // 浠庡浘涓垹闄よ杩炴帴绾�
+              nodeObj.position(node.position().x +node.getBBox().width+50, node.position().y);
+              // edge.source = {cell: node, port: 'right1'}
+              edge.target = {cell: nodeObj, port: 'left1'}
+              // targetNode.position(nodeObj.position().x +nodeObj.getBBox().width+50, node.position().y);
+              // this.graph.addEdge({
+              //   source: {cell: node, port: 'right1'},
+              //   target: {cell: nodeObj, port: 'left1'},
+              //   router: {name: 'manhattan'},
+              //   connector: {name: 'rounded'}
+              // })
+              this.graph.addEdge({
+                source: {cell: nodeObj, port: 'right1'},
+                target: {cell: targetNode, port: 'left1'},
+                router: {name: 'manhattan'},
+                connector: {name: 'rounded'}
+              })
+            }else {
+              this.graph.addEdge({
+                source: {cell: node, port: 'right1'},
+                target: {cell: nodeObj, port: 'left1'},
+                router: {name: 'manhattan'},
+                connector: {name: 'rounded'}
+              })
+              nodeObj.position(node.position().x +node.getBBox().width+50, node.position().y);
+            }
+          }
+        }
+
+
+      }
+    },
+  },
+
+}
 </script>
 
 <style>
-  #containerImg {
-    display: flex;
-    border: 1px solid #dfe3e8;
-    height: 400px;
-    width: 100% !important;
-  }
-
-  .x6-graph-scroller.x6-graph-scroller-pannable {
-    width: 100% !important;
-  }
-
-  #stencilImg {
-    width: 100%;
-    height: 100%;
-    position: relative;
-    border-right: 1px solid #dfe3e8;
-  }
-
-  .x6-widget-stencil {
-    position: relative;
-    height: 100%;
-  }
-#stencilImg .x6-graph-svg-viewport{
-    height: 100%;
+#containerImg {
+  display: flex;
+  border: 1px solid #dfe3e8;
+  height: 400px;
+  width: 100% !important;
 }
-  .x6-widget-stencil-content {
-    position: relative;
+
+.x6-graph-scroller.x6-graph-scroller-pannable {
+  width: 100% !important;
+}
+
+#stencilImg {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  border-right: 1px solid #dfe3e8;
+}
+
+.x6-widget-stencil {
+  position: relative;
+  height: 100%;
+}
+
+#stencilImg .x6-graph-svg-viewport {
+  height: 100%;
+}
+
+.x6-widget-stencil-content {
+  position: relative;
   height: calc(100% - 32px);
 }
-#stencilImg .x6-widget-stencil.collapsable > .x6-widget-stencil-content{
-    top:0
-  }
+
+#stencilImg .x6-widget-stencil.collapsable > .x6-widget-stencil-content {
+  top: 0
+}
 
 </style>

--
Gitblit v1.9.1