From 027f2fdeaab775c235791cd520d96a47edb23a98 Mon Sep 17 00:00:00 2001
From: wente <329538422@qq.com>
Date: 星期六, 12 十月 2024 11:56:25 +0800
Subject: [PATCH] 时序图缩略图

---
 web/src/views/modules/taskReliability/timeDiagramThumbnail.vue |  327 +++++++++++++++++++++++
 web/src/views/modules/taskReliability/TimeDiagram.vue          |  178 +++++++++---
 web/src/views/modules/taskReliability/textDiagram.vue          |  321 ++++++++++++++++++++++
 3 files changed, 781 insertions(+), 45 deletions(-)

diff --git a/web/src/views/modules/taskReliability/TimeDiagram.vue b/web/src/views/modules/taskReliability/TimeDiagram.vue
index e7b0071..ec5a79e 100644
--- a/web/src/views/modules/taskReliability/TimeDiagram.vue
+++ b/web/src/views/modules/taskReliability/TimeDiagram.vue
@@ -1,8 +1,8 @@
 <template>
-  <div class="fa-card-a">
-    <el-row :gutter="5">
+  <div class="fa-card-a" style="width: calc(100% - 20px);height: calc(100vh - 128px)">
+    <div >
       <div class="mod-taskReliability-simulatAssess">
-        <el-form :inline="true" :model="dataForm" ref="dataForm" :disabled="dataForm.disabled">
+        <el-form :inline="true" :model="dataForm" ref="dataForm" :disabled="dataForm.disabled" >
           <zt-form-item label="浜у搧鑺傜偣" prop="productId">
             <zt-select v-model="dataForm.productId" :datas="productList" @change="onProductSelected"/>
           </zt-form-item>
@@ -23,25 +23,31 @@
           </zt-form-item>
           <zt-form-item>
             <zt-button @click="getDiagram(null)">鏌ョ湅鏃跺簭鍥�</zt-button>
+<!--            <zt-button @click="graphRightTranslate()">鐢诲竷鍙崇Щ</zt-button>-->
+<!--            <zt-button @click="graphLeftTranslate()">鐢诲竷宸︾Щ</zt-button>-->
           </zt-form-item>
         </el-form>
-        <div>
-          <el-col :span="4">
+        <div style="display: flex">
+          <div style="width: 300px">
             <div style="margin-right: 5px;height: calc(88vh - 100px)" v-if="isSelect">
               <product-model-tree @on-selected="onTreeSelected"
                                   ref="ProductModelTree" :isShow="false" :productId="dataForm.productId"/>
             </div>
-          </el-col>
-          <el-col :span="20">
-            <div style="margin-top: 20px">
-              <div id="timeDiagram" style="border: 1px solid #EAEBEE;border-radius: 6px;
+          </div>
+          <div style="height: calc(100vh - 233px);width: calc(100% - 300px);margin-left:10px">
+            <div style="margin-top:15px;width:100%; height:100%;border: 1px solid #EAEBEE;border-left:none;border-radius: 6px;
         box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);">
+<!--              <div style="width:100%;height: 150px" id="thumbnail" class="minimap-container"></div>-->
+              <timeDiagramThumbnail ref="timeDiagramThumbnail" @getPoint="getPoint"></timeDiagramThumbnail>
+              <div id="flexLayout" style="display:flex;">
+                <textDiagram class="flexLayout-item_1"  ref="textDiagram"></textDiagram>
+                <div id="timeDiagram" class="flexLayout-item_2" style="height: 300px" ref="scrollView"  @mousewheel="handleScroll"></div>
               </div>
             </div>
-          </el-col>
+          </div>
         </div>
       </div>
-    </el-row>
+    </div>
     <el-dialog v-dialogDrag :title="title" top="1vh" width='95%' :visible.sync="dialogVisible2" v-if="dialogVisible2">
       <model-view ref="modelView"></model-view>
     </el-dialog>
@@ -53,13 +59,17 @@
   import ProductModelTree from "../basicInfo/ProductModelTree";
   import {Graph, Shape, Addon, Cell} from '@antv/x6'
   import ModelView from "./ModelView";
