From 20bfc32d080d0eb21919bead71d7ca5f243e91db Mon Sep 17 00:00:00 2001 From: trp <2477421791@qq.com> Date: Fri, 29 Dec 2023 13:09:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=94=90=E6=B6=A6=E5=B9=B3=EF=BC=9A?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/tunnelScene.js | 9 ++ .../content/tunnelScene/TunnelScene.vue | 71 +++++----- .../tunnelScene/editEquComp/editDialog.vue | 42 +++--- .../content/tunnelScene/request/index.js | 128 ++++++++++++++++++ .../sceneClass/editEquipment/index.js | 101 +++++++------- src/store/modelSceneStore.js | 17 ++- src/views/edit/edit.vue | 112 +++++++-------- 7 files changed, 314 insertions(+), 166 deletions(-) create mode 100644 src/components/content/tunnelScene/request/index.js diff --git a/src/api/tunnelScene.js b/src/api/tunnelScene.js index 5b1aa0a..43b4edc 100644 --- a/src/api/tunnelScene.js +++ b/src/api/tunnelScene.js @@ -42,3 +42,12 @@ export const saveEquipment = ( }, }); }; + +// 保存模型(新增) +export const apiSaveEquipment = (data) => { + return request({ + url: "/tunnel/model/details", + method: "put", + data, + }); +}; diff --git a/src/components/content/tunnelScene/TunnelScene.vue b/src/components/content/tunnelScene/TunnelScene.vue index 77738bb..b0add02 100644 --- a/src/components/content/tunnelScene/TunnelScene.vue +++ b/src/components/content/tunnelScene/TunnelScene.vue @@ -3,17 +3,34 @@
- - + + " + >

是否确定删除该设备

