From 4f96875c6abddd2195b716906558d838a9250776 Mon Sep 17 00:00:00 2001 From: jihongshun <1151753686@qq.com> Date: 星期三, 13 八月 2025 13:49:50 +0800 Subject: [PATCH] 更换随机id --- src/views/system/project/components/addPorjectDialog.vue | 467 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 444 insertions(+), 23 deletions(-) diff --git a/src/views/system/project/components/addPorjectDialog.vue b/src/views/system/project/components/addPorjectDialog.vue index cf5606f..9a082c5 100644 --- a/src/views/system/project/components/addPorjectDialog.vue +++ b/src/views/system/project/components/addPorjectDialog.vue @@ -10,12 +10,12 @@ <el-col :span=6> <el-card class="noScroll"> <div class="chooseModel"> - <!-- <el-button type="primary" @click='chooseModel'>娣诲姞璁惧</el-button> --> <div class="fontJust">璁惧鍒楄〃</div> <el-button @click="addDevice"> 鏂板</el-button> <el-table :data="tableData" max-height = '180' + :row-key="getRowKeys" style="width: 100%"> <el-table-column prop="deviceName" @@ -23,15 +23,16 @@ width="150"> </el-table-column> <el-table-column - prop="muban" + prop="mode" label="妯℃澘" - width="150"> + width="120"> </el-table-column> <el-table-column fixed="right" label="鎿嶄綔" - width="100"> + width="130"> <template slot-scope="scope"> + <el-button type="text" size="small" @click="chooseModel(scope.row)">妯℃澘</el-button> <el-button type="text" size="small" @click="flyToLocal(scope.row)">瀹氫綅</el-button> <el-button type="text" size="small" @click="deleteData(scope.row)">绉婚櫎</el-button> </template> @@ -45,9 +46,9 @@ <div class="fontJust">宸℃鐐圭洰褰�</div> <el-tree class="filter-tree" + node-key="id" :data="treeData" :props="defaultProps" - draggable default-expand-all ref="tree"> </el-tree> @@ -63,16 +64,22 @@ <el-button type="primary" @click="submit()" >鐢熸垚鑸嚎浠诲姟</el-button> </span> </el-dialog> - <chooseDeviceDialog v-if="showModel" @cancel ='cancel' @dealChooseArr="dealChooseArr" ></chooseDeviceDialog> + <chooseDeviceDialog v-if="showDevice" @cancel ='cancel' @dealChooseArr="dealChooseArr" ></chooseDeviceDialog> + <chooseModelDialog v-if="showModel" @cancelModel ='cancelModel' @receiveModel="receiveModel" :deviceId="deviceId"></chooseModelDialog> </div> </template> <script> import CesiumMap from "../../../../utils/components/cesium-map.vue"; import chooseDeviceDialog from './chooseDeviceDialog.vue'; +import chooseModelDialog from './chooseModelDialog.vue'; +import { obtainRealData ,buildKmz} from "@/api/system/template" +let rotationAngle = Cesium.Math.toRadians(0) +let lastConnectPolyline export default{ components: { CesiumMap, - chooseDeviceDialog + chooseDeviceDialog, + chooseModelDialog }, data(){ return{ @@ -83,21 +90,21 @@ children: 'children', label: 'label' }, + showDevice:false, + multipleSelection: [], showModel:false, - multipleSelection: [] + deviceId:null } }, methods:{ handleClose(){ - console.log("close") this.dialogVisible = false this.$emit('close') }, flyToLocal(row){ - console.log(row) - console.log(viewer) - const position = Cesium.Cartesian3.fromDegrees(row.longitude,row.latitude, row.altitude); - + const position = Cesium.Cartesian3.fromDegrees(row.longitude,row.latitude, row.deviceHeight); + // rotationAngle = Cesium.Math.toRadians(row.face) || Cesium.Math.toRadians(0) + rotationAngle = Cesium.Math.toRadians(row.face) || Cesium.Math.toRadians(0) // 璁剧疆妯″瀷鏂瑰悜锛堝彲閫夛級 const heading = Cesium.Math.toRadians(row.face); // 鏈濅笢鍗楁柟鍚� const pitch = 0; @@ -113,19 +120,35 @@ position: position, orientation: orientation, model: { - uri: "http://192.168.1.5:9000/tower/2025/07/01/tower_20250701145739A004.glb", // 鏇挎崲鎴愪綘鐨勬ā鍨嬭矾寰� - scale: 1000, + uri: row?.ardTowerModel.modelRoute, // 鏇挎崲鎴愪綘鐨勬ā鍨嬭矾寰� + scale: 1, }, + label: { + show: true, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + horizontalOrigin: Cesium.HorizontalOrigin.CENTER, + font: '28px Helvetica', + outlineColor: Cesium.Color.BLUE, + outlineWidth: 3, + fillColor: Cesium.Color.fromCssColorString('#FFFFFF'), //44c3cc + text: row.deviceName, + style: Cesium.LabelStyle.FILL_AND_OUTLINE, + pixelOffset: new Cesium.Cartesian2(0.0, -56.0), + scaleByDistance: new Cesium.NearFarScalar(1000, 0.6, 10000, 0.4), + pixelOffsetScaleByDistance: new Cesium.NearFarScalar(1000, 0.4, 10000, 0.4), + disableDepthTestDistance: 100000000 + } }); console.log(entity) // 椋炶鍒版ā鍨嬩綅缃� + console.log(this.treeData) viewer.flyTo(entity) }, addDevice(){ - this.showModel = true + this.showDevice = true }, cancel(){ - this.showModel = false + this.showDevice = false }, hasSameId(array1, array2) { const ids1 = new Set(array1.map(item => item.id)); @@ -145,29 +168,427 @@ type: 'warning' }) } - this.tableData = this.tableData.concat(arr) + this.tableData = this.treeData.concat(arr) } const dealTreeData =this.dealTee() this.treeData = dealTreeData - console.log(this.treeData) }, dealTee(){ + console.log(this.tableData) return this.tableData.map(item => ({ ...item, label: item.deviceName, - children: [] })); }, deleteData(row){ + console.log(row) // 鎵惧埌 id 涓� "1" 鐨勫厓绱犵储寮� const index = this.tableData.findIndex(item => item.id === row.id); - // 濡傛灉鎵惧埌浜嗭紝鍒犻櫎璇ュ厓绱� if (index !== -1) { this.tableData.splice(index, 1); } - const dealTreeData = this.dealTee() - this.treeData = dealTreeData + const indexTree = this.treeData.findIndex(item => item.id === row.id); + // 濡傛灉鎵惧埌浜嗭紝鍒犻櫎璇ュ厓绱� + if (index !== -1) { + this.treeData.splice(indexTree, 1); + } + if(this.treeData?.length >=2 && this.treeData[0]?.children?.length > 0 && this.treeData[1]?.children?.length > 0 ) { + this.dealAddHeight() + } else if(this.treeData?.length ==1) { + this.treeData.map((device,index) => { + // 纭繚璁惧鏈塩hildren鏁扮粍 + if(index == 0) { + //绗竴涓暟鎹� + if (device.children && Array.isArray(device.children) && device.children.length > 0) { + // 鑾峰彇鏈�鍚庝竴涓┖涓偣 + const lastChild = device.children[device.children.length - 1]; + const firstChild = device.children[0]; + // 娣辨嫹璐濇渶鍚庝竴涓厓绱狅紙鍖呮嫭宓屽鐨刢hildren锛� + const newChildJson = JSON.parse(JSON.stringify(lastChild)); + // 娣辨嫹璐濇渶涓�涓�涓厓绱狅紙鍖呮嫭宓屽鐨刢hildren锛� + const firstChildJson = JSON.parse(JSON.stringify(firstChild)); + + if(newChildJson && newChildJson.label.includes('鍔犻珮')){ + device.children?.pop(newChild); + }else if(firstChildJson && firstChildJson.label.includes('鍔犻珮')) { + device.children?.shift(firstChildJson); + } + // 娣诲姞鍒癱hildren鏁扮粍鏈熬 + } + } + }) + } + const entitiesToRemove = []; + viewer.entities.values.forEach(entity => { + if (entity.id && entity.id.includes(row.id)) { + entitiesToRemove.push(entity.id); + } + }); + entitiesToRemove.forEach(id => { + viewer.entities.removeById(id); + }); + this.drawConnectionsWithLabels(this.treeData) + // console.log(this.tableData) + console.log(this.treeData) + // const dealTreeData = this.dealTee() + // console.log(dealTreeData) + // this.treeData = dealTreeData + // this.drawConnectionsWithLabels(this.treeData) + }, + chooseModel(row){ + this.deviceId = row.id + this.showModel = true + }, + cancelModel(){ + this.showModel = false + }, + receiveModel(obj){ + //deal閫昏緫 + let flightTemplateId =obj.modelObj.id + let deviceId = obj.deviceId + this.dealTableTemplate(obj) + // let + obtainRealData(flightTemplateId,deviceId).then(res=>{ + console.log(res) + let treeDealData = this.transformFlightData(res.data?.coordinateSystemVoS || []) + console.log(treeDealData) + this.dealTreeMerge(obj,treeDealData) + + this.rotateAllPoints(this.treeData || [],res.data.longitude,res.data.latitude,res.data.height) + console.log(this.treeData) + if(this.treeData?.length >=2 && this.treeData[0]?.children?.length > 0 && this.treeData[1]?.children?.length > 0 ) { + this.dealAddHeight() + } + console.log(this.treeData) + this.drawConnectionsWithLabels(this.treeData) + }) + // this.dealTreeMerge(obj) + }, + dealAddHeight(){ + let currentLength = this.treeData.filter(item=>item.children)?.length || 0 + console.log(this.treeData) + console.log(currentLength) + this.treeData.map((device,index) => { + // 纭繚璁惧鏈塩hildren鏁扮粍 + if(index == 0) { + //绗竴涓暟鎹� + if (device.children && Array.isArray(device.children) && device.children.length > 0) { + // 鑾峰彇鏈�鍚庝竴涓┖涓偣 + const lastChild = device.children[device.children.length - 1]; + // 娣辨嫹璐濇渶鍚庝竴涓厓绱狅紙鍖呮嫭宓屽鐨刢hildren锛� + const newChild = JSON.parse(JSON.stringify(lastChild)); + if(newChild.label.includes('鍔犻珮')) { + + }else { + newChild.label = newChild.label + '-鍔犻珮' + // 楂樺害澧炲姞20 + // newChild.height += 20; + //濉旈珮 - 楂樺害 + 寰�涓婇澶氬皯绫� + newChild.height += (device.ardTowerModel?.modelHeight - newChild.height + 20) ; + console.log('push11111111111111') + // 娣诲姞鍒癱hildren鏁扮粍鏈熬 + device.children.push(newChild); + } + } + } + else if(index == currentLength -1) { + if (device.children && Array.isArray(device.children) && device.children.length > 0) { + // 鑾峰彇鏈�鍚庝竴涓┖涓偣 + const lastChild = device.children[0]; + // 娣辨嫹璐濇渶涓�涓�涓厓绱狅紙鍖呮嫭宓屽鐨刢hildren锛� + const newChild = JSON.parse(JSON.stringify(lastChild)); + if(newChild.label.includes('鍔犻珮')) { + }else { + newChild.label = newChild.label + '-鍔犻珮绗竴涓偣' + newChild.height += (device.ardTowerModel?.modelHeight - newChild.height + 20) ; + // 娣诲姞鍒癱hildren鏁扮粍鏈熬 + device.children.unshift(newChild); + } + + } + } else { + if (device.children && Array.isArray(device.children) && device.children.length > 0) { + // 鑾峰彇鏈�鍚庝竴涓┖涓偣 + const firstChild = device.children[0]; + const lastChild = device.children[device.children.length - 1]; + // 娣辨嫹璐濇渶涓�涓�涓厓绱狅紙鍖呮嫭宓屽鐨刢hildren锛� + const newFirstChild = JSON.parse(JSON.stringify(firstChild)); + const newLastChildChild = JSON.parse(JSON.stringify(lastChild)); + //楂樺害澧炲姞20 + if(newFirstChild.label.includes('鍔犻珮')) { + }else { + newFirstChild.label = newFirstChild.label + '-鍔犻珮' + newFirstChild.height += (device.ardTowerModel?.modelHeight - newFirstChild.height + 20) ; + device.children.unshift(firstChild); + } + if(newLastChildChild.label.includes('鍔犻珮')) { + }else { + newLastChildChild.label = newLastChildChild.label + '-鍔犻珮' + newLastChildChild.height += (device.ardTowerModel?.modelHeight - newLastChildChild.height + 20) ; + device.children.push(newLastChildChild); + } + } + } + }) + }, + //杩斿洖鏁版嵁杞崲鏍戠粨鏋� + transformFlightData(data) { + console.log(data) + const result = []; + + data.forEach(item => { + // 鎵惧埌绗竴涓� groundPoint锛屼綔涓轰唬琛� + const groundPoint = item.groundPointVo?.[0]; + + // 鐢熸垚 children 鑺傜偣 + const children = groundPoint ? [{ + id: groundPoint.id, + label: groundPoint.targetName, + longitude: groundPoint.longitude, + latitude: groundPoint.latitude, + height: groundPoint.height + }] : []; + + // 鐢熸垚绌轰腑鐐� + result.push({ + id: item.id, + label: item.targetName, + longitude: item.longitude, + latitude: item.latitude, + height: item.altitude, + children + }); + }); + + return result; + }, + dealTableTemplate(obj){ + const targetTableData = this.tableData.find(item => item.id === obj.deviceId) + const targetTreeData = this.treeData.find(item => item.id === obj.deviceId) + if (targetTableData) { + this.$set(targetTableData, 'mode', obj.modelObj.templateName) // 鉁� Vue2 闇�瑕佷娇鐢� $set 浠ョ‘淇濆搷搴斿紡 + } + if (targetTreeData) { + this.$set(targetTreeData, 'mode', obj.modelObj.templateName) // 鉁� Vue2 闇�瑕佷娇鐢� $set 浠ョ‘淇濆搷搴斿紡 + } + }, + dealTreeMerge(obj,data){ + this.treeData.forEach(item => { + if(item.id == obj.deviceId) { + // 鏇挎崲绗竴灞傛瘡涓妭鐐圭殑 children + this.$set(item, 'children', JSON.parse(JSON.stringify(data))); + } + }); + }, + generateId() { + return 'id_' + Math.random().toString(36).substring(2, 10); + }, + drawConnectionsWithLabels(devices) { + if(lastConnectPolyline) { + viewer.entities.remove(lastConnectPolyline) + lastConnectPolyline = null + } + // 鐩存帴鎿嶄綔EntityCollection锛堟帹鑽愶級 + const entitiesToRemove = []; + viewer.entities.values.forEach(entity => { + if (entity.id && entity.id.includes(this.deviceId)) { + entitiesToRemove.push(entity.id); + } + }); + + entitiesToRemove.forEach(id => { + viewer.entities.removeById(id); + }); + const airPoints = []; + console.log(devices) + devices.forEach(device => { + if (!Array.isArray(device.children)) return; + device.children.forEach(airPoint => { + // 绌轰腑鐐逛綅缃� + const airPos = Cesium.Cartesian3.fromDegrees( + airPoint.longitude, + airPoint.latitude, + airPoint.height + ); + + // 鉁� 娣诲姞绌轰腑鐐瑰疄浣撳拰 label + viewer.entities.add({ + position: airPos, + id:device.id +'airpoint' + this.generateId(), + point: { + pixelSize: 6, + color: Cesium.Color.YELLOW + }, + label: { + text: airPoint.label || '', + font: '14px sans-serif', + fillColor: Cesium.Color.YELLOW, + style: Cesium.LabelStyle.FILL_AND_OUTLINE, + outlineColor: Cesium.Color.BLACK, + outlineWidth: 2, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -12) + } + }); + + airPoints.push(airPos); + + // 閬嶅巻鍦伴潰鐐癸紙瀛愰」锛� + if (Array.isArray(airPoint.children)) { + airPoint.children.forEach(groundPoint => { + const groundPos = Cesium.Cartesian3.fromDegrees( + groundPoint.longitude, + groundPoint.latitude, + groundPoint.height + ); + + // 鉁� 娣诲姞鍦伴潰鐐瑰疄浣撳拰 label + viewer.entities.add({ + id:device.id +'groundpoint' + this.generateId(), + position: groundPos, + point: { + pixelSize: 6, + color: Cesium.Color.BLUE + }, + label: { + text: groundPoint.label || '', + font: '14px sans-serif', + fillColor: Cesium.Color.WHITE, + style: Cesium.LabelStyle.FILL_AND_OUTLINE, + outlineColor: Cesium.Color.BLACK, + outlineWidth: 2, + verticalOrigin: Cesium.VerticalOrigin.BOTTOM, + pixelOffset: new Cesium.Cartesian2(0, -12) + } + }); + + // 鉁� 钃濊壊铏氱嚎杩炴帴锛氱┖涓偣 鉃� 鍦伴潰鐐� + viewer.entities.add({ + id:device.id +'polyline' + this.generateId(), + polyline: { + positions: [airPos, groundPos], + width: 2, + material: new Cesium.PolylineDashMaterialProperty({ + color: Cesium.Color.BLUE, + dashLength: 8 + }) + } + }); + }); + } + }); + }); + console.log(airPoints) + // 鉁� 榛勮壊瀹炵嚎杩炴帴鎵�鏈夌┖涓偣 + if (airPoints.length > 1) { + lastConnectPolyline = viewer.entities.add({ + polyline: { + positions: airPoints, + width: 3, + material: Cesium.Color.YELLOW + } + }); + } + }, + rotateAllPoints(dataList,towerLongitude,towerLatitude,towerhHight) { + return dataList.map(item => { + if(!item.isDeal) { + const towerPoint = Cesium.Cartesian3.fromDegrees(towerLongitude, towerLatitude, towerhHight); + const newGround = { + ...item, + }; + if(item.id == this.deviceId ){ + item.isDeal = true + } + // 澶勭悊瀛愮┖涓偣 + newGround.children = item.children?.map(child => { + const airPoint = Cesium.Cartesian3.fromDegrees(child.longitude, child.latitude, child.height); + const rotatedAirPoint = this.rotateAroundPoint( airPoint,towerPoint, rotationAngle); + const rotatedAirCarto = Cesium.Cartographic.fromCartesian(rotatedAirPoint); + child.longitude = Cesium.Math.toDegrees(rotatedAirCarto.longitude) + child.latitude = Cesium.Math.toDegrees(rotatedAirCarto.latitude) + child.height = rotatedAirCarto.height + child.children = child.children?.map(sonChild => { + const groundPoint = Cesium.Cartesian3.fromDegrees(sonChild.longitude, sonChild.latitude, sonChild.height); + const newGroundPoint = this.rotateAroundPoint( groundPoint,towerPoint, rotationAngle); + const newGroundCarto = Cesium.Cartographic.fromCartesian(newGroundPoint); + return { + ...sonChild, + longitude: Cesium.Math.toDegrees(newGroundCarto.longitude), + latitude: Cesium.Math.toDegrees(newGroundCarto.latitude), + height: newGroundCarto.height + }; + }); + }); + console.log(newGround.children) + return newGround; + } + + }); + }, + //聽璁$畻鐐笰缁曠偣B閫嗘椂閽堟棆杞寚瀹氳搴﹀悗鐨勬柊浣嶇疆 + // 绌轰腑鐐规垨鑰呭湴闈㈢偣绗涘崱灏斿潗鏍� 濉旂殑绗涘崱灏斿潗鏍� 濉旂殑鏈濆悜鍊� + rotateAroundPoint(startPoint,pivotPoint,rotationAngle) { + console.log(rotationAngle) + //聽鍒涘缓涓�涓粠B鐐瑰埌鏈湴鍧愭爣绯荤殑杞崲鐭╅樀锛堜笢鏂瑰悜涓篨杞达紝鍖楁柟鍚戜负Y杞达紝鍨傜洿鏂瑰悜涓篫杞达級 + const transformationMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(pivotPoint); + //聽鑾峰彇涓栫晫鍧愭爣绯诲埌鏈湴鍧愭爣绯荤殑杞崲鐭╅樀 + const inverseTransformationMatrix = Cesium.Matrix4.inverse(transformationMatrix,new Cesium.Matrix4()); + //聽灏咥鐐硅浆鎹㈠埌灞�閮ㄥ潗鏍囩郴涓� + const localStartPoint = Cesium.Matrix4.multiplyByPoint(inverseTransformationMatrix, startPoint,new Cesium.Cartesian3()); + //聽璁$畻A鐐瑰湪灞�閮ㄥ潗鏍囩郴涓�嗘椂閽堟棆杞寚瀹氳搴﹀悗鐨勬柊浣嶇疆 + const rotatedX = localStartPoint.x * Math.cos(rotationAngle) + localStartPoint.y * Math.sin(rotationAngle); + const rotatedY = localStartPoint.y * Math.cos(rotationAngle) - localStartPoint.x * Math.sin(rotationAngle); + const rotatedZ = localStartPoint.z; //聽Z杞村潗鏍囦繚鎸佷笉鍙� + //聽灏嗘棆杞悗鐨勫眬閮ㄥ潗鏍囪浆鎹㈠洖涓栫晫鍧愭爣绯� + return Cesium.Matrix4.multiplyByPoint(transformationMatrix,聽new聽Cesium.Cartesian3(rotatedX,聽rotatedY,聽rotatedZ),聽new聽Cesium.Cartesian3()); + }, + getRowKeys(row){ + console.log(row) + return row.id +this.generateId() + }, + submit(){ + console.log(this.treeData) + + const routePointList = []; + + this.treeData.forEach(device => { + device.children.forEach((airPoint, index) => { + routePointList.push({ + routePointIndex: routePointList.length, + longitude: airPoint.longitude, + latitude: airPoint.latitude, + height: airPoint.height, + isStartAndEndPoint: false, + coordinatePointReq: { + height: airPoint.children[0].height, + latitude:airPoint.children[0].latitude, + longitude: airPoint.children[0].longitude + } + }); + }); + }); + + // 鏍囪棣栧熬涓� true + if (routePointList.length > 0) { + routePointList[0].isStartAndEndPoint = true; + routePointList[routePointList.length - 1].isStartAndEndPoint = true; + } + + console.log(routePointList); + let params = { + routePointList:routePointList + } + console.log('鐢熸垚鑸嚎') + buildKmz(params).then(res=>{ + if(res.code == 200) { + this.$message({ + message: '鐢熸垚鑸嚎鎴愬姛', + type: 'success' + }) + } + }) } } } -- Gitblit v1.9.3