+  import textDiagram from "./textDiagram";
+  import timeDiagramThumbnail from "./timeDiagramThumbnail"
 
 
   export default {
     data() {
       return {
-        title: '',
-        knob: HTMLDivElement,
+        bigWidth:0,
+        left:400,
+        title:'',
+        knob:HTMLDivElement,
         dialogVisible2: false,
         timers: '',
         shape: '',
@@ -72,6 +82,9 @@
         MTTR: '',
         diagramJson: '',
         graph: null,
+        timeDiagramWidth:document.documentElement.clientWidth - 300,
+        timeDiagramHeight:document.documentElement.clientHeight - 133,
+        smallTimeDiagramWidth:document.documentElement.clientWidth - 600,
         globalGridAttr: {
           type: 'mesh',
           size: 10,
@@ -119,26 +132,47 @@
         }
       }
     },
+    created() {
+      let scrollView = this.$refs['scrollView']
+      window.addEventListener('scroll', this.handleScroll,true);
+    },
+    destroyed() {
+      let scrollView = this.$refs['scrollView']
+      window.removeEventListener('scroll', this.handleScroll,true);
+    },
     mounted() {
       this.getProductList()
+      this.$refs.textDiagram.init()
+      this.$refs.timeDiagramThumbnail.init()
     },
     components: {
       ModelView,
       ProductModelTree,
       SimulatCurve,
+      textDiagram,
+      timeDiagramThumbnail
     },
     methods: {
+      handleScroll(){
+        this.graph.getScrollbarPosition()
+        let left = this.graph.getScrollbarPosition().left
+        console.log(left,'left left')
+        let top = this.graph.getScrollbarPosition().top
+        this.$refs.textDiagram.setScroll(top)
+        this.$refs.timeDiagramThumbnail.getNodePointX(left,this.bigWidth)
+      },
       init() {
         console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
         console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
         this.graph = new Graph({
           container: document.getElementById('timeDiagram'),
-          width: document.documentElement.clientWidth,
-          height: document.documentElement.clientHeight - 220,
+          // width: document.documentElement.clientWidth - 100,
+          height: document.documentElement.clientHeight - 440,
           // async: true,
           grid: {
             visible: false,
           },
+          virtual:true,
           embedding: {
             enabled: true,
             findParent({node}) {
@@ -157,23 +191,40 @@
           autoResize: true,
           scroller: {
             enabled: true,
-            pageVisible: true,
-            pageBreak: true,
+            className:'my-scroller-drag',
+            pageWidth:100,
+            pageVisible:true,
+            // pageBreak:true,
+            padding: {
+              top: 0,
+              right: 0,
+              bottom: 0,
+              left: 0,
+            },
+            minVisibleWidth: 500,
+            minVisibleHeight:300,
             pannable: true,
           },
-          mousewheel: {
-            enabled: true,
-            zoomAtMousePosition: true,
-            modifiers: 'ctrl',
-            minScale: 0.1,
-            maxScale: 10,
-          },
+          // minimap: {
+          //   enabled: true,
+          //   container: document.getElementById('thumbnail'),
+          //   scalable:false,
+          //   width: document.documentElement.clientWidth - 400,
+          //   height: 150,
+          // },
+          // mousewheel: {
+          //   enabled: true,
+          //   zoomAtMousePosition: true,
+          //   modifiers: 'ctrl',
+          //   minScale: 0.1,
+          //   maxScale: 10,
+          // },
           createEdge() {
             return new Shape.Edge({
               data: {
                 id: '',
                 status: '',
-                startTime: '',
+                startTime:'',
                 endTime: '',
               },
               attrs: {
@@ -192,7 +243,7 @@
           },
           keyboard: true,
         })
-        this.knob = document.createElement('div', false)
+        this.knob = document.createElement('div',false)
         this.knob.style.position = 'absolute'
         document.getElementById('timeDiagram').appendChild(this.knob)
         this.graph.centerContent()
@@ -415,7 +466,9 @@
           this.type = 'grid'
           // this.id = cell.id
         })
-
+        this.graph.on('translate', ({ tx, ty }) => {
+          console.log(`褰撳墠鍋忕Щ閲忎綅缃�: x=${tx}, y=${ty}`);
+        });
         this.graph.on('cell:click', ({cell}) => {
           // this.type.value = cell.isNode() ? "node" : "edge"
           this.type = cell.isNode() ? 'node' : 'edge'
@@ -446,7 +499,7 @@
               id: node.getData().dataId,
               modelName: node.attr('label/textWrap/modelName'),
             }
-            this.title = node.attr('label/textWrap/modelName') + "妯″瀷璁捐"
+            this.title=node.attr('label/textWrap/modelName') + "妯″瀷璁捐"
             this.$nextTick(() => {
               this.$refs.modelView.init(param)
             })
@@ -461,22 +514,22 @@
         })
 
         // 榧犳爣绉诲叆edge鑺傜偣
-        this.graph.on('edge:mouseenter', ({edge, e}) => {
+        this.graph.on('edge:mouseenter', ({edge,e}) => {
           const style = this.knob.style
           // e.stopPropagation()
-          console.log('edge:mouseenter')
+          // console.log('edge:mouseenter')
           if (e && edge.data) {
-            if (edge.getData().status === 'F') {
+            if (edge.getData().status==='F') {
               //console.log(edge.getData(),"eee edge.getData()")
               let startTimes = edge.getData().startTimes
               let endTimes = edge.getData().endTimes
               //console.log(e,'eee')
               const p = this.graph.clientToGraph(e.clientX, e.clientY)
-              setTimeout(() => {
+              setTimeout(()=>{
                 style.display = 'block'
                 style.left = `${p.x}px`
                 style.top = `${p.y}px`
-                style.width = 200 + 'px'
+                style.width = 200+ 'px'
                 style.height = 80 + 'px'
                 style.textAlign = 'center'
                 style.background = '#000'
@@ -484,15 +537,15 @@
                 style.lineHeight = (40 + 'px')
                 style.zIndex = 100
                 this.knob.innerText = `寮�濮嬫椂闂达細${startTimes}\n缁撴潫鏃堕棿锛�${endTimes}`
-              }, 0)
-              console.log(p, 'p p p')
-              console.log(style, this.knob, 'style style')
+              },0)
+              // console.log(p,'p p p')
+              // console.log(style,this.knob,'style style')
             }
           }
         })
 // 榧犳爣绉诲嚭edge鑺傜偣
         this.graph.on('edge:mouseleave', ({edge}) => {
-          console.log('edge:mouseleave')
+          // console.log('edge:mouseleave')
           const style = this.knob.style
           style.display = 'none'
         })
@@ -562,12 +615,21 @@
         }
         let res = await this.$http.get('/taskReliability/SimulatAssess/getStatus', {params: params})
         if (res.data !== null) {
-          this.diagramJson = JSON.parse(res.data.smallDiagramJson)
+          this.diagramJson = JSON.parse(res.data.diagramJson)
+          let textDiagramJson = JSON.parse(res.data.textDiagramJson)
+          let smallDiagramJson = JSON.parse(res.data.smallDiagramJson)
           console.log(this.diagramJson, 'this.Diagram json')
+          console.log(smallDiagramJson, 'smallDiagramJson')
           this.graph.fromJSON(this.diagramJson)
-          this.graph.centerContent()
-          //this.graph.zoomToFit()
+          // this.graph.centerContent()
+          this.graph.positionContent('left',{ padding: { left: 0 }})
+          // this.graph.zoomToFit()
+          this.bigWidth = this.graph.getContentBBox().width
+          console.log(this.bigWidth,'getContentBBox')
+          // this.graph.resize(this.graph.getContentBBox().width,this.graph.getContentBBox().height)
           this.graph.freeze()
+          this.$refs.textDiagram.getTextDiagram(textDiagramJson)
+          this.$refs.timeDiagramThumbnail.getThumbnail(smallDiagramJson)
         } else {
           this.graph.fromJSON(this.emptyJson)
           this.graph.centerContent()
@@ -576,24 +638,38 @@
         }
         console.log(res.data)
       },
+      graphRightTranslate(){
+        this.left+=200
+        this.graph.scrollToPoint(this.left, null,  { animation: { duration: 400 }})
+        // this.graph.setScrollbarPosition(100, null, { animation: { duration: 200, easing: 'linear' }})
+      },
+      getPoint(x,smallWidth){
+        let pointX = Number((x * (this.bigWidth / smallWidth )).toFixed(0))
+        // console.log(pointX)
+        this.graph.setScrollbarPosition(pointX, null)
+        // if(pointX<600){
+        // this.graph.setScrollbarPosition(pointX, null,  { animation: { duration: 400 }})
+        // }else {
+        //   this.graph.scrollToPoint(pointX, null, {animation: {duration: 400}})
+        // }
+      }
     }
   }
 </script>
 <style>
   #timeDiagram {
     display: flex;
-    border: 1px solid #dfe3e8;
-    width: 100% !important;
+    /*border: 1px solid #dfe3e8;*/
+    /*width: 60% !important;*/
   }
 
   #timeDiagram .x6-cell.x6-node {
     cursor: inherit;
   }
 
-  .x6-graph-scroller.x6-graph-scroller-pannable {
-    width: 100% !important;
+  #flexLayout  .x6-graph-scroller.x6-graph-scroller-pannable {
+    width: 92% !important;
   }
-
   .x6-widget-stencil {
     position: relative;
     height: 100%;
@@ -603,4 +679,16 @@
     position: relative;
     height: 100%;
   }
+  .my-scroller-drag {
+    overflow: auto; /* 闇�瑕佹粴鍔ㄦ椂淇濇寔杩欎釜灞炴�� */
+    scrollbar-width: none; /* 瀵逛簬Firefox */
+  }
+
+  .my-scroller-drag::-webkit-scrollbar {
+    display: none; /* 瀵逛簬Chrome, Safari鍜孫pera */
+  }
+  .zt.light .el-tab-pane .mod-taskReliability-simulatAssess .el-form{
+    margin-top: 5px;
+   margin-bottom: 0;
+}
 </style>
diff --git a/web/src/views/modules/taskReliability/textDiagram.vue b/web/src/views/modules/taskReliability/textDiagram.vue
new file mode 100644
index 0000000..3c1f530
--- /dev/null
+++ b/web/src/views/modules/taskReliability/textDiagram.vue
@@ -0,0 +1,321 @@
+<template>
+  <div id="textDiagram"></div>
+</template>
+
+<script>
+  import {Graph, Shape, Addon, Cell} from '@antv/x6'
+
+  export default {
+    name: "textDiagram",
+    data(){
+      return{
+        graph:null,
+      }
+    },
+    methods:{
+      init() {
+        console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
+        console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
+        this.graph = new Graph({
+          container: document.getElementById('textDiagram'),
+          // width:250,
+          height: document.documentElement.clientHeight - 440,
+          // async: true,
+          grid: {
+            visible: false,
+          },
+          embedding: {
+            enabled: true,
+            findParent({node}) {
+              const bbox = node.getBBox()
+              return this.getNodes().filter((node) => {
+                // 鍙湁 data.parent 涓� true 鐨勮妭鐐规墠鏄埗鑺傜偣
+                const data = node.getData()
+                if (data && data.parent) {
+                  const targetBBox = node.getBBox()
+                  return bbox.isIntersectWithRect(targetBBox)
+                }
+                return false
+              })
+            }
+          },
+          autoResize: true,
+          scroller: {
+            enabled: true,
+            className:'my-scroller-text',
+            padding: {
+              top: 0,
+              right: 0,
+              bottom: 0,
+              left: 0,
+            },
+            pannable: false,
+          },
+          createEdge() {
+            return new Shape.Edge({
+              data: {
+                id: '',
+                status: '',
+                startTime:'',
+                endTime: '',
+              },
+              attrs: {
+                line: {
+                  stroke: '#A2B1C3',
+                  strokeWidth: 2,
+                  sourceMarker: 'none',
+                  targetMarker: 'none'
+                }
+              },
+              tools: {
+                name: 'vertices',
+              },
+              zIndex: 0,
+            })
+          },
+          keyboard: true,
+        })
+        this.graph.centerContent()
+
+        Graph.registerNode(
+          'custom-rect',
+          {
+            inherit: 'rect',
+            width: 86,
+            height: 26,
+            zIndex: 10,
+            data: {
+              dataId: '',
+              finishDate: '',
+              inspectName: ''
+            },
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: 'none',
+                fill: 'none',
+              },
+              text: {
+                // fontFamily: '浠垮畫',
+                fontSize: 20,
+                fill: '#000',
+              },
+              label: {
+                refX: 0,
+                refY: 0.5,
+                textAnchor: 'start',
+                textVerticalAnchor: 'middle',
+                textWrap: {
+                  text: '鏂囧瓧妯℃澘',
+                  width: -10,      // 瀹藉害鍑忓皯 10px
+                  ellipsis: false,  // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙�
+                  breakWord: true, // 鏄惁鎴柇鍗曡瘝
+                }
+              },
+            },
+            ports: {...this.ports},
+          },
+          true,
+        )
+
+        Graph.registerNode(
+          'custom-polygon',
+          {
+            inherit: 'polygon',
+            width: 86,
+            height: 56,
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              text: {
+                fontSize: 20,
+                fill: '#262626',
+              },
+            },
+            ports: {
+              ...this.ports
+              // items: [
+              //   {
+              //     group: 'top',
+              //   },
+              //   {
+              //     group: 'bottom',
+              //   },
+              // ],
+            },
+          },
+          true,
+        )
+        //
+        Graph.registerNode(
+          'custom-circle',
+          {
+            inherit: 'ellipse',
+            width: 120,
+            height: 120,
+            data: {
+              dataId: '',
+              finishDate: ''
+            },
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              //鏃ユ湡
+              title: {
+                text: '',
+                fontSize: 12,
+                fill: '#262626',
+                refX: 0.5,
+                refY: '100%',
+                refY2: -10,
+                textAnchor: 'middle',
+                textVerticalAnchor: 'bottom',
+              },
+              // 鍚嶇О
+              text: {
+                // fontFamily: '浠垮畫',
+                fontSize: 20,
+                fill: '#262626',
+                textWrap: {
+                  width: 80,      // 瀹藉害涓� 80px鎹㈣
+                  ellipsis: false,  // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙�
+                  breakWord: true, // 鏄惁鎴柇鍗曡瘝
+                }
+              },
+            },
+            markup: [
+              {
+                tagName: 'ellipse',
+                selector: 'body',
+              },
+              {
+                tagName: 'text',
+                selector: 'title',
+              },
+              {
+                tagName: 'text',
+                selector: 'text',
+              },
+            ],
+            ports: {...this.ports},
+          },
+          true,
+        )
+        Graph.registerNode(
+          'custom-circle1',
+          {
+            inherit: 'ellipse',
+            width: 65,
+            height: 65,
+            data: {
+              dataId: '',
+              finishDate: ''
+            },
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              //鏃ユ湡
+              text: {
+                // fontFamily: '浠垮畫',
+                fontSize: 12,
+                text: '鏃ユ湡鑺傜偣',
+                fill: '#262626',
+              },
+            },
+            ports: {...this.ports},
+          },
+          true,
+        )
+        Graph.registerNode(
+          'custom-text',
+          {
+            inherit: 'text-block',
+            width: 86,
+            height: 56,
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              text: {
+                text: '涓撲笟',
+                fontSize: 20,
+                style: {
+                  color:'#080808'
+                },
+                refX: '0',
+                refY: -0.5,
+                refY2: 1,
+                textAnchor: 'middle',
+                textVerticalAnchor: 'middle',
+              },
+            },
+            markup: [
+              {
+                tagName: 'rect',
+                selector: 'body',
+              },
+              {
+                tagName: 'text',
+                selector: 'text',
+              },
+            ],
+            ports: {...this.ports},
+          },
+          true,
+        )
+      },
+      getTextDiagram(diagramJson){
+        this.graph.unfreeze()
+        this.graph.fromJSON(diagramJson)
+        this.graph.positionContent('left',{ padding: { left: 0 }})
+        this.graph.freeze()
+        // this.graph.centerContent()
+        // this.graph.zoomToFit()
+      },
+      setScroll(top){
+        this.graph.setScrollbarPosition(null, top)
+      }
+    },
+  }
+</script>
+
+<style >
+  #textDiagram {
+    /*border: 1px solid #dfe3e8;*/
+    width: 100% !important;
+  }
+  /*#textDiagram .x6-graph-scroller.x6-graph-scroller-pannable {*/
+  /*  width:100% !important;*/
+  /*}*/
+
+  .x6-widget-stencil {
+    position: relative;
+    height: 100%;
+  }
+  #textDiagram .x6-node {
+    cursor: default ;
+  }
+  .x6-widget-stencil-content {
+    position: relative;
+    height: 100%;
+  }
+  .my-scroller-text {
+    overflow: auto; /* 闇�瑕佹粴鍔ㄦ椂淇濇寔杩欎釜灞炴�� */
+    scrollbar-width: none; /* 瀵逛簬Firefox */
+  }
+
+  .my-scroller-text::-webkit-scrollbar {
+    display: none; /* 瀵逛簬Chrome, Safari鍜孫pera */
+  }
+</style>
diff --git a/web/src/views/modules/taskReliability/timeDiagramThumbnail.vue b/web/src/views/modules/taskReliability/timeDiagramThumbnail.vue
new file mode 100644
index 0000000..b3678a7
--- /dev/null
+++ b/web/src/views/modules/taskReliability/timeDiagramThumbnail.vue
@@ -0,0 +1,327 @@
+<template>
+    <div id="timeDiagramThumbnail"></div>
+</template>
+
+<script>
+  import {Graph, Shape, Addon, Cell} from '@antv/x6'
+
+  export default {
+    name: "timeDiagramThumbnail",
+    data(){
+      return{
+        graph:null,
+        smallWidth:0,
+        targetNode:{},
+      }
+    },
+    methods:{
+      init() {
+        console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
+        console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
+
+        this.graph = new Graph({
+          container: document.getElementById('timeDiagramThumbnail'),
+          // width:250,
+          height: 150,
+          grid: {
+            visible: false,
+          },
+          translating: {
+            restrict(view) {
+              const cell = view.cell
+              if (cell.isNode() || cell.isEdge()) {
+                const parent = cell.getParent()
+                if (parent) {
+                  return parent.getBBox()
+                }
+              }
+              return null
+            },
+          },
+          interacting: function (cellView) {
+            const data = cellView.cell.getData();
+            if (cellView.cell.isEdge()) {
+              return { edgeMovable : false };
+            }
+            else if (data && data.nodeMovable ) {
+              return { nodeMovable : false };
+            }
+            return true;
+          },
+          // embedding: {
+          //   enabled: true,
+          //   findParent({node}) {
+          //     const bbox = node.getBBox()
+          //     return this.getNodes().filter((node) => {
+          //       // 鍙湁 data.parent 涓� true 鐨勮妭鐐规墠鏄埗鑺傜偣
+          //       const data = node.getData()
+          //       if (data && data.parent) {
+          //         const targetBBox = node.getBBox()
+          //         return bbox.isIntersectWithRect(targetBBox)
+          //       }
+          //       return false
+          //     })
+          //   }
+          // },
+          // autoResize: true,
+          // keyboard: true,
+        })
+        this.graph.centerContent()
+        Graph.registerNode(
+          'custom-rect',
+          {
+            inherit: 'rect',
+            width: 86,
+            height: 26,
+            zIndex: 10,
+            data: {
+              dataId: '',
+              finishDate: '',
+              inspectName: ''
+            },
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: 'none',
+                fill: 'none',
+              },
+              text: {
+                // fontFamily: '浠垮畫',
+                fontSize: 20,
+                fill: '#000',
+              },
+              label: {
+                refX: 0,
+                refY: 0.5,
+                textAnchor: 'start',
+                textVerticalAnchor: 'middle',
+                textWrap: {
+                  text: '鏂囧瓧妯℃澘',
+                  width: -10,      // 瀹藉害鍑忓皯 10px
+                  ellipsis: false,  // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙�
+                  breakWord: true, // 鏄惁鎴柇鍗曡瘝
+                }
+              },
+            },
+            ports: {...this.ports},
+          },
+          true,
+        )
+
+        Graph.registerNode(
+          'custom-polygon',
+          {
+            inherit: 'polygon',
+            width: 86,
+            height: 56,
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              text: {
+                fontSize: 20,
+                fill: '#262626',
+              },
+            },
+            ports: {
+              ...this.ports
+              // items: [
+              //   {
+              //     group: 'top',
+              //   },
+              //   {
+              //     group: 'bottom',
+              //   },
+              // ],
+            },
+          },
+          true,
+        )
+        //
+        Graph.registerNode(
+          'custom-circle',
+          {
+            inherit: 'ellipse',
+            width: 120,
+            height: 120,
+            data: {
+              dataId: '',
+              finishDate: ''
+            },
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              //鏃ユ湡
+              title: {
+                text: '',
+                fontSize: 12,
+                fill: '#262626',
+                refX: 0.5,
+                refY: '100%',
+                refY2: -10,
+                textAnchor: 'middle',
+                textVerticalAnchor: 'bottom',
+              },
+              // 鍚嶇О
+              text: {
+                // fontFamily: '浠垮畫',
+                fontSize: 20,
+                fill: '#262626',
+                textWrap: {
+                  width: 80,      // 瀹藉害涓� 80px鎹㈣
+                  ellipsis: false,  // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙�
+                  breakWord: true, // 鏄惁鎴柇鍗曡瘝
+                }
+              },
+            },
+            markup: [
+              {
+                tagName: 'ellipse',
+                selector: 'body',
+              },
+              {
+                tagName: 'text',
+                selector: 'title',
+              },
+              {
+                tagName: 'text',
+                selector: 'text',
+              },
+            ],
+            ports: {...this.ports},
+          },
+          true,
+        )
+        Graph.registerNode(
+          'custom-circle1',
+          {
+            inherit: 'ellipse',
+            width: 65,
+            height: 65,
+            data: {
+              dataId: '',
+              finishDate: ''
+            },
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              //鏃ユ湡
+              text: {
+                // fontFamily: '浠垮畫',
+                fontSize: 12,
+                text: '鏃ユ湡鑺傜偣',
+                fill: '#262626',
+              },
+            },
+            ports: {...this.ports},
+          },
+          true,
+        )
+        Graph.registerNode(
+          'custom-text',
+          {
+            inherit: 'text-block',
+            width: 86,
+            height: 56,
+            attrs: {
+              body: {
+                strokeWidth: 1,
+                stroke: '#5F95FF',
+                fill: '#EFF4FF',
+              },
+              text: {
+                text: '涓撲笟',
+                fontSize: 20,
+                style: {
+                  color:'#080808'
+                },
+                refX: '0',
+                refY: -0.5,
+                refY2: 1,
+                textAnchor: 'middle',
+                textVerticalAnchor: 'middle',
+              },
+            },
+            markup: [
+              {
+                tagName: 'rect',
+                selector: 'body',
+              },
+              {
+                tagName: 'text',
+                selector: 'text',
+              },
+            ],
+            ports: {...this.ports},
+          },
+          true,
+        )
+
+        this.graph.on('node:moved', ({ e, x, y, node, view }) => {
+         this.$emit('getPoint',x,this.smallWidth)
+        })
+      },
+      getThumbnail(smallDiagramJson){
+        this.graph.fromJSON(smallDiagramJson)
+        this.graph.centerContent()
+        this.smallWidth = this.graph.getContentBBox().width
+        const nodes = this.graph.getNodes()
+        for (const otherNode of nodes) {
+          if (otherNode.parent){
+            this.targetNode = otherNode
+          }
+        }
+        // console.log(this.graph.getContentBBox().width,'DiagramJson11')
+        // this.graph.zoomToFit()
+      },
+      getNodePointX(x,bigWidth){
+        let pointX = Number((x / ( bigWidth /this.smallWidth)).toFixed(0))
+        this.targetNode.position(pointX, this.targetNode.position().y)
+      },
+      // setScroll(top){
+      //   this.graph.setScrollbarPosition(null, top)
+      // }
+    },
+  }
+</script>
+
+<style >
+  #timeDiagramThumbnail {
+    border: 1px solid #dfe3e8;
+    width: 100% !important;
+  }
+  /*#timeDiagramThumbnail .x6-graph-scroller.x6-graph-scroller-pannable {*/
+  /*  width:100% !important;*/
+  /*}*/
+  #timeDiagramThumbnail .x6-edge {
+    cursor: default !important; ;
+  }
+  /*#timeDiagramThumbnail .x6-node {*/
+  /*  cursor: default ;*/
+  /*}*/
+  .x6-widget-stencil {
+    position: relative;
+    height: 100%;
+  }
+
+  .x6-widget-stencil-content {
+    position: relative;
+    height: 100%;
+  }
+  .my-scroller-text {
+    overflow: auto; /* 闇�瑕佹粴鍔ㄦ椂淇濇寔杩欎釜灞炴�� */
+    scrollbar-width: none; /* 瀵逛簬Firefox */
+  }
+
+  .my-scroller-text::-webkit-scrollbar {
+    display: none; /* 瀵逛簬Chrome, Safari鍜孫pera */
+  }
+</style>

--
Gitblit v1.9.1