xzw 2 年之前
父节点
当前提交
db83e93ece

+ 21 - 4
src/custom/modules/clipModel/Clip.js

@@ -159,7 +159,7 @@ var Clip = {
                     //为了方便缩放操作,直接使用box中心作为target
                     
                     
-                    let duration = 1000
+                    let duration = e.duration == void 0 ? 1000 : e.duration
                     viewer.scene.view.setView({position,  duration,  target})
                      
                 },
@@ -169,10 +169,27 @@ var Clip = {
                     setTimeout(()=>{
                         let boundingBox = Clip.box.boundingBox.clone().applyMatrix4(Clip.box.matrixWorld)
                         if(mapVisi){//切换地图
-                            if(Clip.switchMapCount == 0 || !Potree.Utils.isInsideFrustum(boundingBox, viewer.mapViewer.camera)){ 
-                                let size = boundingBox.getSize(new THREE.Vector3)
+                         
+                            if(viewer.fpVisiDatasets.length == 0){//不会显示任何一个floorplan图,就要就近移动到一个可见数据集里
+                                let clouds = viewer.scene.pointclouds.filter(e=>e.visible)
+                                if(clouds.length == 0)clouds = viewer.scene.pointclouds
+                                let scores = clouds.map((e,i)=>{
+                                    return [ -viewer.scene.view.position.distanceToSquared(e.bound2) , i]
+                                })    
+                                scores = scores.sort((a,b)=> a[0] - b[0])
+                                let neareast = clouds[scores[0][1]]
+                                viewer.flyToDataset({ pointcloud : neareast, duration:0})
+                            }
+
+                            
+                            if(Clip.switchMapCount == 0 || !Potree.Utils.getPos2d(viewer.scene.view.position, viewer.mapViewer.camera, viewer.mapViewer.renderArea, viewer.mapViewer.viewports[0]).inSight
+                              ||  !Potree.Utils.isInsideFrustum(boundingBox, viewer.mapViewer.camera)){ //要使box框和游标都在屏幕内。因为游标是3d的当前位置,很可能是准备去框住的位置
+                                let bound = boundingBox.clone()
+                                    bound.expandByPoint(viewer.scene.view.position)
+                                let size = bound.getSize(new THREE.Vector3)
+                                let center = bound.getCenter(new THREE.Vector3)
                                 let margin = viewer.mainViewport.resolution.clone().multiplyScalar(0.3) 
-                                viewer.mapViewer.moveTo(Clip.box.position, size, 100, margin)   
+                                viewer.mapViewer.moveTo(center, size, 100, margin)   
                             }
                             Clip.switchMapCount++
                             //关于究竟是focus box还是dataset有点纠结,又或是两个的union。box和数据集可能离得很远,且无法确定当前想选择的数据集,且数据集可能无floorplan, 即使有可能也不展示……

+ 1 - 0
src/custom/modules/siteModel/BuildingBox.js

@@ -157,6 +157,7 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
         if(this.buildType == 'room' || this.buildType == 'hole'){
             this.restrictArea = this.buildParent  //不能超出的区域
         }
+        if(this.buildParent)this.dontDragFloorHeight = this.buildParent.dontDragFloorHeight
         
         if(this.ifDraw){ //只存储空间模型信息,不绘制
             if(this.buildType != 'hole'){

+ 4 - 6
src/custom/modules/siteModel/SiteModel.js

@@ -33,11 +33,8 @@ var SiteModel = {
         if(Potree.settings.editType == 'pano'){
             return
         }
-        
-        
-        
-        
-        //this.createHeightPull();
+          
+        this.createHeightPull();
         
         if(Potree.settings.isTest && ifDrawDatasetBound){
             viewer.addEventListener('allLoaded',()=>{
@@ -771,7 +768,7 @@ var SiteModel = {
         this.selected = entity
         
         
-        if(entity && (entity.buildType == 'floor' || entity.buildType == 'room' )){
+        if(entity && !entity.dontDragFloorHeight && (entity.buildType == 'floor' || entity.buildType == 'room' )){
             this.height_pull_box && (this.height_pull_box.visible = true)
             this.fitPullBox()
         }  
@@ -877,6 +874,7 @@ var SiteModel = {
     
     
     createHeightPull:function(){ //拖拽楼层的bounding box 
+ 
         let boxGeo = new THREE.BoxBufferGeometry( 1, 1, 1/4 )
         let boxMat = new THREE.MeshBasicMaterial({
             color:"#F00", 

+ 1 - 1
src/custom/viewer/ViewerNew.js

@@ -3729,7 +3729,7 @@ export class Viewer extends ViewerBase{
         
             if(this.modules.Clip.editing){
                 position.z = center.z   //剪裁时在中心高度,因为以点云为重点
-                this.modules.Clip.bus.dispatchEvent({type:'flyToPos', position })
+                this.modules.Clip.bus.dispatchEvent({type:'flyToPos', position, duration })
             }else{
                 if(math.closeTo(position, this.images360.position)) return 'posNoChange'