From 664db98c9e8595ce4dd636a27f480e3a08b81ff5 Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期五, 21 二月 2025 11:13:51 +0800 Subject: [PATCH] 新增可忽略的维修时间 --- web/src/views/modules/taskReliability/RBD-edit-img.vue | 1685 +++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 1,214 insertions(+), 471 deletions(-) diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue index 07ec2d5..a83d7e4 100644 --- a/web/src/views/modules/taskReliability/RBD-edit-img.vue +++ b/web/src/views/modules/taskReliability/RBD-edit-img.vue @@ -1,14 +1,14 @@ <template> <div> <el-row :gutter="[8,8]"> - <el-col :span="3"> + <el-col :span="4"> <div :style="'height:' +left_p+'px'"> <div style="height: 100%"> <div id="stencilImg"></div> </div> </div> </el-col> - <el-col :span="21"> + <el-col :span="20"> <div class="fa-card-a"> <el-form :inline="true"> <el-form-item> @@ -16,8 +16,12 @@ </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="analyzeDiagram()">鎻愪氦</el-button> <el-button type="primary" @click="clearDiagram()">娓呯┖鍥惧舰</el-button> + <el-checkbox style="margin: 0 10px 0 10px" v-model="dataForm.autoLayout" :true-label="1" :false-label="0"> + 鏄惁寮�鍚竴閿帓鐗� + </el-checkbox> + <el-button type="primary" @click="layoutDiagram()" :disabled="!dataForm.autoLayout">涓�閿帓鐗�</el-button> <el-button @click="leftAlign()"> <i style="font-size: 1rem;" class="wt-iconfont icon-zuoduiqi"></i> </el-button> @@ -41,16 +45,15 @@ <el-button @click="undo()">鎾ら攢</el-button> <el-button @click="redo()">閲嶅仛</el-button> </el-form-item> + <el-form-item> + <zt-button type="delete" @click="deleteCompment()"/> + </el-form-item> </el-form> <div id="containerImg" style="border: 1px solid #EAEBEE;border-radius: 6px; box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);height: 100%"> </div> - <config-node v-show="type === 'node'" :id="id" :diagramId="diagramId" :globalGridAttr="globalGridAttr" - :graph="graph" - :nodeType="nodeType" - :projectId="projectId" - :shape="shape"/> - <config-edge v-show="type === 'edge'" :id="id" :globalGridAttr="globalGridAttr" :graph="graph"/> + <config-node ref="configNode" v-show="type === 'node'"/> + <config-edge ref="configEdge" v-show="type === 'edge'"/> </div> </el-col> </el-row> @@ -59,19 +62,17 @@ <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 ConfigNode from './ConfigNode/configNode.vue' + import ConfigEdge from './ConfigEdge/configEdge.vue' import {setHartBeat} from '@/commonJS/common'; import Cookies from 'js-cookie' import {getUUID} from '../../../../packages/utils' - import RBDDefault from './RBD-default.json' + // import Mousetrap from 'mousetrap' + // var Mousetrap = require('mousetrap'); + // import RBDDefault from './RBD-default.json' export default { name: 'RBD-edit-img', - /*props: { - - },*/ props: { projectId: { type: String @@ -91,8 +92,434 @@ ConfigNode, ConfigEdge }, + computed: { + RBDDefault() { + let url = `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getSvgImage?token=${Cookies.get('token')}&id=` + let result = ` + { + "cells": + [ + { + "position": { + "x": -600, + "y": 0 + }, + "size": { + "width": 60, + "height": 40 + }, + "attrs": { + "text": { + "refY": "100%", + "textVerticalAnchor": "top", + "text": "", + "refY2": 4 + }, + "image": { + "xlink:href": "${url}10011" + } + }, + "visible": true, + "shape": "image", + "id": "10000", + "data": { + "type": "imageNodes", + "endNodeId": "20000", + "dataId": "", + "nodeType": "start", + "nodeTypeExt": "", + "voteNum": "" + }, + "ports": { + "groups": { + "top": { + "position": { + "name": "top" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "right": { + "position": { + "name": "right" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "bottom": { + "position": { + "name": "bottom" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "left": { + "position": { + "name": "left" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + } + }, + "items": [ + { + "id": "top1", + "group": "top" + }, + { + "id": "right1", + "group": "right" + }, + { + "id": "bottom1", + "group": "bottom" + }, + { + "id": "left1", + "group": "left" + } + ] + }, + "zIndex": 1 + }, + { + "position": { + "x": 0, + "y": 0 + }, + "size": { + "width": 60, + "height": 40 + }, + "attrs": { + "text": { + "refY": "100%", + "textVerticalAnchor": "top", + "text": "", + "refY2": 4 + }, + "image": { + "xlink:href": "${url}10015" + } + }, + "visible": true, + "shape": "image", + "id": 15000, + "data": { + "type": "imageNodes", + "dataId": "", + "nodeType": "dashedBox", + "nodeTypeExt": "", + "voteNum": "" + }, + "ports": { + "groups": { + "top": { + "position": { + "name": "top" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "right": { + "position": { + "name": "right" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "bottom": { + "position": { + "name": "bottom" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "left": { + "position": { + "name": "left" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + } + }, + "items": [ + { + "id": "top1", + "group": "top" + }, + { + "id": "right1", + "group": "right" + }, + { + "id": "bottom1", + "group": "bottom" + }, + { + "id": "left1", + "group": "left" + } + ] + }, + "zIndex": 2 + }, + { + "position": { + "x": 600, + "y": 0 + }, + "size": { + "width": 60, + "height": 40 + }, + "attrs": { + "text": { + "refY": "100%", + "textVerticalAnchor": "top", + "text": "", + "refY2": 4 + }, + "image": { + "xlink:href": "${url}10012" + } + }, + "visible": true, + "shape": "image", + "id": "20000", + "data": { + "type": "imageNodes", + "startNodeId": "10000", + "dataId": "", + "nodeType": "end", + "nodeTypeExt": "", + "voteNum": "" + }, + "ports": { + "groups": { + "top": { + "position": { + "name": "top" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "right": { + "position": { + "name": "right" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "bottom": { + "position": { + "name": "bottom" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + }, + "left": { + "position": { + "name": "left" + }, + "attrs": { + "circle": { + "r": 4, + "magnet": true, + "stroke": "#5F95FF", + "strokeWidth": 1, + "fill": "#fff", + "style": { + "visibility": "hidden" + } + } + } + } + }, + "items": [ + { + "id": "top1", + "group": "top" + }, + { + "id": "right1", + "group": "right" + }, + { + "id": "bottom1", + "group": "bottom" + }, + { + "id": "left1", + "group": "left" + } + ] + }, + "zIndex": 3 + }, + { + "shape": "edge", + "id": "66c81c68-0827-4a3c-8343-e2c453d3e9e7", + "router": { + "name": "manhattan", + "args": { + "startDirections": ["right"], + "endDirections": ["left"] + } + }, + "connector": { + "name": "rounded" + }, + "source": { + "cell": "10000" + }, + "target": { + "cell": 15000 + }, + "zIndex": -1 + }, + { + "shape": "edge", + "id": "a0f3cf90-6d37-4ee0-a254-90b4ec2b6a7f", + "router": { + "name": "manhattan", + "args": { + "startDirections": ["right"], + "endDirections": ["left"] + } + }, + "connector": { + "name": "rounded" + }, + "source": { + "cell": 15000 + }, + "target": { + "cell": "20000" + }, + "zIndex": -1 + } + ] + } + ` + return JSON.parse(result) + } + }, data() { return { + canAdd: true, + nodeX: '', + nodeY: '', isFirstLoad: true, hasMoveNode: false, hasMoveSingleNode: null, @@ -103,40 +530,20 @@ modelType: '', timer: null, imagesList: [ - // {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: {} - // }, - // { - // imgPath: 'connect', - // imgName: 'bridge', - // nodeType: 'bridge', - // imgWidth: 50, - // imgHeight: 50, - // imgId: '12', - // data: {} - // }, { - imgPath: 'parallel', - imgName: 'parallel', - nodeType: 'parallel', + imgPath: 'switch', + imgName: '', + nodeType: 'switch', imgWidth: 50, imgHeight: 50, imgId: '9', data: {} }, - {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 50, imgHeight: 50, imgId: '6', data: {}}, + {imgPath: 'vote', imgName: '', nodeType: 'vote', imgWidth: 50, imgHeight: 50, imgId: '6', data: {}}, { - imgPath: 'switch', - imgName: 'switch', - nodeType: 'switch', + imgPath: 'parallel', + imgName: '', + nodeType: 'parallel', imgWidth: 50, imgHeight: 50, imgId: '5', @@ -144,22 +551,13 @@ }, { imgPath: 'bridgeConnection', - imgName: 'bridgeConnection', + imgName: '', nodeType: 'bridgeConnection', imgWidth: 50, imgHeight: 50, imgId: '10', data: {} }, - // { - // imgPath: 'dashedBox', - // imgName: 'dashedBox', - // nodeType: 'dashedBox', - // imgWidth: 60, - // imgHeight: 60, - // imgId: '10000', - // data: {} - // }, ], imagesList2: [], nodeType: '', @@ -173,10 +571,16 @@ diagramIdDisabled: false, dataForm: { id: null, + pid: null, + model_tag: '', + model_name: '', + product_id: null, content: null, publishContent: null, hasPublish: 0, urlPref: '', + nodeArr: [], + autoLayout: 1, }, type: '', id: '', @@ -185,10 +589,12 @@ productType: '', voteNum: '', repairMttcr: '', - repairMttcrOther: '', + repairMttcrOtherParams2: '', + repairMttcrOtherParams3: '', repairDistribType: '', reliabDistribType: '', - taskMtbcfOther: '', + taskMtbcfOtherParams2: '', + taskMtbcfOtherParams3: '', isRepair: 0, taskMtbcf: '', numberInputValue: '', @@ -211,7 +617,13 @@ stroke: '#5F95FF', strokeWidth: 1, connector: 'rounded', - router: 'manhattan', + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, + }, label: '', nodeStroke: '#5F95FF', nodeStrokeWidth: 1, @@ -345,10 +757,13 @@ token: Cookies.get('token'), } let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params}) - if (res.data !== null && (res.data.content != null)) { - this.dataForm = res.data + this.dataForm = res.data + this.dataForm.autoLayout = parseInt(this.dataForm.autoLayout) + if (res.data.content != null) { + console.log(this.dataForm, 'getDiagram datafrom') + console.log(res.data, 'getDiagram res.data') this.diagramJson = JSON.parse(this.dataForm.content) - this.graph.fromJSON(this.diagramJson) + this.graph.fromJSON(this.diagramJson) this.isFirstLoad = false; console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length') @@ -356,14 +771,14 @@ // this.graph.centerContent() // this.graph.zoomToFit() } else { - this.graph.fromJSON(RBDDefault) + this.graph.fromJSON(this.RBDDefault) this.isFirstLoad = false } }, async clearDiagram() { - this.dataForm.id = null // this.graph.fromJSON(this.emptyJson) - this.graph.fromJSON(RBDDefault) + console.log(this.RBDDefault, 'clearDiagram') + this.graph.fromJSON(this.RBDDefault) this.graph.positionContent('left') this.isFirstLoad = false; // this.graph.centerContent() @@ -392,9 +807,6 @@ } }, }, - // panning: { - // enabled: true, - // }, scroller: { enabled: true, pageVisible: true, @@ -415,9 +827,10 @@ connecting: { router: { name: 'manhattan', - // args: { - // padding: 1, - // }, + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, }, connector: { name: 'rounded', @@ -428,6 +841,7 @@ anchor: 'center', connectionPoint: 'anchor', allowBlank: false, + allowLoop: false, // 鏄惁鍏佽鍒涘缓寰幆杩炵嚎锛屽嵆杈圭殑璧峰鑺傜偣鍜岀粓姝㈣妭鐐逛负鍚屼竴鑺傜偣锛岄粯璁や负 true snap: { radius: 20, }, @@ -435,9 +849,10 @@ return new Shape.Edge({ attrs: { line: { + // sourceMarker: 'block', // 瀹炲績绠ご stroke: '#A2B1C3', strokeWidth: 2, - targetMarker: {fill: 'none'} + targetMarker: null } }, labels: [{ @@ -496,30 +911,56 @@ }) this.graph.centerContent() const stencil = new Addon.Stencil({ - getDragNode: (node) => node.clone({keepId: true}), + // getDragNode: (node) => { + // node.removeAttrs('title') + // }, getDropNode: (node) => { + this.canAdd = true const {width, height} = node.size() - if (node.getData().type && node.getData().nodeType === 'dashedBox') { - return node.clone().size(100, 60) - } 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; // 鍙栨秷娣诲姞鑺傜偣鎿嶄綔 + const nodes = this.graph.getNodes() + let deviceNoArr = [] + + for (const node2 of nodes) { + console.log(node2, 'saveDiagram node') + if (node2.getData().nodeType == 'node' && node2.getData().dataId) { + if (node2.getData().dataId == node.getData().dataId) { + deviceNoArr.push(node2.getData().deviceNo) + } + } + } + let no = 0 + console.log(node, 'node') + console.log(deviceNoArr, 'deviceNoArr') + for (let i = 1; i <= node.getData().basicUnitNum; i++) { + if (deviceNoArr.findIndex(item => item === i) === -1) { + no = i + if (node.getData().basicUnitNum >= 1) { + node.getData().deviceNo = i + if(node.getData().deviceNo > 1){ + node.attr('text/text', node.attr('text/text') + '-' + i) + } + } + break + } + } + if (no === 0) { + this.canAdd = false } } + return node.clone() + + }, + validateNode: (node) => { + if (!this.canAdd) { + this.$message({message: '璇ヨ澶囪妭鐐瑰凡鍦ㄧ敾甯冧笂锛屾棤娉曞啀娆$粯鍒�', type: 'warning'}) + return false + } + }, title: '', target: this.graph, - stencilGraphWidth: 200, + stencilGraphWidth: 240, stencilGraphHeight: 280, collapsable: true, groups: [ @@ -533,13 +974,13 @@ name: 'group2', graphHeight: '', layoutOptions: { - rowHeight: 90, + rowHeight: 100, }, } ], layoutOptions: { columns: 2, - columnWidth: 105, + columnWidth: 130, }, }) document.getElementById('stencilImg').appendChild(stencil.container) @@ -584,79 +1025,149 @@ } let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params}) this.imagesList2 = res.data - console.log(this.imagesList2, 'getProduct(productId)234567890') - let urlObject = window.URL || window.webkitURL || window; + /*for(let i =0;i<this.imagesList2.length;i++){ + }*/ + console.log(this.imagesList2, 'getProduct(productId)234567890') const imageNodes2 = this.imagesList2.map((item) => this.graph.createNode({ shape: 'image', //imageUrl: `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getProductImg?token=${Cookies.get('token')}&id=${item.imgPath}`, width: 60, - height: 60, - id: item.dataId, // 鎵嬪姩璁剧疆鑺傜偣鐨� ID + height: 70, + //id: item.dataId, // 鎵嬪姩璁剧疆鑺傜偣鐨� ID data: { type: 'imageNodes2', - isRepair: item.isRepair, dataId: item.dataId, + basicUnitNum: item.basicUnitNum, + deviceNo: 1, nodeType: item.nodeType, nodeTypeExt: item.nodeTypeExt, productType: item.productType, statusImg: item.statusImg, - reliabDistribType: item.reliabDistribType, - repairDistribType: item.repairDistribType, - repairMttcr: item.repairMttcr, - repairMttcrOther: item.repairMttcrOther, + + reliabDistribType: item.reliabDistribType ? item.reliabDistribType : 1, taskMtbcf: item.taskMtbcf, - taskMtbcfOther: item.taskMtbcfOther, + taskMtbcfOther2: item.taskMtbcfOtherParams2, + taskMtbcfOther3: item.taskMtbcfOtherParams3, + + isRepair: item.isRepair, + repairDistribType: item.repairDistribType ? item.repairDistribType : 1, + repairMttcr: item.repairMttcr, + repairMttcrOther2: item.repairMttcrOtherParams2, + repairMttcrOther3: item.repairMttcrOtherParams3, + successRate: item.successRate, + imgHeight: item.imgHeight, imgWidth: item.imgWidth, voteNum: '', }, attrs: { image: { - 'xlink:href': `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getSvgImage?token=${Cookies.get('token')}&id=${item.imgPath}`, + 'xlink:href': `${window.SITE_CONFIG['apiURL']}/basicInfo/XhProductModel/getImg?token=${Cookies.get('token')}&id=${item.dataId}&t=${new Date().getTime()}`, //'xlink:href': urlObject.createObjectURL(new Blob([item.svgContent])), + }, + title: { + text: item.basicUnitNum > 1 ? item.basicUnitNum : '', + refX: 15, + refY: 10, + fill: '#748be7', + fontSize: 14, + fontWeight: 'bold', + 'text-anchor': 'start', }, text: { text: item.imgName, fontSize: 14, - style: { - color: this.globalGridAttr.nodeColor - }, refX: 0.5, - refY: '100%', + refY: '85%', refY2: 4, textAnchor: 'middle', textVerticalAnchor: 'top', + textWrap: { + width: 120, // 瀹藉害涓� 120px鎹㈣ + ellipsis: false, // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙� + breakWord: true, // 鏄惁鎴柇鍗曡瘝 + } }, }, - tools: [ + markup: [ { - name: 'button', - args: { - markup: [ - { - tagName: 'image', - selector: 'icon', - attrs: { - // 'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*evDjT5vjkX0AAAAAAAAAAAAAARQnAQ', - 'xlink:href': item.statusImg, - width: 30, - height: 30, - x: 0, - y: 0 - } - } - ] - } - } + tagName: 'image', + selector: 'image', + }, + { + tagName: 'text', + selector: 'title', + }, + { + tagName: 'text', + selector: 'text', + }, ], + // tools: [ + // { + // name: 'button', + // args: { + // markup: [ + // { + // tagName: 'image', + // selector: 'icon', + // attrs: { + // 'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*evDjT5vjkX0AAAAAAAAAAAAAARQnAQ', + // // 'xlink:href': item.statusImg, + // width: 30, + // height: 30, + // x: 0, + // y: 0 + // } + // } + // ] + // } + // } + // ], ports: {...this.ports}, }), ) stencil.load(imageNodes, 'group1') stencil.load(imageNodes2, 'group2') +// konami code! + // 鍗曞嚮node鑺傜偣 + // this.graph.on('node:click', ({ e, x, y, node, view}) => { + // Mousetrap.bind('up', function(e) { + // e.preventDefault(); + // node.getBBox().x + // node.getBBox().y + // setTimeout(()=>{ + // node.position(node.getBBox().x,node.getBBox().y -0.5) + // console.log(x,y,'鎸変笅浜嗏啈閿� up'); + // },100) + // }) + // Mousetrap.bind('down', function(e) { + // e.preventDefault(); + // setTimeout(()=>{ + // node.position(node.getBBox().x,node.getBBox().y+0.5) + // console.log(x,y,'鎸変笅浜嗏啌閿� down'); + // },100) + // + // }) + // Mousetrap.bind('left', function(e) { + // e.preventDefault(); + // setTimeout(()=>{ + // node.position(node.getBBox().x-0.5,node.getBBox().y) + // console.log(x,y,'鎸変笅浜嗏啇閿� left'); + // },100) + // + // }) + // Mousetrap.bind('right', function(e) { + // e.preventDefault(); + // setTimeout(()=>{ + // node.position(node.getBBox().x+0.5,node.getBBox().y) + // console.log(x,y,'鎸変笅浜嗏啋閿� right'); + // },100) + // }) + // }) this.graph.bindKey(['meta+c', 'ctrl+c'], () => { const cells = this.graph.getSelectedCells() if (cells.length) { @@ -689,122 +1200,7 @@ }) //delete this.graph.bindKey('delete', () => { - const cells = this.graph.getSelectedCells() - console.log(cells, 'cells') - if (cells.length === 1) { - let node = cells[0] - if (!node.isNode()) { - this.$confirm('鏄惁鍒犻櫎璇ヨ繛鎺ョ嚎鐐�?', '鎻愮ず', { - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - type: 'warning' - }).then(() => { - this.$message({ - type: 'success', - message: '鍒犻櫎鎴愬姛!' - }) - }).catch(() => { - this.$message({ - type: 'info', - message: '宸插彇娑堝垹闄�' - }) - }) - // this.$message({message: '璇烽�変腑鑺傜偣', type: 'warning'}) - return false; // 鍙栨秷鎿嶄綔 - } - let nodeType = node.getData().nodeType - let deleteType = 0 - if (nodeType === 'node' || nodeType === 'dashedBox') { - deleteType = 1 - } else if ('parallel,switch,vote,bridge'.indexOf(nodeType) > -1) { - deleteType = 2 - } - let canDelete = false - if (nodeType === 'start' || nodeType === 'end') { - this.$message({message: '鏃犳硶鍒犻櫎璧峰鍜岀粨鏉熻妭鐐�', type: 'warning'}) - return false; // 鍙栨秷鎿嶄綔 - } - if (deleteType > 0) { - let startNode = null - if (deleteType === 1) { - startNode = node - } else if (deleteType === 2) { - startNode = this.graph.getCellById(node.getData().startNodeId) - } - let isSeriesNode = this.isSeriesNode(startNode, node) - if (isSeriesNode) { - let inLine = this.getInLinesOfNode(startNode) - let outLine = this.getOutLinesOfNode(node) - let inLineIsToLine = this.hasOtherLineToMyLine(inLine[0].id) - let inNode = isSeriesNode.inNode - let outNode = isSeriesNode.outNode - console.log(inLine, outLine, 'inLine,outLine') - console.log(inNode, outNode, 'inNode,outNode') - //鎻愮ず鏄惁瑕佸垹闄� - this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', { - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - type: 'warning' - }).then(() => { - if (inLineIsToLine) { - inLine[0].target = {cell: outNode.id, port: 'left1'} - } else { - outLine[0].source = {cell: inNode.id, port: 'right1'} - } - if (deleteType === 1){ - node.remove() - } - else{ - this.deleteCombination(node) - } - this.$message({ - type: 'success', - message: '鍒犻櫎鎴愬姛!' - }) - }).catch(() => { - this.$message({ - type: 'info', - message: '宸插彇娑堝垹闄�' - }) - return false - }) - } - if (this.isMultipleBrach(node)) { - //鎻愮ず鏄惁瑕佸垹闄� - this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', { - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - type: 'warning' - }).then(() => { - if (inLineIsToLine) { - inLine[0].target = {cell: outNode.id, port: 'left1'} - } else { - outLine[0].source = {cell: inNode.id, port: 'right1'} - } - if (deleteType === 1) - node.remove() - else - this.deleteCombination(node) - this.$message({ - type: 'success', - message: '鍒犻櫎鎴愬姛!' - }) - - }).catch(() => { - this.$message({ - type: 'info', - message: '宸插彇娑堝垹闄�' - }) - return false - }) - } - } - //鎻愮ず涓嶈兘鍒犻櫎 - } else { - //鎻愮ず涓嶈兘鍒犻櫎 - this.$message({message: '鍙兘閫変腑涓�涓妭鐐�', type: 'warning'}) - return false; // 鍙栨秷鎿嶄綔 - } + this.deleteCompment() }) // zoom this.graph.bindKey(['ctrl+1', 'meta+1'], () => { @@ -822,13 +1218,16 @@ }) this.graph.on('blank:click', ({cell}) => { - this.reset() + // this.reset() // this.type.value = "grid" this.type = 'grid' // this.id = cell.id }) // 鐩戝惉鑺傜偣娣诲姞浜嬩欢 this.graph.on('node:added', ({node}) => { + node.setAttrs({ + title: {text: ''}, + }) if (this.isFirstLoad) { return } @@ -837,7 +1236,7 @@ } const nodeType = node.getData().nodeType; // 鑾峰彇鑺傜偣鐨勭被鍨� const nodeObj = node - console.log(123) + console.log(node.id, 'node.id') let intersectNode = this.findIntersectsNode(node) if (intersectNode) { // 褰撴湁鑺傜偣鐩镐氦 ==>骞惰 this.addBranch(intersectNode, nodeObj) @@ -859,41 +1258,33 @@ } } node.remove() - - /*//濡傛灉鑺傜偣涓庤妭鐐圭浉浜� - console.log(node.position().x, node.position().x, 'node.position().x') - if (nodeType === 'bridgeConnection') { - this.getBridgeConnection() - }*/ }); this.graph.on('cell:contextmenu', ({cell}) => { // this.type.value = cell.isNode() ? "node" : "edge" this.type = cell.isNode() ? 'node' : 'edge' - this.shape = cell.shape - this.id = cell.id + /* 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') + //this.nodeType = cell.getData().nodeType + this.$refs.configNode.loadData(cell) + } else { + this.$refs.configNode.loadData(cell) } - // 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.reset() + // edge.attr('line/stroke', 'orange') + // edge.prop('labels/0', { + // attrs: { + // body: { + // stroke: 'orange', + // }, + // }, + // + // }) + }) - }) - }) - // 鍗曞嚮node鑺傜偣 - this.graph.on('node:click', ({node}) => { - }) // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌 this.graph.on('node:delete', ({view, e}) => { e.stopPropagation() @@ -926,57 +1317,57 @@ }) }) - 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: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('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() - }) + // 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' - } - }, + // 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() @@ -995,33 +1386,229 @@ }) }) }, + deleteCompment() { + const cells = this.graph.getSelectedCells() + console.log(cells, 'cells') + if (cells.length === 1) { + let node = cells[0] + if (!node.isNode()) { + this.$confirm('鏄惁鍒犻櫎璇ヨ繛鎺ョ嚎?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + node.remove() + this.$message({ + type: 'success', + message: '鍒犻櫎鎴愬姛!' + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }) + }) + // this.$message({message: '璇烽�変腑鑺傜偣', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 + } + let nodeType = node.getData().nodeType + let deleteType = 0 + if (nodeType === 'node' || nodeType === 'dashedBox') { + deleteType = 1 + } else if ('parallel,switch,vote,bridge'.indexOf(nodeType) > -1) { + deleteType = 2 + } + + let canDelete = false + if (nodeType === 'start' || nodeType === 'end') { + this.$message({message: '涓嶅厑璁稿垹闄よ捣濮嬪拰缁撴潫鑺傜偣', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 + } + if (deleteType > 0) { + let startNode = null + if (deleteType === 1) { + startNode = node + } else if (deleteType === 2) { + startNode = this.graph.getCellById(node.getData().startNodeId) + } + + let isSeriesNode = this.isSeriesNode(startNode, node) + let isMultipleBrach = this.isMultipleBrach(node) + if (isSeriesNode) { + //涓茶仈 + let inLine = this.getInLinesOfNode(startNode) + let outLine = this.getOutLinesOfNode(node) + let inLineIsToLine = this.hasOtherLineToMyLine(inLine[0].id) + let inNode = isSeriesNode.inNode + let outNode = isSeriesNode.outNode + console.log(inLine, outLine, 'inLine,outLine') + console.log(inNode, outNode, 'inNode,outNode') + //鎻愮ず鏄惁瑕佸垹闄� + this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + if (inLineIsToLine) { + inLine[0].target = {cell: outNode.id, port: 'left1'} + } else { + outLine[0].source = {cell: inNode.id, port: 'right1'} + } + if (deleteType === 1) { + node.remove() + } else { + this.deleteCombination(node) + } + this.$message({ + type: 'success', + message: '鍒犻櫎鎴愬姛!' + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }) + return false + }) + } else if (this.isMultipleBrach(node)) { + //鎻愮ず鏄惁瑕佸垹闄� + this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + /* if (inLineIsToLine) { + inLine[0].target = {cell: outNode.id, port: 'left1'} + } else { + outLine[0].source = {cell: inNode.id, port: 'right1'} + }*/ + if (deleteType === 1) + node.remove() + else + this.deleteCombination(node) + this.$message({ + type: 'success', + message: '鍒犻櫎鎴愬姛!' + }) + + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }) + return false + }) + } else { + //鎻愮ず涓嶈兘鍒犻櫎 + this.$message({message: '璇ユ潯绾胯矾涓婂彧鏈夎鑺傜偣锛屾棤娉曞垹闄�', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 + } + } + } else { + //鎻愮ず涓嶈兘鍒犻櫎 + this.$message({message: '鍙兘閫変腑涓�涓妭鐐�', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 + } + }, async search() { await this.getDiagram(); }, async saveDiagram() { console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()') + // 鑾峰彇鎵�鏈夊瓙鑺傜偣 + this.getNodeArr() 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.$emit('refreshDataList') this.$alert('淇濆瓨鎴愬姛', '鎻愮ず', { confirmButtonText: '纭畾' }) } }) }, + getNodeArr() { + const nodes = this.graph.getNodes() + let nodeArr2 = [] + // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜� + for (const node of nodes) { + console.log(node, 'saveDiagram node') + if (node.getData().nodeType == 'node' && node.getData().dataId) { + nodeArr2.push(node.getData().dataId) + } + } + this.dataForm.nodeArr = nodeArr2 + }, async analyzeDiagram() { console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()') + // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜� + // 鑾峰彇鎵�鏈夊瓙鑺傜偣 + this.getNodeArr() + const nodes = this.graph.getNodes() + for (const node of nodes) { + if (node.getData().nodeType === 'dashedBox') { + this.$message({message: '璇ユā鍨嬩腑瀛樺湪铏氭锛屾棤娉曟彁浜�', type: 'warning'}) + return false; + } + if (node.getData().nodeType === 'vote') { + if (node.getData().voteNum === null || node.getData().voteNum === '') { + this.$message({message: '琛ㄥ喅鑺傜偣鐨勮〃鍐虫暟閲忔湭璁剧疆', type: 'warning'}) + return false; + } + const edges = this.graph.getIncomingEdges(node); + if (node.getData().voteNum >= edges.length) { + this.$message({message: '琛ㄥ喅鑺傜偣鐨勮〃鍐虫暟閲忓繀椤诲皬浜庤鑺傜偣鐨勮繘绾挎暟閲�', type: 'warning'}) + return false; + } + } + if (node.getData().nodeType === 'switch') { + if (node.getData().voteNum === null || node.getData().voteNum === '') { + this.$message({message: '鏃佽仈鑺傜偣鐨勫浠芥暟閲忔湭璁剧疆', type: 'warning'}) + return false; + } + const edges = this.graph.getIncomingEdges(node); + if (node.getData().voteNum >= edges.length) { + this.$message({message: '鏃佽仈鑺傜偣鐨勫浠芥暟閲忓繀椤诲皬浜庤鑺傜偣鐨勮繘绾挎暟閲�', type: 'warning'}) + return false; + } + } + } 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瀽鎴愬姛', '鎻愮ず', { + this.$emit('refreshDataList') + this.$alert('鎻愪氦鎴愬姛', '鎻愮ず', { confirmButtonText: '纭畾' }) } }) + }, + async layoutDiagram() { + if (this.dataForm.autoLayout == 1) { + 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/layout`, this.dataForm).then(async res => { + if (res.msg === 'success') { + // this.$emit('refreshDataList') + // this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', { + // confirmButtonText: '纭畾' + // }) + console.log(res.data, 'layoutDiagram res.data') + this.dataForm.content = res.data.content + console.log(this.dataForm.content, 'layoutDiagram dataForm.content') + this.diagramJson = JSON.parse(this.dataForm.content) + this.graph.fromJSON(this.diagramJson) + this.isFirstLoad = false; + // console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length') + + this.graph.positionContent('left') + } + }) + } }, leftAlign() { const NODE = this.graph.getSelectedCells() @@ -1161,13 +1748,13 @@ let dragNodeType = dragNode.getData().nodeType let offHeight = 50 if (dragNodeType === 'node') { - offHeight = 60 + offHeight = 70 } else if (dragNodeType === 'bridgeConnection') { offHeight = 175 } else { offHeight = 70 } - let centerX = 0, centerY = 0; + let centerX = 0, centerY = 0; if (graphNodeType === 'dashedBox') { //铏氭 const edges = this.graph.getConnectedEdges(graphNode); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾� @@ -1184,17 +1771,26 @@ endNode = this.graph.getCellById(endNodeId) } if (startNode && endNode) { - centerX = graphNode.position().x+graphNode.getBBox().width/2 - centerY = graphNode.position().y+graphNode.getBBox().height/2 + centerX = graphNode.position().x + graphNode.getBBox().width / 2 + centerY = graphNode.position().y + graphNode.getBBox().height / 2 let result = this.addNodeAndConnect(graphNode, dragNode, centerX, centerY) - if (!result){ - dragNode.remove() - this.$message({message: '娌℃湁瓒冲鐨勭┖闂存斁缃鑺傜偣锛岃鎵╁ぇ鍓╀綑绌洪棿', type: 'warning'}) - return + + let startPort = 'right1' + let endPort = 'left1' + if ((inEdges[0].target.port == 'top1' || outEdges[0].source.port == 'bottom1') && ('parallel,switch,vote,bridge'.indexOf(dragNodeType)) == -1) { + startPort = 'bottom1' + endPort = 'top1' } - inEdges[0].target = {cell: result.newStartNode.id, port: 'left1'} - outEdges[0].source = {cell: result.newEndNode.id, port: 'right1'} + + inEdges[0].target = {cell: result.newStartNode.id} + outEdges[0].source = {cell: result.newEndNode.id} graphNode.remove() + if (this.dataForm.autoLayout == 1) { + if (!result.canPlace) { + //璋冪敤鑷姩鎺掔増 + this.layoutDiagram() + } + } } } else { //骞惰缁撴瀯 const graphNodeStartNodeId = graphNode.getData().startNodeId // 鑾峰彇鐢诲竷涓婂師鏈夎妭鐐圭殑寮�濮婭D @@ -1212,122 +1808,179 @@ this.getYRange(inEdges, graphNodeStartNode, pointXY) console.log(pointXY, 'new') - let minX = graphNodeStartNode.position().x + graphNode.getBBox().width+15 - let maxX = graphNode.position().x + let minX = graphNodeStartNode.position().x + graphNode.getBBox().width + let maxX = graphNode.position().x - dragNode.getBBox().width / 2 let centerX = minX + (maxX - minX) / 2 - let centerY = graphNodeY+ graphNode.getBBox().height/2 - pointXY.minY > pointXY.maxY - (graphNodeY+ graphNode.getBBox().height/2) ? - pointXY.maxY + offHeight/2 + 30 : pointXY.minY - offHeight/2 - 30 + let centerY = graphNodeY + graphNode.getBBox().height / 2 - pointXY.minY > pointXY.maxY - (graphNodeY + graphNode.getBBox().height / 2) ? + pointXY.maxY + offHeight / 2 + 30 : pointXY.minY - offHeight / 2 - 30 - let result = this.addNodeAndConnect(null, dragNode, minX, centerY) - if (!result){ - dragNode.remove() - this.$message({message: '娌℃湁瓒冲鐨勭┖闂存斁缃鑺傜偣锛岃鎵╁ぇ鍓╀綑绌洪棿', type: 'warning'}) - return + let result = this.addNodeAndConnect(null, dragNode, centerX, centerY) + console.log(result, 'result111') + this.graph.addEdge({ + source: {cell: graphNodeStartNode}, + target: {cell: result.newStartNode}, + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 + }) + this.graph.addEdge({ + source: {cell: result.newEndNode}, + target: {cell: graphNode}, + router: { + name: 'manhattan', + args: { + startDirections: ['right'], // 浠庝笅鏂瑰紑濮� + endDirections: ['top', 'bottom'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 + }) + if (this.dataForm.autoLayout == 1) { + if (!result.canPlace) { + //璋冪敤鑷姩鎺掔増 + this.layoutDiagram() + } } - this.graph.addEdge({ - source: {cell: graphNodeStartNode, port: 'right1'}, - target: {cell: result.newStartNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} - }) - this.graph.addEdge({ - source: {cell: result.newEndNode, port: 'right1'}, - target: {cell: graphNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} - }) } }, addNodeAndConnect(targetNode, dragNode, centerX, centerY) { // graphCell鏄敾甯冧笂鍘熸湁鐨勮妭鐐广�俤ragNode鏄綋鍓嶆嫋鎷界殑鑺傜偣 - let width =100, + let width = 100, height = 80, - leftTopX = centerX , + leftTopX = centerX, leftTopY = centerY let dragNodeType = dragNode.getData().nodeType if (dragNodeType === 'node') { - width =60 - height = 60 - }else if (dragNodeType === 'dashedBox') { - width =100 - height = 60 + width = 100 + height = 70 + } else if (dragNodeType === 'dashedBox') { + width = 60 + height = 40 } else if (dragNodeType === 'bridgeConnection') { - width =550 + width = 550 height = 175 } else { - width =270 - height = 60 + width = 270 + height = 70 } - leftTopX = centerX - width/2 - leftTopY = centerY - height/2 - if (!this.canPlace(targetNode,dragNode,{leftTopX, leftTopY, width, height})){ - return false + leftTopX = centerX - width / 2 + leftTopY = centerY - height / 2 + let canPlace = true; + if (!this.canPlace(targetNode, dragNode, {leftTopX, leftTopY, width, height})) { + canPlace = false } if (dragNodeType === 'node' || dragNodeType === 'dashedBox') { dragNode.position(leftTopX, leftTopY) - return {newStartNode: dragNode, newEndNode: dragNode} + return {newStartNode: dragNode, newEndNode: dragNode, canPlace: canPlace} } else if (dragNodeType === 'bridgeConnection') { - return this.createBridgeConnection(leftTopX, leftTopY, dragNode) + return { + ...this.createBridgeConnection(leftTopX, leftTopY, dragNode), + ...{canPlace: canPlace} + } } else { - return this.createParallelBrach(leftTopX, centerY, dragNode) + return { + ...this.createParallelBrach(leftTopX, centerY, dragNode), + ...{canPlace: canPlace} + } } }, // 鐩镐氦鐨勮竟 addNodeAndInsertEdge(graphEdge, dragNode) { - const Source = graphEdge.getSourceCell() - const Target = graphEdge.getTargetCell() + const source = graphEdge.getSourceCell() + const target = graphEdge.getTargetCell() - let centerY = Source.position().y + Source.getBBox().height/2 - if (Target.getData().nodeType === 'node'){ - centerY = Target.position().y + Target.getBBox().height/2 + let centerX = 0 + let centerY = 0 + if (!source.isNode() || !target.isNode()) { + if (source.isNode()) { + centerX = source.position().x + source.getBBox().width / 2 + centerY = dragNode.position().y + dragNode.getBBox().height / 2 + } else { + centerX = target.position().x + target.getBBox().width / 2 + centerY = dragNode.position().y + dragNode.getBBox().height / 2 + } + } else { + centerX = dragNode.position().x + dragNode.getBBox().width / 2 + centerY = source.position().y + source.getBBox().height / 2 + if (target.getData().nodeType === 'node' || target.getData().nodeType === 'dashedBox') { + centerY = target.position().y + target.getBBox().height / 2 + } } - console.log(Source,'Source 璧峰鐐逛俊鎭�') - console.log(Target,'Target 缁堟鐐逛俊鎭�') - console.log(Source.position().y,'璧峰鐐圭殑Y鍧愭爣') - console.log(Target.position().y,'缁堟鐐圭殑Y鍧愭爣') let startNodeId = graphEdge.source.cell let startNode = this.graph.getCellById(startNodeId) let endNodeId = graphEdge.target.cell let endNode = this.graph.getCellById(endNodeId) + if (startNode && endNode) { - let isRight = true; - let startPort = 'right1' - let endPort = 'left1' + let routerStart = ['right']; + let routerEnd = ['left']; if (this.isTopBottom(graphEdge)) { - startPort = 'bottom1' - endPort = 'top1' + routerStart = ['top', 'bottom']; + routerEnd = ['top', 'bottom']; } + + let isRight = true; if (this.hasOtherLineToMyLine(graphEdge.id)) { let leftX = startNode.position().x + startNode.getBBox().width let rightX = endNode.position().x - let centerX = dragNode.position().x + dragNode.getBBox().width / 2 + // let centerX = dragNode.position().x + dragNode.getBBox().width / 2 if (centerX - leftX < rightX - centerX) { isRight = false } } - let result = this.addNodeAndConnect(null, dragNode, dragNode.position().x, centerY) - if (!result){ - dragNode.remove() - this.$message({message: '娌℃湁瓒冲鐨勭┖闂存斁缃鑺傜偣锛岃鎵╁ぇ鍓╀綑绌洪棿', type: 'warning'}) - return - } if (isRight) { - graphEdge.target = {cell: result.newStartNode.id, port: endPort} + if (endNode.getData()) { + if ("parallel,vote,bridge".indexOf(endNode.getData().nodeType) > -1) { + isRight = false + } + } + } + let result = this.addNodeAndConnect(null, dragNode, centerX, centerY) + + if (isRight) { + graphEdge.target = {cell: result.newStartNode.id} this.graph.addEdge({ - source: {cell: result.newEndNode, port: startPort}, - target: {cell: endNode, port: endPort}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: result.newEndNode}, + target: {cell: endNode}, + router: { + name: 'manhattan', + args: { + startDirections: routerStart, // 浠庝笅鏂瑰紑濮� + endDirections: routerEnd, // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) } else { this.graph.addEdge({ - source: {cell: startNode, port: startPort}, - target: {cell: result.newStartNode, port: endPort}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: startNode}, + target: {cell: result.newStartNode}, + router: { + name: 'manhattan', + args: { + startDirections: routerStart, // 浠庝笅鏂瑰紑濮� + endDirections: routerEnd, // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) - graphEdge.source = {cell: result.newEndNode.id, port: startPort} + graphEdge.source = {cell: result.newEndNode.id} + } + if (this.dataForm.autoLayout == 1) { + if (!result.canPlace) { + //璋冪敤鑷姩鎺掔増 + this.layoutDiagram() + } } // graphEdge.remove() } @@ -1359,46 +2012,79 @@ createParallelBrach(x, y, dragNode) { dragNode.position(x + 320, y - dragNode.size().height / 2) const connectNode = this.createConnectNode(x + 50, y) + this.createBrach(dragNode, connectNode, x, y - 50) + this.createBrach(dragNode, connectNode, x, y + 50) + + return {newStartNode: connectNode, newEndNode: dragNode} + }, + createBrach(dragNode, connectNode, x, y) { const dashedBox = this.createDashedBox(x + 150, y) dragNode.setData({startNodeId: connectNode.id}) this.graph.addEdge({ - source: {cell: connectNode, port: 'right1'}, - target: {cell: dashedBox, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: connectNode}, + target: {cell: dashedBox}, + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) this.graph.addEdge({ - source: {cell: dashedBox, port: 'right1'}, - target: {cell: dragNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: dashedBox}, + target: {cell: dragNode}, + router: { + name: 'manhattan', + args: { + startDirections: ['right'], // 浠庝笅鏂瑰紑濮� + endDirections: ['top', 'bottom'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) - return {newStartNode: connectNode, newEndNode: dragNode} - /* this.graph.addEdge({ - source: {cell: startNode, port: 'right1'}, - target: {cell: connectNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} - }) - this.graph.addEdge({ - source: {cell: dragNode, port: 'right1'}, - target: {cell: endNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} - })*/ }, createBridgeConnection(x, y, dragNode) { - console.log(x,y,'leftX centerY') + console.log(x, y, 'leftX centerY') const leftTopDashedBox = this.createDashedBox(x + 40, y) const rightTopDashedBox = this.createDashedBox(x + 380, y) const leftConnectNode = this.createConnectNode(x, y + 87) - const alignCenterDashedBox = this.createDashedBox(x+ 210, y + 87) - const rightConnectNode = this.createBridgeNode(x + 530, y + 87) + const alignCenterDashedBox = this.createDashedBox(x + 209, y + 87) + const leftBottomDashedBox = this.createDashedBox(x + 40, y + 160) + const rightBottomDashedBox = this.createDashedBox(x + 380, y + 160) + let edgeTop = this.graph.addEdge({ + source: {cell: leftTopDashedBox}, + target: {cell: rightTopDashedBox}, + router: { + name: 'manhattan', + args: { + startDirections: ['right'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 + }) + let edgeBottom = this.graph.addEdge({ + source: {cell: leftBottomDashedBox}, + target: {cell: rightBottomDashedBox}, + router: { + name: 'manhattan', + args: { + startDirections: ['right'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 + }) - const leftBottomDashedBox = this.createDashedBox(x+ 50, y + 160) - const rightBottomDashedBox = this.createDashedBox(x + 370 , y + 160) + const rightConnectNode = this.createBridgeNode(x + 530, y + 87, leftConnectNode.id, edgeTop.id, edgeBottom.id) rightConnectNode.setData({startNodeId: leftConnectNode.id}) leftConnectNode.setData({endNodeId: rightConnectNode.id}) @@ -1415,55 +2101,84 @@ connector: {name: 'rounded'} })*/ this.graph.addEdge({ - source: {cell: leftConnectNode, port: 'right1'}, - target: {cell: leftTopDashedBox, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: leftConnectNode}, + target: {cell: leftTopDashedBox}, + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], + endDirections: ['left'], + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) this.graph.addEdge({ - source: {cell: leftConnectNode, port: 'right1'}, - target: {cell: leftBottomDashedBox, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} - }) - - let edgeTop = this.graph.addEdge({ - source: {cell: leftTopDashedBox, port: 'right1'}, - target: {cell: rightTopDashedBox, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} - }) - let edgeBottom = this.graph.addEdge({ - source: {cell: leftBottomDashedBox, port: 'right1'}, - target: {cell: rightBottomDashedBox, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: leftConnectNode}, + target: {cell: leftBottomDashedBox}, + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['left'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) this.graph.addEdge({ - source: {cell: rightTopDashedBox, port: 'right1'}, - target: {cell: rightConnectNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: rightTopDashedBox}, + target: {cell: rightConnectNode}, + router: { + name: 'manhattan', + args: { + startDirections: ['right'], // 浠庝笅鏂瑰紑濮� + endDirections: ['top', 'bottom'], // 鍚戝乏鏂圭粨鏉� + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) this.graph.addEdge({ - source: {cell: rightBottomDashedBox, port: 'right1'}, - target: {cell: rightConnectNode, port: 'left1'}, - router: {name: 'manhattan'}, - connector: {name: 'rounded'} + source: {cell: rightBottomDashedBox}, + target: {cell: rightConnectNode}, + router: { + name: 'manhattan', + args: { + startDirections: ['right'], + endDirections: ['top', 'bottom'], + }, + }, + connector: {name: 'rounded'}, + zIndex: -1 }) this.graph.addEdge({ source: {cell: edgeTop}, - target: {cell: alignCenterDashedBox, port: 'top1'}, - router: {name: 'manhattan'}, + target: {cell: alignCenterDashedBox}, + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['top', 'bottom'], // 鍚戝乏鏂圭粨鏉� + }, + }, connector: {name: 'rounded'}, + zIndex: -1 }) this.graph.addEdge({ - source: {cell: alignCenterDashedBox, port: 'bottom1'}, + source: {cell: alignCenterDashedBox}, target: {cell: edgeBottom}, - router: {name: 'manhattan'}, + router: { + name: 'manhattan', + args: { + startDirections: ['top', 'bottom'], // 浠庝笅鏂瑰紑濮� + endDirections: ['top', 'bottom'], // 鍚戝乏鏂圭粨鏉� + }, + }, connector: {name: 'rounded'}, + zIndex: -1 }) dragNode.remove() return {newStartNode: leftConnectNode, newEndNode: rightConnectNode} @@ -1473,8 +2188,8 @@ let dashedBox = this.graph.addNode({ shape: 'image', // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), - width: 100, - height: 60, + width: 60, + height: 40, id: dashId, data: { isSelfCreated: true, @@ -1489,7 +2204,7 @@ 'xlink:href': '/modelImg/dashedBox.svg', }, text: { - text: 'dashedBox', + text: '', fontSize: 14, refX: 0.5, refY: '100%', @@ -1525,7 +2240,7 @@ 'xlink:href': '/modelImg/connect.svg', }, text: { - text: 'connect', + text: '', fontSize: 14, refX: 0.5, refY: '100%', @@ -1539,18 +2254,19 @@ connectNode.position(x, y - connectNode.size().height / 2) return connectNode }, - createBridgeNode(x, y) { - const connectId = getUUID().toString() + createBridgeNode(x, y, connectId, edgeTopId, edgeBottomId) { const dragNodeId = getUUID().toString() let bridgeNode = this.graph.addNode({ shape: 'image', width: 30, height: 30, - id: connectId, + id: dragNodeId, data: { isSelfCreated: true, type: 'imageNodes', - endNodeId: dragNodeId, + startNodeId: connectId, + edgeTopId: edgeTopId, + edgeBottomId: edgeBottomId, dataId: '', nodeType: 'bridge', nodeTypeExt: '', @@ -1649,9 +2365,20 @@ return false }, isTopBottom(edge) { - if (edge.source.port === 'top1' || edge.source.port === 'bottom1' || edge.target.port === 'top1' || edge.target.port === 'bottom1') { + if (this.hasTopBottom(edge.getRouter().args.startDirections) && this.hasTopBottom(edge.getRouter().args.endDirections)) { return true } + return false + }, + hasTopBottom(object) { + let result = false + for (let a of object) { + if (a == "top" || a == "bottom") { + result = true + break + } + } + return result }, isMultipleBrach(node) { let outEdges = this.getOutLinesOfNode(node) @@ -1719,30 +2446,30 @@ console.log(edges, '鑾峰彇鐢诲竷涓婄殑缁撴潫鑺傜偣鎵�鏈夌殑绾� edges') return edges.filter(edge => edge.source.cell === node.id) }, - canPlace(targetNode,dragNode,box2){ + canPlace(targetNode, dragNode, box2) { const nodes = this.graph.getNodes() let intersectNodes = [] // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜� for (const otherNode of nodes) { if (otherNode === dragNode || otherNode === targetNode) continue; - const bbox1 = otherNode.getBBox(); - if (bbox1.x < box2.leftTopX + box2.width && - bbox1.x + bbox1.width > box2.leftTopX && - bbox1.y < box2.leftTopY + box2.height && - bbox1.y + bbox1.height > box2.leftTopY) { - intersectNodes.push(otherNode); - } + const bbox1 = otherNode.getBBox(); + if (bbox1.x < box2.leftTopX + box2.width && + bbox1.x + bbox1.width > box2.leftTopX && + bbox1.y < box2.leftTopY + box2.height && + bbox1.y + bbox1.height > box2.leftTopY) { + intersectNodes.push(otherNode); + } } - console.log(box2,'box2') - console.log(intersectNodes,'intersectNodes') + console.log(box2, 'box2') + console.log(intersectNodes, 'intersectNodes') return intersectNodes.length <= 0; }, - undo(){ + undo() { if (this.graph.history.canUndo()) { this.graph.history.undo() } }, - redo(){ + redo() { if (this.graph.history.canRedo()) { this.graph.history.redo() } @@ -1754,7 +2481,7 @@ <style> #containerImg { display: flex; - border: 1px solid #dfe3e8; + /*border: 1px solid #dfe3e8;*/ height: 400px; width: 100% !important; } @@ -1788,4 +2515,20 @@ top: 0 } + #containerImg .x6-graph-pagebreak>.x6-graph-pagebreak-horizontal { + position: absolute; + right: 0; + left: 0; + box-sizing: border-box; + height: 0; + border-top: none; + } + #containerImg .x6-graph-pagebreak>.x6-graph-pagebreak-vertical { + position: absolute; + top: 0; + bottom: 0; + box-sizing: border-box; + width: 0; + border-left: none; + } </style> -- Gitblit v1.9.1