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