| | |
| | | <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" |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | nodeAdded: false, |
| | | connectNode: {}, |
| | | modelId: '', |
| | | modelName: '', |
| | | modelType: '', |
| | |
| | | imgPath: 'connect', |
| | | imgName: 'connect', |
| | | nodeType: 'connect', |
| | | imgWidth: 20, |
| | | imgHeight: 20, |
| | | imgWidth: 30, |
| | | imgHeight: 30, |
| | | 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', |
| | | imgPath: 'switch', |
| | | imgName: 'switch', |
| | | nodeType: 'switch', |
| | | imgWidth: 60, |
| | |
| | | imgId: '5', |
| | | data: {} |
| | | }, |
| | | {imgPath: 'voteRight', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}}, |
| | | {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, |
| | |
| | | |
| | | stroke: '#5F95FF', |
| | | strokeWidth: 1, |
| | | connector: 'normal', |
| | | connector: 'rounded', |
| | | router: 'manhattan', |
| | | label: '', |
| | | nodeStroke: '#5F95FF', |
| | | nodeStrokeWidth: 1, |
| | |
| | | ports: { |
| | | groups: { |
| | | top: { |
| | | position: 'top', |
| | | position: {name: 'top'}, |
| | | attrs: { |
| | | circle: { |
| | | r: 4, |
| | |
| | | }, |
| | | }, |
| | | right: { |
| | | position: 'right', |
| | | position: {name: 'right'}, |
| | | attrs: { |
| | | circle: { |
| | | r: 4, |
| | |
| | | }, |
| | | }, |
| | | bottom: { |
| | | position: 'bottom', |
| | | position: {name: 'bottom'}, |
| | | attrs: { |
| | | circle: { |
| | | r: 4, |
| | |
| | | }, |
| | | }, |
| | | left: { |
| | | position: 'left', |
| | | position: {name: 'left'}, |
| | | attrs: { |
| | | circle: { |
| | | r: 4, |
| | |
| | | }, |
| | | items: [ |
| | | { |
| | | id: 'top1', |
| | | group: 'top', |
| | | }, |
| | | { |
| | | id: 'right1', |
| | | group: 'right', |
| | | }, |
| | | { |
| | | id: 'bottom1', |
| | | group: 'bottom', |
| | | }, |
| | | { |
| | | id: 'left1', |
| | | group: 'left', |
| | | }, |
| | | ], |
| | |
| | | scroller: { |
| | | enabled: true, |
| | | pageVisible: true, |
| | | autoResize: true, |
| | | pageBreak: true, |
| | | pannable: true, |
| | | minVisibleWidth: 200, |
| | | minVisibleHeight: 200, |
| | | modifiers: 'shift', |
| | | }, |
| | | // panning: { |
| | | // enabled: true, |
| | | // modifiers: 'shift', |
| | | // }, |
| | | mousewheel: { |
| | | enabled: true, |
| | | zoomAtMousePosition: true, |
| | | modifiers: 'ctrl', |
| | | minScale: 0.1, |
| | | maxScale: 10, |
| | | minScale: 0.5, |
| | | maxScale: 3, |
| | | }, |
| | | connecting: { |
| | | router: { |
| | | name: 'normal', |
| | | name: 'manhattan', |
| | | // args: { |
| | | // padding: 1, |
| | | // }, |
| | |
| | | connector: { |
| | | name: 'rounded', |
| | | args: { |
| | | radius: 8, |
| | | radius: 5, |
| | | }, |
| | | }, |
| | | // anchor: 'center', |
| | | anchor: 'center', |
| | | connectionPoint: 'anchor', |
| | | allowBlank: false, |
| | | snap: { |
| | |
| | | }, |
| | | }, |
| | | }, |
| | | resizing: { |
| | | enabled: true, |
| | | restricted: true |
| | | }, |
| | | resizing: true, |
| | | rotating: true, |
| | | selecting: { |
| | | enabled: 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 |
| | | getDropNode: (node) => { |
| | | if (node.getData().type && node.getData().type === 'imageNodes2') { |
| | | return node.clone({keepId: true}) |
| | | } else { |
| | | return node.clone() |
| | | } |
| | | if (node.getData().imgHeight) { |
| | | height = node.getData().imgHeight |
| | | } |
| | | return node.clone({ keepId: true }).size(width, height) |
| | | }, |
| | | validateNode(node){ |
| | | console.log(node.id) |
| | | validateNode: (node) => { |
| | | const existingNodes = this.graph.getNodes(); // 获取画布上所有节点 |
| | | for (const existingNode of existingNodes) { |
| | | if (existingNode.id === node.id) { |
| | | this.$message({message: '该设备节点已在画布上,无法再次绘制', type: 'warning'}) |
| | | return false; // 取消添加节点操作 |
| | | } |
| | | } |
| | | }, |
| | | title: '', |
| | | target: this.graph, |
| | |
| | | { |
| | | title: '运算符号', |
| | | name: 'group1', |
| | | }, |
| | | { |
| | | title: '组合图', |
| | | name: 'combiningImages', |
| | | graphHeight: 100, |
| | | }, |
| | | { |
| | | title: '设备节点', |
| | |
| | | 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:'' |
| | | }, |
| | | 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}, |
| | | }), |
| | | ) |
| | | 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, |
| | |
| | | height: 60, |
| | | id: item.dataId, // 手动设置节点的 ID |
| | | data: { |
| | | type: 'imageNodes2', |
| | | isRepair: item.isRepair, |
| | | dataId: item.dataId, |
| | | nodeType: item.nodeType, |
| | |
| | | ) |
| | | stencil.load(imageNodes, 'group1') |
| | | stencil.load(imageNodes2, 'group2') |
| | | |
| | | stencil.load(combiningImages, 'combiningImages') |
| | | |
| | | this.graph.bindKey(['meta+c', 'ctrl+c'], () => { |
| | | const cells = this.graph.getSelectedCells() |
| | |
| | | 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); |
| | | } |
| | | } |
| | | 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('cell:click', ({cell}) => { |
| | | // this.type.value = cell.isNode() ? "node" : "edge" |
| | | this.type = cell.isNode() ? 'node' : 'edge' |
| | |
| | | }) |
| | | // 单击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('node:delete', ({view, e}) => { |
| | |
| | | }) |
| | | }) |
| | | }, |
| | | // 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(); |
| | | }, |
| | |
| | | } |
| | | }) |
| | | }, |
| | | // 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 |
| | |
| | | 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是画布原有的节点。nodeObj是当前拖拽的节点 |
| | | 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; // 获取连接线的起始点y坐标 |
| | | const targetPointY = edge.getTargetPoint().y; // 获取连接线的结束点y坐标 |
| | | console.log('原节点Y坐标' + node.position().y, '连接线起始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) { // 如果连接线的起始节点等于当前画布目标节点的ID |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | }, |
| | | }, |
| | | |
| | | } |
| | |
| | | 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 |
| | | } |