From ac9a7471c6d2695e68d779ca87f8e5980546c536 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Tue, 9 Nov 2021 17:32:05 +0800 Subject: [PATCH 01/29] =?UTF-8?q?=E5=90=84=E6=A8=A1=E5=9D=97=E9=97=B4?= =?UTF-8?q?=E8=A7=86=E8=A7=92=E4=BF=9D=E5=AD=98=E4=B8=8E=E8=BF=98=E5=8E=9F?= =?UTF-8?q?=EF=BC=8C=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/scene-manager.ts | 1 + src/app/babylon/model/data/camera-data.ts | 9 +++-- .../model/data/institution/jyz-show-data.ts | 7 ++-- src/app/babylon/tool/babylon-tool.ts | 3 ++ .../view/building-window/building-window.ts | 33 +++++++++++++------ 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/app/babylon/controller/scene-manager.ts b/src/app/babylon/controller/scene-manager.ts index fed7287..c285922 100644 --- a/src/app/babylon/controller/scene-manager.ts +++ b/src/app/babylon/controller/scene-manager.ts @@ -138,6 +138,7 @@ export class SceneManager { // camera.upperBetaLimit = 1.5; //beta方向上的旋转限制(防止看到模型底面) camera.lowerRadiusLimit = 1; //相机距离拍摄目标的最小距离(防止穿插) camera.setTarget(Vector3.Zero()); //设置拍摄目标 + camera.radius = 100; camera.attachControl(this.canvas, true); //把相机连接到画布 this.defaultCamera = camera; diff --git a/src/app/babylon/model/data/camera-data.ts b/src/app/babylon/model/data/camera-data.ts index 8ab6ed5..16c1bf5 100644 --- a/src/app/babylon/model/data/camera-data.ts +++ b/src/app/babylon/model/data/camera-data.ts @@ -12,13 +12,18 @@ export class ArcRotateCameraData { alpha: number; beta: number; + + constructor() { + this.target = new Vector3(); + } + /** * 将数据设置到相机上 * @param camera */ setDataToCamera(camera: ArcRotateCamera) { camera._scene.stopAnimation(camera); - camera.target = this.target; + camera.target = this.target.clone(); camera.radius = this.radius; camera.alpha = this.alpha; camera.beta = this.beta; @@ -29,7 +34,7 @@ export class ArcRotateCameraData { * @param camera */ getDataFromCamera(camera: ArcRotateCamera) { - this.target = camera.target; + this.target = camera.target.clone(); this.radius = camera.radius; this.alpha = camera.alpha; this.beta = camera.beta; diff --git a/src/app/babylon/model/data/institution/jyz-show-data.ts b/src/app/babylon/model/data/institution/jyz-show-data.ts index 68ec178..23e717f 100644 --- a/src/app/babylon/model/data/institution/jyz-show-data.ts +++ b/src/app/babylon/model/data/institution/jyz-show-data.ts @@ -16,7 +16,7 @@ export class JYZShowData { * 摄像机数据 */ @Type(() => ArcRotateCameraData) - cameraData: ArcRotateCameraData; + cameraData: ArcRotateCameraData = new ArcRotateCameraData(); /** * 展示罩棚 @@ -26,7 +26,10 @@ export class JYZShowData { constructor(moudleType: JYZInfoMoudleType, camera: ArcRotateCamera, showZP: boolean) { this.moudleType = moudleType; this.cameraData = new ArcRotateCameraData(); - this.cameraData.getDataFromCamera(camera); + if (camera != null) { + this.cameraData.getDataFromCamera(camera); + } + } } diff --git a/src/app/babylon/tool/babylon-tool.ts b/src/app/babylon/tool/babylon-tool.ts index 8369ff6..9b04c7f 100644 --- a/src/app/babylon/tool/babylon-tool.ts +++ b/src/app/babylon/tool/babylon-tool.ts @@ -288,6 +288,9 @@ export class BabylonTool { } + /** + * 动画移动摄像机target、半径、alpha、beta + */ public static AnimMoveCameraTargetAB( camera: ArcRotateCamera, allFrame: number, diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index 9478575..a2abb06 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -239,15 +239,7 @@ export class BuildingWindow extends UIBase { //进入应急处置 } else {//恢复查看状态 - let showData = DataManager.institutionData.getMoudleShowData(type); - if (showData != null) { - let camera = SceneManager.Instance.defaultCamera; - //showData.cameraData.setDataToCamera(camera); - let cameraData = showData.cameraData; - BabylonTool.AnimMoveCameraTargetAB(camera, 60, cameraData.target, cameraData.radius, cameraData.alpha, cameraData.beta); - this.showZP(showData.showZP); - PlanComponent.instance.isOpenAwning = showData.showZP; - } + this.recoverMoudleShow(type); } } else { @@ -259,6 +251,24 @@ export class BuildingWindow extends UIBase { } + /** + * 恢复展示模块状态(视角、罩棚) + * @param type + */ + recoverMoudleShow(type: JYZInfoMoudleType) { + let showData = DataManager.institutionData.getMoudleShowData(type); + console.log("恢复模块状态", showData); + if (showData != null) { + let camera = SceneManager.Instance.defaultCamera; + //showData.cameraData.setDataToCamera(camera); + let cameraData = showData.cameraData; + BabylonTool.AnimMoveCameraTargetAB(camera, 60, cameraData.target, cameraData.radius, cameraData.alpha, cameraData.beta); + this.showZP(showData.showZP); + PlanComponent.instance.isOpenAwning = showData.showZP; + } + + } + //#endregion @@ -345,6 +355,7 @@ export class BuildingWindow extends UIBase { this.showJYZModules(JYZInfoMoudleType.AQSS, false); this.showJYZModules(JYZInfoMoudleType.YQHSGX, false); this.showJYZModules(JYZInfoMoudleType.YQHSGX, false); + this.recoverMoudleShow(null); //this.onChangeCurrentBuildingItem(item); @@ -503,7 +514,7 @@ export class BuildingWindow extends UIBase { instance.addBuildings(BuildingType.Normal, 0, (uiItem, index) => { if (index == 0 && uiItem.buildingInfo.isEnable) { instance.onChangeCurrentBuildingItem(uiItem, false); - uiItem.lookAt(false); + //uiItem.lookAt(false); // console.log("默认选中" + uiItem.buildingInfo.buildingData.normalData.key); } }); @@ -936,10 +947,12 @@ export class BuildingWindow extends UIBase { } if (jyzShowData == null) { jyzShowData = new JYZShowData(moudleType, camera, showZP); + DataManager.institutionData.JYZShowDatas.push(jyzShowData); } jyzShowData.moudleType = moudleType; jyzShowData.cameraData.getDataFromCamera(camera); jyzShowData.showZP = showZP; + console.log("保存展示数据", DataManager.institutionData.JYZShowDatas); } From 57ae37ba1623ef2127402d6c657e7cf860b7ba32 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Wed, 10 Nov 2021 11:20:38 +0800 Subject: [PATCH 02/29] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E6=B2=B9?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/data-manager.ts | 9 +- .../property-data/in/property-data-jyj.ts | 22 +++ .../property-data/in/property-data-sygx.ts | 25 +++ .../property-data/in/property-data-yg.ts | 20 +++ .../property-data/in/property-data-yqhsgx.ts | 25 +++ .../property-data/out/property-data-q.ts | 2 +- .../data/model-data/model-data-facility.ts | 2 +- .../model/facilityinfo-tool/facility-area.ts | 50 ++++-- .../model/info/model/model-info-facility.ts | 34 ++-- .../babylon/model/info/model/model-info.ts | 16 +- src/app/babylon/tool/pos-point-tool.ts | 7 +- .../view/facility-window/facility-window.ts | 147 ++++++++++++++++-- 12 files changed, 312 insertions(+), 47 deletions(-) create mode 100644 src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts create mode 100644 src/app/babylon/model/data/institution/facility/property-data/in/property-data-sygx.ts create mode 100644 src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts create mode 100644 src/app/babylon/model/data/institution/facility/property-data/in/property-data-yqhsgx.ts diff --git a/src/app/babylon/controller/data-manager.ts b/src/app/babylon/controller/data-manager.ts index 4b8f0c6..8d784f4 100644 --- a/src/app/babylon/controller/data-manager.ts +++ b/src/app/babylon/controller/data-manager.ts @@ -11,7 +11,11 @@ import { } from '../model/data/institution/building/building-data'; import { AllFacilityData } from '../model/data/institution/facility/all-facility-data'; import { PropertyData_Base_IMG } from '../model/data/institution/facility/property-data/base/property-data-base-img'; +import { PropertyData_JYJ } from '../model/data/institution/facility/property-data/in/property-data-jyj'; import { PropertyData_MHQ } from '../model/data/institution/facility/property-data/in/property-data-mhq'; +import { PropertyData_SYGX } from '../model/data/institution/facility/property-data/in/property-data-sygx'; +import { PropertyData_YG } from '../model/data/institution/facility/property-data/in/property-data-yg'; +import { PropertyData_YQHSGX } from '../model/data/institution/facility/property-data/in/property-data-yqhsgx'; import { PropertyData_DWBZ } from '../model/data/institution/facility/property-data/out/property-data-dwbz'; import { PropertyData_PL } from '../model/data/institution/facility/property-data/out/property-data-pl'; import { PropertyData_Q } from '../model/data/institution/facility/property-data/out/property-data-q'; @@ -439,7 +443,10 @@ export class DataManager { case FacilityType.XF_MHQ_GF_4: case FacilityType.XF_MHQ_GF_8: case FacilityType.XF_MHQ_GF_35: result = new PropertyData_MHQ(key, facilityType); break; - + case FacilityType.JY_JYJ: result = new PropertyData_JYJ(key); break; + case FacilityType.JY_YG: result = new PropertyData_YG(key); break; + case FacilityType.JY_SYGX: result = new PropertyData_SYGX(key); break; + case FacilityType.JY_YQHSGX: result = new PropertyData_YQHSGX(key); break; } diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts new file mode 100644 index 0000000..1455610 --- /dev/null +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts @@ -0,0 +1,22 @@ + +import { FacilityType } from "../../../../model-data/model-data-facility"; +import { PropertyData_Base } from "../property-data-base"; + +/** + * 加油机 + */ +export class PropertyData_JYJ extends PropertyData_Base { + + + + constructor(key: string) { + super(key, FacilityType.JY_JYJ); + + } + + clone(key: string) { + let result = new PropertyData_JYJ(key); + return result; + } + +} \ No newline at end of file diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-sygx.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-sygx.ts new file mode 100644 index 0000000..a396beb --- /dev/null +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-sygx.ts @@ -0,0 +1,25 @@ + +import { FacilityType } from "../../../../model-data/model-data-facility"; +import { PropertyData_Base_IMG } from "../base/property-data-base-img"; +import { PropertyData_Base } from "../property-data-base"; + +/** + * 输油管 + */ +export class PropertyData_SYGX extends PropertyData_Base_IMG { + + constructor(key: string) { + super(key, "", "", "", FacilityType.JY_SYGX); + + } + + clone(key: string) { + let result = new PropertyData_SYGX(key); + result.img = this.img; + result.pos = this.pos; + result.info = this.info, + result.is360 = this.is360; + return result; + } + +} \ No newline at end of file diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts new file mode 100644 index 0000000..a495585 --- /dev/null +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts @@ -0,0 +1,20 @@ + +import { FacilityType } from "../../../../model-data/model-data-facility"; +import { PropertyData_Base } from "../property-data-base"; + +/** + * 油罐 + */ +export class PropertyData_YG extends PropertyData_Base { + + constructor(key: string) { + super(key, FacilityType.JY_YG); + + } + + clone(key: string) { + let result = new PropertyData_YG(key); + return result; + } + +} \ No newline at end of file diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yqhsgx.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yqhsgx.ts new file mode 100644 index 0000000..22bdab0 --- /dev/null +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yqhsgx.ts @@ -0,0 +1,25 @@ + +import { FacilityType } from "../../../../model-data/model-data-facility"; +import { PropertyData_Base_IMG } from "../base/property-data-base-img"; +import { PropertyData_Base } from "../property-data-base"; + +/** + * 输油管 + */ +export class PropertyData_YQHSGX extends PropertyData_Base_IMG { + + constructor(key: string) { + super(key, "", "", "", FacilityType.JY_YQHSGX); + + } + + clone(key: string) { + let result = new PropertyData_YQHSGX(key); + result.img = this.img; + result.pos = this.pos; + result.info = this.info, + result.is360 = this.is360; + return result; + } + +} \ No newline at end of file diff --git a/src/app/babylon/model/data/institution/facility/property-data/out/property-data-q.ts b/src/app/babylon/model/data/institution/facility/property-data/out/property-data-q.ts index dbb01b2..67b507b 100644 --- a/src/app/babylon/model/data/institution/facility/property-data/out/property-data-q.ts +++ b/src/app/babylon/model/data/institution/facility/property-data/out/property-data-q.ts @@ -6,7 +6,7 @@ import { PropertyData_Base_IMG } from "../base/property-data-base-img"; import { PropertyData_Base } from "../property-data-base"; /** - * 集结区和禁停区 + * 区域类 */ export class PropertyData_Q extends PropertyData_Base_IMG { 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 5fe89f2..aa080af 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 @@ -67,7 +67,7 @@ export class ModelData_facility extends ModelData { //新建区域位点 newAreapPoints(): Vector3[] { - let size = 10; + let size = 3; let x = 0.75 * size; let z = 0.5 * size; let result: Vector3[] = []; diff --git a/src/app/babylon/model/info/model/facilityinfo-tool/facility-area.ts b/src/app/babylon/model/info/model/facilityinfo-tool/facility-area.ts index 8531844..6c96074 100644 --- a/src/app/babylon/model/info/model/facilityinfo-tool/facility-area.ts +++ b/src/app/babylon/model/info/model/facilityinfo-tool/facility-area.ts @@ -1,6 +1,6 @@ //#region 区域 -import { AbstractMesh, Color3, Mesh, MeshBuilder, Observer, PolygonMeshBuilder, Quaternion, Scene, StandardMaterial, Vector2, Vector3 } from "@babylonjs/core"; +import { AbstractMesh, Color3, Mesh, MeshBuilder, Observer, PointerDragBehavior, PolygonMeshBuilder, Quaternion, Scene, StandardMaterial, Vector2, Vector3 } from "@babylonjs/core"; import { Button, Vector2WithInfo } from "@babylonjs/gui"; import { ModelInfo_facility } from "../model-info-facility"; @@ -197,9 +197,9 @@ export class AreaInfo { //更新顶点 updateMeshPoint(index = -1) { this.clearMeshPoint(); - let select = null; + let select: PolygonMeshPoint = null; for (let i = 0; i < this.pointData.length; i++) { - let l_meshPoint = new PolygonMeshPoint(PosPointTool.c_key + "_" + i, i, 0.2, this.root, this.pointData[i], this); + let l_meshPoint = new PolygonMeshPoint(PosPointTool.c_key + "_" + i, i, 0.5, this.root, this.pointData[i], this); this.pointMesh.push(l_meshPoint); if (i == index) { @@ -266,6 +266,7 @@ export class PolygonMeshPoint { area: AreaInfo mesh: Mesh; pos: Vector3; + pointMat: StandardMaterial; //顶点材质 index: number; @@ -273,6 +274,7 @@ export class PolygonMeshPoint { onGizmoAimMeshObservor: Observer<AbstractMesh>; onPointerClickObservor: Observer<Vector2WithInfo>; + pointerDragBehavior: PointerDragBehavior;//拖拽事件 constructor(name: string, index: number, size: number, parent: Mesh, pos: Vector3, area: AreaInfo) { @@ -289,23 +291,37 @@ export class PolygonMeshPoint { //初始化编辑UI initEditUI(name: string, size: number, parent: Mesh, pos: Vector3) { if (ModeManager.currentMode == ModeType.Edit) { - this.mesh = MeshBuilder.CreateBox(name, { size: size }); + let instance = this; + + this.mesh = MeshBuilder.CreateSphere(name, { diameter: size }); this.mesh.setParent(parent); this.mesh.position = pos; - this.mesh.isVisible = false; + this.mesh.isVisible = true; - let instance = this; - this.uiRoot = Button.CreateSimpleButton("ui_" + name, this.index.toString()); - UIManager.Instance.uiRoot.addControl(this.uiRoot); - this.uiRoot.linkWithMesh(this.mesh); - BabylonUIStyleTool.setStyle_size(this.uiRoot, "20px", "20px"); - this.uiRoot.background = BabylonUIStyleTool.c_color_blue; - this.uiRoot.color = BabylonUIStyleTool.c_color_white; - this.uiRoot.onPointerClickObservable.add(() => { + this.pointMat = new StandardMaterial("mat_areaPoint", SceneManager.Instance.scene); + this.pointMat.emissiveColor = Color3.FromHexString("#A9FF00"); + this.pointMat.disableLighting = true; + this.pointMat.alpha = 0.87; + this.mesh.material = this.pointMat; + + this.pointerDragBehavior = new PointerDragBehavior({ dragPlaneNormal: Vector3.Up() }); //平面内移动 + this.mesh.addBehavior(this.pointerDragBehavior); + this.pointerDragBehavior.onDragEndObservable.add(() => { instance.changeAim(); }); - this.showUI(false); + + // this.uiRoot = Button.CreateSimpleButton("ui_" + name, this.index.toString()); + // UIManager.Instance.uiRoot.addControl(this.uiRoot); + // this.uiRoot.linkWithMesh(this.mesh); + // BabylonUIStyleTool.setStyle_size(this.uiRoot, "20px", "20px"); + // this.uiRoot.background = BabylonUIStyleTool.c_color_blue; + // this.uiRoot.color = BabylonUIStyleTool.c_color_white; + // this.uiRoot.onPointerClickObservable.add(() => { + // instance.changeAim(); + // }); + + // this.showUI(false); } } @@ -318,7 +334,7 @@ export class PolygonMeshPoint { //改变选中的目标 changeAim() { let instance = this; - GizmoTool.changeGizmoAim(instance.mesh); + //GizmoTool.changeGizmoAim(instance.mesh); PosPointTool.attachMesh(instance.mesh as Mesh, instance.pos, () => { instance.addPoint(); @@ -337,6 +353,10 @@ export class PolygonMeshPoint { this.mesh.dispose(); this.uiRoot.dispose(); } + if (this.pointMat != null) { + this.pointMat.dispose(); + this.pointMat = null; + } } 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 1725414..3603b59 100644 --- a/src/app/babylon/model/info/model/model-info-facility.ts +++ b/src/app/babylon/model/info/model/model-info-facility.ts @@ -8,7 +8,7 @@ import { FacilityWindow } from "src/app/babylon/view/facility-window/facility-wi import { FacilityInfoInSceneWindow } from "src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window"; import { PropertyBaseWindow } from "src/app/babylon/view/property-window/property-base-window"; import { ModelData } from "../../data/model-data/model-data"; -import { FacilityShowType, FacilityType, ModelData_facility } from "../../data/model-data/model-data-facility"; +import { FacilityPosType, FacilityShowType, FacilityType, ModelData_facility } from "../../data/model-data/model-data-facility"; import { BuildingInfo } from "../building/building-info"; import { AreaInfo } from "./facilityinfo-tool/facility-area"; @@ -16,6 +16,9 @@ import { ModelInfo } from "./model-info"; //设施数据 export class ModelInfo_facility extends ModelInfo { + + static readonly c_hightLightColor = Color3.Yellow(); + belongToBuilding: BuildingInfo;//属于哪个建筑 pickDown: boolean;//按下 facilityShowType: FacilityShowType;//设备展示状态 @@ -39,15 +42,15 @@ export class ModelInfo_facility extends ModelInfo { } onCreateFollowUI() { - let modelData = this.modelData as ModelData_facility; - if (!ConfigManager.getFacilityNeedIcon(modelData.facilityType)) { + let facilityData = this.modelData as ModelData_facility; + if (!ConfigManager.getFacilityNeedIcon(facilityData.facilityType)) { return; } super.onCreateFollowUI(); let instance = this; - let posType = ConfigManager.getPosType(modelData.facilityType); - let iconPath = ConfigManager.getFacilityIconUrl(modelData.facilityType, posType); + let posType = ConfigManager.getPosType(facilityData.facilityType); + let iconPath = ConfigManager.getFacilityIconUrl(facilityData.facilityType, posType); BabylonUIStyleTool.setStyle_size(this.uiFollowRoot, ConfigManager.c_size_facilityIconSize + "px", ConfigManager.c_size_facilityIconSize + "px"); this.uiFollowRoot.thickness = 0; @@ -93,7 +96,13 @@ export class ModelInfo_facility extends ModelInfo { }); this.uiFollowRoot.zIndex = BabylonUIStyleTool.c_zIndex_facilityIcon; - this.showFollowUI(false); + + if (facilityData.posType == FacilityPosType.In) { + this.showFollowUI(false); //内置设备,默认隐藏 + } + + + } @@ -141,7 +150,10 @@ export class ModelInfo_facility extends ModelInfo { * @param enable */ setSelectEnable(enable: boolean) { - this.ui_select.isVisible = enable; + if (this.ui_select != null) { + this.ui_select.isVisible = enable; + } + } /** @@ -159,14 +171,14 @@ export class ModelInfo_facility extends ModelInfo { } /** - * 播放展示动画(高亮) - * @param play false表示停止,并恢复正常 - */ + * 播放展示动画(高亮) + * @param play false表示停止,并恢复正常 + */ playShowAnim(play: boolean) { this.showFollowUI(play); if (this.modelBox != null) { if (play) { - SceneManager.Instance.addToHighLight(this.modelBox as Mesh, Color3.Yellow()); + SceneManager.Instance.addToHighLight(this.modelBox as Mesh, ModelInfo_facility.c_hightLightColor); } else { SceneManager.Instance.removeFromHighLight(this.modelBox as Mesh); diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index 9a28a13..f89684a 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -25,7 +25,7 @@ export class ModelInfo { /** * 所有子节点 */ - models: AbstractMesh[]; + _models: AbstractMesh[]; /** * 包装盒、根节点 ,请使用modelBox 属性进行访问 */ @@ -121,6 +121,20 @@ export class ModelInfo { } } + /** + * 模型的子节点们 + */ + get models(): AbstractMesh[] { + if (this._models == null) { + this._models = this.modelBox.getChildMeshes(); + } + return this._models; + } + + set models(value: AbstractMesh[]) { + this._models = value; + } + //创建跟随UI onCreateFollowUI() { diff --git a/src/app/babylon/tool/pos-point-tool.ts b/src/app/babylon/tool/pos-point-tool.ts index 058f5da..eb75013 100644 --- a/src/app/babylon/tool/pos-point-tool.ts +++ b/src/app/babylon/tool/pos-point-tool.ts @@ -19,14 +19,19 @@ export class PosPointTool { initUI() { let instance = this; this.uiRoot = new Rectangle("PosPointTooUI"); + this.uiRoot.color = BabylonUIStyleTool.c_color_3d_blueLight; + this.uiRoot.shadowBlur = 5; UIManager.Instance.uiRoot.addControl(this.uiRoot); BabylonUIStyleTool.setStyle_size(this.uiRoot, "40px", "20px"); let stack = new StackPanel("stack"); this.uiRoot.addControl(stack); + stack.width = 1; + stack.height = 1; stack.isVertical = false; + let btn_add = Button.CreateSimpleButton("add", "+"); stack.addControl(btn_add); btn_add.background = BabylonUIStyleTool.c_color_blue; @@ -52,7 +57,7 @@ export class PosPointTool { showUI(show: boolean) { this.uiRoot.isVisible = show; this.uiRoot.linkWithMesh(this.mesh); - this.uiRoot.linkOffsetY = "-50px"; + this.uiRoot.linkOffsetY = "-30px"; } //#endregion diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index d511de0..a1ebb1e 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -1,8 +1,10 @@ import { AbstractMesh, + Color3, EventState, Mesh, MeshBuilder, + PickingInfo, PointerEventTypes, PointerInfo, Vector3, @@ -23,6 +25,7 @@ import { BuildingStatus } from '../../controller/status/building-status'; import { IndoorStatus } from '../../controller/status/indoor-status'; import { StatusManager } from '../../controller/status/status-manager'; import { UIManager } from '../../controller/ui-manager'; +import { JYZInfoMoudleType } from '../../model/data/institution/jyz-show-data'; import { FacilityPosType, ModelData_facility, FacilityShowType, FacilityType } from '../../model/data/model-data/model-data-facility'; import { TransformData } from '../../model/data/transform-data'; import { BuildingInfo } from '../../model/info/building/building-info'; @@ -33,6 +36,7 @@ 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 { FacilityInfoUIItem } from '../facilityinfoinscene-window/facilityinfo-ui-item'; import { CopyFacilityInfo, FacilityInfoInSceneWindow } from '../facilityinfoinscene-window/facilityinfoinscene-window'; import { ToolbarWindow } from '../toolbar-window/toobar-window'; import { UIBase } from '../window-base/ui-base'; @@ -49,6 +53,8 @@ export class FacilityWindow extends UIBase { static s_currentFacilityItem: FacilityUIItem; static instance: FacilityWindow; + + createIconRoot: Rectangle;//创建状态的跟随icon createIcon: Image; static readonly c_createIcon_width = 40; @@ -237,7 +243,12 @@ export class FacilityWindow extends UIBase { case PointerEventTypes.POINTERUP: if (eventData.event.button == 0) { //左键正常 + + if (eventData.pickInfo.hit && !SceneManager.s_isPointerDrag) { + + instance.selectJYJFrom3D(eventData.pickInfo); + if (FacilityWindow.s_currentFacilityItem != null) { instance.createNewFacilityByPos(eventData.pickInfo.pickedPoint); return; @@ -258,6 +269,7 @@ export class FacilityWindow extends UIBase { } } + //寻找设备预设 getFacilityPrefab(resName: string): Mesh { let result = null; @@ -309,24 +321,8 @@ export class FacilityWindow extends UIBase { } - /** - * 根据mesh创建设备 - * @param mesh - * @param type - */ - createNewFacilityByMesh(mesh: AbstractMesh, type: FacilityType) { - let facilityData = this.createFacilityDataFromMesh(mesh, type); - //let facilityInfo = this.createFacilityInfoFromMesh(facilityData, mesh, buildingInfo); - - - if (!this.isRepeatFacilityFromMesh(type, mesh.id)) //不重复 - { - console.log("获取到设备" + type, mesh); - this.createNewFacility(facilityData, mesh); - } - } /** @@ -730,4 +726,123 @@ export class FacilityWindow extends UIBase { //#endregion + + //#region 加油机特殊表现 + + /** + * 选中加油机时,高亮颜色 + */ + static readonly c_selectJYJColor = Color3.Green(); + + /** + * 当前选中的加油机 + */ + currentSelectJYJInfo: ModelInfo_facility; + + /** + * 根据mesh创建设备 + * @param mesh + * @param type + */ + createNewFacilityByMesh(mesh: AbstractMesh, type: FacilityType) { + let facilityData = this.createFacilityDataFromMesh(mesh, type); + //let facilityInfo = this.createFacilityInfoFromMesh(facilityData, mesh, buildingInfo); + + + if (!this.isRepeatFacilityFromMesh(type, mesh.id)) //不重复 + { + console.log("获取到设备" + type, mesh); + this.createNewFacility(facilityData, mesh); + } + + + } + + /** + * 三维中通过点击模型获取加油机(或油罐) + * @param pickInfo null 表示取消选中 + */ + selectJYJFrom3D(pickInfo: PickingInfo) { + + if (this.currentSelectJYJInfo != null) { + this.playJYJSelectEffect(false, this.currentSelectJYJInfo); + this.currentSelectJYJInfo = null; + } + + if (pickInfo == null) { + return; + } + + let allJYJInfo: ModelInfo_facility[] = []; + + try { + let facilityInfosByType = BuildingWindow.instance.currentBuidngItem.buildingInfo.ModelInfo.facilityInfos; + + for (let i = 0; i < facilityInfosByType.length; i++) { + if (facilityInfosByType[i].type == FacilityType.JY_JYJ || facilityInfosByType[i].type == FacilityType.JY_YG) { + allJYJInfo = allJYJInfo.concat(facilityInfosByType[i].facilityInfo); + } + } + + + } catch (error) { + console.log("没找到加油机", error); + } + + let result: ModelInfo_facility = null; + + + for (let i = 0; i < allJYJInfo.length; i++) { + let childMesh = allJYJInfo[i].models; + childMesh.push(allJYJInfo[i].modelBox); + for (let j = 0; j < childMesh.length; j++) { + if (pickInfo.pickedMesh == childMesh[j]) { + result = allJYJInfo[i]; + console.log("通过点击,找到加油机了"); + break; + } + } + } + + + if (result != null) { + this.currentSelectJYJInfo = result; + this.playJYJSelectEffect(true, this.currentSelectJYJInfo); + let facilityItem: FacilityInfoUIItem = FacilityInfoInSceneWindow.instance.getFacilityItem(result); + console.log("场景中选中设备", facilityItem); //通知前端 + FacilityInfoInSceneWindow.instance.selectFacilityItemToThree([facilityItem], true); + } + } + + /** + * 展示加油机(或油罐)选中的效果 + * @param play false,表示还原 + */ + playJYJSelectEffect(play: boolean, facilityInfo: ModelInfo_facility) { + + if (play) { + //正在展示加油机或油罐 + if (BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.JYJ + || BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.YG) { + SceneManager.Instance.removeFromHighLight(facilityInfo.modelBox as Mesh); + } + SceneManager.Instance.addToHighLight(facilityInfo.modelBox as Mesh, FacilityWindow.c_selectJYJColor); + + } + else { + SceneManager.Instance.removeFromHighLight(facilityInfo.modelBox as Mesh); + //正在展示加油机或油罐 + if (BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.JYJ + || BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.YG) { + SceneManager.Instance.addToHighLight(facilityInfo.modelBox as Mesh, ModelInfo_facility.c_hightLightColor); + } + + } + + + } + + + //#endregion + } From f0743a629d43f31592d565f20019696a1580255e Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Wed, 10 Nov 2021 11:30:24 +0800 Subject: [PATCH 03/29] =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../left-domain/left-domain.component.html | 5 ++++- .../left-domain/left-domain.component.scss | 3 +-- src/app/pages/plan/plan.component.html | 2 +- src/styles.scss | 22 +++++++++++-------- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 73e12e9..5221beb 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -66,7 +66,10 @@ <!-- 油罐设备 --> <!-- 消防设施 --> <div class="publicBox fireFacilities" *ngIf="beforeFence === 3"> - <nz-tree #nzTreeComponent [nzData]="treeData"></nz-tree> + <nz-tree [nzData]="treeData" [nzTreeTemplate]="nzTreeTemplate"></nz-tree> + <ng-template #nzTreeTemplate let-node let-origin="origin"> + <div class="treeRow"><p>{{node.title}}</p><p>{{node.children.length}}</p></div> + </ng-template> </div> <!-- 消防设施 --> </div> diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index fe01a1e..45bb38d 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -69,9 +69,8 @@ } .fireFacilities{ //消防设施 .ant-tree{ - height: 32px; - line-height: 32px; background-color: transparent; color: #C4E2FC; } + .treeRow{ width: 100%; display: flex; height: 30px; line-height: 30px; p:first-child{ flex: 1; }; p{ margin: 0; padding: 0; } } } \ No newline at end of file diff --git a/src/app/pages/plan/plan.component.html b/src/app/pages/plan/plan.component.html index d872530..1716fe8 100644 --- a/src/app/pages/plan/plan.component.html +++ b/src/app/pages/plan/plan.component.html @@ -1,5 +1,5 @@ <div class="loading" *ngIf="isShowLoading"><nz-spin nzSimple [nzSize]="'large'"></nz-spin></div> -<div class="content"> +<div class="content" id="threeDimensional"> <div class="header"> <button *ngFor="let item of allFence; let key = index;" [ngClass]="{'selectFence': selectFence === key}" (click)="toggleHeaderFence(key)">{{item}}</button> diff --git a/src/styles.scss b/src/styles.scss index e2f0095..30d9ef7 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -102,15 +102,19 @@ h1 { font-size: 16px; } -//滚动条样式 -::-webkit-scrollbar { - width: 5px; -} -::-webkit-scrollbar-thumb { - background-image: linear-gradient(#2495f8,#1c73c2,#02233f,); -} -::-webkit-scrollbar-track { - background-color: #0d4070; +//三维场景 +#threeDimensional { + .ant-tree-node-content-wrapper { width: 100%; } + //滚动条样式 + ::-webkit-scrollbar { + width: 5px; + } + ::-webkit-scrollbar-thumb { + background-image: linear-gradient(#2495f8,#1c73c2,#02233f,); + } + ::-webkit-scrollbar-track { + background-color: #0d4070; + } } From 6a1898d5641c7bfcdc73c3b308f97f2a3cea9449 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Wed, 10 Nov 2021 15:09:43 +0800 Subject: [PATCH 04/29] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=89=E7=BB=B4?= =?UTF-8?q?=E9=80=89=E4=B8=AD=E4=B8=8E=E5=89=8D=E7=AB=AF=E7=9A=84=E4=BA=A4?= =?UTF-8?q?=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/config-manager.ts | 5 +- .../view/facility-window/facility-window.ts | 92 +-------- .../facilityinfo-ui-item.ts | 3 + .../facilityinfoinscene-window.ts | 181 ++++++++++++++++-- 4 files changed, 169 insertions(+), 112 deletions(-) diff --git a/src/app/babylon/controller/config-manager.ts b/src/app/babylon/controller/config-manager.ts index b932819..bc06280 100644 --- a/src/app/babylon/controller/config-manager.ts +++ b/src/app/babylon/controller/config-manager.ts @@ -73,11 +73,14 @@ export class ConfigManager { static getFacilityTypeName(type: FacilityType): string { let result = "未知"; switch (type) { - + //自定义放置 case FacilityType.PL: result = "毗邻"; break; case FacilityType.QY: result = "区域"; break; case FacilityType.TPBZ: result = "图片标注"; break; case FacilityType.DWBZ: result = "点位标注"; break; + //内建 + case FacilityType.XF_MHQ_PT_4: result = "4kg普通灭火器"; break; + } return result; } diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index a1ebb1e..3ee7da4 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -247,7 +247,6 @@ export class FacilityWindow extends UIBase { if (eventData.pickInfo.hit && !SceneManager.s_isPointerDrag) { - instance.selectJYJFrom3D(eventData.pickInfo); if (FacilityWindow.s_currentFacilityItem != null) { instance.createNewFacilityByPos(eventData.pickInfo.pickedPoint); @@ -729,15 +728,8 @@ export class FacilityWindow extends UIBase { //#region 加油机特殊表现 - /** - * 选中加油机时,高亮颜色 - */ - static readonly c_selectJYJColor = Color3.Green(); - /** - * 当前选中的加油机 - */ - currentSelectJYJInfo: ModelInfo_facility; + /** * 根据mesh创建设备 @@ -758,89 +750,7 @@ export class FacilityWindow extends UIBase { } - /** - * 三维中通过点击模型获取加油机(或油罐) - * @param pickInfo null 表示取消选中 - */ - selectJYJFrom3D(pickInfo: PickingInfo) { - - if (this.currentSelectJYJInfo != null) { - this.playJYJSelectEffect(false, this.currentSelectJYJInfo); - this.currentSelectJYJInfo = null; - } - - if (pickInfo == null) { - return; - } - - let allJYJInfo: ModelInfo_facility[] = []; - - try { - let facilityInfosByType = BuildingWindow.instance.currentBuidngItem.buildingInfo.ModelInfo.facilityInfos; - - for (let i = 0; i < facilityInfosByType.length; i++) { - if (facilityInfosByType[i].type == FacilityType.JY_JYJ || facilityInfosByType[i].type == FacilityType.JY_YG) { - allJYJInfo = allJYJInfo.concat(facilityInfosByType[i].facilityInfo); - } - } - - - } catch (error) { - console.log("没找到加油机", error); - } - - let result: ModelInfo_facility = null; - - for (let i = 0; i < allJYJInfo.length; i++) { - let childMesh = allJYJInfo[i].models; - childMesh.push(allJYJInfo[i].modelBox); - for (let j = 0; j < childMesh.length; j++) { - if (pickInfo.pickedMesh == childMesh[j]) { - result = allJYJInfo[i]; - console.log("通过点击,找到加油机了"); - break; - } - } - } - - - if (result != null) { - this.currentSelectJYJInfo = result; - this.playJYJSelectEffect(true, this.currentSelectJYJInfo); - let facilityItem: FacilityInfoUIItem = FacilityInfoInSceneWindow.instance.getFacilityItem(result); - console.log("场景中选中设备", facilityItem); //通知前端 - FacilityInfoInSceneWindow.instance.selectFacilityItemToThree([facilityItem], true); - } - } - - /** - * 展示加油机(或油罐)选中的效果 - * @param play false,表示还原 - */ - playJYJSelectEffect(play: boolean, facilityInfo: ModelInfo_facility) { - - if (play) { - //正在展示加油机或油罐 - if (BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.JYJ - || BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.YG) { - SceneManager.Instance.removeFromHighLight(facilityInfo.modelBox as Mesh); - } - SceneManager.Instance.addToHighLight(facilityInfo.modelBox as Mesh, FacilityWindow.c_selectJYJColor); - - } - else { - SceneManager.Instance.removeFromHighLight(facilityInfo.modelBox as Mesh); - //正在展示加油机或油罐 - if (BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.JYJ - || BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.YG) { - SceneManager.Instance.addToHighLight(facilityInfo.modelBox as Mesh, ModelInfo_facility.c_hightLightColor); - } - - } - - - } //#endregion diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts index 7a278ee..8acf483 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts @@ -93,12 +93,15 @@ export class FacilityInfoUIItem { GizmoTool.onPickMeshInfoObservable.notifyObservers(this.modelInfo); this.facilityInfoInSceneWindow.selectFacilityItemToThree([this], true); this.modelInfo.setIconEnable(select); + this.facilityInfoInSceneWindow.playJYJSelectEffect(select, this.modelInfo) } else { this.facilityInfoInSceneWindow.selectFacilityItemToThree([this], false); if (!this.facilityInfoInSceneWindow.getFacilityUIShowType(this.getType())) { this.modelInfo.setIconEnable(select); + } + this.facilityInfoInSceneWindow.playJYJSelectEffect(select, this.modelInfo) } } diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts index d3cf2ed..cf98b44 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts @@ -1,15 +1,17 @@ import { EventManager } from "@angular/platform-browser"; -import { AbstractMesh, Ray, RayHelper, Vector3 } from "@babylonjs/core"; +import { AbstractMesh, Color3, EventState, Mesh, PickingInfo, PointerEventTypes, PointerInfo, Ray, RayHelper, Vector3 } from "@babylonjs/core"; import { classToClass } from "class-transformer"; import { PlanComponent } from "src/app/pages/plan/plan.component"; import { ModelChangeType } from "../../controller/data-manager"; import { Event_KeyboardInput } from "../../controller/event-manager/events/event-keyboard-input"; import { Event_ModelInfoChange } from "../../controller/event-manager/events/event-modelinfo-change"; import { ModeManager, ModeType } from "../../controller/mode-manager"; +import { SceneManager } from "../../controller/scene-manager"; import { BuildingStatus } from "../../controller/status/building-status"; import { IndoorStatus } from "../../controller/status/indoor-status"; import { StatusManager } from "../../controller/status/status-manager"; import { Game } from "../../game"; +import { JYZInfoMoudleType } from "../../model/data/institution/jyz-show-data"; import { ModelData_facility, FacilityType } from "../../model/data/model-data/model-data-facility"; import { BuildingInfo } from "../../model/info/building/building-info"; import { ModelInfo } from "../../model/info/model/model-info"; @@ -18,6 +20,7 @@ import { GizmoTool } from "../../tool/gizmo-tool"; import { TsTool } from "../../tool/ts-tool"; import { BuildingWindow } from "../building-window/building-window"; +import { FacilityWindow } from "../facility-window/facility-window"; import { UIBase } from "../window-base/ui-base"; import { FacilityInfoUIItem } from "./facilityinfo-ui-item"; @@ -42,6 +45,7 @@ export class FacilityInfoInSceneWindow extends UIBase { isMultiselect: boolean = false;//多选状态 + //#region 前端对接 @@ -175,21 +179,21 @@ export class FacilityInfoInSceneWindow extends UIBase { showFacilityByType(facilityType: FacilityType, show: boolean) { if (ModeManager.currentMode == ModeType.Look) { - // for (let i = 0; i < this.facilityInfoUIItemes.length; i++) { - // let l_facilityData = (this.facilityInfoUIItemes[i].modelInfo.modelData) as ModelData_facility; - // if (facilityType == null || facilityType == l_facilityData.facilityType) { - // this.facilityInfoUIItemes[i].modelInfo.setEnable(show); - // } - // else if (show) { - // this.facilityInfoUIItemes[i].modelInfo.setEnable(false); - // } - // } for (let i = 0; i < this.facilityInfoUIItemes.length; i++) { let l_facilityData = (this.facilityInfoUIItemes[i].modelInfo.modelData) as ModelData_facility; if (facilityType == null || facilityType == l_facilityData.facilityType) { - this.facilityInfoUIItemes[i].modelInfo.setIconEnable(show); + this.facilityInfoUIItemes[i].modelInfo.setEnable(show); + } + else if (show) { + this.facilityInfoUIItemes[i].modelInfo.setEnable(false); } } + // for (let i = 0; i < this.facilityInfoUIItemes.length; i++) { + // let l_facilityData = (this.facilityInfoUIItemes[i].modelInfo.modelData) as ModelData_facility; + // if (facilityType == null || facilityType == l_facilityData.facilityType) { + // this.facilityInfoUIItemes[i].modelInfo.setIconEnable(show); + // } + // } } else { for (let i = 0; i < this.facilityInfoUIItemes.length; i++) { @@ -249,7 +253,7 @@ export class FacilityInfoInSceneWindow extends UIBase { this.currentFacility = []; this.initKeyboardInput(); this.initDragInput(); - + this.initPickEvent(); } @@ -261,6 +265,7 @@ export class FacilityInfoInSceneWindow extends UIBase { GizmoTool.onPickMeshInfoObservable.removeCallback(this.onClickModel); } + //#endregion //#region 键盘输入 /** @@ -280,14 +285,7 @@ export class FacilityInfoInSceneWindow extends UIBase { onKeyboardInput(eventData: Event_KeyboardInput) { if (eventData.data.key == "Delete") // 删除。 后期看是否加入 Backspace 退格 { - //改由前端完成快捷键删除 - // if (this.currentFacility != null) { - // for (let i = 0; i < this.currentFacility.length; i++) { - // this.currentFacility[i].askDelete(false); - // } - // this.currentFacility = []; - // this.three.getAllCensusList(this.facilityInfoUIItemes || []); - // } + } else if (eventData.data.key == "X") //室内消火栓吸附墙 { @@ -417,6 +415,149 @@ export class FacilityInfoInSceneWindow extends UIBase { //#endregion + //#region 鼠标输入 + //初始化pick事件 + initPickEvent() { + + SceneManager.Instance.scene.onPointerObservable.add( + + this.onPointerObservable + ); + } + + //鼠标交互监听 + onPointerObservable(eventData: PointerInfo, eventState: EventState) { + + let instance = FacilityInfoInSceneWindow.instance; + + switch (eventData.type) { + case PointerEventTypes.POINTERUP: + if (eventData.event.button == 0) { //左键正常 + if (eventData.pickInfo.hit && !SceneManager.s_isPointerDrag) { + + instance.selectJYJFrom3D(eventData.pickInfo); + } + } + else { //右键 + + } + break; + case PointerEventTypes.POINTERPICK: + // console.log(eventData.event); + break; + } + } + + + /** + * 选中加油机时,高亮颜色 + */ + static readonly c_selectJYJColor = Color3.Green(); + + /** + * 当前选中的加油机 + */ + currentSelectJYJInfo: ModelInfo_facility; + + /** + * 三维中通过点击模型获取加油机(或油罐) + * @param pickInfo null 表示取消选中 + */ + selectJYJFrom3D(pickInfo: PickingInfo) { + + if (this.currentSelectJYJInfo != null) { + this.playJYJSelectEffect(false, this.currentSelectJYJInfo); + this.currentSelectJYJInfo = null; + } + + if (pickInfo == null) { + return; + } + + let allJYJInfo: ModelInfo_facility[] = []; + + try { + let facilityInfosByType = BuildingWindow.instance.currentBuidngItem.buildingInfo.ModelInfo.facilityInfos; + + let currentMoudle = BuildingWindow.instance.currentJYZInfoMoudleType; + + for (let i = 0; i < facilityInfosByType.length; i++) { + if ((currentMoudle == null || currentMoudle == JYZInfoMoudleType.JYJ) && facilityInfosByType[i].type == FacilityType.JY_JYJ || + (currentMoudle == null || currentMoudle == JYZInfoMoudleType.YG) && facilityInfosByType[i].type == FacilityType.JY_YG) { + allJYJInfo = allJYJInfo.concat(facilityInfosByType[i].facilityInfo); + } + } + + + } catch (error) { + console.log("点击没找到", error); + } + + let result: ModelInfo_facility = null; + + + for (let i = 0; i < allJYJInfo.length; i++) { + let childMesh = allJYJInfo[i].models; + childMesh.push(allJYJInfo[i].modelBox); + for (let j = 0; j < childMesh.length; j++) { + if (pickInfo.pickedMesh == childMesh[j]) { + result = allJYJInfo[i]; + console.log("通过点击,找到加油机了"); + break; + } + } + } + + + if (result != null) { + + this.playJYJSelectEffect(true, result); + let facilityItem: FacilityInfoUIItem = FacilityInfoInSceneWindow.instance.getFacilityItem(result); + console.log("场景中选中设备", facilityItem); //通知前端 + FacilityInfoInSceneWindow.instance.selectFacilityItemToThree([facilityItem], true); + } + } + + /** + * 展示加油机(或油罐)选中的效果 + * @param play false,表示还原 + */ + playJYJSelectEffect(play: boolean, facilityInfo: ModelInfo_facility) { + + if (play) { + let facilityData = facilityInfo.modelData as ModelData_facility; + if (facilityData.facilityType != FacilityType.JY_JYJ && + facilityData.facilityType != FacilityType.JY_YG) { + //只有加油机和油罐有高亮显示 + return; + } + } + + + if (play) { + this.currentSelectJYJInfo = facilityInfo; + //正在展示加油机或油罐 + if (BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.JYJ + || BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.YG) { + SceneManager.Instance.removeFromHighLight(facilityInfo.modelBox as Mesh); + } + SceneManager.Instance.addToHighLight(facilityInfo.modelBox as Mesh, FacilityInfoInSceneWindow.c_selectJYJColor); + + } + else { + SceneManager.Instance.removeFromHighLight(facilityInfo.modelBox as Mesh); + //正在展示加油机或油罐 + if (BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.JYJ + || BuildingWindow.instance.currentJYZInfoMoudleType == JYZInfoMoudleType.YG) { + SceneManager.Instance.addToHighLight(facilityInfo.modelBox as Mesh, ModelInfo_facility.c_hightLightColor); + } + + } + + + } + //#endregion + //创建所有设备UI createAllFacilities(facilityByType: FacilityInfoByType[]) { this.clearFacilityInfoUIItemes(); From b216930430c1de5b806faca54b90353a81c7a345 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Wed, 10 Nov 2021 17:13:03 +0800 Subject: [PATCH 05/29] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/info/model/model-info-facility.ts | 2 + src/app/babylon/tool/speaking-tool.ts | 64 +++++++++++++++++++ .../view/facility-window/facility-window.ts | 5 ++ yarn.lock | 6 +- 4 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/app/babylon/tool/speaking-tool.ts 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 3603b59..8d9a2df 100644 --- a/src/app/babylon/model/info/model/model-info-facility.ts +++ b/src/app/babylon/model/info/model/model-info-facility.ts @@ -3,6 +3,7 @@ import { Button, Control, Ellipse, Rectangle, Vector2WithInfo } from "@babylonjs import { ConfigManager } from "src/app/babylon/controller/config-manager"; import { SceneManager } from "src/app/babylon/controller/scene-manager"; import { BabylonUIStyleTool } from "src/app/babylon/tool/babylon-ui-style-tool"; +import { SpeakingTool } from "src/app/babylon/tool/speaking-tool"; import { TsTool } from "src/app/babylon/tool/ts-tool"; import { FacilityWindow } from "src/app/babylon/view/facility-window/facility-window"; import { FacilityInfoInSceneWindow } from "src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window"; @@ -124,6 +125,7 @@ export class ModelInfo_facility extends ModelInfo { // this.onClickMeshIconBtn(eventData,eventState); FacilityInfoInSceneWindow.instance.selectFacilityInfo(this); + // SpeakingTool.Instance.speak("这是离线版"); } //展示属性 diff --git a/src/app/babylon/tool/speaking-tool.ts b/src/app/babylon/tool/speaking-tool.ts new file mode 100644 index 0000000..5fb710b --- /dev/null +++ b/src/app/babylon/tool/speaking-tool.ts @@ -0,0 +1,64 @@ + +/** + * 语音工具 + */ +export class SpeakingTool { + + private static instance: SpeakingTool; + + static get Instance() { + if (SpeakingTool.instance == null) { + SpeakingTool.instance = new SpeakingTool(); + } + return SpeakingTool.instance; + } + + + /** + * 阅读一段文字 + * @param msg + */ + speak(msg: string) { + if (this.isIE()) { + + } + else { + let speakMsg = new SpeechSynthesisUtterance(msg); + speakMsg.lang = "zh-CN"; + speakMsg.rate = 1; + speakMsg.pitch = 1.5; + window.speechSynthesis.speak(speakMsg); + + return speakMsg; + } + } + + /** + * 暂停正在进行的阅读 + * @param speakMsg + */ + pause() { + window.speechSynthesis.pause(); + } + /** + * 继续之前暂停的阅读 + */ + resume() { + window.speechSynthesis.resume(); + } + + /** + * IE浏览器 + */ + private isIE() { + // if ("ActiveXObject" in window) { + // console.log("IE 浏览器") + // return true; + // } + // else { + // return false; + // } + return false; + } + +} \ No newline at end of file diff --git a/src/app/babylon/view/facility-window/facility-window.ts b/src/app/babylon/view/facility-window/facility-window.ts index 3ee7da4..a430a89 100644 --- a/src/app/babylon/view/facility-window/facility-window.ts +++ b/src/app/babylon/view/facility-window/facility-window.ts @@ -25,6 +25,7 @@ import { BuildingStatus } from '../../controller/status/building-status'; import { IndoorStatus } from '../../controller/status/indoor-status'; import { StatusManager } from '../../controller/status/status-manager'; import { UIManager } from '../../controller/ui-manager'; +import { BuildingType } from '../../model/data/institution/building/building-data'; import { JYZInfoMoudleType } from '../../model/data/institution/jyz-show-data'; import { FacilityPosType, ModelData_facility, FacilityShowType, FacilityType } from '../../model/data/model-data/model-data-facility'; import { TransformData } from '../../model/data/transform-data'; @@ -337,6 +338,10 @@ export class FacilityWindow extends UIBase { // ThreeDimensionalHomeComponent.instance.openSnackBar("请先选中目标建筑"); return } + else if (currentBuidngItem.getBuildingType() == BuildingType.Environment) { + alert("请选中主体建筑后,再进行标注") + return + } Event_ChangeFacility.dispatch(facilityData, ModelChangeType.Add, null); diff --git a/yarn.lock b/yarn.lock index e2d741a..20611a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -122,7 +122,7 @@ resolved "https://registry.npmmirror.com/@angular/animations/download/@angular/animations-9.1.13.tgz?cache=0&sync_timestamp=1634753072212&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40angular%2Fanimations%2Fdownload%2F%40angular%2Fanimations-9.1.13.tgz#561305f7bf4a7a5ea3ff172d6fac31615667acb0" integrity sha1-VhMF979Kel6j/xctb6wxYVZnrLA= -"@angular/cdk@^9.0.0": +"@angular/cdk@^9.0.0", "@angular/cdk@^9.2.4": version "9.2.4" resolved "https://registry.npmmirror.com/@angular/cdk/download/@angular/cdk-9.2.4.tgz#8413958bd275e4c34be3b96f56444671dd30ba93" integrity sha1-hBOVi9J15MNL47lvVkRGcd0wupM= @@ -4976,9 +4976,9 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -echarts@^4.6.0: +echarts@^4.9.0: version "4.9.0" - resolved "https://registry.nlark.com/echarts/download/echarts-4.9.0.tgz?cache=0&sync_timestamp=1632191355993&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fecharts%2Fdownload%2Fecharts-4.9.0.tgz#a9b9baa03f03a2a731e6340c55befb57a9e1347d" + resolved "https://registry.npmmirror.com/echarts/download/echarts-4.9.0.tgz?cache=0&sync_timestamp=1635741929711&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fecharts%2Fdownload%2Fecharts-4.9.0.tgz#a9b9baa03f03a2a731e6340c55befb57a9e1347d" integrity sha1-qbm6oD8Doqcx5jQMVb77V6nhNH0= dependencies: zrender "4.3.2" From 0c3ef3499109fa04ad49fb5b92d10c775e706e0b Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 09:40:27 +0800 Subject: [PATCH 06/29] =?UTF-8?q?=E6=B6=88=E9=98=B2=E8=AE=BE=E6=96=BD?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/config-manager.ts | 12 +++- .../left-domain/left-domain.component.html | 2 +- .../left-domain/left-domain.component.ts | 55 ++++++++++++++++++- src/styles.scss | 1 + 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/app/babylon/controller/config-manager.ts b/src/app/babylon/controller/config-manager.ts index bc06280..e724c8d 100644 --- a/src/app/babylon/controller/config-manager.ts +++ b/src/app/babylon/controller/config-manager.ts @@ -80,7 +80,17 @@ export class ConfigManager { case FacilityType.DWBZ: result = "点位标注"; break; //内建 case FacilityType.XF_MHQ_PT_4: result = "4kg普通灭火器"; break; - + case FacilityType.XF_MHQ_PT_8: result = "8kg普通灭火器"; break; + case FacilityType.XF_MHQ_PT_35: result = "35kg普通灭火器"; break; + case FacilityType.XF_MHQ_GF_4: result = "4kg干粉灭火器"; break; + case FacilityType.XF_MHQ_GF_8: result = "8kg干粉灭火器"; break; + case FacilityType.XF_MHQ_GF_35: result = "35kg干粉灭火器"; break; + case FacilityType.XF_MHT: result = "灭火毯"; break; + case FacilityType.XF_XFQ: result = "消防锹"; break; + case FacilityType.XF_XFT: result = "消防桶"; break; + case FacilityType.XF_XFCM: result = "消防长矛"; break; + case FacilityType.XF_XFF: result = "消防斧"; break; + case FacilityType.XF_XFS: result = "消防沙"; break; } return result; } diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 5221beb..9eeb991 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -68,7 +68,7 @@ <div class="publicBox fireFacilities" *ngIf="beforeFence === 3"> <nz-tree [nzData]="treeData" [nzTreeTemplate]="nzTreeTemplate"></nz-tree> <ng-template #nzTreeTemplate let-node let-origin="origin"> - <div class="treeRow"><p>{{node.title}}</p><p>{{node.children.length}}</p></div> + <div class="treeRow"><p>{{node.title}}</p><p>{{getFacilityNum(node.key)}}</p></div> </ng-template> </div> <!-- 消防设施 --> diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index 80e56ad..fb855cd 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -1,6 +1,9 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { NzTreeComponent, NzTreeNodeOptions } from 'ng-zorro-antd/tree'; +import { FacilityInfoInSceneWindow } from 'src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window'; import { PlanComponent } from '../plan/plan.component'; +import { FacilityInfoUIItem } from "../../babylon/view/facilityinfoinscene-window/facilityinfo-ui-item"; +import { ConfigManager } from 'src/app/babylon/controller/config-manager'; @Component({ selector: 'app-left-domain', @@ -16,18 +19,68 @@ export class LeftDomainComponent implements OnInit { } beforeFence: number; //当前选中功能栏 + FacilityList: FacilityInfoUIItem[] = []; //统计设备 list @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; - treeData: NzTreeNodeOptions[] = treeData.nodes; //tree data + treeData: NzTreeNodeOptions[] = []; //tree data //初始化组件 initComponent(type?: number) { if (type != undefined && type != null) { this.beforeFence = type + this.handleFacility() } else { this.beforeFence = PlanComponent.instance.selectFence + this.handleFacility() } } + //处理 设备data + handleFacility() { + let list: FacilityInfoUIItem[] = [] + FacilityInfoInSceneWindow.instance.facilityInfoUIItemes.forEach(item=>{ + if (this.beforeFence === 3) { //消防设施 + (item.getType()).slice(0,3) === "XF_"? list.push(item) : null + } + }) + this.FacilityList = list + if (this.beforeFence === 3) { //消防设施 + this.handleTreeData(this.FacilityList) + } + } + + //处理 treeData + handleTreeData(list: FacilityInfoUIItem[]) { + this.treeData = [] + list.forEach(item=>{ + let isFind = this.treeData.find(element=>{ return (item.getType()).includes(element.key) }) + if (!isFind) { //不存在 + if (item.getType().includes('XF_MHQ')) { //灭火器 + let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, children: [], } + let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } + primaryNode.children.push(treeNode) + this.treeData.push(primaryNode) + } else { + let primaryNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } + this.treeData.push(primaryNode) + } + } else { //存在 + if (item.getType().includes('XF_MHQ') && !isFind.children.find(elements=>{ return elements.key === item.getType() })) { //灭火器 + let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } + isFind.children.push(treeNode) + } + } + }) + } + + //获取设备 数量 + getFacilityNum(type: string): number { + let num = 0 + this.FacilityList.forEach(item=>{ + item.getType().includes(type)? num = num + 1 : null + }) + return num + } + //编辑信息 editInfo() { diff --git a/src/styles.scss b/src/styles.scss index 30d9ef7..4d7af63 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -104,6 +104,7 @@ h1 { //三维场景 #threeDimensional { + .ant-tree-node-content-wrapper:hover { background-color: transparent; } .ant-tree-node-content-wrapper { width: 100%; } //滚动条样式 ::-webkit-scrollbar { From 11f3e581f58733e349519b466bb710838aa6ad89 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 09:45:49 +0800 Subject: [PATCH 07/29] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/login/login.component.html | 1 + src/app/pages/login/login.component.ts | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/app/pages/login/login.component.html b/src/app/pages/login/login.component.html index ede3a45..f9a80e3 100644 --- a/src/app/pages/login/login.component.html +++ b/src/app/pages/login/login.component.html @@ -1,6 +1,7 @@ <div class="login" id="login"> <div class="card"> <h1 class="cardheader">欢迎登陆</h1> + <input type="text" [(ngModel)]="yuyinmsg"><button style="color: #000;" (click)="ceshiYuyin()">测试语音</button> <form nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()"> <nz-form-item> <nz-form-control nzErrorTip="请输入账号!"> diff --git a/src/app/pages/login/login.component.ts b/src/app/pages/login/login.component.ts index 19abd0d..192cc37 100644 --- a/src/app/pages/login/login.component.ts +++ b/src/app/pages/login/login.component.ts @@ -6,6 +6,7 @@ import { CookieService } from 'ngx-cookie-service';//cookie插件 import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { NzMessageService } from 'ng-zorro-antd/message'; +import { SpeakingTool } from 'src/app/babylon/tool/speaking-tool'; @Component({ selector: 'app-login', templateUrl: './login.component.html', @@ -27,6 +28,11 @@ export class LoginComponent implements OnInit { errmsg: string = ''; //错误信息 + yuyinmsg: string; + ceshiYuyin() { + SpeakingTool.Instance.speak(this.yuyinmsg) + } + //跳转注册页面 toRegister() { From dc10e83d13c5249d1723da5ef60074dcb049a535 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 09:47:55 +0800 Subject: [PATCH 08/29] =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/login/login.component.html | 1 - src/app/pages/login/login.component.ts | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/app/pages/login/login.component.html b/src/app/pages/login/login.component.html index f9a80e3..ede3a45 100644 --- a/src/app/pages/login/login.component.html +++ b/src/app/pages/login/login.component.html @@ -1,7 +1,6 @@ <div class="login" id="login"> <div class="card"> <h1 class="cardheader">欢迎登陆</h1> - <input type="text" [(ngModel)]="yuyinmsg"><button style="color: #000;" (click)="ceshiYuyin()">测试语音</button> <form nz-form [formGroup]="validateForm" class="login-form" (ngSubmit)="submitForm()"> <nz-form-item> <nz-form-control nzErrorTip="请输入账号!"> diff --git a/src/app/pages/login/login.component.ts b/src/app/pages/login/login.component.ts index 192cc37..d379c6a 100644 --- a/src/app/pages/login/login.component.ts +++ b/src/app/pages/login/login.component.ts @@ -3,10 +3,9 @@ import { HttpClient } from '@angular/common/http' import { Router, ActivatedRoute } from '@angular/router' import { CacheTokenService } from '../../service/cache-token.service'//引入服务 import { CookieService } from 'ngx-cookie-service';//cookie插件 - import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { NzMessageService } from 'ng-zorro-antd/message'; -import { SpeakingTool } from 'src/app/babylon/tool/speaking-tool'; + @Component({ selector: 'app-login', templateUrl: './login.component.html', @@ -28,10 +27,6 @@ export class LoginComponent implements OnInit { errmsg: string = ''; //错误信息 - yuyinmsg: string; - ceshiYuyin() { - SpeakingTool.Instance.speak(this.yuyinmsg) - } //跳转注册页面 From 07f01aeb762f89d60be88bef142011ea99d11953 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 10:42:55 +0800 Subject: [PATCH 09/29] =?UTF-8?q?=E6=B6=88=E9=98=B2=E8=AE=BE=E6=96=BD?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../left-domain/left-domain.component.html | 4 +- .../left-domain/left-domain.component.scss | 10 ++--- .../left-domain/left-domain.component.ts | 45 +++++++------------ src/styles.scss | 3 +- 4 files changed, 22 insertions(+), 40 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 9eeb991..5a91b33 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -66,9 +66,9 @@ <!-- 油罐设备 --> <!-- 消防设施 --> <div class="publicBox fireFacilities" *ngIf="beforeFence === 3"> - <nz-tree [nzData]="treeData" [nzTreeTemplate]="nzTreeTemplate"></nz-tree> + <nz-tree [nzData]="treeData" [nzTreeTemplate]="nzTreeTemplate" [nzMultiple]="true" (nzClick)="nzClick($event)"></nz-tree> <ng-template #nzTreeTemplate let-node let-origin="origin"> - <div class="treeRow"><p>{{node.title}}</p><p>{{getFacilityNum(node.key)}}</p></div> + <div class="treeRow"><p>{{node.title}}</p><p><i nz-icon nzType="eye" nzTheme="outline" *ngIf="node.isSelected"></i>{{getFacilityNum(node.key)}}</p></div> </ng-template> </div> <!-- 消防设施 --> diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index 45bb38d..2f23f94 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -64,13 +64,9 @@ } } } -.oilTank{ //油管设备 +// .oilTank{ //油管设备 -} +// } .fireFacilities{ //消防设施 - .ant-tree{ - background-color: transparent; - color: #C4E2FC; - } - .treeRow{ width: 100%; display: flex; height: 30px; line-height: 30px; p:first-child{ flex: 1; }; p{ margin: 0; padding: 0; } } + .treeRow{ width: 100%; display: flex; height: 30px; line-height: 30px; p:first-child{ flex: 1; }; p{ margin: 0; padding: 0; .anticon{ margin-right: 5px; font-size: 16px; } } } } \ No newline at end of file diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index fb855cd..dfdfc08 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -1,9 +1,10 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { NzTreeComponent, NzTreeNodeOptions } from 'ng-zorro-antd/tree'; +import { NzFormatEmitEvent, NzTreeComponent, NzTreeNodeOptions } from 'ng-zorro-antd/tree'; import { FacilityInfoInSceneWindow } from 'src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window'; import { PlanComponent } from '../plan/plan.component'; import { FacilityInfoUIItem } from "../../babylon/view/facilityinfoinscene-window/facilityinfo-ui-item"; import { ConfigManager } from 'src/app/babylon/controller/config-manager'; +import { FacilityType } from 'src/app/babylon/model/data/model-data/model-data-facility'; @Component({ selector: 'app-left-domain', @@ -55,17 +56,17 @@ export class LeftDomainComponent implements OnInit { let isFind = this.treeData.find(element=>{ return (item.getType()).includes(element.key) }) if (!isFind) { //不存在 if (item.getType().includes('XF_MHQ')) { //灭火器 - let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, children: [], } - let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } + let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, expanded: true, children: [], } + let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, selected: true, } primaryNode.children.push(treeNode) this.treeData.push(primaryNode) } else { - let primaryNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } + let primaryNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, selected: true, } this.treeData.push(primaryNode) } } else { //存在 if (item.getType().includes('XF_MHQ') && !isFind.children.find(elements=>{ return elements.key === item.getType() })) { //灭火器 - let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } + let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, selected: true, } isFind.children.push(treeNode) } } @@ -81,6 +82,14 @@ export class LeftDomainComponent implements OnInit { return num } + //点击tree节点 + nzClick(event: NzFormatEmitEvent) { + event.node.isSelected = !event.node.isSelected + if (event.node.key != 'XF_MHQ') { + FacilityInfoInSceneWindow.instance.showFacilityByType(FacilityType[event.node.key], event.node.isSelected) + } + } + //编辑信息 editInfo() { @@ -96,29 +105,5 @@ export class LeftDomainComponent implements OnInit { } export class treeData { - static nodes: NzTreeNodeOptions[] = [ - { - title: '灭火器', - key: '1', - selectable: false, - children: [ - { title: '4KG手提干粉灭火器', key: '1', selectable: false, }, - { title: '4KG手提泡沫灭火器', key: '2', selectable: false, }, - { title: '4KG手提二氧化碳灭火器', key: '3', selectable: false, }, - { title: '35KG手推灭火器', key: '4', selectable: false, }, - ] - }, - { - title: '灭火毯', - key: '2', - selectable: false, - children: [] - }, - { - title: '消防锹', - key: '3', - selectable: false, - children: [] - }, - ]; + static nodes: NzTreeNodeOptions[] = [] } diff --git a/src/styles.scss b/src/styles.scss index 4d7af63..90ea105 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -104,7 +104,8 @@ h1 { //三维场景 #threeDimensional { - .ant-tree-node-content-wrapper:hover { background-color: transparent; } + .ant-tree{ color: #C4E2FC; } + .ant-tree,.ant-tree-node-content-wrapper:hover,.ant-tree-node-content-wrapper.ant-tree-node-selected { background-color: transparent; } .ant-tree-node-content-wrapper { width: 100%; } //滚动条样式 ::-webkit-scrollbar { From a39fe0a89586716cb94187a85ed4744c127f277a Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 11 Nov 2021 11:59:53 +0800 Subject: [PATCH 10/29] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/model/info/model/model-info-facility.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8d9a2df..29e5b8d 100644 --- a/src/app/babylon/model/info/model/model-info-facility.ts +++ b/src/app/babylon/model/info/model/model-info-facility.ts @@ -125,7 +125,7 @@ export class ModelInfo_facility extends ModelInfo { // this.onClickMeshIconBtn(eventData,eventState); FacilityInfoInSceneWindow.instance.selectFacilityInfo(this); - // SpeakingTool.Instance.speak("这是离线版"); + // SpeakingTool.Instance.speak("你好世界"); } //展示属性 From 22675945b90bf0c276dd0f8091ec3e2ca1adf9e6 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 11 Nov 2021 14:21:53 +0800 Subject: [PATCH 11/29] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E8=AE=BE=E5=A4=87UI=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/config-manager.ts | 3 ++ .../babylon/model/info/model/model-info.ts | 42 +++++++++++++++++- .../facilityinfo-ui-item.ts | 12 +++++ src/assets/images/facility/in/JY_JYJ.png | Bin 0 -> 2239 bytes src/assets/images/facility/in/JY_YG.png | Bin 0 -> 2500 bytes 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/assets/images/facility/in/JY_JYJ.png create mode 100644 src/assets/images/facility/in/JY_YG.png diff --git a/src/app/babylon/controller/config-manager.ts b/src/app/babylon/controller/config-manager.ts index e724c8d..b136957 100644 --- a/src/app/babylon/controller/config-manager.ts +++ b/src/app/babylon/controller/config-manager.ts @@ -43,7 +43,10 @@ export class ConfigManager { case FacilityType.QY: case FacilityType.TPBZ: case FacilityType.DWBZ: + case FacilityType.JY_JYJ://临时 + case FacilityType.JY_YG://临时 result = true; + break; } diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index f89684a..eeea1de 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -5,6 +5,7 @@ import { EventState, Mesh, PointerDragBehavior, + Vector2, Vector3, } from '@babylonjs/core'; import { Button, Rectangle, Vector2WithInfo } from '@babylonjs/gui'; @@ -14,6 +15,8 @@ import { UIManager } from 'src/app/babylon/controller/ui-manager'; import { BabylonTool } from 'src/app/babylon/tool/babylon-tool'; import { BabylonUIStyleTool } from 'src/app/babylon/tool/babylon-ui-style-tool'; import { GizmoTool } from 'src/app/babylon/tool/gizmo-tool'; +import { TsTool } from 'src/app/babylon/tool/ts-tool'; +import { isRegularExpressionLiteral } from 'typescript'; import { ModelData } from '../../data/model-data/model-data'; @@ -26,6 +29,11 @@ export class ModelInfo { * 所有子节点 */ _models: AbstractMesh[]; + + /** + * 头部所在位置(并不是都有) + */ + head: AbstractMesh; /** * 包装盒、根节点 ,请使用modelBox 属性进行访问 */ @@ -251,8 +259,23 @@ export class ModelInfo { if (this.uiFollowRoot != null) { - this.uiFollowRoot.linkWithMesh(this.modelBox); - this.uiFollowRoot.linkOffsetY = '-50px'; + + for (let i = 0; i < this.models.length; i++) { + let l_mesh = this.models[i]; + if (TsTool.stringContain(l_mesh.name, "Head")) { + this.head = l_mesh; + break; + } + } + + if (this.head == null) { + this.uiFollowRoot.linkWithMesh(this.modelBox); + this.uiFollowRoot.linkOffsetY = '-50px'; + } + else { + this.uiFollowRoot.linkWithMesh(this.head); + } + } } @@ -285,6 +308,21 @@ export class ModelInfo { } + + + /** + * 获取头部跟随的ui所在的位置 + */ + getHeadUIPos() { + let result: Vector2 = null; + if (this.uiFollowRoot != null) { + result.x = this.uiFollowRoot.leftInPixels; + result.y = this.uiFollowRoot.topInPixels; + } + + return result; + } + } diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts index 8acf483..96c3b87 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts @@ -134,5 +134,17 @@ export class FacilityInfoUIItem { } + /** + * 获取头部UI的位置(像素) + */ + getHeadUIPos() { + if (this.modelInfo != null) { + return this.modelInfo.getHeadUIPos(); + } + else { + return null; + } + } + } \ No newline at end of file diff --git a/src/assets/images/facility/in/JY_JYJ.png b/src/assets/images/facility/in/JY_JYJ.png new file mode 100644 index 0000000000000000000000000000000000000000..199063a26f65e9ad3eabd8473b8b7fc693513398 GIT binary patch literal 2239 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 N002ovPDHLkV1h8FRu%vN literal 0 HcmV?d00001 diff --git a/src/assets/images/facility/in/JY_YG.png b/src/assets/images/facility/in/JY_YG.png new file mode 100644 index 0000000000000000000000000000000000000000..f377b06ea5fcf47261a2e27475efbc353ba9b238 GIT binary patch literal 2500 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 O0000<MNUMnLSTZ7zr^DJ literal 0 HcmV?d00001 From 74a8367284b71907fbcc849788a5fad892dbfb6c Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 14:40:50 +0800 Subject: [PATCH 12/29] =?UTF-8?q?=E6=B6=88=E9=98=B2=E8=AE=BE=E6=96=BD?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../left-domain/left-domain.component.html | 2 +- .../left-domain/left-domain.component.ts | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 5a91b33..2b3196f 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -66,7 +66,7 @@ <!-- 油罐设备 --> <!-- 消防设施 --> <div class="publicBox fireFacilities" *ngIf="beforeFence === 3"> - <nz-tree [nzData]="treeData" [nzTreeTemplate]="nzTreeTemplate" [nzMultiple]="true" (nzClick)="nzClick($event)"></nz-tree> + <nz-tree [nzData]="treeData" [nzTreeTemplate]="nzTreeTemplate" (nzClick)="nzClick($event)"></nz-tree> <ng-template #nzTreeTemplate let-node let-origin="origin"> <div class="treeRow"><p>{{node.title}}</p><p><i nz-icon nzType="eye" nzTheme="outline" *ngIf="node.isSelected"></i>{{getFacilityNum(node.key)}}</p></div> </ng-template> diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index dfdfc08..dca4e69 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -57,20 +57,36 @@ export class LeftDomainComponent implements OnInit { if (!isFind) { //不存在 if (item.getType().includes('XF_MHQ')) { //灭火器 let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, expanded: true, children: [], } - let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, selected: true, } + let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } primaryNode.children.push(treeNode) this.treeData.push(primaryNode) } else { - let primaryNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, selected: true, } + let primaryNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } this.treeData.push(primaryNode) } } else { //存在 if (item.getType().includes('XF_MHQ') && !isFind.children.find(elements=>{ return elements.key === item.getType() })) { //灭火器 - let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, selected: true, } + let treeNode = { title: ConfigManager.getFacilityTypeName(item.getType()), key: item.getType(), selectable: false, } isFind.children.push(treeNode) } } }) + //编辑模式 + let isFind = this.treeData.find(item=>{ return item.key === 'XF_MHQ' }) + if (!isFind) { + let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, } + this.treeData.push(primaryNode) + } + for (let facility in FacilityType) { + if (facility.slice(0,3) === "XF_" && !facility.includes('XF_MHQ')) { + let isFind = this.treeData.find(item=>{ return item.key === facility }) + if (!isFind) { + let primaryNode = { title: ConfigManager.getFacilityTypeName(FacilityType[facility]), key: facility, selectable: false, } + this.treeData.push(primaryNode) + } + } + } + //编辑模式 } //获取设备 数量 @@ -84,8 +100,9 @@ export class LeftDomainComponent implements OnInit { //点击tree节点 nzClick(event: NzFormatEmitEvent) { - event.node.isSelected = !event.node.isSelected if (event.node.key != 'XF_MHQ') { + event.node.isSelected = !event.node.isSelected + FacilityInfoInSceneWindow.instance.showFacilityByType(null, !event.node.isSelected) FacilityInfoInSceneWindow.instance.showFacilityByType(FacilityType[event.node.key], event.node.isSelected) } } From ccb2d0d2d3533c41d354da0f0baa799753030a98 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 11 Nov 2021 14:46:34 +0800 Subject: [PATCH 13/29] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/model/info/model/model-info.ts | 4 +--- .../facilityinfoinscene-window/facilityinfo-ui-item.ts | 3 ++- .../facilityinfoinscene-window.ts | 10 +++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/app/babylon/model/info/model/model-info.ts b/src/app/babylon/model/info/model/model-info.ts index eeea1de..2a31504 100644 --- a/src/app/babylon/model/info/model/model-info.ts +++ b/src/app/babylon/model/info/model/model-info.ts @@ -10,13 +10,10 @@ import { } from '@babylonjs/core'; import { Button, Rectangle, Vector2WithInfo } from '@babylonjs/gui'; import { classToClass } from 'class-transformer'; -import { SceneManager } from 'src/app/babylon/controller/scene-manager'; import { UIManager } from 'src/app/babylon/controller/ui-manager'; import { BabylonTool } from 'src/app/babylon/tool/babylon-tool'; -import { BabylonUIStyleTool } from 'src/app/babylon/tool/babylon-ui-style-tool'; import { GizmoTool } from 'src/app/babylon/tool/gizmo-tool'; import { TsTool } from 'src/app/babylon/tool/ts-tool'; -import { isRegularExpressionLiteral } from 'typescript'; import { ModelData } from '../../data/model-data/model-data'; @@ -316,6 +313,7 @@ export class ModelInfo { getHeadUIPos() { let result: Vector2 = null; if (this.uiFollowRoot != null) { + result = new Vector2(); result.x = this.uiFollowRoot.leftInPixels; result.y = this.uiFollowRoot.topInPixels; } diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts index 96c3b87..f9126ba 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts @@ -1,4 +1,5 @@ +import { Vector2 } from "@babylonjs/core"; import { SceneManager } from "../../controller/scene-manager"; import { PropertyData_Base } from "../../model/data/institution/facility/property-data/property-data-base"; import { FacilityType, ModelData_facility } from "../../model/data/model-data/model-data-facility"; @@ -137,7 +138,7 @@ export class FacilityInfoUIItem { /** * 获取头部UI的位置(像素) */ - getHeadUIPos() { + getHeadUIPos(): Vector2 { if (this.modelInfo != null) { return this.modelInfo.getHeadUIPos(); } diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts index cf98b44..72975ef 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts @@ -466,7 +466,9 @@ export class FacilityInfoInSceneWindow extends UIBase { selectJYJFrom3D(pickInfo: PickingInfo) { if (this.currentSelectJYJInfo != null) { - this.playJYJSelectEffect(false, this.currentSelectJYJInfo); + let facilityItem: FacilityInfoUIItem = FacilityInfoInSceneWindow.instance.getFacilityItem(this.currentSelectJYJInfo); + facilityItem.onSelect(false); + // this.playJYJSelectEffect(false, this.currentSelectJYJInfo); this.currentSelectJYJInfo = null; } @@ -511,10 +513,12 @@ export class FacilityInfoInSceneWindow extends UIBase { if (result != null) { - this.playJYJSelectEffect(true, result); + //this.playJYJSelectEffect(true, result); let facilityItem: FacilityInfoUIItem = FacilityInfoInSceneWindow.instance.getFacilityItem(result); console.log("场景中选中设备", facilityItem); //通知前端 - FacilityInfoInSceneWindow.instance.selectFacilityItemToThree([facilityItem], true); + facilityItem.onSelect(true); + //FacilityInfoInSceneWindow.instance.selectFacilityItemToThree([facilityItem], true); + //console.log(facilityItem.getHeadUIPos()); } } From 71e33f581c4f43cf17ff311a47be6dee1ad2587c Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 15:02:17 +0800 Subject: [PATCH 14/29] =?UTF-8?q?=E6=B6=88=E9=98=B2=E8=AE=BE=E6=96=BD?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/left-domain/left-domain.component.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index dca4e69..0265ae2 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -102,8 +102,18 @@ export class LeftDomainComponent implements OnInit { nzClick(event: NzFormatEmitEvent) { if (event.node.key != 'XF_MHQ') { event.node.isSelected = !event.node.isSelected - FacilityInfoInSceneWindow.instance.showFacilityByType(null, !event.node.isSelected) - FacilityInfoInSceneWindow.instance.showFacilityByType(FacilityType[event.node.key], event.node.isSelected) + if (event.node.isSelected) { //显示当前, 隐藏所有 + FacilityInfoInSceneWindow.instance.showFacilityByType(null, false) + FacilityInfoInSceneWindow.instance.showFacilityByType(FacilityType[event.node.key], event.node.isSelected) + } else { //显示所有 + this.treeData.forEach(item=>{ + if (item.key != 'XF_MHQ') { + FacilityInfoInSceneWindow.instance.showFacilityByType(FacilityType[item.key], true) + } else { + item.children.forEach(element=>{ FacilityInfoInSceneWindow.instance.showFacilityByType(FacilityType[element.key], true) }) + } + }) + } } } From c1391ed07141a90508c2c49b3e205ea5a5d0401c Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Thu, 11 Nov 2021 15:32:32 +0800 Subject: [PATCH 15/29] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/left-domain/left-domain.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index 0265ae2..cf9afca 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -39,7 +39,11 @@ export class LeftDomainComponent implements OnInit { handleFacility() { let list: FacilityInfoUIItem[] = [] FacilityInfoInSceneWindow.instance.facilityInfoUIItemes.forEach(item=>{ - if (this.beforeFence === 3) { //消防设施 + if (this.beforeFence === 1) { //加油机 + item.getType() === "JY_JYJ"? list.push(item) : null + } else if (this.beforeFence === 2) { //油罐设备 + item.getType() === "JY_YG"? list.push(item) : null + } else if (this.beforeFence === 3) { //消防设施 (item.getType()).slice(0,3) === "XF_"? list.push(item) : null } }) From 7ae1fc34dc5efc3066ccb30429e92f3705c74aaa Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 11 Nov 2021 15:32:33 +0800 Subject: [PATCH 16/29] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B6=88=E9=98=B2?= =?UTF-8?q?=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/building-window/building-window.ts | 4 ++- .../facilityinfo-ui-item.ts | 4 +-- .../facilityinfoinscene-window.ts | 31 ++++++++++++++----- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index a2abb06..ea2e0b7 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -20,6 +20,7 @@ import { ModelInfo_building } from "../../model/info/model/model-info-building"; import { FacilityInfoByType } from "../../model/info/model/model-info-facility"; import { BabylonTool } from "../../tool/babylon-tool"; import { TsTool } from "../../tool/ts-tool"; +import { FacilityInfoInSceneWindow } from "../facilityinfoinscene-window/facilityinfoinscene-window"; import { UIBase } from "../window-base/ui-base"; import { BuildingUIItem } from "./building-ui-item"; @@ -257,7 +258,6 @@ export class BuildingWindow extends UIBase { */ recoverMoudleShow(type: JYZInfoMoudleType) { let showData = DataManager.institutionData.getMoudleShowData(type); - console.log("恢复模块状态", showData); if (showData != null) { let camera = SceneManager.Instance.defaultCamera; //showData.cameraData.setDataToCamera(camera); @@ -719,6 +719,8 @@ export class BuildingWindow extends UIBase { } this.initFacilityTypeByMoudleType(type, this.currentBuidngItem.buildingInfo); + FacilityInfoInSceneWindow.instance.selectJYJFrom3D(null); + //设备: 显示UI let facilityByType: FacilityInfoByType[] = []; if (this.facilitysByMoudle.has(type)) { diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts index f9126ba..5df9528 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts @@ -100,9 +100,9 @@ export class FacilityInfoUIItem { this.facilityInfoInSceneWindow.selectFacilityItemToThree([this], false); if (!this.facilityInfoInSceneWindow.getFacilityUIShowType(this.getType())) { this.modelInfo.setIconEnable(select); - + this.facilityInfoInSceneWindow.playJYJSelectEffect(select, this.modelInfo) } - this.facilityInfoInSceneWindow.playJYJSelectEffect(select, this.modelInfo) + } } diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts index 72975ef..ec58012 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts @@ -211,13 +211,27 @@ export class FacilityInfoInSceneWindow extends UIBase { * @param facilityType */ getFacilityUIShowType(facilityType: FacilityType): boolean { - // for (let i = 0; i < this.three.allFacilityInfoUIItemes.length; i++) { - // let item = this.three.allFacilityInfoUIItemes[i]; - // if (item.type == facilityType) { - // return item.isShow; - // } - // } - return true; + + //没开弹框 + if (!this.three.isShowChildComponent || this.three.leftDomain == null) { + + return false; + } + + //没有要显示的设备 + if (this.three.leftDomain.FacilityList == null) { + return false; + } + + for (let i = 0; i < this.three.leftDomain.FacilityList.length; i++) { + let item: FacilityInfoUIItem = this.three.leftDomain.FacilityList[i]; + if (item.getType() == facilityType) { + console.log("显示", facilityType); + return true; + } + } + console.log("不显示", facilityType); + return false; } @@ -246,7 +260,8 @@ export class FacilityInfoInSceneWindow extends UIBase { super.onInit(); FacilityInfoInSceneWindow.instance = this; - // this.three = ThreeDimensionalHomeComponent.instance; + this.three = PlanComponent.instance; + // EventManager.addListener(Event_ModelInfoChange, this.onModelInfoChange); GizmoTool.onPickMeshInfoObservable.add(this.onClickModel); From 81bc202e7d04fdbc3b5a86d8b7607346e53018da Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 11 Nov 2021 16:00:43 +0800 Subject: [PATCH 17/29] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facilityinfo-ui-item.ts | 4 ++-- .../facilityinfoinscene-window.ts | 17 ++++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts index 5df9528..f9126ba 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfo-ui-item.ts @@ -100,9 +100,9 @@ export class FacilityInfoUIItem { this.facilityInfoInSceneWindow.selectFacilityItemToThree([this], false); if (!this.facilityInfoInSceneWindow.getFacilityUIShowType(this.getType())) { this.modelInfo.setIconEnable(select); - this.facilityInfoInSceneWindow.playJYJSelectEffect(select, this.modelInfo) - } + } + this.facilityInfoInSceneWindow.playJYJSelectEffect(select, this.modelInfo) } } diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts index ec58012..91dc478 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts @@ -165,10 +165,13 @@ export class FacilityInfoInSceneWindow extends UIBase { if (isChecked) { //选中 this.three.beforeOnefacilityInfo = facilityInfoUIItem[0].getID(); this.three.getPropertyData(facilityInfoUIItem[0]) + console.log("通知前端选中设备", facilityInfoUIItem[0]); } else { //取消选中 // this.three.isShowRightNature = false this.three.beforeOnefacilityInfo = null + } + } } @@ -543,14 +546,14 @@ export class FacilityInfoInSceneWindow extends UIBase { */ playJYJSelectEffect(play: boolean, facilityInfo: ModelInfo_facility) { - if (play) { - let facilityData = facilityInfo.modelData as ModelData_facility; - if (facilityData.facilityType != FacilityType.JY_JYJ && - facilityData.facilityType != FacilityType.JY_YG) { - //只有加油机和油罐有高亮显示 - return; - } + //if (play) { + let facilityData = facilityInfo.modelData as ModelData_facility; + if (facilityData.facilityType != FacilityType.JY_JYJ && + facilityData.facilityType != FacilityType.JY_YG) { + //只有加油机和油罐有高亮显示和取消 + return; } + //} if (play) { From bf8315c914cd3755f9df5dd91db67a5c83605680 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Thu, 11 Nov 2021 16:49:33 +0800 Subject: [PATCH 18/29] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/mode-manager.ts | 8 ++++---- src/app/babylon/controller/scene-manager.ts | 2 +- src/app/babylon/model/info/model/model-info-building.ts | 9 ++++++++- src/app/babylon/tool/gizmo-tool.ts | 2 +- src/app/babylon/view/building-window/building-window.ts | 3 --- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/app/babylon/controller/mode-manager.ts b/src/app/babylon/controller/mode-manager.ts index 5bf14b6..4f3c9fd 100644 --- a/src/app/babylon/controller/mode-manager.ts +++ b/src/app/babylon/controller/mode-manager.ts @@ -15,15 +15,15 @@ export enum ModeType { export class ModeManager { /** - * 当前模式的类型(编辑模式代表内部编辑人员,可新增单位、上传模型,查看模式代表交付的模式) + * 当前模式的类型 * 外部使用 currentMode 属性访问和修改 */ private static s_currentMode: ModeType = ModeType.Edit; /** - * 高级权限,表示某些高级功能的开放 + * 制作模式代表内部编辑人员,可新增单位、上传模型,查看模式代表交付的模式 */ - public static highPower = true; + public static s_isMakeMode = true; /** * 调试模式 @@ -52,7 +52,7 @@ export class ModeManager { //#endregion /** - * 获取当前模式的类型 + * 获取当前模式的类型(查看或编辑,用户权限有关) */ static get currentMode(): ModeType { return ModeManager.s_currentMode; diff --git a/src/app/babylon/controller/scene-manager.ts b/src/app/babylon/controller/scene-manager.ts index c285922..cb7899e 100644 --- a/src/app/babylon/controller/scene-manager.ts +++ b/src/app/babylon/controller/scene-manager.ts @@ -476,7 +476,7 @@ export class SceneManager { ) { // console.log("准备加载"); - let defaultMesh = MeshBuilder.CreateBox(modelData.key, { size: 0.01 }); + let defaultMesh = MeshBuilder.CreateBox(modelData.key + "Box", { size: 0.01 }); defaultMesh.scaling.y = 0.01; defaultMesh.visibility = 0; 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 337a043..68345d8 100644 --- a/src/app/babylon/model/info/model/model-info-building.ts +++ b/src/app/babylon/model/info/model/model-info-building.ts @@ -50,7 +50,7 @@ export class ModelInfo_building extends ModelInfo { for (let i = 0; i < allTransformNode.length; i++) { if (TsTool.stringContain(allTransformNode[i].name, "WAI")) { this.neiRoot = allTransformNode[i]; - console.log("找到关键节点wai"); + break; } } @@ -58,6 +58,10 @@ export class ModelInfo_building extends ModelInfo { if (this.neiRoot == null) { + if (!TsTool.stringContain(this.modelBox.name, "Box")) { + console.error("没有关键节点", this.modelBox.name); + } + this.neiRoot = this.modelBox; } @@ -156,6 +160,9 @@ export class ModelInfo_building extends ModelInfo { //更新跟随UI的名称 updateName(name: string) { this.uiIconBtn.textBlock.text = name; + if (!ModeManager.s_isMakeMode) { + this.showFollowUI(false); + } } diff --git a/src/app/babylon/tool/gizmo-tool.ts b/src/app/babylon/tool/gizmo-tool.ts index 199d4e2..632c872 100644 --- a/src/app/babylon/tool/gizmo-tool.ts +++ b/src/app/babylon/tool/gizmo-tool.ts @@ -425,7 +425,7 @@ export class GizmoTool { : UIBase.color_null; GizmoTool.s_gizmoManager.scaleGizmoEnabled = isScaling; - if (uiType == TransformUIType.Hide) { //隐藏选中框 + if (uiType == TransformUIType.Hide || !ModeManager.s_isMakeMode) { //隐藏选中框 GizmoTool.s_boundingBoxGizmo.attachedMesh = null; } diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index ea2e0b7..4ef7789 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -218,8 +218,6 @@ export class BuildingWindow extends UIBase { * @param show true表示显示 */ showJYZInfoModel(type: JYZInfoMoudleType, show: boolean) { - console.log("showJYZInfoModel", type, show); - if (this.currentJYZInfoMoudleType == type) { if (show) { return; //与上次显示的模块相同 @@ -875,7 +873,6 @@ export class BuildingWindow extends UIBase { if (!isRepeat)//不重复,就添加进去 { this.mat_UV.get(moudleType).push(l_mat); - console.log("找到uv", l_mat); } } } From b5036c35b203bf14d1616ee1fe1720a4211e9330 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 12 Nov 2021 09:21:19 +0800 Subject: [PATCH 19/29] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/model/data/mark/mark-plan-data.ts | 10 ++++++++++ src/app/pages/pages.module.ts | 8 ++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/app/babylon/model/data/mark/mark-plan-data.ts b/src/app/babylon/model/data/mark/mark-plan-data.ts index 68fb3f9..1e4e751 100644 --- a/src/app/babylon/model/data/mark/mark-plan-data.ts +++ b/src/app/babylon/model/data/mark/mark-plan-data.ts @@ -225,6 +225,16 @@ export class MarkNodeData { @Type(() => NatureData) natureData: NatureData; + /** + * 描述 + */ + describe: string; + + /** + * 图片(或视频?) + */ + texture: string; + constructor(id: number, name: string) { this.id = id; diff --git a/src/app/pages/pages.module.ts b/src/app/pages/pages.module.ts index 470eb6a..73c0fc2 100644 --- a/src/app/pages/pages.module.ts +++ b/src/app/pages/pages.module.ts @@ -1,4 +1,4 @@ -import { NgModule } from '@angular/core'; +import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { A11yModule } from '@angular/cdk/a11y'; import { DragDropModule } from '@angular/cdk/drag-drop'; @@ -37,6 +37,8 @@ import { OilStationInfoComponent } from './oil-station-info/oil-station-info.com import { LeftDomainComponent } from './left-domain/left-domain.component'; import { AddequipmentComponent } from './equipment-info/addequipment/addequipment.component'; import { EditequipmentComponent } from './equipment-info/editequipment/editequipment.component'; + + @NgModule({ declarations: [LoginComponent, RegisterComponent, HomeComponent, PlanComponent, TodayWarningComponent, CriminalRecordsComponent, TodayWarningAdminComponent, CriminalRecordsAdminComponent, LeftDomainComponent, EquipmentInfoComponent, OilStationInfoComponent, AddequipmentComponent, EditequipmentComponent], imports: [ @@ -67,6 +69,8 @@ import { EditequipmentComponent } from './equipment-info/editequipment/editequip NzSpinModule, NzTreeModule ], - entryComponents :[AddequipmentComponent,EditequipmentComponent] + entryComponents: [AddequipmentComponent, EditequipmentComponent], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }) export class PagesModule { } From 401d38c3263b1c9b24b964fe11a92bc1f04797bf Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 12 Nov 2021 09:51:25 +0800 Subject: [PATCH 20/29] =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/data-manager.ts | 2 +- .../property-data/in/property-data-jyj.ts | 20 +++++++++----- .../property-data/in/property-data-yg.ts | 20 +++++++++----- .../left-domain/left-domain.component.ts | 26 +++++++++++-------- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/app/babylon/controller/data-manager.ts b/src/app/babylon/controller/data-manager.ts index 8d784f4..aed716a 100644 --- a/src/app/babylon/controller/data-manager.ts +++ b/src/app/babylon/controller/data-manager.ts @@ -443,7 +443,7 @@ export class DataManager { case FacilityType.XF_MHQ_GF_4: case FacilityType.XF_MHQ_GF_8: case FacilityType.XF_MHQ_GF_35: result = new PropertyData_MHQ(key, facilityType); break; - case FacilityType.JY_JYJ: result = new PropertyData_JYJ(key); break; + case FacilityType.JY_JYJ: result = new PropertyData_JYJ(key,"", "","", "","",); break; case FacilityType.JY_YG: result = new PropertyData_YG(key); break; case FacilityType.JY_SYGX: result = new PropertyData_SYGX(key); break; case FacilityType.JY_YQHSGX: result = new PropertyData_YQHSGX(key); break; diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts index 1455610..43fdad7 100644 --- a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts @@ -7,15 +7,23 @@ import { PropertyData_Base } from "../property-data-base"; */ export class PropertyData_JYJ extends PropertyData_Base { - - - constructor(key: string) { - super(key, FacilityType.JY_JYJ); - + brand: string = ""; //品牌 + superBrand: string = ""; //超大牌 + oilGunNum: string = ""; //油枪数量 + oilProductNo: string = ""; //油品品号 + oilPumpType: string = ""; //油泵类型 + + constructor(key: string,brand: string,superBrand: string,oilGunNum: string,oilProductNo: string,oilPumpType: string) { + super(key, FacilityType.JY_JYJ); + this.brand = brand + this.superBrand = superBrand + this.oilGunNum = oilGunNum + this.oilProductNo = oilProductNo + this.oilPumpType = oilPumpType } clone(key: string) { - let result = new PropertyData_JYJ(key); + let result = new PropertyData_JYJ(key,this.brand,this.superBrand,this.oilGunNum,this.oilProductNo,this.oilPumpType); return result; } diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts index a495585..c0b1888 100644 --- a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts @@ -7,14 +7,20 @@ import { PropertyData_Base } from "../property-data-base"; */ export class PropertyData_YG extends PropertyData_Base { - constructor(key: string) { - super(key, FacilityType.JY_YG); + oilProductNo: string = ""; //油品品号 + oilTankVolume: string = ""; //油罐容积 + safeVolume: string = ""; //安全容积 + quantity: string = ""; //数量 + tankFarm: string = ""; //罐区 + oilTankType: string = ""; //油罐类型 - } + constructor(key: string) { + super(key, FacilityType.JY_YG); + } - clone(key: string) { - let result = new PropertyData_YG(key); - return result; - } + clone(key: string) { + let result = new PropertyData_YG(key); + return result; + } } \ No newline at end of file diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index cf9afca..71bc4be 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -19,6 +19,7 @@ export class LeftDomainComponent implements OnInit { this.initComponent() } + editModel: boolean = true; //编辑/查看模式 beforeFence: number; //当前选中功能栏 FacilityList: FacilityInfoUIItem[] = []; //统计设备 list @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; @@ -48,6 +49,7 @@ export class LeftDomainComponent implements OnInit { } }) this.FacilityList = list + console.log(this.FacilityList,this.FacilityList[0].getPropertyData(),'筛选设备') if (this.beforeFence === 3) { //消防设施 this.handleTreeData(this.FacilityList) } @@ -76,17 +78,19 @@ export class LeftDomainComponent implements OnInit { } }) //编辑模式 - let isFind = this.treeData.find(item=>{ return item.key === 'XF_MHQ' }) - if (!isFind) { - let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, } - this.treeData.push(primaryNode) - } - for (let facility in FacilityType) { - if (facility.slice(0,3) === "XF_" && !facility.includes('XF_MHQ')) { - let isFind = this.treeData.find(item=>{ return item.key === facility }) - if (!isFind) { - let primaryNode = { title: ConfigManager.getFacilityTypeName(FacilityType[facility]), key: facility, selectable: false, } - this.treeData.push(primaryNode) + if (this.editModel) { + let isFind = this.treeData.find(item=>{ return item.key === 'XF_MHQ' }) + if (!isFind) { + let primaryNode = { title: '灭火器', key: 'XF_MHQ', selectable: false, } + this.treeData.push(primaryNode) + } + for (let facility in FacilityType) { + if (facility.slice(0,3) === "XF_" && !facility.includes('XF_MHQ')) { + let isFind = this.treeData.find(item=>{ return item.key === facility }) + if (!isFind) { + let primaryNode = { title: ConfigManager.getFacilityTypeName(FacilityType[facility]), key: facility, selectable: false, } + this.treeData.push(primaryNode) + } } } } From 1c2490e4009efa2c6322f1bb7d0318d06daa986d Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 12 Nov 2021 14:15:05 +0800 Subject: [PATCH 21/29] =?UTF-8?q?=E5=8A=A0=E6=B2=B9=E6=9C=BA=EF=BC=8C?= =?UTF-8?q?=E6=B2=B9=E7=BD=90=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/data-manager.ts | 2 +- .../property-data/in/property-data-yg.ts | 10 +++++-- .../left-domain/left-domain.component.html | 30 +++++++++---------- .../left-domain/left-domain.component.scss | 4 ++- .../left-domain/left-domain.component.ts | 1 - 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/app/babylon/controller/data-manager.ts b/src/app/babylon/controller/data-manager.ts index aed716a..de28f8a 100644 --- a/src/app/babylon/controller/data-manager.ts +++ b/src/app/babylon/controller/data-manager.ts @@ -444,7 +444,7 @@ export class DataManager { case FacilityType.XF_MHQ_GF_8: case FacilityType.XF_MHQ_GF_35: result = new PropertyData_MHQ(key, facilityType); break; case FacilityType.JY_JYJ: result = new PropertyData_JYJ(key,"", "","", "","",); break; - case FacilityType.JY_YG: result = new PropertyData_YG(key); break; + case FacilityType.JY_YG: result = new PropertyData_YG(key,"", "","", "","",""); break; case FacilityType.JY_SYGX: result = new PropertyData_SYGX(key); break; case FacilityType.JY_YQHSGX: result = new PropertyData_YQHSGX(key); break; diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts index c0b1888..a491273 100644 --- a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts @@ -14,12 +14,18 @@ export class PropertyData_YG extends PropertyData_Base { tankFarm: string = ""; //罐区 oilTankType: string = ""; //油罐类型 - constructor(key: string) { + constructor(key: string,oilProductNo: string,oilTankVolume: string,safeVolume: string,quantity: string,tankFarm: string,oilTankType: string) { super(key, FacilityType.JY_YG); + this.oilProductNo = oilProductNo + this.oilTankVolume = oilTankVolume + this.safeVolume = safeVolume + this.quantity = quantity + this.tankFarm = tankFarm + this.oilTankType = oilTankType } clone(key: string) { - let result = new PropertyData_YG(key); + let result = new PropertyData_YG(key,this.oilProductNo,this.oilTankVolume,this.safeVolume,this.quantity,this.tankFarm,this.oilTankType); return result; } diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 2b3196f..65c0b73 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -18,8 +18,8 @@ <!-- 基本信息 --> <!-- 加油机 --> <div class="publicBox refueller" *ngIf="beforeFence === 1"> - <div class="interval"> - <p class="title">1类加油机</p> + <div class="interval" *ngFor="let item of FacilityList"> + <p class="title">{{item.getName()}}</p> <div class="table"> <div class="tableHeader"> <p>品牌</p> @@ -29,11 +29,11 @@ <p>油泵类型</p> </div> <div class="tableContent"> - <p>超大牌</p> - <p>2</p> - <p>4</p> - <p>92#</p> - <p>自吸泵</p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().brand"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().superBrand"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilGunNum"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilProductNo"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilPumpType"></p> </div> </div> </div> @@ -41,8 +41,8 @@ <!-- 加油机 --> <!-- 油罐设备 --> <div class="publicBox refueller oilTank" *ngIf="beforeFence === 2"> - <div class="interval"> - <p class="title">1号油罐</p> + <div class="interval" *ngFor="let item of FacilityList"> + <p class="title">{{item.getName()}}</p> <div class="table"> <div class="tableHeader"> <p>油品品号</p> @@ -53,12 +53,12 @@ <p>油罐类型</p> </div> <div class="tableContent"> - <p>92#</p> - <p>200L</p> - <p>180L</p> - <p>1</p> - <p>独立罐区</p> - <p>防渗罐池</p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilProductNo"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilTankVolume"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().safeVolume"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().quantity"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().tankFarm"></p> + <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilTankType"></p> </div> </div> </div> diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index 2f23f94..1238ac9 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -33,8 +33,10 @@ } } -.title{ font-size: 16px; height: 20px; line-height: 20px; margin-bottom: 20px; } //头部header .publicBox{ width: 100%; height: 100%; overflow-y: auto; padding: 0 20px; } +.title{ font-size: 16px; height: 20px; line-height: 20px; margin-bottom: 20px; } //头部header +.tableInput{ border: none; outline: none; background-color: transparent; width: 100%; height: 100%; } + .baseInfo{ //基本信息 .interval{ margin-top: 10px; border-bottom: 1px solid rgb(197, 226, 245); } //分隔div p{ height: 20px; line-height: 20px; } diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index 71bc4be..eb3d85b 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -49,7 +49,6 @@ export class LeftDomainComponent implements OnInit { } }) this.FacilityList = list - console.log(this.FacilityList,this.FacilityList[0].getPropertyData(),'筛选设备') if (this.beforeFence === 3) { //消防设施 this.handleTreeData(this.FacilityList) } From aa030344b966d18a3ce5b196c1646715da3c37e1 Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 12 Nov 2021 14:55:41 +0800 Subject: [PATCH 22/29] =?UTF-8?q?=E9=80=89=E4=B8=AD=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facilityinfoinscene-window.ts | 6 +----- src/app/pages/left-domain/left-domain.component.html | 4 ++-- src/app/pages/left-domain/left-domain.component.scss | 2 +- src/app/pages/left-domain/left-domain.component.ts | 2 ++ src/app/pages/plan/plan.component.ts | 8 +++++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts index 91dc478..3250cd0 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts @@ -163,12 +163,8 @@ export class FacilityInfoInSceneWindow extends UIBase { } } else { // 单选 if (isChecked) { //选中 - this.three.beforeOnefacilityInfo = facilityInfoUIItem[0].getID(); - this.three.getPropertyData(facilityInfoUIItem[0]) - console.log("通知前端选中设备", facilityInfoUIItem[0]); + this.three.selectProperty(facilityInfoUIItem[0]) } else { //取消选中 - // this.three.isShowRightNature = false - this.three.beforeOnefacilityInfo = null } diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 65c0b73..7314d40 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -19,7 +19,7 @@ <!-- 加油机 --> <div class="publicBox refueller" *ngIf="beforeFence === 1"> <div class="interval" *ngFor="let item of FacilityList"> - <p class="title">{{item.getName()}}</p> + <p class="title">{{item.getName()}}<i nz-icon nzType="eye" nzTheme="outline" *ngIf="selectFacilityId === item.getID()"></i></p> <div class="table"> <div class="tableHeader"> <p>品牌</p> @@ -42,7 +42,7 @@ <!-- 油罐设备 --> <div class="publicBox refueller oilTank" *ngIf="beforeFence === 2"> <div class="interval" *ngFor="let item of FacilityList"> - <p class="title">{{item.getName()}}</p> + <p class="title">{{item.getName()}}<i nz-icon nzType="eye" nzTheme="outline" *ngIf="selectFacilityId === item.getID()"></i></p> <div class="table"> <div class="tableHeader"> <p>油品品号</p> diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index 1238ac9..af3f38d 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -34,7 +34,7 @@ } .publicBox{ width: 100%; height: 100%; overflow-y: auto; padding: 0 20px; } -.title{ font-size: 16px; height: 20px; line-height: 20px; margin-bottom: 20px; } //头部header +.title{ font-size: 16px; height: 20px; line-height: 20px; margin-bottom: 20px; .anticon{ margin-left: 5px; font-size: 16px; } } //头部header .tableInput{ border: none; outline: none; background-color: transparent; width: 100%; height: 100%; } .baseInfo{ //基本信息 diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index eb3d85b..351f80a 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -22,6 +22,7 @@ export class LeftDomainComponent implements OnInit { editModel: boolean = true; //编辑/查看模式 beforeFence: number; //当前选中功能栏 FacilityList: FacilityInfoUIItem[] = []; //统计设备 list + selectFacilityId: string = null; //选中设备 ID @ViewChild('nzTreeComponent', { static: false }) nzTreeComponent!: NzTreeComponent; treeData: NzTreeNodeOptions[] = []; //tree data @@ -49,6 +50,7 @@ export class LeftDomainComponent implements OnInit { } }) this.FacilityList = list + this.selectFacilityId = null if (this.beforeFence === 3) { //消防设施 this.handleTreeData(this.FacilityList) } diff --git a/src/app/pages/plan/plan.component.ts b/src/app/pages/plan/plan.component.ts index 01bb492..be42d05 100644 --- a/src/app/pages/plan/plan.component.ts +++ b/src/app/pages/plan/plan.component.ts @@ -269,11 +269,13 @@ export class PlanComponent implements OnInit { } beforeOnePropertyData: FacilityInfoUIItem = null; //当前选择 设备 - beforeOnefacilityInfo: string = null; //当前选择 设备ID - //获取选择设备 属性 - getPropertyData(e: FacilityInfoUIItem) { + //选中 设备 + selectProperty(e: FacilityInfoUIItem) { this.beforeOnePropertyData = e + if (this.isShowChildComponent && this.leftDomain) { + this.leftDomain.selectFacilityId = e.getID() + } } selectRightTopFast: number = 0; //当前选择功能 快捷栏 From dcea344887e118306ddc224dcdddc3c2908d1732 Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 12 Nov 2021 15:05:10 +0800 Subject: [PATCH 23/29] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8B=E5=B1=9E=E8=AE=BE=E5=A4=87=E7=9A=84=E6=98=BE=E9=9A=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/building-window/building-window.ts | 43 ++++++++++++------ src/assets/images/facility/out/DWBZ.png | Bin 2141 -> 9295 bytes src/assets/images/facility/out/PL.png | Bin 1404 -> 9434 bytes src/assets/images/facility/out/QY.png | Bin 1765 -> 8847 bytes src/assets/images/facility/out/TPBZ.png | Bin 2507 -> 9131 bytes 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index 4ef7789..f93b102 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -1,8 +1,10 @@ import { AbstractMesh, Material, Mesh, PBRMaterial, Texture } from "@babylonjs/core"; import { PlanComponent } from "src/app/pages/plan/plan.component"; +import { ConfigManager } from "../../controller/config-manager"; import { DataManager } from "../../controller/data-manager"; import { InfoManager } from "../../controller/info-manager"; +import { ModeManager, ModeType } from "../../controller/mode-manager"; import { SceneManager } from "../../controller/scene-manager"; import { ServeManager } from "../../controller/serve-manager"; import { BuildingStatus } from "../../controller/status/building-status"; @@ -10,7 +12,7 @@ import { StatusManager } from "../../controller/status/status-manager"; import { BuildingData, BuildingData_ChemicalPlant, BuildingData_Environment, BuildingData_Normal, BuildingType } from "../../model/data/institution/building/building-data"; import { JYZInfoMoudleType, JYZShowData } from "../../model/data/institution/jyz-show-data"; import { ModelType } from "../../model/data/model-data/model-data"; -import { FacilityType } from "../../model/data/model-data/model-data-facility"; +import { FacilityPosType, FacilityType } from "../../model/data/model-data/model-data-facility"; import { ModelEditData } from "../../model/data/model-data/model-edit-data"; import { BuildingInfo } from "../../model/info/building/building-info"; import { BuildingInfo_ChemicalPlant } from "../../model/info/building/building-info-chemicalplant"; @@ -774,7 +776,31 @@ export class BuildingWindow extends UIBase { let moudleTypeKey = moudleType; //当前模块物体的特殊字段 let zdKey = "ZD_" + moudleType; //阻挡类物体特殊字段 - if (this.facilitysByMoudle.has(moudleType)) { + //编辑模式下,基本信息下的设备会随时变化 + if (moudleType == JYZInfoMoudleType.JBXX && ModeManager.currentMode == ModeType.Edit) { + if (this.facilitysByMoudle.has(moudleType)) { + this.facilitysByMoudle.get(moudleType).length = 0; + } + else { + this.facilitysByMoudle.set(moudleType, []); + } + + + let allFacilityByType = buildingInfo.ModelInfo.facilityInfos; + if (allFacilityByType == null) { + return; //没有设备 + } + + for (let i = 0; i < allFacilityByType.length; i++) { + let l_facilityByType = allFacilityByType[i]; + if (ConfigManager.getPosType(l_facilityByType.type) == FacilityPosType.Out) { + this.facilitysByMoudle.get(moudleType).push(l_facilityByType); + } + } + + + } + else if (this.facilitysByMoudle.has(moudleType)) { //已经初始化过了 return; } @@ -790,17 +816,7 @@ export class BuildingWindow extends UIBase { 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 (TsTool.stringContain(l_facilityByType.type, zdKey)) { //遮挡物 if (!this.zdByMoudle.has(moudleType)) { this.zdByMoudle.set(moudleType, []); } @@ -809,6 +825,7 @@ export class BuildingWindow extends UIBase { else if (TsTool.stringContain(l_facilityByType.type, "_" + moudleTypeKey) || TsTool.stringContain(l_facilityByType.type, moudleTypeKey + "_")) { this.facilitysByMoudle.get(moudleType).push(l_facilityByType); } + } } diff --git a/src/assets/images/facility/out/DWBZ.png b/src/assets/images/facility/out/DWBZ.png index 8424018d7c95805a5913af4c20e9e123e9a40498..bbc7d5086f757aa51d637eeb4582d6261d0ddbc3 100644 GIT binary patch literal 9295 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 literal 2141 zcmV-j2%`6iP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000OiNkl<Zc%1E< z`)?dq6~{k*uf2Y+*Kfy<wH@bSBI2Z^sI(2O5G_fY0EMQ!gv3v!<?rBU8i9m_pol0% z`~Ygxf-1G4AxLdV0*#Y6cI4RDwc}^Z#_RQSchS8%vrN{z>)F{^XD#xTR{NScbHCrY z_uO;OoXaEppCiYhf8yLZr<71O3jjAz3bX?Ifi9pOXaeehD*0a_04xC0zyvS?+y<@# z|CaxkfOR0^L?i!n?3jMfcfyz;R|t85J;0ZMgTMix#w>Oml*_Bt^p_$!2Yd=#1^xyM z0J9=U*oj6vA%G%Q0ki>60AB_U1I-TDRboCXuUCM703QMufl<JpZjVS;fI^@fcm{YL z=mR`y+DwFIc|8eS0p0^X0EU1yyGGLypb_{2@B?|TPs3I!Py&Ai_#AK)coX;pn6zWe zt^mEj%fNB@{4k&de-Y>a-T~eM`ZFznOUCz4fTv`PK5X=g7-}f~O#H-3CIl#xvHq%z z!=fx8Z@??PQ90wEi*H!8a-vlM6#3_X*MP^ejJ$y&xiKzr&VRNdLaqhFE}7c0nY@7_ zY2$0sX4h6HSP|gx4k2&AEW+Wf4&F)t6~ewQ0nSb!Z=gup{JL;Rh-3n&nEe#+w3V)8 z7b@JVDK6$<ZLQO$UDEbb!X+*e2~a5A==gR_bsm?CS9^PTqM^ZQ)5h%Zm~h&Jcmm|e z%I*8x7337;=4ugsxOXqlwzQC&lWg6TGJ1teSG)yTJOL_XzCYq*D-t3n2UlL6{<qrY z;#*x^Jk!!bVXhVbY#B#{Q$_3vu~*5JRo&ONF}9Bipx`Yo=IcHmPc=0?@Ozr57fx-l zoMQzjm34eyMj4x+`ebF%gA+`BNeL%>KAvoBq$J<5ltrI#D>eUU7Qk44AI;#Bb`x4k zOZj4B<EGym-ELm!=-}~&2B$>u2sf|U7nlVokW9`YC$44%EoEhVucwDSRaJ41ZYnM1 zSX>gp(VMubDcvB3DjEP&DdTb#JkR%k0P=R3Q1)3?R^ua0}6y`96gwNCVeme^rn z7Qihzyo|$FQNhdI-I|mYsN+xid`=CAgTi%_0J|iCnNjSkuIAfaUG#aqDb4q)C!Fl) z(7{rgv%>-5x=Dau$=+rRy&exQb$0T3ua|rq^Sts2#_UjFKTfDI2Y6;HaU&(CpvZs2 z=VPzOV~f0j2Dh7&ot-@0+)SRmh|!32HOwt(&kS|g@A2s1W>0l>I(IG#6(^{kbhO!a z<~_>Q+?sUr_;Jx$S;>nX9qjXXD0D8e(-GsT?rt8hw-vBPxtay2bEIV^DDVAEpN|7I zHICf*Sg5tbkM`}eBSMs`c}|HRjo3tcc{wkMw@+uxn=us(a&=~gx#eY+Lm>idYpjLC z%q}mdYAVXrEPy-yv8lrdat?aE<T$jn9ba7J*8>CGn4f1O^1r8H`cow3r(;pBX-5@` zUTsMUl`a>da9EGc=iA!YUtOK9X$?i~&i(tmdGjXM@7*JkI@zQ!3$P^V@6?c!Lq%aB zKkn_N+3nWfotjI-k%%ULW^j-j&XQj;K9~pRf*nh$QNw;ezr22(@uej@-7zjSdB2~x zhK9H{H>bZlh$vUH0MmBuhawRM7Zx~k>lPDBOKCS&*&AD2<eiZb{^dM*%v{X^e3p*I z^>CO^=jQYs8w&(92|G~dDTnv=$Os=#O=-W90Ytf)eZWY%*I5mPxH2=N9oO;pb{z+# zGXI<J{KdO>wWt|Fl&iUQx1FfJSqX)>JUz|(V`D6=u39G_4m0BS^Y)!PT%4R_Jrv3m z`G|1UFbmKxH92Xcq@X}ghgR>t;qCu0Je=t}k8q6E5tv&zCIv}pp}eqAXLMD5zpAK+ z;Km02)zyTgBI50TfBUxXIUAWJk8m6_zL*7Al4>m5aOLOg{M~b{t-1#U*4Mc(F~QlP zAx$!#Hy;lKI5RZFKWAq%;qBw$YN9wGAf;&IcC4y+zo)WNCo$_vO1Qtarpcch8R7iI zg!bynyPHYg4F>t$;9w@^`9v5Oj)7>qO$V+^9p2?s6Qe5L-&I<w7eB3KW!zg?;r;P( z&X12Xx3Z$isYQ&65LGU)$?ewXyf-?!op&DLHXvLz%mPHD2=TmBT3CKIpq}f!vU@k( zRaHy}gZy!Lm`|psbuTcWXNQ>??F-bg>Un@#-EG5|H!v^UX3eu*teZB5!4<1ki}Lbx zZeOLmCISI|Gcdq~$;k)E8&GkAy5lNrRzekJAV-h{S7N)rLhNcVEESmVN*&&onTGH7 z^l+rEj?u+Mes%Mvc6Q0`s_Fr^78W>t?OG=1`dCZ}r_tCF+jz@izf@VN$4DoVSyd^i zukPBVm#M$#?`Jj`v=m9HF+Z?iYwcwh9}6dc?D_EoFe0Vjs;pMB8iCgGaxP6z>$|zU zv5`{SoL<)_LBDW`8|fxWh^PU4Nh&bw6IF@)^z!9x;$R!I!r@Y)dg5eWNY(A11^${! z<z*IOMcRH=xWvU)Zdh$tctgt5t*>kzK31j8ZwQBkurd#++S}98jdp?vtJ2of()OgV zBEX7lQrHP1n8|-=W$0SX3NK3S?OK)=OC#hjWU5#iG58k=DYL0u9`W`cWx8A*F|5ML z|75|22?PDxxnaV5(Ro>2ZTFTL15>h9=AmqvK`!{NL|EIgY0AKSwrrY0E__4M%pW<t zZ7vp{W#hIvqyfq&TvLznWVT3k<76VcJ7VLc0o9=UGFzzB)8Dgs>+B;u0s#CMT?4fM TdZkoP00000NkvXXu0mjf7=Iq~ diff --git a/src/assets/images/facility/out/PL.png b/src/assets/images/facility/out/PL.png index 96be52e56f8fe4b666667610de496f96d7a37f0f..9e82a04348bee379f4965de9510e15911fe17154 100644 GIT binary patch literal 9434 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 literal 1404 zcmV-?1%vvDP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000F;Nkl<ZXo0nw zU2IfE6vuyTOSj#&6tK0neZq)EY`~&X-wY-`Y5YvoP$kg^#SaoSVodN!gC_WZ4+_Kw zi6|JhD8^`cFwyuXMrbq<=|==j+KL6X?S8bo+wGcD=hp3dXYb71_5V0?&VSCCJ9B2{ zoV#N4g|k!vR|8vt+kp+hI-m_`RMcr;5;zZ>1HK2o1^x;<bQlM&0=5I&fSZNOQojhC z295%Ufy*vNxH!-OybL^DGQ(k!0X_iU0>*8)A{Mf>z%F1Ic&UoU3u3_Yz>pearKzH+ z1M7hwfW1JIyPbh(Qe((i8%-2U9Jmko5$OFN4KK${z$xJVAi>&z{-=QbK#j?$u@w<E z)Ya2nSI?$s1HI9P#rDDMEI(&w8OqIZE;mP}xL`sjU*kCNEbzWgsM02WMj3B}?W@+( zw`wizHI<j|#X_DVGgmk~bH$Vz<-`FS2kr$vGnx6W+Li2W>*B_`1{;I;B{$0}lVgm{ z=S{>5z=OaS<sE(w+@Lm5;AY*?(#nq2Z5C$#7YC;%IXHdEL^K853jA8ySiXtn`+s6$ z{F<7Y(8dddL%0mkq-<NZM#~*|0oZK9_Uf8zLL2YECAPg-+EBWLI@LiEIQw@uwy>wQ zQ``S#dYbPtsl~`6kcf0gtciOXTeLd6FOBn6dfLPZSxVjBiCyZzyTEfn+KrJ2@s4X3 zH?JRdO^)$(X2!SguGlKxZtL>xlg<3_#BZb*j6&>w&sJ{<wE|C?X!g`KXpP@Cab9b@ zK>9?+55n1F9?70iHZM8w7+|E`6Rr1c|1>ql+1y;9zQ~BI4Yv;(l+DW=FoG`L56)#w zDYUYdXGx#ufILRFm}>Pz{RcUdHFrQKtK-%{-XNXgz@0Xa5naSC6wOE0$r_yo|3Ylu zDh}Lcqcxh(`nGSfm_41Wj=KVGiKsWMF-CL#gGih=g-%w-T>;(Vz;!knzt87<+vSjw zI3EO&(H&?y?h05h4zyc2kk=0)ht$S8eJGSZ-9Z+_twFmyXqs&_PR*qm%x36~#(eva zcC1^B^Aak(XtO06qqjcBLrtr-yuvBmmS_%ok@@0edPeJjKn$&9td7$GIaxwUTfKqw zG=G{sM2sL@17;VwawNrpi?&*+g#`xOX3Q7Dl`^};l_MbzjJjx^bepkibB#n)uF_sJ zpCz75xDLDo;TW+$z&s2^RQ|;Y{mBH`qQxDe45Hf~ZW2yMRF>Gu3Yobu28eEm*%zC? z@iy@pR~A_U$%TTop6G;Jf@1Ty_a6AzmF1859Py<81Emr~M|49#((;r#Fzd?IpGt7K zFmEg`vZ50Lv#O@B<bY(B4!IJ_L1eQRL^k9>cu3j2EHAW2r7WCqER|rwz$lS97H;-a z%2vu9kUY!luB?fI*`^d3kqv=2N~<{KnYnl5V(7{pPbIie;Yuuh@o=**w(TozD0e{C zz$1XuMMsiSmG*-4878j$AeYWZm5odAtI&)9kE@inHDrc|eey%n7Gm}bD)lp5-k~co zNgjTu%SicRk+@IdO4{=7*N&ZjwE+T3Ob3+b#w8{X$CC+KBQ-qG{LiE2L~?4e%>jil zB_<D2X!{Tdez8{<DOE^6QHj;0O8L3uU&2Hu2mGY+RTYglbpW-o<v)nsVXhno5boDh zDaq&;0-H*`1o$^q(R-izfumZG^u>F?_3D&0zU77a*`rm3+dh>XcKO*uuEa-xkG#8$ zEvogqjU>n9cN<x^Qswl1xAAg_vLU_SZKTR5uRwW7Stk^h0r(q<<maX?GURdq0000< KMNUMnLSTYzcdI-A diff --git a/src/assets/images/facility/out/QY.png b/src/assets/images/facility/out/QY.png index 20c98713eb017bdf71aecf65a90c266938abf99e..81b25dcc67c74d20ef85054423d6d707738385e9 100644 GIT binary patch literal 8847 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 RaFPH3002ovPDHLkV1g7!>D&MS literal 1765 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 Hu0mjf1dl>T diff --git a/src/assets/images/facility/out/TPBZ.png b/src/assets/images/facility/out/TPBZ.png index 48a05d6af3c21132e44bfca864d99e5a3fba466e..74945410f0557e3cdb1424b9c812cc3438d03fae 100644 GIT binary patch literal 9131 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 literal 2507 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 VluJVgzcT;;002ovPDHLkV1lDM(O&=n From cb97760f02dd51347685d5f338a4e28475db3a2c Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 12 Nov 2021 15:36:02 +0800 Subject: [PATCH 24/29] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=AE=A4=E5=A4=96?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=98=BE=E9=9A=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/config-manager.ts | 8 +++-- .../property-data/in/property-data-jyj.ts | 36 ++++++++++--------- .../view/building-window/building-window.ts | 13 +++---- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/app/babylon/controller/config-manager.ts b/src/app/babylon/controller/config-manager.ts index b136957..d676a0e 100644 --- a/src/app/babylon/controller/config-manager.ts +++ b/src/app/babylon/controller/config-manager.ts @@ -79,8 +79,8 @@ export class ConfigManager { //自定义放置 case FacilityType.PL: result = "毗邻"; break; case FacilityType.QY: result = "区域"; break; - case FacilityType.TPBZ: result = "图片标注"; break; - case FacilityType.DWBZ: result = "点位标注"; break; + case FacilityType.TPBZ: result = "图片"; break; + case FacilityType.DWBZ: result = "点位"; break; //内建 case FacilityType.XF_MHQ_PT_4: result = "4kg普通灭火器"; break; case FacilityType.XF_MHQ_PT_8: result = "8kg普通灭火器"; break; @@ -94,6 +94,10 @@ export class ConfigManager { case FacilityType.XF_XFCM: result = "消防长矛"; break; case FacilityType.XF_XFF: result = "消防斧"; break; case FacilityType.XF_XFS: result = "消防沙"; break; + case FacilityType.JY_JYJ: result = "加油机"; break; + case FacilityType.JY_YG: result = "油罐"; break; + case FacilityType.JY_SYGX: result = "输油管线"; break; + case FacilityType.JY_YQHSGX: result = "油气回收管线"; break; } return result; } diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts index 43fdad7..e06fede 100644 --- a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-jyj.ts @@ -7,24 +7,26 @@ import { PropertyData_Base } from "../property-data-base"; */ export class PropertyData_JYJ extends PropertyData_Base { - brand: string = ""; //品牌 - superBrand: string = ""; //超大牌 - oilGunNum: string = ""; //油枪数量 - oilProductNo: string = ""; //油品品号 - oilPumpType: string = ""; //油泵类型 + brand: string = ""; //品牌 + superBrand: string = ""; //超大牌 + oilGunNum: string = ""; //油枪数量 + oilProductNo: string = ""; //油品品号 + oilPumpType: string = ""; //油泵类型 - constructor(key: string,brand: string,superBrand: string,oilGunNum: string,oilProductNo: string,oilPumpType: string) { - super(key, FacilityType.JY_JYJ); - this.brand = brand - this.superBrand = superBrand - this.oilGunNum = oilGunNum - this.oilProductNo = oilProductNo - this.oilPumpType = oilPumpType - } + constructor(key: string, brand: string, superBrand: string, oilGunNum: string, oilProductNo: string, oilPumpType: string) { + super(key, FacilityType.JY_JYJ); + this.name = "未命名"; + this.brand = brand + this.superBrand = superBrand + this.oilGunNum = oilGunNum + this.oilProductNo = oilProductNo + this.oilPumpType = oilPumpType + } - clone(key: string) { - let result = new PropertyData_JYJ(key,this.brand,this.superBrand,this.oilGunNum,this.oilProductNo,this.oilPumpType); - return result; - } + clone(key: string) { + let result = new PropertyData_JYJ(key, this.brand, this.superBrand, this.oilGunNum, this.oilProductNo, this.oilPumpType); + result.name = this.name; + return result; + } } \ No newline at end of file diff --git a/src/app/babylon/view/building-window/building-window.ts b/src/app/babylon/view/building-window/building-window.ts index f93b102..41f09df 100644 --- a/src/app/babylon/view/building-window/building-window.ts +++ b/src/app/babylon/view/building-window/building-window.ts @@ -777,12 +777,13 @@ export class BuildingWindow extends UIBase { let zdKey = "ZD_" + moudleType; //阻挡类物体特殊字段 //编辑模式下,基本信息下的设备会随时变化 - if (moudleType == JYZInfoMoudleType.JBXX && ModeManager.currentMode == ModeType.Edit) { - if (this.facilitysByMoudle.has(moudleType)) { - this.facilitysByMoudle.get(moudleType).length = 0; + if (ModeManager.currentMode == ModeType.Edit) { + let jbxxMoudle = JYZInfoMoudleType.JBXX; + if (this.facilitysByMoudle.has(jbxxMoudle)) { + this.facilitysByMoudle.get(jbxxMoudle).length = 0; } else { - this.facilitysByMoudle.set(moudleType, []); + this.facilitysByMoudle.set(jbxxMoudle, []); } @@ -794,13 +795,13 @@ export class BuildingWindow extends UIBase { for (let i = 0; i < allFacilityByType.length; i++) { let l_facilityByType = allFacilityByType[i]; if (ConfigManager.getPosType(l_facilityByType.type) == FacilityPosType.Out) { - this.facilitysByMoudle.get(moudleType).push(l_facilityByType); + this.facilitysByMoudle.get(jbxxMoudle).push(l_facilityByType); } } } - else if (this.facilitysByMoudle.has(moudleType)) { + if (this.facilitysByMoudle.has(moudleType)) { //已经初始化过了 return; } From 22606b02a39f443a6e1c224459ba253227fd15ff Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 12 Nov 2021 16:26:09 +0800 Subject: [PATCH 25/29] =?UTF-8?q?type=E4=B8=8B=E6=8B=89=E6=A1=86=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/left-domain/left-domain.component.html | 15 +++++++++++++-- .../pages/left-domain/left-domain.component.scss | 1 + src/styles.scss | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index 7314d40..c62069f 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -33,7 +33,12 @@ <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().superBrand"></p> <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilGunNum"></p> <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilProductNo"></p> - <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilPumpType"></p> + <p style="padding-left: 8px;"> + <nz-select class="tableSelect" [nzBorderless]="true" [nzDisabled]="!editModel" [(ngModel)]="item.getPropertyData().oilPumpType"> + <nz-option nzValue="zxb" nzLabel="自吸泵"></nz-option> + <nz-option nzValue="qyb" nzLabel="潜油泵"></nz-option> + </nz-select> + </p> </div> </div> </div> @@ -58,7 +63,13 @@ <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().safeVolume"></p> <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().quantity"></p> <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().tankFarm"></p> - <p><input type="text" class="tableInput" [disabled]="!editModel" [(ngModel)]="item.getPropertyData().oilTankType"></p> + <p style="padding-left: 8px;"> + <nz-select class="tableSelect" [nzBorderless]="true" [nzDisabled]="!editModel" [(ngModel)]="item.getPropertyData().oilTankType"> + <nz-option nzValue="scg" nzLabel="双层罐"></nz-option> + <nz-option nzValue="dcg" nzLabel="单层罐"></nz-option> + <nz-option nzValue="fsgc" nzLabel="防渗罐池"></nz-option> + </nz-select> + </p> </div> </div> </div> diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index af3f38d..6bfca9a 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -36,6 +36,7 @@ .publicBox{ width: 100%; height: 100%; overflow-y: auto; padding: 0 20px; } .title{ font-size: 16px; height: 20px; line-height: 20px; margin-bottom: 20px; .anticon{ margin-left: 5px; font-size: 16px; } } //头部header .tableInput{ border: none; outline: none; background-color: transparent; width: 100%; height: 100%; } +.tableSelect{ width: 100%; height: 100%; color: #fff; } .baseInfo{ //基本信息 .interval{ margin-top: 10px; border-bottom: 1px solid rgb(197, 226, 245); } //分隔div diff --git a/src/styles.scss b/src/styles.scss index 90ea105..88c4e22 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -107,6 +107,7 @@ h1 { .ant-tree{ color: #C4E2FC; } .ant-tree,.ant-tree-node-content-wrapper:hover,.ant-tree-node-content-wrapper.ant-tree-node-selected { background-color: transparent; } .ant-tree-node-content-wrapper { width: 100%; } + .ant-select-single:not(.ant-select-customize-input) .ant-select-selector { border: none; border-radius: 0px; } //滚动条样式 ::-webkit-scrollbar { width: 5px; From d2bde436a6c7b0ae3ef7454718e3322835e4997f Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 12 Nov 2021 16:39:05 +0800 Subject: [PATCH 26/29] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=B1=9E=E6=80=A7name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../institution/facility/property-data/in/property-data-yg.ts | 2 ++ src/app/pages/left-domain/left-domain.component.html | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts index a491273..41892e3 100644 --- a/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts +++ b/src/app/babylon/model/data/institution/facility/property-data/in/property-data-yg.ts @@ -16,6 +16,7 @@ export class PropertyData_YG extends PropertyData_Base { constructor(key: string,oilProductNo: string,oilTankVolume: string,safeVolume: string,quantity: string,tankFarm: string,oilTankType: string) { super(key, FacilityType.JY_YG); + this.name = "未命名"; this.oilProductNo = oilProductNo this.oilTankVolume = oilTankVolume this.safeVolume = safeVolume @@ -26,6 +27,7 @@ export class PropertyData_YG extends PropertyData_Base { clone(key: string) { let result = new PropertyData_YG(key,this.oilProductNo,this.oilTankVolume,this.safeVolume,this.quantity,this.tankFarm,this.oilTankType); + result.name = this.name; return result; } diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index c62069f..c5b558b 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -19,7 +19,7 @@ <!-- 加油机 --> <div class="publicBox refueller" *ngIf="beforeFence === 1"> <div class="interval" *ngFor="let item of FacilityList"> - <p class="title">{{item.getName()}}<i nz-icon nzType="eye" nzTheme="outline" *ngIf="selectFacilityId === item.getID()"></i></p> + <p class="title"><input type="text" class="tableInput" [(ngModel)]="item.getPropertyData().name"></p> <div class="table"> <div class="tableHeader"> <p>品牌</p> @@ -47,7 +47,7 @@ <!-- 油罐设备 --> <div class="publicBox refueller oilTank" *ngIf="beforeFence === 2"> <div class="interval" *ngFor="let item of FacilityList"> - <p class="title">{{item.getName()}}<i nz-icon nzType="eye" nzTheme="outline" *ngIf="selectFacilityId === item.getID()"></i></p> + <p class="title"><input type="text" class="tableInput" [(ngModel)]="item.getPropertyData().name"></p> <div class="table"> <div class="tableHeader"> <p>油品品号</p> From f60d7b3421f622eb4c538e7c6249b3212913af8b Mon Sep 17 00:00:00 2001 From: cpf <1105965053@qq.com> Date: Fri, 12 Nov 2021 17:09:02 +0800 Subject: [PATCH 27/29] =?UTF-8?q?=E9=80=89=E4=B8=AD=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=8F=8A=E9=80=89=E4=B8=AD=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/pages/left-domain/left-domain.component.html | 12 ++++++++++-- src/app/pages/left-domain/left-domain.component.scss | 6 +++++- src/app/pages/left-domain/left-domain.component.ts | 11 +++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/app/pages/left-domain/left-domain.component.html b/src/app/pages/left-domain/left-domain.component.html index c5b558b..d0782a8 100644 --- a/src/app/pages/left-domain/left-domain.component.html +++ b/src/app/pages/left-domain/left-domain.component.html @@ -18,7 +18,11 @@ <!-- 基本信息 --> <!-- 加油机 --> <div class="publicBox refueller" *ngIf="beforeFence === 1"> - <div class="interval" *ngFor="let item of FacilityList"> + <div class="interval" *ngFor="let item of FacilityList" (click)="selectFacility(item)"> + <!-- 选中样式 --> + <div class="positionLeftTop" *ngIf="selectFacilityId === item.getID()"></div><div class="positionLeftBottom" *ngIf="selectFacilityId === item.getID()"></div> + <div class="positionRightTop" *ngIf="selectFacilityId === item.getID()"></div><div class="positionRightBottom" *ngIf="selectFacilityId === item.getID()"></div> + <!-- 选中样式 --> <p class="title"><input type="text" class="tableInput" [(ngModel)]="item.getPropertyData().name"></p> <div class="table"> <div class="tableHeader"> @@ -46,7 +50,11 @@ <!-- 加油机 --> <!-- 油罐设备 --> <div class="publicBox refueller oilTank" *ngIf="beforeFence === 2"> - <div class="interval" *ngFor="let item of FacilityList"> + <div class="interval" *ngFor="let item of FacilityList" (click)="selectFacility(item)"> + <!-- 选中样式 --> + <div class="positionLeftTop" *ngIf="selectFacilityId === item.getID()"></div><div class="positionLeftBottom" *ngIf="selectFacilityId === item.getID()"></div> + <div class="positionRightTop" *ngIf="selectFacilityId === item.getID()"></div><div class="positionRightBottom" *ngIf="selectFacilityId === item.getID()"></div> + <!-- 选中样式 --> <p class="title"><input type="text" class="tableInput" [(ngModel)]="item.getPropertyData().name"></p> <div class="table"> <div class="tableHeader"> diff --git a/src/app/pages/left-domain/left-domain.component.scss b/src/app/pages/left-domain/left-domain.component.scss index 6bfca9a..5f39ec6 100644 --- a/src/app/pages/left-domain/left-domain.component.scss +++ b/src/app/pages/left-domain/left-domain.component.scss @@ -47,7 +47,11 @@ .textImage{ margin-bottom: 15px; height: auto; line-height: normal; img{ width: auto; height: 130px; } } } .refueller{ //加油机 - .interval{ margin-top: 10px; } //分隔div + .interval{ margin-top: 10px; position: relative; cursor: pointer; } //分隔div + .positionLeftTop { position: absolute; width: 10px; height: 10px; left: -5px; top: -5px; border-left: 1px solid #fff; border-top: 1px solid #fff; } //左上角 + .positionLeftBottom { position: absolute; width: 10px; height: 10px; left: -5px; bottom: -5px; border-left: 1px solid #fff; border-bottom: 1px solid #fff; } //左下角 + .positionRightTop { position: absolute; width: 10px; height: 10px; right: -5px; top: -5px; border-right: 1px solid #fff; border-top: 1px solid #fff; } //右上角 + .positionRightBottom { position: absolute; width: 10px; height: 10px; right: -5px; bottom: -5px; border-right: 1px solid #fff; border-bottom: 1px solid #fff; } //右下角 .table{ width: 100%; border: 1px solid #91CCFF; diff --git a/src/app/pages/left-domain/left-domain.component.ts b/src/app/pages/left-domain/left-domain.component.ts index 351f80a..e6dd912 100644 --- a/src/app/pages/left-domain/left-domain.component.ts +++ b/src/app/pages/left-domain/left-domain.component.ts @@ -56,6 +56,17 @@ export class LeftDomainComponent implements OnInit { } } + //选中 设备 + selectFacility(item: FacilityInfoUIItem) { + if (this.selectFacilityId != item.getID()) { + this.selectFacilityId = item.getID() + FacilityInfoInSceneWindow.instance.selectFacilityItem(item); + } else { + this.selectFacilityId = null + item.onSelect(false) + } + } + //处理 treeData handleTreeData(list: FacilityInfoUIItem[]) { this.treeData = [] From 0503c77265ecabd501af9ab2fe27860f77084dfd Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 12 Nov 2021 17:15:54 +0800 Subject: [PATCH 28/29] =?UTF-8?q?=E5=BA=94=E6=80=A5=E5=A4=84=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E6=BC=94=E5=87=BA=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/babylon/controller/serve-manager.ts | 13 ++- .../babylon/model/info/mark/mark-plan-info.ts | 2 +- .../babylon/view/mark-window/mark-window.ts | 97 +++++++++++++++++-- 3 files changed, 99 insertions(+), 13 deletions(-) diff --git a/src/app/babylon/controller/serve-manager.ts b/src/app/babylon/controller/serve-manager.ts index dc50523..0ac613a 100644 --- a/src/app/babylon/controller/serve-manager.ts +++ b/src/app/babylon/controller/serve-manager.ts @@ -5,7 +5,7 @@ import { BuildingBasicInfosService } from "src/app/service/babylon/building-basi import { ObjectsService } from "src/app/service/objects.service"; import { InsitutionDataSimple } from "../model/data/institution/institution-data-simple"; import { AllMarkPlanData } from "../model/data/mark/mark-plan-data"; -import { ModeManager } from "./mode-manager"; +import { ModeManager, ModeType } from "./mode-manager"; //服务器通信 export class ServeManager { @@ -95,7 +95,7 @@ export class ServeManager { this.buildingBISrv.getMarkData(institutionID) .subscribe(data => { - ModeManager.log(data); + // ModeManager.log(data); if (onSuccess) { onSuccess(institutionID, JSON.parse((data as any).result)); } @@ -103,7 +103,13 @@ export class ServeManager { if (error instanceof HttpErrorResponse) { if (error.status === 404) { ModeManager.log("没有标绘数据,新建:" + error.error); - onSuccess(institutionID, null); //data 为null ,表示新建 + if (ModeManager.currentMode == ModeType.Edit) { + onSuccess(institutionID, null); //data 为null ,表示新建 + } + else { + PlanComponent.instance.openSnackBar("暂无数据"); + } + } else { if (onError) { @@ -138,6 +144,7 @@ export class ServeManager { } //PlanComponent.instance.openSnackBar("保存标绘信息成功"); // alert("保存标绘信息成功"); + PlanComponent.instance.openSnackBar("保存成功"); //暂时没有失败的回调 onError }) diff --git a/src/app/babylon/model/info/mark/mark-plan-info.ts b/src/app/babylon/model/info/mark/mark-plan-info.ts index 7ef67bf..16e0a6d 100644 --- a/src/app/babylon/model/info/mark/mark-plan-info.ts +++ b/src/app/babylon/model/info/mark/mark-plan-info.ts @@ -83,7 +83,7 @@ export class MarkNodeInfo { } /** - * 获取下一个标绘物的id + * 获取下一个新建标绘物的id(用于新建) */ getNextMarkDataId() { //console.log(this.currentMarkDataIndex, 1); diff --git a/src/app/babylon/view/mark-window/mark-window.ts b/src/app/babylon/view/mark-window/mark-window.ts index 7e7f6ad..5fc0bcb 100644 --- a/src/app/babylon/view/mark-window/mark-window.ts +++ b/src/app/babylon/view/mark-window/mark-window.ts @@ -117,8 +117,8 @@ export class MarkWindow extends UIBase { isShowProperty3d: boolean = true; /** - * 是否显示水源 - */ + * 是否显示水源 + */ isShowWaterSource = false; //#region 生命周期 @@ -145,7 +145,9 @@ export class MarkWindow extends UIBase { this.weatherTool = new WeatherTool(SceneManager.Instance.defaultCamera, SceneManager.Instance.scene); - + SceneManager.Instance.scene.onBeforeRenderObservable.add(() => { + instance.onUpdateShow(); + }) } @@ -623,9 +625,9 @@ export class MarkWindow extends UIBase { } /** - * 改变风向 - * @param temperature - */ + * 改变风向 + * @param temperature + */ changeNature_windDirection(windDirection: WindDirectionType) { if (this.currentMarkNodeInfo == null) { return; @@ -635,9 +637,9 @@ export class MarkWindow extends UIBase { } /** -* 改变风速 -* @param temperature -*/ + * 改变风速 + * @param temperature + */ changeNature_windPower(windPower: number) { if (this.currentMarkNodeInfo == null) { return; @@ -646,7 +648,77 @@ export class MarkWindow extends UIBase { } + /** + * 播放或暂停演出系统 + * @param play false 表示暂停 + */ + playOrPauseShow(play: boolean) { + + + } + + /** + * 调至某一节点 + */ + skipToNode(nodeID: string) { + + } + + + + //#endregion + + + //#region 演出系统 + + + + /** + * 当前演出剩余时间 + */ + currentShowTime: number; + /** + * 当前节点的完整演出时间 + */ + totalShowTime: number; + + + /** + * 是否正在演出 + */ + isPlayingShow: boolean = false; + + + /** + * 播放 + * @param id + */ + playMarkNode(id: number) { + + + + //通知前端 + } + + /** + * 每帧更新 + */ + onUpdateShow() { + + if (this.isPlayingShow) { + if (this.currentShowTime > 0) { + this.currentShowTime -= SceneManager.Instance.scene.deltaTime * 0.001; + + if (this.currentShowTime <= 0) { + let l_currentMarkNodeData: MarkNodeData = this.currentMarkNodeInfo.nodeData; + //播放下一个节点 + this.getNextNode(l_currentMarkNodeData.id); + } + } + } + + } //#endregion @@ -904,6 +976,13 @@ export class MarkWindow extends UIBase { return result; } + /** + * 获取当前方案下,下一个节点,null表示没有了 + */ + getNextNode(id: number) { + let result: MarkNodeInfo = null; + return result; + } //#endregion From 22560acd80d6b611fbd63bd60a9b747ea0c3b3cf Mon Sep 17 00:00:00 2001 From: liuxianghui <519646741@qq.com> Date: Fri, 12 Nov 2021 17:31:10 +0800 Subject: [PATCH 29/29] =?UTF-8?q?=E5=8A=A0=E6=B2=B9=E6=9C=BA=E9=80=89?= =?UTF-8?q?=E4=B8=ADbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facilityinfoinscene-window/facilityinfoinscene-window.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts index 3250cd0..4e715ea 100644 --- a/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts +++ b/src/app/babylon/view/facilityinfoinscene-window/facilityinfoinscene-window.ts @@ -98,6 +98,7 @@ export class FacilityInfoInSceneWindow extends UIBase { { if (this.currentFacility != null) { for (let i = 0; i < this.currentFacility.length; i++) { + console.log("取消选中", facilityInfoUIItem.getName()); this.currentFacility[i].onSelect(false); } this.currentFacility = []; @@ -530,7 +531,8 @@ export class FacilityInfoInSceneWindow extends UIBase { //this.playJYJSelectEffect(true, result); let facilityItem: FacilityInfoUIItem = FacilityInfoInSceneWindow.instance.getFacilityItem(result); console.log("场景中选中设备", facilityItem); //通知前端 - facilityItem.onSelect(true); + this.selectFacilityItem(facilityItem); + // facilityItem.onSelect(true); //FacilityInfoInSceneWindow.instance.selectFacilityItemToThree([facilityItem], true); //console.log(facilityItem.getHeadUIPos()); }