From 7b02e5ed98cab7df7c52949c5bba298d1060329b Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期四, 09 五月 2024 14:50:18 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- web/src/views/modules/taskReliability/RBD-edit-img.vue | 958 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 703 insertions(+), 255 deletions(-) diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue index 0878f72..8984205 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="4"> + <el-col :span="3"> <div :style="'height:' +left_p+'px'"> <div style="height: 100%"> <div id="stencilImg"></div> </div> </div> </el-col> - <el-col :span="20"> + <el-col :span="21"> <div class="fa-card-a"> <el-form :inline="true"> <el-form-item> @@ -60,6 +60,7 @@ import {removeCurrentTabHandle} from '@/commonJS/common' import {setHartBeat} from '@/commonJS/common'; import Cookies from 'js-cookie' + import {getUUID} from '../../../../packages/utils' export default { name: 'RBD-edit-img', @@ -87,6 +88,7 @@ }, data() { return { + isFirstLoad: true, hasMoveNode: false, hasMoveSingleNode: null, nodeAdded: false, @@ -96,26 +98,26 @@ 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: 'switch', - imgName: 'switch', - nodeType: 'switch', - imgWidth: 60, - imgHeight: 60, - imgId: '5', - data: {} - }, + // {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', @@ -127,12 +129,12 @@ }, {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}}, { - imgPath: 'dashedBox', - imgName: 'dashedBox', - nodeType: 'dashedBox', + imgPath: 'switch', + imgName: 'switch', + nodeType: 'switch', imgWidth: 60, imgHeight: 60, - imgId: '9', + imgId: '5', data: {} }, { @@ -141,7 +143,16 @@ nodeType: 'bridgeConnection', imgWidth: 60, imgHeight: 60, - imgId: '9', + imgId: '10', + data: {} + }, + { + imgPath: 'dashedBox', + imgName: 'dashedBox', + nodeType: 'dashedBox', + imgWidth: 60, + imgHeight: 60, + imgId: '10000', data: {} }, ], @@ -346,6 +357,7 @@ console.log(this.dataForm, 'init(row){') }, async getDiagram(modelId) { + this.isFirstLoad = true; let params = { modelId: modelId, urlPref: window.SITE_CONFIG['apiURL'], @@ -355,11 +367,12 @@ if (res.data !== null && (res.data.content != null)) { this.dataForm = res.data this.diagramJson = JSON.parse(this.dataForm.content) - if(this.diagramJson.cells.length!==0){ + if (this.diagramJson.cells.length !== 0) { this.graph.fromJSON(this.diagramJson) - }else { + } else { this.initCells() } + this.isFirstLoad = false; console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length') this.graph.positionContent('left') @@ -444,7 +457,7 @@ line: { stroke: '#A2B1C3', strokeWidth: 2, - targetMarker: 'classic' + targetMarker: {fill: 'none'} } }, labels: [{ @@ -471,7 +484,7 @@ attrs: {fill: '#666'}, }, }, - zIndex: 0, + zIndex: -100, }) }, validateConnection({targetMagnet}) { @@ -505,9 +518,9 @@ const stencil = new Addon.Stencil({ getDragNode: (node) => node.clone({keepId: true}), getDropNode: (node) => { - const { width, height } = node.size() - if(node.getData().type && node.getData().nodeType === 'dashedBox'){ - return node.clone().size(170, 90) + const {width, height} = node.size() + if (node.getData().type && node.getData().nodeType === 'dashedBox') { + return node.clone().size(100, 80) } if (node.getData().type && node.getData().type === 'imageNodes2') { return node.clone({keepId: true}) @@ -533,7 +546,7 @@ { title: '杩愮畻绗﹀彿', name: 'group1', - graphHeight: 360, + graphHeight: 260, }, { title: '璁惧鑺傜偣', @@ -556,9 +569,12 @@ // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), width: item.imgWidth, height: item.imgHeight, + id: item.imgId, data: { type: 'imageNodes', dataId: '', + startNodeId: '', + endNodeId: '20000', nodeType: item.nodeType, nodeTypeExt: '', voteNum: '' @@ -703,23 +719,83 @@ //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: '宸插彇娑堝垹闄�' - }) - }) + console.log(cells, 'cells') + if (cells.length === 1) { + let node = cells[0] + if (!node.isNode()) { + this.$message({message: '璇烽�変腑鑺傜偣', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 + } + let nodeType = node.getData().nodeType + let deleteType = 0 + if (nodeType === 'node' || nodeType === 'dashedBox') { + deleteType = 1 + } else if ('parallel,switch,vote,bridge'.indexOf(nodeType) > -1) { + deleteType = 2 + } + let canDelete = false + if (nodeType === 'start' || nodeType === 'end') { + this.$message({message: '鏃犳硶鍒犻櫎璧峰鍜岀粨鏉熻妭鐐�', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 + } + if (deleteType > 0) { + let startNode = null + if (deleteType === 1) { + startNode = node + } else if (deleteType === 2) { + startNode = this.graph.getCellById(node.getData().startNodeId) + } + let isSeriesNode = this.isSeriesNode(startNode, node) + if (isSeriesNode) { + let inLine = this.getInLinesOfNode(startNode) + let outLine = this.getOutLinesOfNode(node) + let inLineIsToLine = this.hasOtherLineToMyLine(inLine[0].id) + let inNode = isSeriesNode.inNode + let outNode = isSeriesNode.outNode + console.log(inLine, outLine, 'inLine,outLine') + console.log(inNode, outNode, 'inNode,outNode') + if (inLineIsToLine) { + inLine[0].target = {cell: outNode.id, port: 'left1'} + } else { + outLine[0].source = {cell: inNode.id, port: 'right1'} + } + //鎻愮ず鏄惁瑕佸垹闄� + this.$confirm('鏄惁鍒犻櫎璇ヨ妭鐐�?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + if (deleteType === 1){ + node.remove() + } + else{ + this.deleteCombination(node) + } + this.$message({ + type: 'success', + message: '鍒犻櫎鎴愬姛!' + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }) + }) + } + if (this.isMultipleBrach(node)) { + //鎻愮ず鏄惁瑕佸垹闄� + if (deleteType === 1) + node.remove() + else + this.deleteCombination(node) + return + } + } + //鎻愮ず涓嶈兘鍒犻櫎 + } else { + //鎻愮ず涓嶈兘鍒犻櫎 + this.$message({message: '鍙兘閫変腑涓�涓妭鐐�', type: 'warning'}) + return false; // 鍙栨秷鎿嶄綔 } }) // zoom @@ -745,79 +821,48 @@ }) // 鐩戝惉鑺傜偣娣诲姞浜嬩欢 this.graph.on('node:added', ({node}) => { - const nodeId = node.id; // 鑾峰彇鑺傜偣鐨勫敮涓� ID + if (this.isFirstLoad) { + return + } + if (node.getData().isSelfCreated) { + return + } + const nodeType = node.getData().nodeType; // 鑾峰彇鑺傜偣鐨勭被鍨� 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); + console.log(123) + let intersectNode = this.findIntersectsNode(node) + if (intersectNode) { // 褰撴湁鑺傜偣鐩镐氦 ==>骞惰 + this.addBranch(intersectNode, nodeObj) + return + } else { + let isSelfCreated = null + try { + isSelfCreated = node.getData().isSelfCreated + } catch (e) { } - } - 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); - }) - } - }); - // 鐩戝惉鑺傜偣浣嶇疆鏀瑰彉浜嬩欢 - this.graph.on('node:change:position', ({node}) => { - this.hasMoveNode = true - this.hasMoveSingleNode = node - }); - // 鎶捣 - this.graph.on('node:mouseup', ({e,x,y,node}) => { - - if (this.hasMoveNode) { - const selectionNodes = this.graph.getSelectedCells().filter(node => node.isNode() ) - if (selectionNodes.length == 0){ - selectionNodes.push(this.hasMoveSingleNode) - } - //let selectionNodes = [] - console.log('妯潗鏍囷細',x,'绾靛潗鏍囷細'+y) - // let allNodes = this.graph.getNodes() - // - // for(let node of allNodes){ - // if (this.graph.isSelected(node)){ - // selectionNodes.push(node) - // } - // - // } - // 鑾峰彇鍖呭惈鎸囧畾鍧愭爣鐐圭殑鑺傜偣 - const nodes = this.graph.getNodes(); - let hasNodes = [] - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i]; - const bbox = node.getBBox(); - if (x>=bbox.x && x <= bbox.x + bbox.width && y>=bbox.y && y <= bbox.y + bbox.height) { - if ( selectionNodes.indexOf(node)===-1) { - hasNodes.push(node); - } + if (!isSelfCreated) { + let intersectEdge = this.findIntersectsEdge(this.graph, node) + if (intersectEdge) { // 褰撴湁杈圭浉浜� ==>涓茶仈 + this.addNodeAndInsertEdge(intersectEdge, nodeObj) + return + } else { + //鎻愮ず } } - if(hasNodes){} - console.log('鑾峰彇鍖呭惈鎸囧畾鍧愭爣鐐圭殑鑺傜偣闆嗗悎',hasNodes) - console.log('閫変腑鐨勮妭鐐归泦鍚堬細',selectionNodes) - - // if (selectionNodes.length>2) - // this.graph.addEdge({ - // source: {cell: selectionNodes[0], port: 'left1'}, - // target: {cell: selectionNodes[selectionNodes.length-1], port: 'right1'}, - // router: {name: 'manhattan'}, - // connector: {name: 'rounded'} - // }) - this.hasMoveNode = false - this.hasMoveSingleNode = null - - - // console.log('绉诲姩杩囪妭鐐癸紙澶氫釜锛夊啀鎶捣榧犳爣鍚庡緱鍒扮殑鑺傜偣',selectedNodes); } + node.remove() + + /*//濡傛灉鑺傜偣涓庤妭鐐圭浉浜� + console.log(node.position().x, node.position().x, 'node.position().x') + if (nodeType === 'bridgeConnection') { + this.getBridgeConnection() + }*/ }); + // 鐩戝惉鑺傜偣浣嶇疆鏀瑰彉浜嬩欢 + // this.graph.on('node:change:position', ({node}) => { + // this.hasMoveNode = true + // this.hasMoveSingleNode = node + // }); this.graph.on('cell:click', ({cell}) => { // this.type.value = cell.isNode() ? "node" : "edge" this.type = cell.isNode() ? 'node' : 'edge' @@ -1080,154 +1125,168 @@ } }, // 瀹氫箟鍑芥暟鏉ユ鏌ヤ袱涓寘鍥存鏄惁鐩镐氦 - 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 nodeObjType = nodeObj.getData().nodeType // 鑾峰彇褰撳墠鎷栨嫿鐨勮妭鐐圭被鍨� - const edges = this.graph.getConnectedEdges(node); // 鑾峰彇涓庡師鑺傜偣鐩稿叧鑱旂殑鎵�鏈夎繛鎺ョ嚎 - let TopSum = 0 // 鍦ㄥ師鑺傜偣涓婃柟 - let BottomSum = 0 // 鍦ㄥ師鑺傜偣涓嬫柟 - const edgesSum = edges.length - if ((nodeType === 'end'|| nodeType === 'vote' || nodeType === 'switch' || nodeType === 'parallel') && nodeObjType === '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: '', - signId:node.id, - 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 - 120, node.position().y - (120 * edgesSum)); - this.connectNode.position(node.position().x - 240, node.position().y + (node.size().height - this.connectNode.size().height) / 2); - } else if (edges.length === 1) { - // 灏嗚妭鐐圭Щ鍔ㄥ埌鎸囧畾鐨勪綅缃� - nodeObj.position(node.position().x - 120, 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 - 120, node.position().y + (120 + (120 * BottomSum))) - } else { - nodeObj.position(node.position().x - 120, node.position().y - (120 + (120 * TopSum))); + findIntersectsNode(node) { + const nodes = this.graph.getNodes() + let intersectNodes = [] + const bbox1 = node.getBBox(); + // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜� + for (const otherNode of nodes) { + if (otherNode === node) continue; + let nodeType = otherNode.getData().nodeType + if (nodeType === "parallel" || nodeType === "switch" || nodeType === "vote" || nodeType === "dashedBox") { + const bbox2 = otherNode.getBBox(); + if (bbox1.x < bbox2.x + bbox2.width && + bbox1.x + bbox1.width > bbox2.x && + bbox1.y < bbox2.y + bbox2.height && + bbox1.y + bbox1.height > bbox2.y) { + intersectNodes.push(otherNode); } } + } + if (intersectNodes.length === 1) { + //console.log('Intersecting nodes:', intersectNodes.map(n => n)); // 鐩镐氦鑺傜偣鐨勫璞� + return intersectNodes[0] + } else { + //鎻愮ず鐢ㄦ埛鍙兘鎷栧埌涓�涓湁鏁堢殑鑺傜偣涓� + return null + } + }, + // 鐩镐氦鐨勮妭鐐� + addBranch(graphNode, dragNode) { // graphCell鏄敾甯冧笂鍘熸湁鐨勮妭鐐广�俤ragNode鏄綋鍓嶆嫋鎷界殑鑺傜偣 + let graphNodeType = graphNode.getData().nodeType + + let dragNodeType = dragNode.getData().nodeType + let offHeight = 60 + if (dragNodeType === 'node') { + offHeight = 60 + } else if (dragNodeType === 'bridgeConnection') { + offHeight = 230 + } else { + offHeight = 70 + } + if (graphNodeType === 'dashedBox') { //铏氭 + const edges = this.graph.getConnectedEdges(graphNode); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾� + let inEdges = edges.filter(edge => edge.target.cell === graphNode.id) + let startNode = null + let endNode = null + if (inEdges.length === 1) { + let startNodeId = inEdges[0].source.cell + startNode = this.graph.getCellById(startNodeId) + } + let outEdges = edges.filter(edge => edge.source.cell === graphNode.id) + if (outEdges.length === 1) { + let endNodeId = outEdges[0].target.cell + endNode = this.graph.getCellById(endNodeId) + } + if (startNode && endNode) { + let centerY = graphNode.position().y + let result = this.addNodeAndConnect(startNode, endNode, dragNode, dragNode.position().x, centerY) + inEdges[0].target = {cell: result.newStartNode.id, port: 'left1'} + outEdges[0].source = {cell: result.newEndNode.id, port: 'right1'} + graphNode.remove() + } + } else { //骞惰缁撴瀯 + const graphNodeStartNodeId = graphNode.getData().startNodeId // 鑾峰彇鐢诲竷涓婂師鏈夎妭鐐圭殑寮�濮婭D + const graphNodeStartNode = this.graph.getCellById(graphNodeStartNodeId) // 閫氳繃寮�濮婭D寰楀埌鍒濆鑺傜偣瀵硅薄 + let graphNodeY = graphNode.position().y - graphNode.getBBox().height / 2 // 鑾峰彇鐢诲竷鍘熸湁鑺傜偣鐨剏鍧愭爣 + let minY = graphNode.position().y + let maxY = graphNode.position().y + graphNode.getBBox().height + + const edges = this.graph.getConnectedEdges(graphNode); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾� + let inEdges = edges.filter(edge => edge.target.cell === graphNode.id) + //閬嶅巻杩欎釜缁勫悎閲岄潰鎵�鏈夎妭鐐癸紝 淇敼minY锛宮axY + + let pointXY = {minY: minY, maxY: maxY} + console.log(pointXY, 'old') + this.getYRange(inEdges, graphNodeStartNode, pointXY) + console.log(pointXY, 'new') + + let minX = graphNodeStartNode.position().x + graphNodeStartNode.getBBox().width + let maxX = graphNode.position().x + let centerX = minX + (maxX - minX) / 2 + let centerY = graphNodeY - pointXY.minY > pointXY.maxY - graphNodeY ? pointXY.maxY + 30 : pointXY.minY - offHeight - 30 + + let result = this.addNodeAndConnect(graphNodeStartNode, graphNode, dragNode, minX, centerY) this.graph.addEdge({ - source: {cell: nodeObj, port: 'right1'}, - target: {cell: node, port: 'left1'}, + source: {cell: graphNodeStartNode, port: 'right1'}, + target: {cell: result.newStartNode, 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'} - }) - } - } - if (nodeType === 'node' || (nodeType === 'dashedBox' && nodeObjType === 'dashedBox')) { - // 閬嶅巻鎵�鏈夎繛鎺ョ嚎骞跺垹闄や笌缁欏畾鑺傜偣瀵硅薄鐩稿叧鐨勮繛鎺ョ嚎 - 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 + (node.size().height - nodeObj.size().height) / 2); - // 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); - } - } - } - - + this.graph.addEdge({ + source: {cell: result.newEndNode, port: 'right1'}, + target: {cell: graphNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) } }, - initCells(){ + addNodeAndConnect(startNode, endNode, dragNode, leftX, centerY) { // graphCell鏄敾甯冧笂鍘熸湁鐨勮妭鐐广�俤ragNode鏄綋鍓嶆嫋鎷界殑鑺傜偣 + let dragNodeType = dragNode.getData().nodeType + if (dragNodeType === 'node' || dragNodeType === 'dashedBox') { + dragNode.position(leftX + 50, centerY); + return {newStartNode: dragNode, newEndNode: dragNode} + } else if (dragNodeType === 'bridgeConnection') { + return this.createBridgeConnection(leftX, centerY, startNode, endNode, dragNode) + } else { + return this.createParallelBrach(leftX, centerY, startNode, endNode, dragNode) + } + }, + // 鐩镐氦鐨勮竟 + addNodeAndInsertEdge(graphEdge, dragNode) { + let startNodeId = graphEdge.source.cell + let startNode = this.graph.getCellById(startNodeId) + let endNodeId = graphEdge.target.cell + let endNode = this.graph.getCellById(endNodeId) + if (startNode && endNode) { + let centerY = dragNode.position().y + let isRight = true; + let startPort = 'right1' + let endPort = 'left1' + if (this.isTopBottom(graphEdge)) { + startPort = 'bottom1' + endPort = 'top1' + } + if (this.hasOtherLineToMyLine(graphEdge.id)) { + let leftX = startNode.position().x + startNode.getBBox().width + let rightX = endNode.position().x + let centerX = dragNode.position().x + dragNode.getBBox().width / 2 + if (centerX - leftX < rightX - centerX) { + isRight = false + } + } + let result = this.addNodeAndConnect(startNode, endNode, dragNode, dragNode.position().x, centerY) + if (isRight) { + graphEdge.target = {cell: result.newStartNode.id, port: endPort} + this.graph.addEdge({ + source: {cell: result.newEndNode, port: startPort}, + target: {cell: endNode, port: endPort}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + + } else { + this.graph.addEdge({ + source: {cell: startNode, port: startPort}, + target: {cell: result.newStartNode, port: endPort}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + graphEdge.source = {cell: result.newEndNode.id, port: startPort} + } + // graphEdge.remove() + } + }, + initCells() { const startNode = this.graph.addNode({ shape: 'image', // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), width: 60, height: 60, + id: '10000', data: { type: 'imageNodes', + endNodeId: '20000', dataId: '', nodeType: 'start', nodeTypeExt: '', @@ -1252,8 +1311,9 @@ const dashedBox = this.graph.addNode({ shape: 'image', // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), - width: 170, - height: 90, + width: 100, + height: 80, + id: 15000, data: { type: 'imageNodes', dataId: '', @@ -1281,8 +1341,10 @@ shape: 'image', width: 60, height: 60, + id: '20000', data: { type: 'imageNodes', + startNodeId: '10000', dataId: '', nodeType: 'end', nodeTypeExt: '', @@ -1320,8 +1382,394 @@ connector: {name: 'rounded'} }) }, - }, + findIntersectsEdge(graph, node) { + const edges = graph.getEdges() + const bbox = node.getBBox(); + const lines = [bbox.leftLine, bbox.rightLine, bbox.topLine, bbox.bottomLine]; + let res = []; + edges.forEach((edge) => { + const view = graph.findViewByCell(edge); + lines.forEach((line) => { + if (view) { + if (view.path.intersectsWithLine(line)) { + res.push(edge); + } + } + }) + }) + const uniqueArr = res.filter((insEdge, index) => + res.findIndex(i => i.id === insEdge.id) === index); + console.log(uniqueArr, 'uniqueArr') + if (uniqueArr.length === 1) { + return uniqueArr[0] + } else { + return false + } + }, + createParallelBrach(x, y, startNode, endNode, dragNode) { + dragNode.position(x + 320, y - dragNode.size().height / 2) + const connectNode = this.createConnectNode(x + 50, 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'} + }) + this.graph.addEdge({ + source: {cell: dashedBox, port: 'right1'}, + target: {cell: dragNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + 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, startNode, endNode, dragNode) { + const leftTopDashedBox = this.createDashedBox(x + 120, y) + const rightTopDashedBox = this.createDashedBox(x + 400, y) + + const leftConnectNode = this.createConnectNode(x + 50, y + 80) + const alignCenterDashedBox = this.createDashedBox(x + 260, y + 80) + const rightConnectNode = this.createBridgeNode(x + 550, y + 80) + + const leftBottomDashedBox = this.createDashedBox(x + 120, y + 160) + const rightBottomDashedBox = this.createDashedBox(x + 400, y + 160) + + rightConnectNode.setData({startNodeId: leftConnectNode.id}) + leftConnectNode.setData({endNodeId: rightConnectNode.id}) + /* this.graph.addEdge({ + source: {cell: startNode, port: 'right1'}, + target: {cell: leftConnectNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'}, + }) + this.graph.addEdge({ + source: {cell: rightConnectNode, port: 'right1'}, + target: {cell: endNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + })*/ + this.graph.addEdge({ + source: {cell: leftConnectNode, port: 'right1'}, + target: {cell: leftTopDashedBox, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + 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'} + }) + + this.graph.addEdge({ + source: {cell: rightTopDashedBox, port: 'right1'}, + target: {cell: rightConnectNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + this.graph.addEdge({ + source: {cell: rightBottomDashedBox, port: 'right1'}, + target: {cell: rightConnectNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + + this.graph.addEdge({ + source: {cell: edgeTop}, + target: {cell: alignCenterDashedBox, port: 'top1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'}, + }) + this.graph.addEdge({ + source: {cell: alignCenterDashedBox, port: 'bottom1'}, + target: {cell: edgeBottom}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'}, + }) + dragNode.remove() + return {newStartNode: leftConnectNode, newEndNode: rightConnectNode} + }, + createDashedBox(x, y) { + const dashId = getUUID().toString() + let dashedBox = this.graph.addNode({ + shape: 'image', + // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), + width: 100, + height: 60, + id: dashId, + data: { + isSelfCreated: true, + type: 'imageNodes', + dataId: '', + nodeType: 'dashedBox', + nodeTypeExt: '', + voteNum: '' + }, + attrs: { + image: { + 'xlink:href': '/modelImg/dashedBox.svg', + }, + text: { + text: 'dashedBox', + fontSize: 14, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', + }, + }, + ports: {...this.ports}, + }) + dashedBox.position(x, y - dashedBox.size().height / 2) + return dashedBox + }, + createConnectNode(x, y) { + const connectId = getUUID().toString() + const dragNodeId = getUUID().toString() + let connectNode = this.graph.addNode({ + shape: 'image', + // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), + width: 30, + height: 30, + id: connectId, + data: { + isSelfCreated: true, + type: 'imageNodes', + endNodeId: dragNodeId, + 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}, + }) + connectNode.position(x, y - connectNode.size().height / 2) + return connectNode + }, + createBridgeNode(x, y) { + const connectId = getUUID().toString() + const dragNodeId = getUUID().toString() + let connectNode = this.graph.addNode({ + shape: 'image', + width: 50, + height: 50, + id: connectId, + data: { + isSelfCreated: true, + type: 'imageNodes', + endNodeId: dragNodeId, + dataId: '', + nodeType: 'bridge', + nodeTypeExt: '', + voteNum: '' + }, + attrs: { + image: { + 'xlink:href': '/modelImg/connect.svg', + }, + text: { + text: 'bridge', + fontSize: 14, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', + }, + }, + ports: {...this.ports}, + }) + connectNode.position(x, y - connectNode.size().height / 2) + return connectNode + }, + getYRange(inEdges, startNode, pointXY) { + for (let inEdge of inEdges) { + let nodeId = inEdge.source.cell + let node = this.graph.getCellById(nodeId) + if (node.position().y < pointXY.minY) { + pointXY.minY = node.position().y + } + if (node.position().y + node.getBBox().height > pointXY.maxY) { + pointXY.maxY = node.position().y + node.getBBox().height + } + if (node.id === startNode.id) { + continue + } + const edges = this.graph.getConnectedEdges(node); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾� + let inEdgesPrev = edges.filter(edge => edge.target.cell === node.id) + this.getYRange(inEdgesPrev, startNode, pointXY) + } + }, + isSeriesNode(startNode, endNode) { + let result = false + let inNode = null + let outNode = null + let inEdges = this.getInLinesOfNode(startNode) + console.log(inEdges, 'inEdges') + if (inEdges.length === 1) { + let isMyLineToOtherLine = this.isMyLineToOtherLine(inEdges[0]) + let hasOtherLineToMyLine = this.hasOtherLineToMyLine(inEdges[0].id) + let inNodeId = inEdges[0].source.cell + inNode = this.graph.getCellById(inNodeId) + if (!isMyLineToOtherLine && !hasOtherLineToMyLine) { + let inNodeType = inNode.getData().nodeType + console.log(inNodeType, 'inNodeType') + if ('node,dashedBox,parallel,switch,vote,bridge'.indexOf(inNodeType) > -1) { + result = true + } + } + } + let outEdges = this.getOutLinesOfNode(endNode) + console.log(outEdges, 'outEdges') + if (outEdges.length === 1) { + let isMyLineToOtherLine = this.isMyLineToOtherLine(outEdges[0]) + let hasOtherLineToMyLine = this.hasOtherLineToMyLine(outEdges[0].id) + let outNodeId = outEdges[0].target.cell + outNode = this.graph.getCellById(outNodeId) + if (!isMyLineToOtherLine && !hasOtherLineToMyLine) { + let outNodeType = outNode.getData().nodeType + if ('node,connect,dashedBox'.indexOf(outNodeType) > -1) { + result = true + } + } + } + console.log(result, 'result') + if (result && inNode && outNode) { + console.log(inNode, outNode, 'inNode, outNode') + return {inNode, outNode} + } else { + return false + } + }, + hasOtherLineToMyLine(edgeId) { + for (let edge of this.graph.getEdges()) { + if (edge.source.cell === edgeId || edge.target.cell === edgeId) + return true + } + return false + }, + isMyLineToOtherLine(myEdge) { + for (let edge of this.graph.getEdges()) { + if (myEdge.source.cell === edge.id || myEdge.target.cell === edge.id) + return true + } + return false + }, + isTopBottom(edge) { + if (edge.source.port === 'top1' || edge.source.port === 'bottom1' || edge.target.port === 'top1' || edge.target.port === 'bottom1') { + return true + } + }, + isMultipleBrach(node) { + let outEdges = this.getOutLinesOfNode(node) + let outNodeId = outEdges[0].target.cell + if (this.isTopBottom(outEdges[0])) + return false + let outNode = this.graph.getCellById(outNodeId) + if ('bridge,end'.indexOf(outNode.getData().nodeType) > -1) { + return false + } + let inEdges = this.getInLinesOfNode(outNode) + return inEdges.length > 1; + }, + deleteCombination(node) { + let startNode = this.graph.getCellById(node.getData().startNodeId) + let allCombinationNodes = [] + console.log(startNode, 'startNode') + this.getAllCombinationNodes(startNode.id, node, allCombinationNodes) + console.log(allCombinationNodes, 'allCombinationNodes') + this.graph.removeCells(allCombinationNodes) + }, + getAllCombinationNodes(startNodeId, node, allCombinationNodes) { + allCombinationNodes.push(node) + if (node.id == startNodeId || node.isEdge()) { + return + } + let inEdges = this.getInLinesOfNode(node) // 濡傛灉锛燂紵锛� + for (let inEdge of inEdges) { + let lineNode = this.getNodeOfConectLine(inEdge) + if (lineNode) { + this.getAllCombinationNodes(startNodeId, lineNode, allCombinationNodes) + } + let inNodeId = inEdge.source.cell + let inNode = this.graph.getCellById(inNodeId) + if (inNode.isEdge()) + continue + this.getAllCombinationNodes(startNodeId, inNode, allCombinationNodes) + } + }, + getNodeOfConectLine(paramEdge) { + for (let edge of this.graph.getEdges()) { + let nodeId = null + /* if (edge.source.cell === paramEdge.id){ + nodeId = edge.target.cell + }*/ + if (edge.target.cell === paramEdge.id) { + nodeId = edge.source.cell + } + if (nodeId) { + let node = this.graph.getCellById(nodeId) + if (node.isNode()) + return node + } + } + return null + }, + getInLinesOfNode(node) { + const edges = this.graph.getConnectedEdges(node); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾� + console.log(edges, '鑾峰彇鐢诲竷涓婂紑濮嬭妭鐐规墍鏈夌殑绾� edges') + return edges.filter(edge => edge.target.cell === node.id) + }, + getOutLinesOfNode(node) { + console.log(node, '鑾峰彇鐢诲竷涓婄殑缁撴潫鑺傜偣 node') + const edges = this.graph.getConnectedEdges(node); // 鑾峰彇鐢诲竷涓婂師鏈夌殑鑺傜偣鎵�鏈夎繘鏉ョ殑绾� + console.log(edges, '鑾峰彇鐢诲竷涓婄殑缁撴潫鑺傜偣鎵�鏈夌殑绾� edges') + return edges.filter(edge => edge.source.cell === node.id) + }, + }, } </script> -- Gitblit v1.9.1