diff --git a/src/app/babylon/controller/info-manager.ts b/src/app/babylon/controller/info-manager.ts index 7a8fc35..c6beb2c 100644 --- a/src/app/babylon/controller/info-manager.ts +++ b/src/app/babylon/controller/info-manager.ts @@ -164,7 +164,6 @@ export class InfoManager { modelEditData: ModelEditData, buildingInfo: BuildingInfo = null ) { - console.trace("创建设备", buildingInfo); let facilities = modelEditData.facilities; @@ -174,12 +173,10 @@ export class InfoManager { let mesh: AbstractMesh = null; let facilityData = facilities[i].facilities[j] - if (facilityData.posType == FacilityPosType.In) { - mesh = SceneManager.Instance.scene.getMeshByID(facilityData.resName); - console.log("找到内置设备", mesh.uniqueId); + if (facilityData.posType == FacilityPosType.In && buildingInfo.ModelInfo != null) { + mesh = buildingInfo.ModelInfo.getChildrenByName(facilityData.resName); } - FacilityWindow.instance.createFacility( modelEditData.facilities[i].facilities[j], false, diff --git a/src/app/babylon/controller/scene-manager.ts b/src/app/babylon/controller/scene-manager.ts index 5e14706..ed25a86 100644 --- a/src/app/babylon/controller/scene-manager.ts +++ b/src/app/babylon/controller/scene-manager.ts @@ -252,25 +252,26 @@ export class SceneManager { */ addToHighLight(mesh: Mesh, color: Color3) { if (this.highLightLayer == null) { - this.highLightLayer = new HighlightLayer("highLight", this.scene); - this.highLightLayer.innerGlow = false; - } + this.highLightLayer = new HighlightLayer("highLight", this.scene, + { + mainTextureRatio: 1, + }); + this.highLightLayer.innerGlow = true; + this.highLightLayer.outerGlow = true; + } let allMesh = mesh.getChildMeshes(); - this.highLightLayer.addMesh(mesh, color); allMesh.push(mesh); for (let i = 0; i < allMesh.length; i++) { let childMesh = allMesh[i]; if (childMesh instanceof Mesh) { this.highLightLayer.addMesh(childMesh, color); + this.highLightNum++; } } - - - } highLightNum = 0; diff --git a/src/app/babylon/controller/status/building-status.ts b/src/app/babylon/controller/status/building-status.ts index 54bcaa9..a087bdd 100644 --- a/src/app/babylon/controller/status/building-status.ts +++ b/src/app/babylon/controller/status/building-status.ts @@ -137,9 +137,13 @@ export class BuildingStatus extends StatusBase { //判断已经有了就不创建了 // InfoManager.createFacilityInfos(buildingInfo.buildingData.outdoorData, buildingInfo); //显示 - this.buildingWindow.showFacilityInfosIcon(this.currentBuildingInfo, true); + //this.buildingWindow.showFacilityInfosIcon(this.currentBuildingInfo, true); } + this.buildingWindow.changeCurrentBuildingInfo(buildingInfo.ModelInfo); + + + } //模型变化 diff --git a/src/app/babylon/model/data/model-data/model-data-facility.ts b/src/app/babylon/model/data/model-data/model-data-facility.ts index d01fbfe..5fe89f2 100644 --- a/src/app/babylon/model/data/model-data/model-data-facility.ts +++ b/src/app/babylon/model/data/model-data/model-data-facility.ts @@ -246,11 +246,11 @@ export enum FacilityType { /** * 逃生路线 */ - XF_TSLX = "XF_TSLX", + AQSS_TSLX = "AQSS_TSLX", /** * 疏散点 */ - XF_SSD = "XF_SSD", + AQSS_SSD = "AQSS_SSD", /** * 罩棚 diff --git a/src/app/babylon/model/info/model/model-info-building.ts b/src/app/babylon/model/info/model/model-info-building.ts index 2d47b2a..2e50775 100644 --- a/src/app/babylon/model/info/model/model-info-building.ts +++ b/src/app/babylon/model/info/model/model-info-building.ts @@ -46,6 +46,16 @@ export class ModelInfo_building extends ModelInfo { } } + if (this.neiRoot == null) { + for (let i = 0; i < allTransformNode.length; i++) { + if (TsTool.stringContain(allTransformNode[i].name, "wai")) { + this.neiRoot = allTransformNode[i]; + break; + } + } + } + + if (this.neiRoot == null) { this.neiRoot = this.modelBox; diff --git a/src/app/babylon/model/info/model/model-info-facility.ts b/src/app/babylon/model/info/model/model-info-facility.ts index 2057ec4..f39a964 100644 --- a/src/app/babylon/model/info/model/model-info-facility.ts +++ b/src/app/babylon/model/info/model/model-info-facility.ts @@ -92,6 +92,7 @@ export class ModelInfo_facility extends ModelInfo { }); this.uiFollowRoot.zIndex = BabylonUIStyleTool.c_zIndex_facilityIcon; + this.showFollowUI(false); } diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index 066d77a..227a539 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -133,7 +133,6 @@ export class ModelInfo { showFollowUI(show: boolean) { if (this.uiFollowRoot != null) { this.uiFollowRoot.isVisible = show; - } } @@ -142,14 +141,13 @@ export class ModelInfo { * @param play false表示停止,并恢复正常 */ playShowAnim(play: boolean) { + this.showFollowUI(play); if (this.modelBox != null) { if (play) { - SceneManager.Instance.addToHighLight(this.modelBox as Mesh, Color3.Red()); - + SceneManager.Instance.addToHighLight(this.modelBox as Mesh, Color3.Yellow()); } else { SceneManager.Instance.removeFromHighLight(this.modelBox as Mesh); - } } } diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index 298de6a..8d8c3b4 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -1,4 +1,5 @@ +import { AbstractMesh, Material, Mesh } from "@babylonjs/core"; import { PlanComponent } from "src/app/pages/plan/plan.component"; import { DataManager } from "../../controller/data-manager"; import { InfoManager } from "../../controller/info-manager"; @@ -23,6 +24,11 @@ import { BuildingUIItem } from "./building-ui-item"; //建筑界面 export class BuildingWindow extends UIBase { + /** + * uv动画材质的特殊命名 + */ + readonly c_MAT_UV = "MAT_UV"; + static instance: BuildingWindow; buldingStatus: BuildingStatus; @@ -302,10 +308,13 @@ export class BuildingWindow extends UIBase { } } + console.log("选中建筑", modelInfo); + this.showJYZModules(JYZInfoMoudleType.AQSS, false); //this.onChangeCurrentBuildingItem(item); // this.three.selectLeftBuilding(item); + } /** @@ -370,6 +379,9 @@ export class BuildingWindow extends UIBase { if (updateFacility) { InfoManager.createFacilityInfos(buildingInfo.buildingData.outdoorData, buildingInfo); + + + } if (buildingInfo instanceof BuildingInfo_Environment) { buildingInfo.updateFuGaiCeng(); @@ -581,18 +593,22 @@ export class BuildingWindow extends UIBase { for (let i = 0; i < allNode.length; i++) { let nodeName = allNode[i].name; - if (TsTool.stringContain(nodeName, this.c_xiaoFang)) //消防 + if (TsTool.stringContain(nodeName, "primitive")) { + //复合材质被分解为多个子mesh,不看做特殊意义的对象 + } + else if (TsTool.stringContain(nodeName, this.c_zheDang))//遮挡 { - this.currentBuidngItem.createFacilityByMesh(allNode[i]); + this.currentBuidngItem.createStopByMesh(allNode[i]); } - else if (TsTool.stringContain(nodeName, this.c_xiaoFang))//加油站 + else if (TsTool.stringContain(nodeName, this.c_xiaoFang)) //消防 { - this.currentBuidngItem.createOilingByMesh(allNode[i]); + this.currentBuidngItem.createFacilityByMesh(allNode[i]); } - else if (TsTool.stringContain(nodeName, this.c_zheDang))//遮挡 + else if (TsTool.stringContain(nodeName, this.c_jiaYou))//加油站 { - this.currentBuidngItem.createStopByMesh(allNode[i]); + this.currentBuidngItem.createOilingByMesh(allNode[i]); } + } } @@ -621,13 +637,17 @@ export class BuildingWindow extends UIBase { */ zdByMoudle: Map = new Map(); + /** + * uv动画所需材质 + */ + mat_UV: Map = new Map(); + /** * 展示加油站信息模块 * @param type * @param show */ showJYZModules(type: JYZInfoMoudleType, show: boolean) { - console.log("切换页签", type, show); if (this.currentBuidngItem == null) { return; } @@ -643,14 +663,26 @@ export class BuildingWindow extends UIBase { if (infos != null) { for (let j = 0; j < infos.length; j++) { infos[j].playShowAnim(show); + //安全疏散,特殊,要在不显示时隐藏本体 + if (type == JYZInfoMoudleType.AQSS) { + infos[j].setEnable(show); + } } } } + + + + //阻挡类物体 let zdByType: FacilityInfoByType[] = []; if (this.zdByMoudle.has(type)) { zdByType = this.zdByMoudle.get(type); + console.log("查找阻挡物", type, zdByType); + } + else { + console.log("没找到阻挡物", type, zdByType); } for (let i = 0; i < zdByType.length; i++) { let infos = zdByType[i].facilityInfo; @@ -664,7 +696,6 @@ export class BuildingWindow extends UIBase { this.currentJYZInfoMoudleType = type; } else { - console.log("隐藏", this.currentJYZInfoMoudleType); this.currentJYZInfoMoudleType = null; // SceneManager.Instance.highLightLayer.removeAllMeshes(); @@ -674,11 +705,11 @@ export class BuildingWindow extends UIBase { /** * 根据功能模块,获取所需的设备类型 - * @param moudleType + * @param moudleType 功能模块 */ initFacilityTypeByMoudleType(moudleType: JYZInfoMoudleType, buildingInfo: BuildingInfo) { - let moudleTypeKey = moudleType + "_"; //当前模块物体的特殊字段 + let moudleTypeKey = moudleType; //当前模块物体的特殊字段 let zdKey = "ZD_" + moudleType; //阻挡类物体特殊字段 if (this.facilitysByMoudle.has(moudleType)) { @@ -694,24 +725,29 @@ export class BuildingWindow extends UIBase { return; //没有设备 } - - for (let i = 0; i < allFacilityByType.length; i++) { let l_facilityByType = allFacilityByType[i]; + + // if (moudleType == JYZInfoMoudleType.XF) //消防-逃生 + // { + // if (TsTool.stringContain(l_facilityByType.type, FacilityType.XF_TSLX)) { + // continue; + // } + // if (TsTool.stringContain(l_facilityByType.type, FacilityType.XF_SSD)) { + // continue; + // } + + // } if (TsTool.stringContain(l_facilityByType.type, zdKey)) { + if (!this.zdByMoudle.has(moudleType)) { + this.zdByMoudle.set(moudleType, []); + } this.zdByMoudle.get(moudleType).push(l_facilityByType); } - else if (TsTool.stringContain(l_facilityByType.type, moudleTypeKey)) { + else if (TsTool.stringContain(l_facilityByType.type, "_" + moudleTypeKey) || TsTool.stringContain(l_facilityByType.type, moudleTypeKey + "_")) { this.facilitysByMoudle.get(moudleType).push(l_facilityByType); } } - - // for (var l_facility in FacilityType) { - - - - - // } } /** @@ -720,7 +756,7 @@ export class BuildingWindow extends UIBase { */ showZP(show: boolean) { this.initFacilityTypeByMoudleType(JYZInfoMoudleType.ZP, this.currentBuidngItem.buildingInfo); - let zpInfoByTypes = this.facilitysByMoudle.get(JYZInfoMoudleType.ZP); + let zpInfoByTypes = this.zdByMoudle.get(JYZInfoMoudleType.ZP); if (zpInfoByTypes != null) { for (let i = 0; i < zpInfoByTypes.length; i++) { let infos = zpInfoByTypes[i].facilityInfo; @@ -731,7 +767,78 @@ export class BuildingWindow extends UIBase { } } + /** + * 获取设备所需UV材质(如果有的话) + * @param facilityType + * @param mesh + */ + getUVMat(facilityType: FacilityType, mesh: AbstractMesh) { + let moudleType: JYZInfoMoudleType = null; + switch (facilityType) { + case FacilityType.AQSS_TSLX: + moudleType = JYZInfoMoudleType.AQSS; + break; + case FacilityType.JY_SYGX: + moudleType = JYZInfoMoudleType.SYG; + break; + case FacilityType.JY_YQHSGX: + moudleType = JYZInfoMoudleType.YQHSGX; + break; + } + + if (moudleType != null) { + if (!this.mat_UV.has(moudleType)) { + this.mat_UV.set(moudleType, []); + } + + let mats = this.findUVMat(mesh); //找到mesh上的uv材质 + + for (let i = 0; i < mats.length; i++) { + let l_mat = mats[i]; + let mat_uvByType = this.mat_UV.get(moudleType); + let isRepeat = false;//是重复的 + for (let j = 0; j < mat_uvByType.length; j++) { + if (isRepeat) { + continue; + } + if (l_mat == mat_uvByType[j]) { + isRepeat = true; + } + } + + if (!isRepeat)//不重复,就添加进去 + { + this.mat_UV.get(moudleType).push(l_mat); + } + } + } + } + + /** + * 查找mesh中uv动画所需的材质 + * @param mesh + */ + private findUVMat(mesh: AbstractMesh) { + let result = []; + + let childMesh = mesh.getChildMeshes(); + childMesh.push(mesh); + + for (let i = 0; i < childMesh.length; i++) { + let mat = childMesh[i].material; + if (TsTool.stringContain(mat.name, this.c_MAT_UV)) { + // for(let j =0;j< result.length;j++) + // { + // if(mat != result[j]) + // { + result.push(mat); + // } + // } + } + } + return result; + } //#endregion @@ -763,9 +870,9 @@ export enum JYZInfoMoudleType { */ YQHSGX = "YQHSGX", /** - * 逃生路线 + * 安全疏散 */ - TSLX = "TSLX", + AQSS = "AQSS", /** * 罩棚 diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index feb8e24..fafdc00 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -32,6 +32,7 @@ import { BabylonTool } from '../../tool/babylon-tool'; import { BabylonUIStyleTool } from '../../tool/babylon-ui-style-tool'; import { GizmoTool } from '../../tool/gizmo-tool'; import { TsTool } from '../../tool/ts-tool'; +import { BuildingWindow } from '../building-window/building-window'; import { CopyFacilityInfo, FacilityInfoInSceneWindow } from '../facilityinfoinscene-window/facilityinfoinscene-window'; import { ToolbarWindow } from '../toolbar-window/toobar-window'; import { UIBase } from '../window-base/ui-base'; @@ -316,10 +317,11 @@ export class FacilityWindow extends UIBase { createNewFacilityByMesh(mesh: AbstractMesh, type: FacilityType) { let facilityData = this.createFacilityDataFromMesh(mesh, type); //let facilityInfo = this.createFacilityInfoFromMesh(facilityData, mesh, buildingInfo); - console.log("获取到设备" + type, mesh); + if (!this.isRepeatFacilityFromMesh(type, mesh.id)) //不重复 { + console.log("获取到设备" + type, mesh); this.createNewFacility(facilityData, mesh); } @@ -413,6 +415,8 @@ export class FacilityWindow extends UIBase { onSuccess?: (modelInfo: ModelInfo_facility) => void ): ModelInfo_facility { + BuildingWindow.instance.getUVMat(facilityData.facilityType, mesh); + if (buildingInfo == null) { buildingInfo = this.getCurrentBuildingInfo(); } @@ -583,11 +587,11 @@ export class FacilityWindow extends UIBase { else if (TsTool.stringContain(mesh.name, FacilityType.XF_MHT)) { this.createNewFacilityByMesh(mesh, FacilityType.XF_MHT); } - else if (TsTool.stringContain(mesh.name, FacilityType.XF_SSD)) { - this.createNewFacilityByMesh(mesh, FacilityType.XF_SSD); + else if (TsTool.stringContain(mesh.name, FacilityType.AQSS_SSD)) { + this.createNewFacilityByMesh(mesh, FacilityType.AQSS_SSD); } - else if (TsTool.stringContain(mesh.name, FacilityType.XF_TSLX)) { - this.createNewFacilityByMesh(mesh, FacilityType.XF_TSLX); + else if (TsTool.stringContain(mesh.name, FacilityType.AQSS_TSLX)) { + this.createNewFacilityByMesh(mesh, FacilityType.AQSS_TSLX); } else if (TsTool.stringContain(mesh.name, FacilityType.XF_XFCM)) { this.createNewFacilityByMesh(mesh, FacilityType.XF_XFCM); @@ -613,15 +617,19 @@ export class FacilityWindow extends UIBase { createOilingByMesh(mesh: AbstractMesh) { if (TsTool.stringContain(mesh.name, FacilityType.JY_JYJ)) { + // console.log("找到加油机", mesh) this.createNewFacilityByMesh(mesh, FacilityType.JY_JYJ); } else if (TsTool.stringContain(mesh.name, FacilityType.JY_SYGX)) { + // console.log("找到输油管线", mesh) this.createNewFacilityByMesh(mesh, FacilityType.JY_SYGX); } else if (TsTool.stringContain(mesh.name, FacilityType.JY_YG)) { + // console.log("找到油罐", mesh) this.createNewFacilityByMesh(mesh, FacilityType.JY_YG); } else if (TsTool.stringContain(mesh.name, FacilityType.JY_YQHSGX)) { + // console.log("找到油气回收", mesh) this.createNewFacilityByMesh(mesh, FacilityType.JY_YQHSGX); } } @@ -634,21 +642,26 @@ export class FacilityWindow extends UIBase { if (TsTool.stringContain(mesh.name, FacilityType.ZD_YG)) { this.createNewFacilityByMesh(mesh, FacilityType.ZD_YG); } - else if (TsTool.stringContain(mesh.name, FacilityType.ZD_SYGX)) { + if (TsTool.stringContain(mesh.name, FacilityType.ZD_SYGX)) { this.createNewFacilityByMesh(mesh, FacilityType.ZD_SYGX); } - else if (TsTool.stringContain(mesh.name, FacilityType.ZD_YQHSGX)) { - this.createNewFacilityByMesh(mesh, FacilityType.ZD_SYGX); + if (TsTool.stringContain(mesh.name, FacilityType.ZD_YQHSGX)) { + this.createNewFacilityByMesh(mesh, FacilityType.ZD_YQHSGX); } - else if (TsTool.stringContain(mesh.name, FacilityType.ZD_XF)) { + if (TsTool.stringContain(mesh.name, FacilityType.ZD_XF)) { + console.log("找到消防阻挡物", mesh.name); this.createNewFacilityByMesh(mesh, FacilityType.ZD_XF); } - else if (TsTool.stringContain(mesh.name, FacilityType.ZD_ZP)) { + if (TsTool.stringContain(mesh.name, FacilityType.ZD_ZP)) { this.createNewFacilityByMesh(mesh, FacilityType.ZD_ZP); } } - + /** + * 用已有mesh创建设备 + * @param mesh + * @param type + */ createFacilityDataFromMesh(mesh: AbstractMesh, type: FacilityType) { let name = ConfigManager.getFacilityTypeName(type); let result = new ModelData_facility(mesh.name, type, name, mesh.id, new TransformData(), FacilityPosType.In); diff --git a/src/app/pages/criminal-records-admin/criminal-records-admin.component.html b/src/app/pages/criminal-records-admin/criminal-records-admin.component.html index 8ad4b46..050e9bd 100644 --- a/src/app/pages/criminal-records-admin/criminal-records-admin.component.html +++ b/src/app/pages/criminal-records-admin/criminal-records-admin.component.html @@ -1,4 +1,4 @@ -
+