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
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
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());
         }