From e78397cc852166314ad0eab66008fb090d798f4a Mon Sep 17 00:00:00 2001
From: 584911253@qq.com <584911253@qq.com>
Date: 星期一, 13 三月 2023 15:05:49 +0800
Subject: [PATCH] 模型裁剪修改

---
 src/views/Tools/LayerTree.vue    |    5 -
 src/views/Synthesis/LeftMenu.vue |  142 ++++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 129 insertions(+), 18 deletions(-)

diff --git a/src/views/Synthesis/LeftMenu.vue b/src/views/Synthesis/LeftMenu.vue
index 24c3923..941fa7e 100644
--- a/src/views/Synthesis/LeftMenu.vue
+++ b/src/views/Synthesis/LeftMenu.vue
@@ -666,7 +666,8 @@
       }, {
         value: '鍏朵粬妯″瀷',
         label: '鍏朵粬妯″瀷'
-      }]
+      }],
+      targetY: 0.0,
     };
   },
   methods: {
@@ -674,8 +675,8 @@
     setChangeTwoMenu(res) {
       var val = res.id[0];
       if (window.model != null) {
-        window.model.deleteObject();
-        window.model = null;
+        // window.model.deleteObject();
+        // window.model = null;
       }
       sgworld.Analysis.clearCurtainContrast();
       if (this.isMenuFlag == "d") {
@@ -1518,18 +1519,39 @@
           //   window.MXModel=null;
           // } else {
           var that = this;
-          window.model = sgworld.Creator.create3DTilesets(
-            "",
-            modelUrl + "/tileset/m/SN/tileset.json",
-            {},
-            {},
-            "0",
-            true,
-            (data) => {
-              sgworld.Navigate.flyToObj(data);
-              that.setclippingModel();
-            }
-          );
+          if (window.model){
+            that.modelClipping();
+          }else {
+            var tileset = Viewer.scene.primitives.add(
+                new Cesium.Cesium3DTileset({
+                  name: res.cnName,
+                  url: modelUrl+ "/tileset/m/SN/tileset.json",
+                  maximumScreenSpaceError: 64, // 鏈�澶у睆骞曠┖闂撮敊璇細16
+                  maximumMemoryUsage: 768, // 鏈�澶у唴瀛橈細512
+                  dynamicScreenSpaceError: true, // 鍑忓皯绂荤浉鏈鸿緝杩滅殑灞忓箷绌洪棿閿欒锛歠alse
+                  skipLevelOfDetail: true, // 鍦ㄩ亶鍘嗘椂鍊欒烦杩囪鎯咃細false
+                })
+            );
+            tileset.readyPromise.then((tileset) => {
+              tileset.id = res.cnName;
+              tileset.layerId = res.id;
+              Viewer.flyTo(tileset);
+              that.modelClipping();
+            });
+            window.model = tileset
+          }
+          // window.model = sgworld.Creator.create3DTilesets(
+          //   "",
+          //   modelUrl + "/tileset/m/SN/tileset.json",
+          //   {},
+          //   {},
+          //   "0",
+          //   true,
+          //   (data) => {
+          //     sgworld.Navigate.flyToObj(data);
+          //     that.setclippingModel();
+          //   }
+          // );
 
           break;
         case "d9": //绠¢亾鍒嗘瀽
@@ -1689,6 +1711,96 @@
           break;
       }
     },
+
+    //妯″瀷瑁佸垏
+    modelClipping() {
+      const scene = Viewer.scene;
+      let targetY = 0.0;
+      let planeEntities = [];
+      let selectedPlane;
+      let clippingPlanes = new Cesium.ClippingPlaneCollection({
+        planes: [ // ClippingPlane瀵硅薄鏁扮粍闆嗗悎
+          new Cesium.ClippingPlane( // 瑁佸垏闈�
+              new Cesium.Cartesian3(0.0, 0.0, -1.0), // 娉曠嚎鏂瑰悜
+              0.0 // 鍘熺偣鍒板钩闈㈢殑鏈�鐭窛绂伙紝璁剧疆0灏卞ソ
+          ),
+        ],
+        edgeWidth: 1.0, // 妯″瀷琚鍒囬儴鍒嗙殑鎴潰绾垮
+      });
+      let boundingSphere = window.model.boundingSphere;
+      // 鍒涘缓娣诲姞瑁佸壀骞抽潰
+      for (let i = 0; i < clippingPlanes.length; ++i) {
+        const plane = clippingPlanes.get(i);
+        const planeEntity = Viewer.entities.add({
+          position: boundingSphere.center,
+          plane: {
+            dimensions: new Cesium.Cartesian2(
+                boundingSphere.radius * 1.5,
+                boundingSphere.radius * 1.5
+            ),
+            material: Cesium.Color.WHITE.withAlpha(0.1),
+            plane: new Cesium.CallbackProperty(
+                // 娣诲姞缁戝畾浜嬩欢锛屼笉鏂皟鐢�
+                createPlaneUpdateFunction(plane),
+                false
+            ),
+            outline: true,
+            outlineColor: Cesium.Color.WHITE,
+          },
+        });
+        planeEntities.push(planeEntity);
+      }
+      window.model.clippingPlanes = clippingPlanes;
+
+      // Select plane when mouse down
+      // 缁戝畾涓婄Щ鍔ㄤ簨浠�
+      const downHandler = new Cesium.ScreenSpaceEventHandler(
+          Viewer.scene.canvas
+      );
+      downHandler.setInputAction(function (movement) {
+        const pickedObject = scene.pick(movement.position);
+        if (
+            Cesium.defined(pickedObject) &&
+            Cesium.defined(pickedObject.id.plane)
+        ) {
+          selectedPlane = pickedObject.id.plane;
+          selectedPlane.material = Cesium.Color.WHITE.withAlpha(0.05);
+          selectedPlane.outlineColor = Cesium.Color.WHITE;
+          scene.screenSpaceCameraController.enableInputs = false;
+        }
+      }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
+
+      // Release plane on mouse up
+      // 缁戝畾涓嬬Щ鍔ㄤ簨浠�
+      const upHandler = new Cesium.ScreenSpaceEventHandler(
+          Viewer.scene.canvas
+      );
+      upHandler.setInputAction(function () {
+        if (Cesium.defined(selectedPlane)) {
+          selectedPlane.material = Cesium.Color.WHITE.withAlpha(0.1);
+          selectedPlane.outlineColor = Cesium.Color.WHITE;
+          selectedPlane = undefined;
+        }
+        scene.screenSpaceCameraController.enableInputs = true;
+      }, Cesium.ScreenSpaceEventType.LEFT_UP);
+      // Update plane on mouse move
+      const moveHandler = new Cesium.ScreenSpaceEventHandler(
+          Viewer.scene.canvas
+      );
+      moveHandler.setInputAction(function (movement) {
+        if (Cesium.defined(selectedPlane)) {
+          const deltaY = movement.startPosition.y - movement.endPosition.y;
+          targetY += deltaY;
+        }
+      }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+      function createPlaneUpdateFunction(plane) {
+        return function () {
+          plane.distance = targetY;
+          return plane;
+        };
+      }
+    },
+
     //鍏抽棴绠¢亾淇℃伅寮圭獥
     closePipelinePop(){
       this.$refs &&
diff --git a/src/views/Tools/LayerTree.vue b/src/views/Tools/LayerTree.vue
index 04456b5..3aa0188 100644
--- a/src/views/Tools/LayerTree.vue
+++ b/src/views/Tools/LayerTree.vue
@@ -564,7 +564,7 @@
           for (var i in Viewer.scene.primitives._primitives) {
             Viewer.scene.primitives._primitives[i].show = checked;
             if (Viewer.scene.primitives._primitives[i].id == data.cnName) {
-              std.push(res.id);
+              // std.push(res.id);
               Viewer.flyTo(Viewer.scene.primitives._primitives[i]);
             }
           }
@@ -669,7 +669,6 @@
         });
         window.map.addLayer(vectorLayer);
       } else if (res.serveType == "Tileset") {
-
         var tileset = Viewer.scene.primitives.add(
           new Cesium.Cesium3DTileset({
             name: res.cnName,
@@ -680,13 +679,13 @@
             skipLevelOfDetail: true, // 鍦ㄩ亶鍘嗘椂鍊欒烦杩囪鎯咃細false
           })
         );
-
         tileset.readyPromise.then((tileset) => {
           tileset.id = res.cnName;
           tileset.layerId = res.id;
           this.tileSet(tileset, parseFloat(res.elev))
           Viewer.flyTo(tileset);
         });
+        window.model = tileset
       }
     },
 

--
Gitblit v1.9.3