// DATA 数据 let DATA = [ // 线图 { name: '1', value: [1, 300], }, { name: '2', value: [2, 300], }, { name: '3', value: [2, 225], }, { name: '4', value: [2, 150], }, { name: '5', value: [4, 300], }, { name: '6', value: [7, 300], end: true, }, { name: '6.8', value: [7, 275], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }, { name: '6.2', value: [6, 275], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }, { name: '7', value: [6, 250], }, { name: '8', value: [8, 250], end: true, }, { name: '18', value: [5, 225], end: true, }, { name: '19', value: [4, 150], end: true, }, { name: '19.2', value: [3, 125], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }, { name: '19.8', value: [4, 125], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }, { name: '20', value: [3, 100], }, { name: '21', value: [5, 100], end: true, }, // 框图 1 { name: '29', value: [5.8, (15 / 2) + 50], }, { name: '30', value: [6, 65], symbol: 'none', }, { name: '31', value: [6, 50], symbol: 'none', }, { name: '32', value: [8, 65], symbol: 'none', }, { name: '33', value: [8, 50], symbol: 'none', }, { name: '34', value: [8.2, (15 / 2) + 50], end: true, }, { name: '29-solid', value: [6.3, (15 / 2) + 50], symbol: 'none', }, { name: '34-solid', value: [7.9, (15 / 2) + 50], symbol: 'none', }, // 虚线连接 { name: '34.8', value: [8.2, 40], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }, { name: '34.2', value: [6.8, 40], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }, // 框图 2 { name: '35', value: [6.8, (15 / 2) + 15], }, { name: '36', value: [7, 30], symbolSize: 15 }, { name: '37', value: [7, 15], symbolSize: 15 }, { name: '38', value: [9, 30], symbolSize: 15 }, { name: '39', value: [9, 15], symbolSize: 15 }, { name: '40', value: [9.2, (15 / 2) + 15], end: true, }, ]; let LINKS = [{ source: '1', target: '2' }, { source: '2', target: '3' }, { source: '2', target: '5' }, { source: '5', target: '6', value: '6#基础底板', label: { show: true, position: 'middle', formatter: "{c}" } }, { source: '6', target: '6.8', lineStyle: { type: 'dashed' }, symbol: 'none' }, { source: '6.8', target: '6.2', lineStyle: { type: 'dashed' }, symbol: 'none' }, { source: '6.2', target: '7', lineStyle: { type: 'dashed' } }, { source: '7', target: '8' }, { source: '3', target: '4' }, { source: '3', target: '18', value: '南区西侧底板', label: { show: true, position: 'middle', formatter: "{c}" } }, { source: '4', target: '19', value: '南区东侧底板', label: { show: true, position: 'middle', formatter: "{c}" } }, { source: '19', target: '19.8', lineStyle: { type: 'dashed' }, symbol: 'none' }, { source: '19.8', target: '19.2', lineStyle: { type: 'dashed' }, symbol: 'none' }, { source: '19.2', target: '20', lineStyle: { type: 'dashed' } }, { source: '20', target: '21', value: '南区结构-地下3层(车库2层)', label: { show: true, position: 'middle', formatter: "{c}" } }, // 框线图 1 { source: '30', target: '31', symbol: 'none' }, { source: '30', target: '32', symbol: 'none' }, { source: '31', target: '33', symbol: 'none' }, { source: '32', target: '33', symbol: 'none' }, { source: '29-solid', target: '34-solid', symbol: 'none', lineStyle: { width: 10 } }, // 连接线 { source: '34', target: '34.8', lineStyle: { type: 'dashed' }, symbol: 'none' }, { source: '34.8', target: '34.2', lineStyle: { type: 'dashed' }, symbol: 'none' }, { source: '34.2', target: '35', lineStyle: { type: 'dashed' } }, // 框线图 2 { source: '36', target: '37', symbol: 'none' }, { source: '36', target: '38', symbol: 'none' }, { source: '37', target: '39', symbol: 'none' }, { source: '38', target: '39', symbol: 'none' } ]; // 生成 timeLine 节点 const generatorLineNodes = (x, y) => { let nodes = []; for (let i = 1; i <= y; i++) { nodes.push({ name: `timeLine-${i}`, value: [x, i], label: { show: false }, itemStyle: { color: 'rgb(255, 255, 255,0)', borderColor: 'rgb(255, 255, 255,0)' } }); } let linkNodes = []; for (let j = 0; j < nodes.length; j++) { if (j + 5 >= nodes.length) break; // 找到DATA数据中同等高度的节点 let LINKS_Nodes = DATA.filter(x => x.value[1] === nodes[j + 5].value[1] && x.value[0] < nodes[j + 5].value[0]); if(LINKS_Nodes.length > 0) { // 如果有多个,则按照节点 横坐标 倒序排列 (方便取最接近line的节点) LINKS_Nodes.sort((a,b)=>b.value[0] - a.value[0]) } // 如果存在 name 且 j + 5 j - 5在数据范围内 且 name 属性值是一个整数字符串 if (LINKS_Nodes[0]?.name && j + 5 < nodes.length && j - 5 >= 0 && !LINKS_Nodes[0]?.name.includes('.') && !LINKS_Nodes[0]?.end) { linkNodes.push({ source: nodes[j].name, target: LINKS_Nodes[0].name, lineStyle: { type: 'solid', color: 'red', width: 2 }, symbol: 'none' }); j += 9; linkNodes.push({ source: LINKS_Nodes[0].name, target: nodes[j + 1].name, lineStyle: { type: 'solid', color: 'red', width: 2 }, symbol: 'none' }); } else { linkNodes.push({ source: nodes[j].name, target: nodes[j + 1].name, lineStyle: { type: 'solid', color: 'red', width: 2 }, symbol: 'none' }) } } return { nodes, linkNodes }; } // 调用生成 Lines的函数 let LineNodes = generatorLineNodes(3, 320); // 生成 option const generatorOpt = (el) => { return { title: { text: 'Graph图-节点连接' }, tooltip: { show: false }, xAxis: [{ type: 'value', boundaryGap: false, splitLine: { show: false }, data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } ], yAxis: { type: 'value', splitLine: { show: false } }, series: [{ type: 'graph', layout: 'none', coordinateSystem: 'cartesian2d', symbolSize: 20, edgeSymbol: ['circle', 'arrow'], edgeSymbolSize: [0, 10], itemStyle: { color: '#fff', borderColor: '#000' }, label: { show: true, color: '#000' }, data: DATA.concat(el.nodes), links: LINKS.concat(el.linkNodes), lineStyle: { normal: { color: '#2f4554' } } }] }; }; option = generatorOpt(LineNodes);