@@ -49,45 +66,38 @@ import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader"; import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"; import { onMounted, reactive, ref, watch } from "vue"; import { ElMessage } from "element-plus"; -import { useModelSceneStore } from "@/store/modelSceneStore"; +import { deleteEquipment, initData } from "./request"; // 获取html标签跟随组件dom const content = ref(null); const info = ref(null); const edit = ref(null); -const store = useModelSceneStore(); - +let modelList = ref(null); let demo; //定义demo对象 const loader = new OBJLoader(); let hdrLoader = new RGBELoader(); let backColorSet = three.sRGBEncoding; -const params = defineProps(["isedit", "tunnelId", "tunnelLength"]); //接收参数看是不是编辑模式,如果是编辑模式,则需要做一些处理 - +const params = defineProps(["isedit", "tunnelId", "tunnelLength", "form"]); //接收参数看是不是编辑模式,如果是编辑模式,则需要做一些处理 let isedit = ref(params.isedit); - let tunnelId = reactive(params.tunnelId); -console.log(tunnelId); -console.log(params.tunnelLength); watch( () => params.tunnelLength, (now) => { - params.tunnelLength = now + params.tunnelLength = now; console.log(params.tunnelLength); - pointGap = now / 20 + pointGap = now / 20; }, { deep: true } -) +); let pointGap = reactive(params.tunnelLength); - onMounted(handleMounted); // 挂载后回调 async function handleMounted() { - const doms = [info.value.$el, edit.value.$el]; demo = new ThreeDScene(three, content.value); //看是不是预览模式,然后继续相关的操作(会在demo中的初始化中进行) @@ -106,12 +116,7 @@ async function handleMounted() { //加载HDR背景图片 demo.loadBackground(hdrLoader, backColorSet); - watch( - () => params.tunnelId, - async () => { - const text = await store.initData(params.tunnelId); - } - ); + // 初始化设备模型 try { const map = new Map(); @@ -119,16 +124,15 @@ async function handleMounted() { map.set("equ_sensors", await loadModel("/devicesModel/sensors.obj")); demo.initDevicesModel(map); // 初始化 - const equipmentList = await store.getEquipmentList(); - demo.editTunnelInit(equipmentList); + modelList.value = await initData(params.tunnelId, params.form); + console.log("init", params.tunnelId); + demo.editTunnelInit(modelList.value); } catch (err) { ElMessage({ - message: "场景加载异常!", + message: "场景初始化异常!", type: "warning", }); } - - } // 每个模型加载回调 @@ -139,7 +143,7 @@ function loadModel(path) { (obj) => { resolve(obj); }, - (xhr) => { }, + (xhr) => {}, (err) => { reject(err); } @@ -225,8 +229,7 @@ function handleRemoveEqu() { // 对话框确认删除 function handleConfirmAddEqu() { console.log("target:", targetP.value.info); - store - .deleteEquipment(10000, params.tunnelId, targetP.value.info.equipmentId) + deleteEquipment(targetP.value.info.equipmentId, pointGap) .then((res) => { demo.removeEquipment(targetP.value); centerDialogVisible.value = false; @@ -235,9 +238,9 @@ function handleConfirmAddEqu() { type: "success", }); }) - .catch((err) => { + .catch((res) => { ElMessage({ - message: "请求异常!", + message: "删除失败!", type: "warning", }); }); diff --git a/src/components/content/tunnelScene/editEquComp/editDialog.vue b/src/components/content/tunnelScene/editEquComp/editDialog.vue index b188143..a9fc3cb 100644 --- a/src/components/content/tunnelScene/editEquComp/editDialog.vue +++ b/src/components/content/tunnelScene/editEquComp/editDialog.vue @@ -48,9 +48,8 @@ import InputNum from "./childComps/InputNum.vue"; import SelectInput from "./childComps/SelectInput.vue"; import { getEquipmentType, getEquipment } from "@/api/tunnelScene"; import { reactive, computed, defineEmits, defineProps, watch, ref } from "vue"; -import { useModelSceneStore } from "@/store/modelSceneStore"; import { ElMessage } from "element-plus"; - +import { saveEquipment, initData } from "../request"; const emit = defineEmits(["cancel", "removeEquipment", "addEquipment"]); const params = defineProps([ "pointNum", @@ -58,13 +57,14 @@ const params = defineProps([ "tunnelId", "position", "hasEquipment", + "form", ]); -// 当前风压 let p = ref(57); const equipment = ref(null); const equipmentType = ref(null); -const store = useModelSceneStore(); + +let maxConstructionLength = ref(0); //计算锚点之间距离 const pointDistance_str = computed( () => @@ -73,18 +73,35 @@ const pointDistance_str = computed( }米` ); +watch( + () => params.form, + () => { + initData(params.tunnelId, params.form); + }, + { + deep: true, + } +); + // 请求数据模型 const equipmentSetting = reactive({ + equipmentId: null, + equipmentName: "", equipmentType: "", //设备类型 - chooseEquipment: null, //设备选择(设备名称) + position: "", threshold: "", //阈值 + typeKey: null, //设备选择(设备名称) }); // 绑定选择的设备类型 function handleTypeChange(optionItem) { equipmentSetting.equipmentType = optionItem.value; + console.log("option", equipmentSetting); } function handleEquipmentChange(equipmentItem) { - equipmentSetting.chooseEquipment = equipmentItem; + equipmentSetting.equipmentName = equipmentItem.label; + equipmentSetting.equipmentId = equipmentItem.equipmentId; + equipmentSetting.typeKey = equipmentItem.value; + console.log("option", equipmentSetting); } // 设备类型选项参数 let options = reactive([{ label: "暂无数据", value: "" }]); @@ -150,25 +167,18 @@ function addEquipment() { }); return; } - if (!equipmentSetting.equipmentType || !equipmentSetting.chooseEquipment) { + if (!equipmentSetting.equipmentType || !equipmentSetting.equipmentId) { ElMessage({ message: "选项不能为空!", type: "warning", }); return; } - equipmentSetting.position = params.position; // 合法请求 - store - .saveSceneData(10000, 1, equipmentSetting) + saveEquipment(equipmentSetting, params.pointGap) .then((res) => { emit("addEquipment", equipmentSetting); - equipmentSetting.chooseEquipment = null; - equipmentSetting.equipmentType = ""; - equipmentSetting.threshold = ""; - equipment.value.reset(); - equipmentType.value.reset(); ElMessage({ message: "添加成功!", type: "success", @@ -176,7 +186,7 @@ function addEquipment() { }) .catch((err) => { ElMessage({ - message: "请求异常!", + message: "添加异常!", type: "warning", }); }); diff --git a/src/components/content/tunnelScene/request/index.js b/src/components/content/tunnelScene/request/index.js new file mode 100644 index 0000000..601b910 --- /dev/null +++ b/src/components/content/tunnelScene/request/index.js @@ -0,0 +1,128 @@ +import { apiSaveEquipment, initSceneData } from "@/api/tunnelScene"; +import { toRaw } from "vue"; +let modelEquipmentList = []; +let originData = null; +// 初始化当前隧道数据并保存在本地 +export const initData = (tunnelId, otherInfo) => { + return new Promise((resolve, reject) => { + initSceneData(tunnelId) + .then((res) => { + originData = toRaw(otherInfo); + if (res.data.tunnelThreeConfig) { + console.log("data", res.data); + modelEquipmentList = JSON.parse(res.data.tunnelThreeConfig); + } + console.log("test", modelEquipmentList, originData); + resolve(modelEquipmentList); + }) + .catch((Error) => { + ElMessage.error("场景初始化异常!"); + reject(); + }); + }); +}; + +//保存数据并提交 +export const saveEquipment = (equipmentInfo, pointGap) => { + const { + constructionLength, + isDefault, + remarks, + serialNumber, + siteId, + totalLength, + tunnelId, + tunnelName, + } = originData; + let tempModelEquipmentList = [...modelEquipmentList]; //数组克隆 + tempModelEquipmentList.push(toRaw(equipmentInfo)); + + return new Promise((resolve, reject) => { + apiSaveEquipment({ + constructionLength: autoComputeConstructionLength( + tempModelEquipmentList, + pointGap + ), + isDefault, + modelEquipmentList: tempModelEquipmentList, + remarks, + serialNumber, + tunnelId, + tunnelLength: totalLength, + tunnelName, + }) + .then((res) => { + if (res?.code === 1000) { + modelEquipmentList.push(toRaw(equipmentInfo)); //存入本地 + resolve(); + } + reject(res); + }) + .catch((err) => { + reject(); + }); + }); +}; + +// 删除 +export const deleteEquipment = (equipmentId, pointGap) => { + let tempModelEquipmentList = [...modelEquipmentList]; //数组克隆 + tempModelEquipmentList = tempModelEquipmentList.filter( + (item) => item.equipmentId != equipmentId + ); + const { + constructionLength, + isDefault, + remarks, + serialNumber, + siteId, + totalLength, + tunnelId, + tunnelName, + } = originData; + return new Promise((resolve, reject) => { + apiSaveEquipment({ + constructionLength: autoComputeConstructionLength( + tempModelEquipmentList, + pointGap + ), + isDefault, + modelEquipmentList: tempModelEquipmentList, + remarks, + serialNumber, + tunnelId, + tunnelLength: totalLength, + tunnelName, + }) + .then((res) => { + if (res?.code === 1000) { + modelEquipmentList = modelEquipmentList.filter( + (item) => item.equipmentId != equipmentId + ); + resolve(); + } + reject(res); + }) + .catch((err) => { + reject(); + }); + }); +}; + +function autoComputeConstructionLength(modelEquipmentList, pointGap) { + let maxLength = 0; + modelEquipmentList.forEach((item) => { + const length = + Number( + item.position.substring( + item.position.indexOf("_") + 1, + item.position.lastIndexOf("_") + ) - 1 + ) * pointGap; + if (length > maxLength) { + maxLength = length; + } + }); + console.log("max", maxLength); + return maxLength; +} diff --git a/src/components/content/tunnelScene/sceneClass/editEquipment/index.js b/src/components/content/tunnelScene/sceneClass/editEquipment/index.js index b6d0156..766567a 100644 --- a/src/components/content/tunnelScene/sceneClass/editEquipment/index.js +++ b/src/components/content/tunnelScene/sceneClass/editEquipment/index.js @@ -12,10 +12,10 @@ function addEquipment(targetPoint, formInfo) { if (targetPoint.hasDevice) { return; } - + console.log("info", formInfo); switch (formInfo.equipmentType) { case "frequency": - handleFanEqu.call(this, targetPoint, formInfo.chooseEquipment); + handleFanEqu.call(this, targetPoint, formInfo); break; // 还没有风压阀的模型,所以先用其他设备传感器实现 // case "valve": @@ -23,7 +23,7 @@ function addEquipment(targetPoint, formInfo) { // break; case "windPressure": case "sensor": - handleOtherEqu.call(this, targetPoint, formInfo.chooseEquipment); + handleOtherEqu.call(this, targetPoint, formInfo); break; default: break; @@ -37,9 +37,6 @@ function addEquipment(targetPoint, formInfo) { // } - - - // 其他传感器 function handleOtherEqu(targetPoint, equipmentInfo) { const equMesh = this.equMap.get("equ_sensors").clone(); @@ -47,8 +44,7 @@ function handleOtherEqu(targetPoint, equipmentInfo) { equMesh.position.copy(worldP); //设备添加标签 - const tag = EquipmentTag(equipmentInfo.label); - console.log(equipmentInfo); + const tag = EquipmentTag(equipmentInfo.equipmentName); equMesh.getObjectByName("tag").material = tag; if (/tr$/.test(targetPoint.name)) { equMesh.rotation.z = -Math.PI / 2; @@ -71,39 +67,38 @@ function handleOtherEqu(targetPoint, equipmentInfo) { targetPoint.scale.set(0.03, 0.06, 0.05); this.scene.add(equMesh); targetPoint.visible = false; - targetPoint.hasWall = true + targetPoint.hasWall = true; //处理风压阀的代码片段 - let lineIndex = targetPoint.name.slice(7, 9) + let lineIndex = targetPoint.name.slice(7, 9); for (let line = Number(lineIndex); line <= 20; line++) { if (line < 10) { - let wall = 'wall_' + '0' + line - this.scene.getObjectByName(wall).visible = true - let point = 'point_' + '00' + line + '_tc' - console.log(this.scene.getObjectByName(point)); - this.scene.getObjectByName(point).visible = false - this.scene.getObjectByName(point).layers.set(-2) + let wall = "wall_" + "0" + line; + this.scene.getObjectByName(wall).visible = true; + let point = "point_" + "00" + line + "_tc"; + this.scene.getObjectByName(point).visible = false; + this.scene.getObjectByName(point).layers.set(-2); if (this.scene.getObjectByName(point).hasDevice == true) { - let EquID = this.scene.getObjectByName(point).info.id - this.scene.getObjectById(EquID).visible = false + let EquID = this.scene.getObjectByName(point).info.id; + this.scene.getObjectById(EquID).visible = false; } } else if (line >= 10) { - let wall = 'wall_' + line - this.scene.getObjectByName(wall).visible = true - let point = 'point_' + '0' + line + '_tc' - this.scene.getObjectByName(point).visible = false - this.scene.getObjectByName(point).layers.set(-2) + let wall = "wall_" + line; + this.scene.getObjectByName(wall).visible = true; + let point = "point_" + "0" + line + "_tc"; + this.scene.getObjectByName(point).visible = false; + this.scene.getObjectByName(point).layers.set(-2); if (this.scene.getObjectByName(point).hasDevice == true) { - let EquID = this.scene.getObjectByName(point).info.id - this.scene.getObjectById(EquID).visible = false + let EquID = this.scene.getObjectByName(point).info.id; + this.scene.getObjectById(EquID).visible = false; } } //处理21行的设备和附着点 - let point = 'point_' + '0' + 21 + '_tc' - this.scene.getObjectByName(point).visible = false - this.scene.getObjectByName(point).layers.set(-2) + let point = "point_" + "0" + 21 + "_tc"; + this.scene.getObjectByName(point).visible = false; + this.scene.getObjectByName(point).layers.set(-2); if (this.scene.getObjectByName(point).hasDevice == true) { - let EquID = this.scene.getObjectByName(point).info.id - this.scene.getObjectById(EquID).visible = false + let EquID = this.scene.getObjectByName(point).info.id; + this.scene.getObjectById(EquID).visible = false; } } // this.scene.getObjectByName('wall_01').visible = true @@ -117,7 +112,6 @@ function handleOtherEqu(targetPoint, equipmentInfo) { // 1.先取出当前点击添加设备锚点的行数 // 2.再进行字符串拼接出墙的名字,使用scene.getObjectByName(墙名去获取) // 3.加上循环,固定到20结束就可以了,将点击的函数到20的函数的墙全部设为visable设为可见,还需要将中间的那行设备和附着点全部设为隐藏,且层级变低,无法选中 - } // 风机 @@ -153,7 +147,6 @@ function handleFanEqu( fanSpin.onUpdate((obj) => { fanLeaf.rotation.z = obj.rotation; }); - this.fanSpinArray.push(fanSpin); } @@ -162,39 +155,39 @@ function removeEquipment(targetPoint) { //删除设备这里需要再进行处理,就是根据附着点(附着点一定保存了当前添加设备的信息了)判断是不是分压阀,然后继续一样的隐藏 if (!targetPoint.hasDevice) return; if (targetPoint.hasWall == true) { - let lineIndex = targetPoint.name.slice(7, 9) + let lineIndex = targetPoint.name.slice(7, 9); for (let line = Number(lineIndex); line <= 20; line++) { if (line < 10) { - let wall = 'wall_' + '0' + line - this.scene.getObjectByName(wall).visible = false - let point = 'point_' + '00' + line + '_tc' + let wall = "wall_" + "0" + line; + this.scene.getObjectByName(wall).visible = false; + let point = "point_" + "00" + line + "_tc"; console.log(this.scene.getObjectByName(point)); - this.scene.getObjectByName(point).visible = true - this.scene.getObjectByName(point).layers.set(0) + this.scene.getObjectByName(point).visible = true; + this.scene.getObjectByName(point).layers.set(0); if (this.scene.getObjectByName(point).hasDevice == true) { - this.scene.getObjectByName(point).visible = false - let EquID = this.scene.getObjectByName(point).info.id - this.scene.getObjectById(EquID).visible = true + this.scene.getObjectByName(point).visible = false; + let EquID = this.scene.getObjectByName(point).info.id; + this.scene.getObjectById(EquID).visible = true; } } else if (line >= 10) { - let wall = 'wall_' + line - this.scene.getObjectByName(wall).visible = false - let point = 'point_' + '0' + line + '_tc' - this.scene.getObjectByName(point).visible = true - this.scene.getObjectByName(point).layers.set(0) + let wall = "wall_" + line; + this.scene.getObjectByName(wall).visible = false; + let point = "point_" + "0" + line + "_tc"; + this.scene.getObjectByName(point).visible = true; + this.scene.getObjectByName(point).layers.set(0); if (this.scene.getObjectByName(point).hasDevice == true) { - this.scene.getObjectByName(point).visible = false - let EquID = this.scene.getObjectByName(point).info.id - this.scene.getObjectById(EquID).visible = true + this.scene.getObjectByName(point).visible = false; + let EquID = this.scene.getObjectByName(point).info.id; + this.scene.getObjectById(EquID).visible = true; } } //处理21行的设备和附着点 - let point = 'point_' + '0' + 21 + '_tc' - this.scene.getObjectByName(point).visible = true - this.scene.getObjectByName(point).layers.set(0) + let point = "point_" + "0" + 21 + "_tc"; + this.scene.getObjectByName(point).visible = true; + this.scene.getObjectByName(point).layers.set(0); if (this.scene.getObjectByName(point).hasDevice == true) { - let EquID = this.scene.getObjectByName(point).info.id - this.scene.getObjectById(EquID).visible = true + let EquID = this.scene.getObjectByName(point).info.id; + this.scene.getObjectById(EquID).visible = true; } } } diff --git a/src/store/modelSceneStore.js b/src/store/modelSceneStore.js index 9b101ef..60178a4 100644 --- a/src/store/modelSceneStore.js +++ b/src/store/modelSceneStore.js @@ -3,23 +3,22 @@ import { ref } from "vue"; import { saveEquipment, initSceneData } from "../api/tunnelScene"; import { ElMessage } from "element-plus"; export const useModelSceneStore = defineStore("modelSceneData", () => { - let equipmentList = ref("[]"); + let equipmentList = ref([]); let allEditList = ref({}); function initData(tunnelId = 1) { initSceneData(tunnelId) .then((res) => { - equipmentList.value = res.data.tunnelThreeConfig; + // equipmentList.value = res.data.tunnelThreeConfig; + console.log("初始化的数据"); }) .catch((Error) => { ElMessage.error("场景初始化异常!"); }); } //默认初始化1号隧道 - function saveSceneData(constructionLength, tunnelId, modelData) { - const temp = JSON.parse(equipmentList.value); - temp.push(modelData); - equipmentList.value = JSON.stringify(temp); - console.log("save:", equipmentList.value); + function saveSceneData(data) { + equipmentList.value.push(data); + return saveEquipment(constructionLength, tunnelId, equipmentList.value); } // 删除设备 @@ -39,7 +38,7 @@ export const useModelSceneStore = defineStore("modelSceneData", () => { resolve(JSON.parse(equipmentList.value)); }) .catch((Error) => { - ElMessage.error("场景初始化异常!"); + // ElMessage.error("场景初始化异常!"); reject(); }); }); @@ -49,6 +48,6 @@ export const useModelSceneStore = defineStore("modelSceneData", () => { initData, saveSceneData, deleteEquipment, - getEquipmentList + getEquipmentList, }; }); diff --git a/src/views/edit/edit.vue b/src/views/edit/edit.vue index 75c3adc..7d3d92f 100644 --- a/src/views/edit/edit.vue +++ b/src/views/edit/edit.vue @@ -7,24 +7,24 @@
-
- 设备管理 -
-
- 保存 -
+
设备管理
+
保存
- + - + - + @@ -33,53 +33,60 @@ - +
- +