From 38820566ec10d3dbb73297af463c62fd7f9d3c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=93=E6=B4=81?= <209192278@qq.com> Date: Thu, 7 Dec 2023 23:30:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=93=E6=B4=81=20:=20=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/tunnelScene/TunnelScene.vue | 114 +++++++++++++++-- .../content/tunnelScene/childComp/DevInfo.vue | 22 +++- .../content/tunnelScene/childComp/EditDev.vue | 48 ++++--- .../tunnelScene/sceneClass/addDev/index.js | 37 ++++++ .../tunnelScene/sceneClass/addEvent/index.js | 8 ++ .../content/tunnelScene/sceneClass/demo.js | 119 +++--------------- .../sceneClass/handleDBLclick/index.js | 40 +----- .../sceneClass/handleRLclick/handleLclick.js | 20 +-- .../sceneClass/handleRLclick/handleRclick.js | 4 +- .../tunnelScene/sceneClass/removeDev/index.js | 10 ++ 10 files changed, 225 insertions(+), 197 deletions(-) create mode 100644 src/components/content/tunnelScene/sceneClass/addDev/index.js create mode 100644 src/components/content/tunnelScene/sceneClass/addEvent/index.js create mode 100644 src/components/content/tunnelScene/sceneClass/removeDev/index.js diff --git a/src/components/content/tunnelScene/TunnelScene.vue b/src/components/content/tunnelScene/TunnelScene.vue index 0e66bf4..5b9ef4c 100644 --- a/src/components/content/tunnelScene/TunnelScene.vue +++ b/src/components/content/tunnelScene/TunnelScene.vue @@ -1,7 +1,12 @@ @@ -21,31 +26,33 @@ import { } from "three/addons/renderers/CSS3DRenderer.js"; import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader"; -import DevInfo from "./childComp/DevInfo.vue"; +import DevInfo from "./childComp/devinfo.vue"; import EditDev from "./childComp/EditDev.vue"; -import { onMounted, ref } from "vue"; +import { onMounted, reactive, ref } from "vue"; +import { ElMessage } from "element-plus"; // 获取html标签跟随组件 const content = ref(null); const info = ref(null); const edit = ref(null); - +const num = 10000; +let demo; //定义demo全局变量 const loader = new OBJLoader(); // 模版挂载后 onMounted(handleMounted); // 处理回调 async function handleMounted() { const doms = [info.value.$el, edit.value.$el]; - const demo = new ThreeDScene(three, content.value); + demo = new ThreeDScene(three, content.value); demo.loadModel(GLTFLoader, "./assets/tunnelModel/chanel.glb"); demo.addOrbitControls(OrbitControls); demo.addTween(TWEEN); demo.addCSS3Renderer(CSS3DRenderer, CSS3DSprite, doms); - demo.addOBJLoader(OBJLoader); - demo.loadeOBJModel(); + demo.setDistance(10); + lClickCallback(demo); //左键回调 + rClickCallback(demo); //右键回调 // 初始化设备模型 - try { const deviceList = []; let result = await loadModel("/devicesModel/Camera.obj"); @@ -56,10 +63,16 @@ async function handleMounted() { deviceList.push(result); result = await loadModel("/devicesModel/dev3.obj"); deviceList.push(result); - } catch (e) {} - // demo.initDevicesModel(); + // 给对象初加载设备模型 + demo.initDevicesModel(deviceList); + console.info("设备模型加载完毕"); + // 清空内存 + result = null; + } catch (err) { + console.log(err); + } } - +// 每个模型加载回调 function loadModel(path) { return new Promise((resolve, reject) => { loader.load( @@ -74,6 +87,83 @@ function loadModel(path) { ); }); } + +let hasDevice = ref(true); +let devInfo = reactive({ + meshId: null, + name: "无", + state: "无", + position: "无", +}); + +// 赋值功能 +function editDevInfo( + value = { + meshId: null, + name: "无", + state: "无", + position: "无", + } +) { + devInfo.meshId = value.meshId; + devInfo.name = value.name; + devInfo.state = value.state; + devInfo.position = value.position; +} + +//点击左键返回附着点信息给组件 +function lClickCallback(demo) { + //demo动态添加函数,为操作组件内部 + function displayDevInfo(targetPoint = null) { + hasDevice.value = targetPoint.hasDevice; + if (!targetPoint.info) { + editDevInfo(); + return; + } + editDevInfo(targetPoint.info); + } + // 传给内部使用 + demo.addFunction("displayDevInfo", displayDevInfo); +} + +// 点击右键设备返回附着点对象 +function rClickCallback(demo) { + function editDev(targetPoint = null) { + hasDevice = targetPoint.hasDevice; + if (!targetPoint.info) return; + editDevInfo(targetPoint.info); + } + demo.addFunction("editDev", editDev); +} + +// 添加设备 +function handleAddDev(devInfo) { + if (!demo) { + // 处理未加载完场景情况 + console.info("3D场景正在渲染,请稍后操作"); + return; + } + const tempDevInfo = demo.addDev(devInfo); + hasDevice.value = true; + editDevInfo(tempDevInfo); + ElMessage({ + message: "添加成功", + type: "success", + }); +} + +// 删除设备 +async function handleRemoveDev() { + const result = await demo.removeDev(devInfo.meshId); + if (result === "ok") { + hasDevice.value = false; + editDevInfo(); + ElMessage({ + message: "删除成功", + type: "success", + }); + } +} diff --git a/src/components/content/tunnelScene/childComp/EditDev.vue b/src/components/content/tunnelScene/childComp/EditDev.vue index ec4fa3d..4c656e2 100644 --- a/src/components/content/tunnelScene/childComp/EditDev.vue +++ b/src/components/content/tunnelScene/childComp/EditDev.vue @@ -7,50 +7,49 @@ v-for="(item, key) of devicesList" :key="key" @click="checkDev(key)" + :class="{ 'li-active': checkIndex === key }" > -
{{ item.devName }}
+
{{ item.devName + key }}
- - + +