Files
tunnel-cloud-web/src/components/content/tunnelScene/sceneClass/editEquipment/index.js
2023-12-29 21:18:48 +08:00

186 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Demo from "../demo";
import EquipmentTag from "../utils/EquipmentTag";
/**
*
* @param {Mesh} targetPoint
* @param {String} equType "fan" "sensors"
*/
//formInfo需要的信息这里包括了
//equipmentType
function addEquipment(targetPoint, formInfo) {
if (targetPoint.hasDevice) {
return;
}
console.log("info", formInfo);
switch (formInfo.equipmentType) {
case "frequency":
handleFanEqu.call(this, targetPoint, formInfo);
break;
// 还没有风压阀的模型,所以先用其他设备传感器实现
// case "valve":
// handleValveEqu.call(this, targetPoint, formInfo.chooseEquipment);
// break;
case "windPressure":
case "sensor":
handleOtherEqu.call(this, targetPoint, formInfo);
break;
default:
break;
}
targetPoint.hasDevice = true;
// 标识设备信息
this.clearTagsObj();
}
// function handleValveEqu(targetPoint, equipmentInfo) {
// }
let allline = new Array
// 其他传感器
function handleOtherEqu(targetPoint, equipmentInfo) {
const equMesh = this.equMap.get("equ_sensors").clone();
const worldP = targetPoint.getWorldPosition(new this.THREE.Vector3());
equMesh.position.copy(worldP);
//设备添加标签
const tag = EquipmentTag(equipmentInfo.equipmentName);
equMesh.getObjectByName("tag").material = tag;
if (/tr$/.test(targetPoint.name)) {
equMesh.rotation.z = -Math.PI / 2;
equMesh.rotation.y -= Math.PI / 4;
equMesh.getObjectByName("tag").rotation.z += Math.PI; // 注意在原来的基础上加
} else if (/tl$/.test(targetPoint.name)) {
equMesh.rotation.z = Math.PI / 2;
equMesh.rotation.y += Math.PI / 4;
equMesh.getObjectByName("tag").rotation.z += Math.PI;
} else if (/tc$/.test(targetPoint.name)) {
equMesh.rotation.z = Math.PI;
equMesh.getObjectByName("tag").rotation.z += Math.PI;
} else if (/br$/.test(targetPoint.name)) {
equMesh.rotation.z = -Math.PI / 2;
equMesh.getObjectByName("tag").rotation.z += Math.PI;
} else if (/bl$/.test(targetPoint.name)) {
equMesh.rotation.z = Math.PI / 2;
equMesh.getObjectByName("tag").rotation.z += Math.PI;
}
targetPoint.scale.set(0.03, 0.06, 0.05);
this.scene.add(equMesh);
targetPoint.visible = false;
targetPoint.hasWall = true;
//处理风压阀的代码片段
let lineIndex = targetPoint.name.slice(7, 9)
if (allline.includes(Number(lineIndex))) {
allline.slice(array.indexOf(lineIndex), 1)
console.log('dadad');
} else {
allline.push(Number(lineIndex))
}
console.log(allline);
// console.log(allline);
// allline.forEach((item, index, array) => {
// if (array.includes(item)) {
// array.slice(array.indexOf(item), 1)
// array.slice(array.indexOf(item), 1)
// console.log(array);
// }
// })
// console.log(this.scene);
// 保存该设备模型id后期直接从附附着点进行删除
targetPoint.info = {
id: equMesh.id,
...equipmentInfo,
};
//下面进行模拟分压阀的添加效果
// 1.先取出当前点击添加设备锚点的行数
// 2.再进行字符串拼接出墙的名字使用scene.getObjectByName(墙名去获取)
// 3.加上循环固定到20结束就可以了将点击的函数到20的函数的墙全部设为visable设为可见,还需要将中间的那行设备和附着点全部设为隐藏,且层级变低,无法选中
}
// 风机
function handleFanEqu(
targetPoint,
equipmentInfo,
speed = Math.random().toFixed(1) * 1000
) {
// 由于风机比较多,每个风机转速不一直,保存在一个数中遍历
if (!this.fanSpinArray) {
this.fanSpinArray = [];
}
const equMesh = this.equMap.get("equ_fan").clone();
const worldP = targetPoint.getWorldPosition(new this.THREE.Vector3());
equMesh.position.copy(worldP);
equMesh.translateY(-0.6);
this.scene.add(equMesh);
targetPoint.visible = false;
// 放大附着点方便选中风机的范围
targetPoint.scale.set(0.06, 0.06, 0.06);
// 保存该设备id后期直接从附附着点进行删除
targetPoint.info = {
id: equMesh.id, //模型在场景id
...equipmentInfo,
};
// 定义风机旋转
const fanLeaf = equMesh.getObjectByName("fan_leafs");
const fanSpin = new this.TWEEN.Tween({ rotation: 0 });
fanSpin.to({ rotation: 2 * Math.PI }, speed);
fanSpin.repeat(Infinity);
fanSpin.start();
fanSpin.onUpdate((obj) => {
fanLeaf.rotation.z = obj.rotation;
});
this.fanSpinArray.push(fanSpin);
}
// 删除传感器
function removeEquipment(targetPoint) {
//删除设备这里需要再进行处理,就是根据附着点(附着点一定保存了当前添加设备的信息了)判断是不是分压阀,然后继续一样的隐藏
if (!targetPoint.hasDevice) return;
// if (targetPoint.hasWall == true) {
// 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";
// console.log(this.scene.getObjectByName(point));
// 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;
// }
// } 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);
// 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;
// }
// }
// //处理21行的设备和附着点
// 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;
// }
// }
// }
console.log("测试是不是删除了");
const mesh = this.scene.getObjectById(targetPoint.info.id);
this.scene.remove(mesh);
targetPoint.visible = true;
targetPoint.hasDevice = false;
targetPoint.scale.set(0.01, 0.01, 0.01);
delete targetPoint.info; // 清空设备信息
}
export { addEquipment, removeEquipment };