xzw 1 年之前
父节点
当前提交
8bf83a7330
共有 5 个文件被更改,包括 110 次插入676 次删除
  1. 90 286
      src/custom/modules/clipModel/Clip.js
  2. 0 376
      src/custom/modules/clipping/Clipping.js
  3. 4 3
      src/custom/viewer/ViewerNew.js
  4. 3 1
      src/utils/Volume.js
  5. 13 10
      src/utils/VolumeNew.js

+ 90 - 286
src/custom/modules/clipModel/Clip.js

@@ -11,23 +11,79 @@ const defaultBoxWidth = 16;  //navvis:  10
    
 var Clip = {
     bus : new THREE.EventDispatcher,
-    selectedDatasets : [],    
-    changeCallback(force){ 
-        viewer.controls.setTarget(this.box.position)//绕其旋转
+         
+    
+
+    init(){
+        let {pos,scale,rotation} = this.getBoxPose()
+        this.box = new BoxVolume({
+            clip:true , lineMat: new THREE.LineDashedMaterial({
+                dashSize:0.1,
+                gapSize:0.1,
+                color:"#fff",
+                transparent:true,
+                opacity:0.5, 
+            })
+        }) 
+         
+        this.box.clipTask = ClipTask['SHOW_INSIDE_Big' ]
+        this.box.showBox = true
+        this.box.name = "ClipBox"; 
+        this.box.position.copy(pos)
+        this.box.scale.copy(scale)
+        this.box.rotation.copy(rotation) 
+        viewer.scene.addVolume(this.box);
+         
         
-        if(Potree.settings.isOfficial){
-            let fun = ()=>{ 
-                let pointclouds = this.getIntersectPointcloud() 
-                if( Common.getDifferenceSet(pointclouds,this.selectedDatasets).length){  
-                    this.selectedDatasets = pointclouds 
-                    //console.error('clipSelectedDatasets',selectedDatasets)
-                    this.bus.dispatchEvent({type:'updateSelectedDatasets', selectedDatasets:pointclouds.map(e=>e.dataset_id) })
-                    
-                } 
+        
+        viewer.addEventListener('addBaseLine',(e)=>{
+            let data = this.getBoxData()
+            if(!data.rotByUser){
+                data.rotAngle = this.getRotByBaseLine(e.measure)
+                this.box.rotation.setZ(data.rotAngle)
+            }
+        })
+        
+        viewer.addEventListener('removeBaseLine',(e)=>{
+            let data = this.getBoxData()
+            if(!data.rotByUser){
+                data.rotAngle = 0
+                this.box.rotation.setZ(0)
             }
-            if(force)fun()        
-            else Common.intervalTool.isWaiting('clipSelectedDatasets', fun ,  300)  
-        }  
+        })
+    },
+
+
+    getBoxPose(){
+        //box底部不变,永远在bound的底部。但top会根据height改变
+        let boxData = this.getBoxData()
+        let bound = viewer.bound.boundingBox.clone();
+        let scale = viewer.bound.boundSize.clone().setZ(boxData.height)
+        let pos = viewer.bound.center.clone().setZ(bound.min.z + boxData.height/2)
+        let rotation = new THREE.Euler(0,0,boxData.rotAngle)
+        scale.setX(scale.x*boxData.scaleXY).setY(scale.y*boxData.scaleXY)
+        
+        return {pos,scale,rotation}
+    },
+
+    //暂定为在手动设置旋转之前 , 如果有基准线,使用基准线的旋转角。 
+    getDefaultData(){  
+        this.boxData = {
+            height : 1, scaleXY:1,  //水平缩放比率。1代表和bound相同
+            rotAngle:this.getRotByBaseLine(),  rotByUser: false
+        } 
+    },
+    
+    getRotByBaseLine(baseLine){
+        baseLine = baseLine || viewer.scene.measurements.find(e=>e.isBaseLine && e.points.length == 2)  //使基准线在俯视图中水平
+        
+        let yaw = baseLine ? new THREE.Vector2().subVectors(baseLine.points[0], baseLine.points[1]).angle() : 0 
+        return yaw   
+    },
+    
+    getBoxData(){
+        this.boxData || this.getDefaultData()
+        return this.boxData
     },
 
     enter:function(){
@@ -39,100 +95,21 @@ var Clip = {
             ifShowMarker : Potree.settings.ifShowMarker,
             
 		} 
-
-        let pointcloud = this.getPointcloud() 
-        let bound = pointcloud.bound //只选取其中一个数据集的bound,而非整体,是因为担心两个数据集中间有空隙,于是刚好落在没有点云的地方。
-        let boundSize = bound.getSize(new THREE.Vector3())
-        let target = this.getTarget(bound.getCenter(new THREE.Vector3())); //navvis的位置xy是用相机位置 this.ViewService.mainView.getCamera().position  我觉得也可以用第一个漫游点的,或者最接近bound中心的漫游点
-        let scale = new THREE.Vector3(defaultBoxWidth,defaultBoxWidth, boundSize.z)//z和navvis一样
-        
-        let eyeDir = viewer.scene.view.direction.clone().setZ(0/* -boundSize.z/3 */).multiplyScalar(-defaultBoxWidth)  //为了使所在楼层不变,不修改z
-
-        //let eyeDir = scale.clone().setZ(boundSize.z/3).multiplyScalar(1.3) 
-        let position = new THREE.Vector3().addVectors(target, eyeDir)
-        
+ 
+        this.box.visible = true
+       
         Potree.settings.displayMode = 'showPointCloud'
-        viewer.setView({
+        /* viewer.setView({
             position ,
             target,
             duration:300,
             callback:function(){ 
             }
-        })
+        }) */
         //viewer.setControls(viewer.orbitControls);
         viewer.setLimitFar(false) 
-        //viewer.setClipState(false) //暂时关闭旧的clipping
-        
-        
-        {
-            this.box = new BoxVolume({
-                clip:true 
-            }) 
-            this.box.clipTask = ClipTask['SHOW_INSIDE_Big'  /* "SHOW_INSIDE" */]
-            this.box.showBox = false
-            this.box.name = "ClipBox"; 
-            this.box.position.copy(target)
-            this.box.scale.copy(scale)
-            //带动mapBox
-            this.box.addEventListener('position_changed',e=>{
-                this.mapBox.center.setX(this.box.position.x)
-                this.mapBox.center.setY(this.box.position.y)
-                this.mapBox.updatePoints() 
-                this.changeCallback()
-            })
-            this.box.addEventListener('scale_changed',e=>{
-                var scale = this.box.scale 
-                this.mapBox.updatePoints(scale)
-                this.changeCallback()
-            })
-            this.box.addEventListener('orientation_changed',e=>{
-                this.mapBox.angle = this.box.rotation.z
-                this.mapBox.rotateBar.rotation.z = this.mapBox.angle
-                this.mapBox.updatePoints()
-                this.changeCallback()
-            })
-            viewer.scene.addVolume(this.box);
-            
-        }
-        
-        {//map
-            let boxRotateBack = ()=>{//不知道是不是这么写。 因为可能z的旋转不一定都在z 
-                this.box.rotation.x = 0;
-                this.box.rotation.y = 0;
-            }
-            this.mapBox = new mapClipBox(target, scale)
-            viewer.mapViewer.scene.add(this.mapBox)
-            //带动box
-            this.mapBox.addEventListener('repos',e=>{
-                this.box.position.setX(this.mapBox.center.x)
-                this.box.position.setY(this.mapBox.center.y)
-                boxRotateBack()
-                this.changeCallback()
-            })
-            this.mapBox.addEventListener('dragChange',e=>{
-                var scale = this.mapBox.getScale() 
-                this.box.scale.setX(scale.x)
-                this.box.scale.setY(scale.y)
-                this.box.position.setX(this.mapBox.center.x)
-                this.box.position.setY(this.mapBox.center.y)
-                boxRotateBack()
-                this.changeCallback()
-            })
-            this.mapBox.addEventListener('rotate',e=>{ 
-                this.box.rotation.z = this.mapBox.angle 
-                boxRotateBack()
-                this.changeCallback()
-            })
-        }
-        
-        
-        
-        
-        {
-            //viewer.setClipTask(ClipTask["SHOW_INSIDE"])
-             
-        }
-        
+          
+        /* 
         Potree.settings.unableNavigate = true
         Potree.settings.ifShowMarker = false
         Potree.Utils.updateVisible(viewer.measuringTool.scene, 'clipModel', false)   
@@ -140,10 +117,9 @@ var Clip = {
         viewer.inputHandler.toggleSelection(this.box);
         viewer.inputHandler.fixSelection = true
         viewer.transformationTool.frame.material.color.set(Potree.config.clip.color)//navvis 15899953 
-        viewer.setPointStandardMat(true) 
+        viewer.setPointStandardMat(true)  */
         
-        { 
-            let mapVisi = false
+        {  
             this.events = {
                 flyToPos : (e)=>{ 
                     let dis = 2
@@ -164,59 +140,18 @@ var Clip = {
                     viewer.scene.view.setView({position,  duration,  target})
                      
                 },
-                mapVisiChange(e){
-                    mapVisi = e.visible
-                    let delay =  100  //因resize了camera需要时间更新projectionMatrix
-                    setTimeout(()=>{
-                        let boundingBox = Clip.box.boundingBox.clone().applyMatrix4(Clip.box.matrixWorld)
-                        if(mapVisi){//切换地图
-                         
-                            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(center, size, 100, margin)   
-                            }
-                            Clip.switchMapCount++
-                            //关于究竟是focus box还是dataset有点纠结,又或是两个的union。box和数据集可能离得很远,且无法确定当前想选择的数据集,且数据集可能无floorplan, 即使有可能也不展示……
-                        }else{//切换3d
-                            if(!Potree.Utils.isInsideFrustum(boundingBox, viewer.scene.getActiveCamera())){//屏幕上没有box的话
-                                viewer.focusOnObject({boundingBox}, 'boundingBox', 100  )
-                            }
-                        }      
-                    },delay) 
-                     
-                }
+                 
             }
-            this.switchMapCount = 0
-            this.bus.addEventListener('flyToPos',this.events.flyToPos) 
-            viewer.mapViewer.addEventListener('forceVisible',this.events.mapVisiChange) 
+       
+            //this.bus.addEventListener('flyToPos',this.events.flyToPos)  
         }
         this.editing = true
-        
-        setTimeout(()=>{this.changeCallback(true)},1)
+         
     },
     
-    leave:function(){
-        viewer.inputHandler.fixSelection = false
-        viewer.scene.removeVolume(this.box);
+    leave:function(){ 
+        this.box.visible = false
         
-        this.mapBox.dispose()
         //viewer.setControls(viewer.fpControls);
         
         Potree.settings.unableNavigate = false
@@ -228,31 +163,13 @@ var Clip = {
         viewer.setPointStandardMat(false) 
         //viewer.setClipState(true)
         viewer.controls.setTarget(null)
-        {
-            this.bus.removeEventListener('flyToPos',this.events.flyToPos) 
-            viewer.mapViewer.removeEventListener('forceVisible',this.events.mapVisiChange) 
-            
-            this.events = null 
-        }
+         
         this.editing = false
     },
     
 
 
-    getPointcloud:function(){ //找一个离当前最近的点云,且最好有漫游点
-        let pointclouds = viewer.scene.pointclouds.filter(e=>e.panos.length>0)
-        if(pointclouds.length == 0)pointclouds = viewer.scene.pointclouds;
-
-
-        let result = Common.sortByScore(pointclouds,[],[e=>{
-            let center = e.bound.getCenter(new THREE.Vector3)
-            let size = e.bound.getSize(new THREE.Vector3).length() / 2 
-            let posToCenter = viewer.images360.position.distanceTo(center)
-            return size / posToCenter 
-        }])
-        
-        return result[0].item
-    },
+     
     
 
     getTarget:function(boundCenter){//box位置。要找一个有点云的地方。方案1相机位置, 方案2接近相机的漫游点, 方案3接近中心的漫游点。选择方案2,因最大概率有点云
@@ -268,119 +185,9 @@ var Clip = {
         
         return target
     },
-    /* switchMap:function(state){
-        
-        
-    }, */
-    
-    download:function( ){
-        
-        if(this.getIntersectPointcloud().length == 0){
-            return null
-        }
-        
-        
-        var visiPointclouds = viewer.scene.pointclouds.filter(e=> Potree.Utils.getObjVisiByReason(e, 'datasetSelection'))
-        let data = {   
-            transformation_matrix: visiPointclouds.map((cloud)=>{
-                let data = {
-                    id: cloud.dataset_id, 
-                    matrix : this.getTransformationMatrix(cloud).elements, //剪裁大框
-                    VisiMatrixes: cloud.material.clipBoxes_in.map(e=>this.getTransformationMatrix(cloud, e.inverse).elements), //若干个可见型小框(虽然现在用不到了,因为普通界面不展示这些剪裁区域)
-                    UnVisiMatrixes: cloud.material.clipBoxes_out.map(e=>this.getTransformationMatrix(cloud, e.inverse).elements), //若干个不可见型小框
-                    modelMatrix:(new THREE.Matrix4).copy(cloud.transformMatrix).transpose().elements
-                }  
-                return data
-            }) ,
-            aabb: "b-0.5 -0.5 -0.5 0.5 0.5 0.5" //剪裁空间( 所有点在乘上这个矩阵后, 还能落在 1 * 1 * 1的box内的点就是所裁剪的
-           
-        }
-        
-        return data
-        //https://testlaser.4dkankan.com/indoor/t-ia44BhY/api/pointcloud/crop
-    },
-    
-    
-    
-    downloadNoCrop(){//不剪裁  下载整个点云
-        
-        var visiPointclouds = viewer.scene.pointclouds.filter(e=> Potree.Utils.getObjVisiByReason(e, 'datasetSelection'))
-        let data = {   
-            transformation_matrix: visiPointclouds.map((cloud)=>{
-                let data = {
-                    id: cloud.dataset_id, 
-                    matrix : new THREE.Matrix4().elements, //固定值
-                    modelMatrix:(new THREE.Matrix4).copy(cloud.transformMatrix).transpose().elements
-                }  
-                return data
-            }) ,
-            aabb: "b-12742000 -12742000 -12742000 12742000 12742000 12742000" //固定剪裁空间 
-           
-        }
-        console.log(data)
-        return data
-         
-        
-        
-    },
-    
-    
-    getTransformationMatrix:function(pointcloud, invMatrix) {//剪裁矩阵
-        var invMatrix = invMatrix || this.box.matrixWorld.clone().invert()
-        return (new THREE.Matrix4).multiplyMatrices(invMatrix, pointcloud.transformMatrix).transpose()
-    },
-
-
-    /* getIntersectPointcloud(){ 
-        var boxBound = new THREE.Box3(
-            new THREE.Vector3(-0.5,-0.5,-0.5), new THREE.Vector3(0.5,0.5,0.5),
-        ).applyMatrix4(this.box.matrixWorld)    //large boundingbox
-         
-        let boxMatrixInverse = new THREE.Matrix4().copy(this.box.matrixWorld).invert();
-
-        let boxPoints = [
-            new THREE.Vector3(boxBound.min.x, boxBound.min.y,0),
-            new THREE.Vector3(boxBound.max.x, boxBound.min.y,0),
-            new THREE.Vector3(boxBound.max.x, boxBound.max.y,0),
-            new THREE.Vector3(boxBound.min.x, boxBound.max.y,0)
-        ]
-
-        var intersect = (pointcloud)=>{
-        
-            if(!pointcloud.bound.intersectsBox(boxBound))return false
-            //判断box和点云的tight bound是否相交(因为box可以任意旋转,且实在找不到三维中的立方体相交的函数,所以直接用boxBound) 
-            var points = pointcloud.getUnrotBoundPoint('all') 
-            let rings = math.getPolygonsMixedRings([points.slice(0,4), boxPoints] , true) 
-            //console.log(pointcloud.dataset_id, pointcloud.name, rings.length) 
-            if(rings.length > 1 )return false
-
-            {//再用frustum和数据集的sphere相交试试,能排除一些错误
-                let a = Potree.Utils.isIntersectBox(points,  this.box.matrixWorld) 
-                if(!a){
-                    console.log('没能经过isInsideBox测试')
-                }
-                return a
-            }
-            return true 
-            
-        } 
-
-        return viewer.scene.pointclouds.filter(e=>intersect(e)) 
-         
-
-    }  */ 
-    
-    
-    getIntersectPointcloud(){ 
-          
-        var intersect = (pointcloud)=>{
-            if(pointcloud.intersectBox(this.box.matrixWorld))return true   
-        } 
-
-        return viewer.scene.pointclouds.filter(e=>intersect(e))  
-    } 
     
    
+   
     
 }
 
@@ -388,7 +195,4 @@ var Clip = {
 
 export {Clip} 
 
-
-/* 
-裁剪点云时,2D界面显示全部平面图,按楼层切换显示。 
- */
+ 

+ 0 - 376
src/custom/modules/clipping/Clipping.js

@@ -1,376 +0,0 @@
-
-
-
-
-import * as THREE from "../../../../libs/three.js/build/three.module.js";
- 
-import math from "../../utils/math.js"
-import Common from '../../utils/Common.js'
-import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
-import {ExtendView} from "../../../viewer/ExtendView.js";
-import Viewport from "../../viewer/Viewport.js";
-import Sprite from "../../objects/Sprite.js";
-import {transitions, easing, lerp} from '../../utils/transitions.js'
-import {TransformControls} from "../../objects/tool/TransformControls.js";
-import SplitScreen from "../../utils/SplitScreen.js"
-//import History from "../../utils/History.js"
-
-const cameraProps = [ 
-    { 
-        name : 'top',    
-        axis:["x","y"],  
-        direction : new THREE.Vector3(0,0,-1), //镜头朝向
-        openCount:0,
-    } 
-]   
-
-
-
-export class Clipping extends THREE.EventDispatcher{ //实时剪裁
-    
-    constructor(){
-        super()
-        this.views = {}
-        this.cameras = {}
-        this.orthoCamera = new THREE.OrthographicCamera(-100, 100, 100, 100, 0.01, 10000)
-        this.orthoCamera.up.set(0,0,1)
-        
-    }
-    
-    init(){
-        if(this.inited)return
-        this.initViews()
-        this.inited = true
-        this.prepareRecord = true
-        this.activeViewName = 'mainView'
-         
-        this.events = {
-            transfromCallback:(e)=>{//拖拽变化时
-                this.adjustCamHeight()
-                //检测漫游点、回退等
-                /* if(this.prepareRecord){
-                    let box = viewer.transformationTool.selection[0]
-                    this.history.writeIn({box, matrix:box.matrix.clone()})
-                    this.prepareRecord = false
-                } */
-            },
-            /* onTransfromEnd:(e)=>{//拖拽结束、松开
-                this.prepareRecord = true
-            }, */ 
-            selectCallback:(e)=>{
-                this.adjustCamHeight()
-                 
-                let unableNavigate = this.activeViewName != 'mainView' ||  e.selection.length > 0
-                if(Potree.settings.unableNavigate && !unableNavigate){
-                    setTimeout(()=>{
-                        Potree.settings.unableNavigate = this.activeViewName != 'mainView' ||  e.selection.length > 0
-                    },300)//延迟是因为点击时取消选择后可能立即就会触发flyToPano。 而且有的人喜欢点两下
-                }else Potree.settings.unableNavigate = unableNavigate
-                
-                             
-            },
-            onkeydown:(e)=>{ 
-                if(e.keyCode == 8 || e.keyCode == 46){// Backspace or Delete
-                    viewer.inputHandler.selection[0] && viewer.scene.removeVolume(viewer.inputHandler.selection[0]); 
-                } 
-            }  
-             
-        }
-        
-        /* this.history = new History({ //也可以写到全局,但需要加个判断物品是否存在的函数
-            applyData: (data)=>{  
-                if(viewer.scene.volumes.includes(data.box)){
-                    data.matrix.decompose( data.box.position, data.box.quaternion, data.box.scale );
-                }else{
-                    this.history.undo()//找不到就回退下一个。(直接写这?)
-                }
-            } 
-        }) */
-    }
-    initViews(){
-        
-        this.splitScreenTool = new SplitScreen
-        
-         
-        
-        for(let i=0;i<1;i++){
-            let prop = cameraProps[i];
-            let view = new ExtendView()  
-            this.views[prop.name] = view 
-            this.cameras[prop.name] = this.orthoCamera
-             
-            view.direction = prop.direction
-        }
-        this.views.mainView = viewer.mainViewport.view
-        this.cameras.mainView = viewer.mainViewport.camera
-         
-        
-    } 
-    
-    switchView(name){//替换view和camera到mainViewport
-        if(this.activeViewName == name)return
-    
-        let view = this.views[name]
-        let camera = this.cameras[name]
-        let prop = cameraProps.find(e=>e.name == name)
-         
-        let {boundSize, center, boundingBox} = viewer.bound
-        this.lastViewName = this.activeViewName
-        this.activeViewName = name 
-        let lastView = this.views[this.lastViewName]
-        let lastCamera = this.cameras[this.lastViewName]
-        viewer.mainViewport.view = view
-        viewer.mainViewport.camera = camera 
-        if(lastCamera)lastView.zoom = lastCamera.zoom
-         
-        
-        
-        /* if(lastView){//2d->3d 
-            view.copy(lastView)
-        } */
-        if(name == 'mainView'){ 
-            Potree.settings.unableNavigate = false
-            /* viewer.transformationTool.handles['scale.z+'].node.visible = true
-            viewer.transformationTool.handles['scale.z-'].node.visible = true */
-        }else{
-            Potree.settings.unableNavigate = true
-            /* viewer.transformationTool.handles['scale.z+'].node.visible = false
-            viewer.transformationTool.handles['scale.z-'].node.visible = false */
-            if(prop.openCount == 0){//至多执行一次
-                //this.viewportFitBound(name,  boundSize, center)
-                this.orthoMoveFit(center, {bound:boundingBox},  0)
-                this.camHeightOutOfModel = view.position.z  //记录下此刻相机高度。
-            } 
-            prop.openCount++
-            
-            this.adjustCamHeight()
-            
-            /* this.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), center )  
-            this.targetPlane.projectPoint(view.position, this.shiftTarget )  //target转换到过模型中心的平面,以保证镜头一定在模型外
-            view.position.copy(this.splitScreenTool.getPosOutOfModel(viewer.mainViewport)) */
-            
-            if(view.zoom)camera.zoom = view.zoom//恢复上次的zoom
-            
-            
-        }
-        viewer.updateScreenSize({forceUpdateSize:true})//更新camera aspect  left等
-        if(viewer.inputHandler.selection.length){
-            this.focusOnObject(viewer.inputHandler.selection[0])
-        }
-             
-    }
-    
-    
-    
-    focusOnObject(box, duration=0){
-        if(this.activeViewName == 'mainView'){
-            viewer.focusOnObject({boundingBox:box.boundingBox.clone().applyMatrix4(box.matrixWorld)}, 'boundingBox', duration)
-        }else{
-            this.orthoMoveFit(box.position, {bound:box.boundingBox.clone().applyMatrix4(box.matrixWorld)},  duration) 
-        }
-        this.adjustCamHeight()
-    }
-    
-    orthoMoveFit(pos, info, duration){  
-        var margin = {x:viewer.mainViewport.resolution.x*0.4, y:viewer.mainViewport.resolution.y*0.4}      
-        this.splitScreenTool.viewportFitBound(viewer.mainViewport,  info.bound,  pos, duration, margin ) 
-    }
-    
-    adjustCamHeight(){
-        if(this.activeViewName != 'top')return
-        let view = this.views.top
-        let height 
-        
-        if(viewer.inputHandler.selection.length){ //相机高度位于选中的box的顶部
-            let box = viewer.inputHandler.selection[0]
-            height = box.boundingBox.clone().applyMatrix4(box.matrixWorld).max.z;
-            
-        }else{
-            height = this.camHeightOutOfModel   //显示全部点云
-        }
-        view.position.z = height
-        //console.log('adjustCamHeight',height)
-        
-        //缺点:1 会导致缩放很小的时候,transformationTool的轴因放大到了相机背面。(只有scale轴做了处理)
-        //2 无法直接切换 看不到的box,但可以先取消选择
-        //3 但是俯视图中无法切换到被上层盖住的box(不过把俯视图作为辅助,只针对单个box调动的话,问题不大)
-    }
-    
-    enter(){
-        this.init()
-        viewer.transformationTool.setModeEnable(['translation']) 
-        //viewer.transformationTool.handles['rotation.x'].node.visible = false
-        viewer.transformationTool.frame.material.visible = false //不盖住boxVolume的frame
-        this.targetPlane = viewer.mainViewport.targetPlane = new THREE.Plane()
-        this.shiftTarget = viewer.mainViewport.shiftTarget = new THREE.Vector3 //project在targetPlane上的位置  
-
-        this.getAllBoxes().forEach(box=>{
-            Potree.Utils.updateVisible(box,'hidden',true)  //显现
-        })
-        
-        viewer.transformationTool.history.clear()
-        
-        viewer.transformationTool.addEventListener('transformed', this.events.transfromCallback)
-        //viewer.transformationTool.addEventListener('stopDrag', this.events.onTransfromEnd)
-        viewer.inputHandler.addEventListener('selection_changed', this.events.selectCallback) 
-        viewer.inputHandler.addEventListener('keydown', this.events.onkeydown)
-          
-         
-        this.setPointLevelAuto()
-        var initialPointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == Potree.settings.originDatasetId)
-        //隐藏 初始数据集以外的数据集 
-        viewer.scene.pointclouds.forEach(e=>{
-            if(e.dataset_id!=Potree.settings.originDatasetId){
-                Potree.Utils.updateVisible(e,'enterClipping',false) 
-                //Potree.settings.floorplanEnables[e.dataset_id] = false 
-                e.panos.forEach(pano=>pano.setEnable(false)) //禁止漫游
-                    
-            }else{
-                Potree.Utils.updateVisible(e,'enterClipping',true, 1, 'add')
-                //Potree.settings.floorplanEnables[e.dataset_id] = true 
-            }
-        })
-        
-        viewer.flyToDataset({ pointcloud : initialPointcloud, duration:0})
-         
-    }
-    
-    
-    leave(){
-         
-        viewer.transformationTool.setModeEnable(['scale', 'translation', 'rotation'] )
-         
-        viewer.transformationTool.frame.material.visible = true //恢复
-        this.switchView(  'mainView'  ) 
-        
-        
-        this.getAllBoxes().forEach(box=>{
-            Potree.Utils.updateVisible(box,'hidden',false)//隐身
-        })
-        viewer.transformationTool.removeEventListener('transformed', this.events.transfromCallback)
-        //viewer.transformationTool.removeEventListener('stopDrag', this.events.onTransfromEnd)
-        viewer.inputHandler.removeEventListener('selection_changed', this.events.selectCallback)
-        //viewer.inputHandler.removeEventListener('keydown', this.events.onkeydown)
-        viewer.transformObject(null)
-        viewer.transformationTool.history.clear()
-        
-        //恢复 初始数据集以外的数据集 
-        viewer.scene.pointclouds.forEach(e=>{
-            if(e.dataset_id!=Potree.settings.originDatasetId){
-                Potree.Utils.updateVisible(e,'enterClipping',true) 
-                e.panos.forEach(pano=>pano.setEnable(true))
-            }else{
-                Potree.Utils.updateVisible(e,'enterClipping',false, 0, 'cancel')
-            }
-        }) 
-        
-    }
-    
-    setTranMode(mode){//rotate or translate 
-        this.tranMode = mode 
-        
-        viewer.transformationTool.setModeEnable([mode])
-       
-    }
-    
-    
-    //问:是否要显示其他数据集
-    setPointLevelAuto(){
-        /* 
-        
-        let visiCount = viewer.images360.panos.length
-        let maxCount = 200, minCount = 20,  minPer = 0.7, maxPer = 1
-        let percent = maxPer - ( maxPer - minPer) * THREE.Math.clamp((visiCount - minCount)  / (maxCount - minCount),0,1)  
-         
-        Potree.settings.UserDensityPercent = percent        ---还是不限制了,尤其是平面图希望更细致点,毕竟剪裁主要要看清剪裁的部位。
-        
-         */
-        
-        viewer.setPointBudget(5*1000*1000);     //给个中等到高等之间的质量
-        Potree.settings.sizeFitToLevel = true 
-        viewer.setPointLevels()
-             
-    }
-    
-    
-    
-    
-    
-    
-    
-    getAllBoxes(){
-        return viewer.scene.volumes.filter(v=>v.clip && v instanceof Potree.BoxVolume  ) 
-    }
-     
-    
-    getCalcData(){//给后台矩阵数据,以裁剪点云。
-        let Clip = viewer.modules.Clip //裁剪下载模块 
-        
-        let data = {   
-            transformation_matrix: viewer.scene.pointclouds.filter(p=>p.dataset_id == Potree.settings.originDatasetId).map((cloud)=>{
-                let data = {
-                    id: cloud.dataset_id, 
-                    matrix : new THREE.Matrix4().elements,  //参照downloadNoCrop,给默认值,表示没有最外层裁剪
-                    VisiMatrixes: cloud.material.clipBoxes_in.filter(e=>!e.box.isNew).map(e=>Clip.getTransformationMatrix(cloud, e.inverse).elements), 
-                    UnVisiMatrixes: cloud.material.clipBoxes_out.filter(e=>!e.box.isNew).map(e=>Clip.getTransformationMatrix(cloud, e.inverse).elements),
-                    modelMatrix:(new THREE.Matrix4).copy(cloud.transformMatrix).transpose().elements
-                }  
-                return data
-            }) ,
-            aabb: "b-12742000 -12742000 -12742000 12742000 12742000 12742000" //剪裁空间 
-           
-        }
-        
-        return data
-    } 
-    
-    
-    
-    saveClipData(){//输出所有的clip volumeBox
-        let oldState = !viewer.clipUnabled;
-        viewer.setClipState(true)
-        let data = this.getAllBoxes().filter(e=>!e.isNew).map(volume=>{
-            return {  
-                clipTask: volume.clipTask,
-                position: Potree.Utils.datasetPosTransform({position:volume.position, toDataset: true, datasetId: Potree.settings.originDatasetId}).toArray(),
-                rotation: Potree.Utils.datasetRotTransform({rotation:volume.rotation, toDataset: true, datasetId: Potree.settings.originDatasetId, getRotation:true}).toArray().slice(0,3),
-                scale: volume.scale.toArray(),  
-            }
-        })
-        console.log(data)
-        console.log(JSON.stringify(data))
-        viewer.setClipState(oldState)
-        return data
-    }
-    
-    loadFromData(data=[]){
-        data.forEach(v=>{
-            let volume = new Potree.BoxVolume({clip:true, clipTask:v.clipTask});
-            volume.scale.fromArray(v.scale);
-            volume.position.fromArray(v.position);
-            volume.rotation.fromArray(v.rotation);  
-            
-            volume.position.copy(Potree.Utils.datasetPosTransform({position:volume.position, fromDataset: true, datasetId:Potree.settings.originDatasetId}))
-            volume.rotation.copy(Potree.Utils.datasetRotTransform({rotation:volume.rotation, fromDataset: true, datasetId:Potree.settings.originDatasetId, getRotation:true}))
-            
-            viewer.scene.addVolume(volume);
-            viewer.volumeTool.scene.add(volume);
-        })
-    }
-    
-    
-}
-
-
-
-//注意:实时裁剪只对初始数据集有效
-
-
-
-
-
-
-
-
-
-

+ 4 - 3
src/custom/viewer/ViewerNew.js

@@ -36,8 +36,7 @@ import {BoxVolume} from "../../utils/VolumeNew.js";
 import {VolumeTool} from "../../utils/VolumeTool.js";
 import {Images360} from "../modules/panos/Images360.js";
 import {Clip} from '../modules/clipModel/Clip.js' 
-import {Clipping}  from '../modules/clipping/Clipping.js'
-  
+ 
 
 import {InputHandler} from "../../navigation/InputHandlerNew.js";
 
@@ -94,7 +93,7 @@ export class Viewer extends ViewerBase{
         navCubeArea = navCubeArea_                 
          
         this.modules = { 
-            
+            Clip,
         }
          
        
@@ -639,6 +638,8 @@ export class Viewer extends ViewerBase{
                 
             })
             
+            this.modules.Clip.init()
+            
         }) 
         
         

+ 3 - 1
src/utils/Volume.js

@@ -163,7 +163,9 @@ export class BoxVolume extends Volume{
 		this.boundingBox = this.box.geometry.boundingBox;
 		this.add(this.box);
 
-		this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: 0x000000}));
+         
+
+		this.frame = new THREE.LineSegments(boxFrameGeometry, args.lineMat || new THREE.LineBasicMaterial({color: 0x000000}));
 		// this.frame.mode = THREE.Lines;
 		this.add(this.frame);
 

+ 13 - 10
src/utils/VolumeNew.js

@@ -15,7 +15,7 @@ const LineOpacity = {
     selected: 1,
 }
 const colors = {
-    2: 0x2ee4ce,//0x00ff80, //可见
+    2: 0xffffff,//0x00ff80, //可见
     3: 0xffc23b,//0xff3158, //不可见
     4: 0xffffff, //
 }
@@ -35,7 +35,7 @@ export class Volume extends THREE.Object3D {
 		this._modifiable = args.modifiable || true;
 
 	 
-		{ // event listeners
+		/* { // event listeners
 			this.addEventListener('select', e => {
                 //console.log('select')
                 this.setSelected(true)   
@@ -56,7 +56,7 @@ export class Volume extends THREE.Object3D {
             });
             
             
-		}
+		} */
 
 	}
 
@@ -173,7 +173,7 @@ export class BoxVolume extends Volume{
 
 		}
 
-		this.material = new DepthBasicMaterial({
+		/* this.material = new DepthBasicMaterial({
 			color: colors[this.clipTask],
             side:THREE.DoubleSide,
 			transparent: true,
@@ -184,20 +184,23 @@ export class BoxVolume extends Volume{
             clipDistance : 2,//消失距离
             occlusionDistance: 0.1,//变为backColor距离 
             maxClipFactor: 0.9,
-        });
-		this.box = new THREE.Mesh(boxGeometry, this.material);
+        }); */
+        
+        this.material = new THREE.MeshBasicMaterial
+        
+		this.box = new THREE.Mesh(boxGeometry,  this.material);
 		this.box.geometry.computeBoundingBox();
 		this.boundingBox = this.box.geometry.boundingBox;
 		this.add(this.box); 
-         
+        this.box.visible = false 
 		//this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({color: colors[this.clipTask], opacity:LineOpacity.default/* 0xff2050 */}));
 		this.frame = LineDraw.createFatLine(
-                boxFrameGeometry.vertices, 
-                { color: colors[this.clipTask], opacity:LineOpacity.default, lineWidth:1,  dontAlwaysSeen:true}   )
+                boxFrameGeometry.vertices,  
+                {dashed:true, dashSize:0.1, gapSize:0.1, opacity: 0.5, color: colors[this.clipTask], opacity:LineOpacity.default, lineWidth:2,  dontAlwaysSeen:true}   )
                       
         // this.frame.mode = THREE.Lines;
 		this.add(this.frame);
-
+        this.frame.computeLineDistances()
 		this.update();  
 	}