Browse Source

截图改bug。 另外改了个当导入一个一模一样点位的场景后报的错

xzw 1 năm trước cách đây
mục cha
commit
171deb7e43

+ 63 - 27
src/custom/modules/clipModel/Clip.js

@@ -10,7 +10,7 @@ import {ExtendView} from "../../../viewer/ExtendView.js";
 import Viewport from "../../viewer/Viewport.js";
 import {TextSprite} from "../../objects/TextSprite.js";
 import {ExtendPointCloudMaterial} from "../../../materials/ExtendPointCloudMaterial.js";
-
+import AxisViewer from "../../objects/tool/AxisViewer.js";
 
 
 
@@ -98,7 +98,9 @@ var Clip = {
         //viewer.setControls(viewer.orbitControls);
         viewer.setLimitFar(false) 
         //viewer.setClipState(false) //暂时关闭旧的clipping
-        
+        /* new AxisViewer(viewer.mainViewport, viewer.renderArea,{domStyle:{
+            bottom: '2px',right:  '20px', width:'80px',height:'80px'}
+        }) */
         
         {
             this.box = new BoxVolume({
@@ -270,6 +272,8 @@ var Clip = {
         viewer.controls.setTarget(null)
         this.splitScreenTool.focusCenter = null
         
+        //viewer.mainViewport.axis.dispose() 
+        
         cameraProps.forEach(e=>e.openCount = 0)
         
         if(this.showMap){
@@ -536,7 +540,7 @@ var Clip = {
     },
     
     
-    screenshot: async ()=>{ 
+    screenshot: async ()=>{ //测绘图下载。顶视图|侧视图
         return new Promise((resolve,reject)=>{ 
             if(Clip.screenshoting )return reject()
              
@@ -544,7 +548,7 @@ var Clip = {
             let camera = viewer.mainViewport.camera
             //if(Clip.activeViewName == 'mainView')return reject()
             
-            const maxWidth = 8192, minWidth = 1024 
+            const maxWidth = 8192, minWidth = 1024  //图片尺寸最大最小值。
             //Potree.settings.pointDensity = 'ultraHigh'
             
             viewer.inputHandler.deselectAll() 
@@ -571,16 +575,8 @@ var Clip = {
                 return mat
             })
             
-            
-            let minZoom = Potree.browser.urlHasValue('clipZoom',true) || 80 //1px = 1个点 = 1cm , 如果一个点都是1cm的话
-                    //中间部分75-80为佳,文字100,边缘50. 最好支持调节 . 且当下载尺寸变大往往点云也多,可能冲破pointbudget限制
-            
-            
-            /* let minPointSize = Infinity
-            visiPointclouds.forEach(e=>minPointSize = Math.min(e.material.size,minPointSize))
              
-            let minZoom = 2 / minPointSize //这是相信当前size是恰好的前提,每个点云1px时不会重叠也不会有缝隙
-            */
+            //根据boundingBox尺寸来定图片尺寸
             let boundingBox = Clip.box.boundingBox.clone().applyMatrix4(Clip.box.matrixWorld)
             let points = []
             var bound = new THREE.Box3() 
@@ -591,10 +587,17 @@ var Clip = {
                 bound.expandByPoint(p1)
             }) 
             let boundSize = bound.getSize(new THREE.Vector3) 
+            let minZoom = Potree.browser.urlHasValue('clipZoom',true) || 80 //1px = 1个点 = 1cm , 如果一个点都是1cm的话
+            //zoom不宜过大或过小,过小点云重叠、画面模糊;过大点云有间隙,纹理就看不清
+            //中间部分75-80为佳,文字100,边缘50. 最好支持调节 . 且当下载尺寸变大往往点云也多,可能冲破pointbudget限制
+            //let text = `1 : ${(1 / camera.zoom).toFixed(4)}(像素 : 米)`
+            
+            
+            
             let w = boundSize.x * minZoom
             let h = boundSize.y * minZoom
             
-            let max = Math.max(w,h)//, min = Math.min(w,h)
+            let max = Math.max(w,h) 
             let s = 1
             if(max > maxWidth){
                 s = maxWidth/max 
@@ -609,22 +612,26 @@ var Clip = {
             //虽然size>1就是浪费像素,但是太小了视觉效果有点差……可能因为fov不真实。 点云大就像是老式电视机虽然显示像素量少但感觉不出画面模糊,且边缘锐利。
              
             
-            w = Math.round(w)
+            w = Math.round(w)     
             h = Math.round(h)
              
             let focusObjectInfo = [{boundingBox, points}, 'boundingBox', 0, { dontChangeCamDir:true,  dontMoveMap:true, boundScale:1 }]
             
             
-            //分块渲染
-            let r = THREE.Math.clamp(Math.sqrt(3.5e7 / boundSize.z) * s, 1024, 4096);  // 推理 wc*hc = w / r * h / r =  zoom * w * s * zoom * h * s / r^2 = xyz / V(常数,每多少立方米会超出pointBudget)  
+            //分块渲染截图,最后拼合图片。需要使每一块的点数不超过pointBudget, 且尺寸不超过4096(会崩溃),过小的话一般不会超过pointBudget,除非是深度较大后排点云多。
+            let r = THREE.Math.clamp(Math.sqrt(3.5e7 / boundSize.z) * s, 1024, 4096);  //每多少米分一块。 推理 wc*hc = w / r * h / r =  zoom * w * s * zoom * h * s / r^2 = xyz / V(常数,每多少立方米会超出pointBudget,就是括号里的数字,给大概值)  
             //let r = THREE.Math.clamp(1024 / boundSize.z, 256, 4096); 
              
-            let wc = w / r
-            let hc = h / r
+            let wc = w / r      //横向块数
+            let hc = h / r      //纵向块数
             let splitRenderInfo = (wc > 1 || hc > 1) && {wc: Math.ceil(wc), hc:Math.ceil(hc)}  //因为结果需要化为整数所以可能不太理想, 分割数过多。 另外如果面积小但是因z过长而超出pointBudget没关系,因后排点云无需绘制
             
             console.log({wc,hc,w,h})
             
+            
+            let text = `1 : ${(boundSize.x / w).toFixed(4)}(像素 : 米)`
+            
+            
             let {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', bgOpacity:0, focusObjectInfo, maxTimeForPointLoad : 3e5, pointDensity:'screenshot2', splitRenderInfo }, w, h, 1 )
             finishPromise.done(({dataUrl}) => {
                  
@@ -633,16 +640,29 @@ var Clip = {
                 
                 let img = new Image
                 img.src = dataUrl
-                img.onload = async ()=>{
+                img.onload = async ()=>{//加上标尺比例水印
+                
+                    //固定文字大小和边距像素    //如果有一边过小,可能超出画面外,暂时不管这种可能
+                    const Margin = 30
+                    let topRatioToImg = THREE.Math.clamp(  Margin / h  , 0.006,0.10) //clamp:当图片过大时,label间距像素放大一点,反之缩小一点
+                    let leftRatioToImg = THREE.Math.clamp(  Margin / w  , 0.006,0.05)  
+                
                     let labelInfo = {
-                        bottomRatioToImg : 0.03, rightRatioToImg : 0.03, /* widthRatioToImg : 0.2, //不固定字大小 */
+                        topRatioToImg, leftRatioToImg,  
                         textColor: { r: 255, g: 255, b: 255, a: 1 }, 
                         textBorderColor : { r: 30, g: 30, b: 30, a: 1 },
                         textBorderThick :  1,
-                        fontsize: 24
+                        fontsize: math.linearClamp(w, [100, 700, 4096, 8192], [12, 20, 30, 40])
                     }
                     
-                    let text = `1 : ${(1 / camera.zoom).toFixed(4)}(像素 : 米)`
+                    let m = leftRatioToImg * w
+                    labelInfo.bgMargin = {left:m ,  top : topRatioToImg * h * 2 + labelInfo.fontsize,  right: m,  bottom:m } 
+                    
+                    
+                    
+                    //console.log('topRatioToImg',topRatioToImg,'leftRatioToImg',leftRatioToImg,'fontsize', labelInfo.fontsize)
+                    
+                    
                  
                     let finalDataUrl = await Potree.Utils.imgAddText(img, text , labelInfo )
                     
@@ -662,9 +682,8 @@ var Clip = {
              
         }) 
         /* 
-            隐患:无法获知最大可加在的点的数量,也未知需要加载的点的数量。所以会因pointBudget限制造成周围的点稀疏。
-            
-            如果需要加载的点云还是超出,是否可以改为分批渲染,类似多viewport但共用一个camera,在beforeRender时分viewport
+            隐患:无法获知最大可加载的点的数量,也未知需要加载的点的数量。需要掌控好分块数量,避免因pointBudget限制造成周围的点稀疏。
+            加载点云时间过久
             
          */
         return finishPromise
@@ -698,7 +717,24 @@ export {Clip}
 viewer.modules.Clip.box.matrix
 
 //恢复box
-let a = new THREE.Matrix4().fromArray([....])
+let a = new THREE.Matrix4().fromArray([ 
+    14.189120116830964,
+    0,
+    0,
+    0,
+    0,
+    9.924790069368392,
+    0,
+    0,
+    0,
+    0,
+    0.8751009568437951,
+    0,
+    -7.433819981633984,
+    1.528696446650445,
+    2.9412375879215977,
+    1
+])
 a.decompose(viewer.modules.Clip.box.position,viewer.modules.Clip.box.quaternion,viewer.modules.Clip.box.scale)
  
 viewer.modules.Clip.rotateSideCamera(-93)

+ 17 - 2
src/custom/modules/datasetAlignment/Alignment.js

@@ -367,12 +367,12 @@ var Alignment = {
         
         var data = viewer.scene.pointclouds.map(e=>{
             let pos = viewer.transform.lonlatToLocal.inverse(e.translateUser.clone())
-            
+            let initialPointcloud = viewer.scene.pointclouds.find(e=>e.dataset_id == Potree.settings.originDatasetId)
             
             return {
                 id: e.dataset_id,
                 orientation : e.orientationUser,
-                location:[pos.x, pos.y, pos.z],
+                location:[pos.x, pos.y, pos.z + initialPointcloud.datasetData.location[2]],
                 //transformMatrix: e.transformMatrix.elements,
             }
         })
@@ -404,6 +404,21 @@ var Alignment = {
 然后其他数据集绕该数据集旋转,并保持相对位置不变。
 
 
+
+
+
+关于cloud.js
+tightBoundingBox规定了整个点云应该放置后的边界范围。  boundingBox则是在其基础上变为正方体。
+为了达成这个目标,需要将点云进行位移。在没有位移前,点云boundingBox的min是0,0,0(如果没出错的话)
+所以要令min变为tightBoundingBox.min, 需要将点云position设置为 tightBoundingBox.min 。
+设置完以后整体点云的旋转中心为0,0,0。如果不出错的话0,0,0大概在点云中央附近。
+
+在添加经纬度信息后,非初始数据集又会有一个位置偏移,其旋转中心也跟着一起偏移,如偏移了 1,0,0,则旋转中心就是 1,0,0
+
+ 
+但是,有的cloud.js的tightBoundingBox使用的是大地坐标,需要转成普通值
+
+
  */
  
 

+ 1 - 1
src/custom/modules/mergeModel/MergeEditor.js

@@ -149,7 +149,7 @@ let MergeEditor = {
             this.transformControls.addEventListener('mouseDown', ()=>{ //dragstart
                 this.history.beforeChange(this.selected)
             })  
-            this.transformControls.addEventListener('transform_end',()=>{
+            this.transformControls.addEventListener('mouseUp',()=>{
                 this.history.afterChange(this.selected)
             })
 

+ 1 - 1
src/custom/modules/panoEdit/panoEditor.js

@@ -196,7 +196,7 @@ class PanoEditor extends THREE.EventDispatcher{
                 this.fakeMarkerForTran.addEventListener('position_changed', afterMoveCircle.bind(this,'position')) 
                 this.fakeMarkerForTran.addEventListener("rotation_changed", afterMoveCircle.bind(this,'rotation') )
               
-                this.transformControls.addEventListener('transform_end',()=>{
+                this.transformControls.addEventListener('mouseUp',()=>{
                      Alignment.history.afterChange(this.selectedClouds)
                 })
                 

+ 40 - 15
src/custom/modules/panos/DepthImageSampler.js

@@ -92,31 +92,56 @@ class DepthImageSampler extends THREE.EventDispatcher{
         this.imgDatas.length = 0 
     }
      
-    getDepth( UVx, UVy) {//根据图片像素获取深度值 
+    getDepth( UVx, UVy, useNeighIfZero) {//根据图片像素获取深度值 
         var x = Math.round(UVx * (this.canvas.width - 1))
           , y = Math.round(UVy * (this.canvas.height - 1));
-          
-        
-        if (!(x < 0 || y < 0 || x >= this.canvas.width || y >= this.canvas.height)) { 
+        let imgData = this.imgDatas.find(p=>p.pano == this.pano)
+        let get = (x,y,)=>{ 
+            if (!(x < 0 || y < 0 || x >= this.canvas.width || y >= this.canvas.height)){  
+                let blockIndex = this.canvas.width * y + x
+                let color = imgData.data.slice(blockIndex*4, (blockIndex+1)*4)
+                return color[1] + color[0] / 256
+            }
+        }
          
-            /* viewer.addTimeMark('depthSampler','start') 
-            var r = this.context.getImageData(x, y, 1, 1).data;     //pc chrome 耗时0.01毫秒左右(排除第一次的50) , 但firefox: 4。但换贴图之后就多达5甚至几十  
-            viewer.addTimeMark('depthSampler','end') 
-            //console.log('color', r, x,y)
-            return r[1] + r[0] / 256 */
-            let imgData = this.imgDatas.find(p=>p.pano == this.pano)
-            let blockIndex = this.canvas.width * y + x
-            let color = imgData.data.slice(blockIndex*4, (blockIndex+1)*4)
-            return color[1] + color[0] / 256
+        /* viewer.addTimeMark('depthSampler','start') 
+        var r = this.context.getImageData(x, y, 1, 1).data;     //pc chrome 耗时0.01毫秒左右(排除第一次的50) , 但firefox: 4。但换贴图之后就多达5甚至几十  
+        viewer.addTimeMark('depthSampler','end') 
+       */ 
+        let depth = get(x,y)
+        if(!depth && useNeighIfZero){ //遇到过有的相隔很远且有阻挡的两个漫游点间居然depth为0,没有阻挡?但是周围点有四个非零。所以为了修正会飞到很远的点加个识别周围像素的depth 。 2024.3.19
             
+            let results = [] 
+            let d = 0, sum = 0, count = 0, maxResDis = 1
+            outer2: while(d++<maxResDis){
+                outer: for(let i=-d;i<=d;i++){
+                    for(let j=-d;j<=d;j++){
+                        if(i==-d || i==d || j==-d || j==d ){//外围
+                             let depth1 = get(x+i,y+j)
+                             if(depth1!=0){
+                                 results.push(depth1)
+                             }
+                        }
+                    }
+                }
+            }
+            if(results.length){ 
+                depth = results.reduce((w,c)=>{return w+c},0) / results.length 
+                //console.error('useNeighIfZero', results, depth)
+            }
+            //console.log('useNeighIfZero', results, depth)
         }
+        
+        return depth
+            
+        
     } 
 
 
     
     
     
-    sample( intersect, currentPano, onlyPos ) {//通过和skybox的intersect得到真实的intersect的位置
+    sample( intersect, currentPano, onlyPos, useNeighIfZero ) {//通过和skybox的intersect得到真实的intersect的位置
         if(!intersect)return
         
         
@@ -145,7 +170,7 @@ class DepthImageSampler extends THREE.EventDispatcher{
         let dirInPano = dir.clone().applyMatrix4(currentPano.panoMatrix2Inverse).normalize(); //转化为考虑漫游点旋转的方向
         let uv = math.getUVfromDir(dirInPano)//转化为uv
         
-        let distance = this.getDepth(  uv.x, uv.y);
+        let distance = this.getDepth(  uv.x, uv.y, useNeighIfZero);
         //viewer.addTimeMark(markName,'end')
         
         

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 179 - 135
src/custom/modules/panos/Images360.js


+ 2 - 1
src/custom/modules/panos/Panorama.js

@@ -259,9 +259,10 @@ class Panorama extends THREE.EventDispatcher{
         let texture = texLoader.load( src, ()=>{
             this.depthTex = texture
             this.dispatchEvent({type:'loadedDepthImg',  loaded:true})
+            this.images360.dispatchEvent({type:'loadedDepthImg',  pano:this})
             this.depthTexLoading = false
             this.images360.updateDepthTex(this)
-            //viewer.dispatchEvent('content_changed') 
+          
         },null,(e)=>{//error
             console.error('loadDepthImg失败, 数据集sceneCode'+ this.pointcloud.sceneCode,  this.id )
             this.pointcloud.hasDepthTex = false

+ 1 - 1
src/custom/modules/panos/tile/PanoRenderer.js

@@ -154,7 +154,7 @@ class PanoRenderer extends THREE.EventDispatcher{
             r && this.deactiveDescripor(r.renderTarget) 
             r = this.activeDescripor(l)  
             if (!r) { 
-                var ren = this.initTiledPano(l,  !browser.isMobile() ); 
+                var ren = this.initTiledPano(l,  Potree.settings.disableAATarget ? false : !browser.isMobile()  ); //有的老设备如果抗锯齿打开场景时要多花五秒
                 r = this.initDescriptor(ren.width);
                 r.renderTarget = ren;
             }

+ 17 - 1
src/custom/modules/panos/tile/TileDownloader.js

@@ -378,7 +378,21 @@ class TileDownloader extends THREE.EventDispatcher{
     
 
     getTiles(d, sceneNum, useV4url, pointcloud){ 
+          
+        let v3OrV4Str = useV4url ? `/scene_view_data/${sceneNum}/images/` : `/images/images${sceneNum}/`
+        
+        
+        if(Potree.settings.isLocal && !this.local2SrcFailed && pointcloud.datasetData.mapping && !Potree.settings.isLocal2){   //非离线包的话加mapping  
+            
+            return `${Potree.settings.urls.prefix3}/${pointcloud.datasetData.mapping}${v3OrV4Str}${d}`  
+             
+        }
         
+        return `${Potree.settings.urls.prefix3}${v3OrV4Str}${d}`    
+        
+        
+        
+        /* 
         if(Potree.settings.isLocal && !this.local2SrcFailed || useV4url){//新的地址  scene_view_data/场景码/images/tiles
             if(pointcloud.datasetData.mapping && !Potree.settings.isLocal2){//非离线包的话加mapping
                 return `${Potree.settings.urls.prefix3}/${pointcloud.datasetData.mapping}/scene_view_data/${sceneNum}/images/${d}`  
@@ -387,7 +401,9 @@ class TileDownloader extends THREE.EventDispatcher{
             }    
         }
         
-        return `${Potree.settings.urls.prefix3}/images/images${sceneNum}/${d}`    
+        return `${Potree.settings.urls.prefix3}/images/images${sceneNum}/${d}`
+         */
+        
     }
 
     loadImage(e, t, i, n) {

+ 19 - 2
src/custom/modules/route/RouteGuider.js

@@ -330,7 +330,8 @@ export class RouteGuider extends THREE.EventDispatcher{
             return
         }
         
-        
+        let initialPointcloud = viewer.scene.pointclouds.find(e=>e.dataset_id == Potree.settings.originDatasetId)
+            
         //array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
         
         
@@ -430,6 +431,7 @@ export class RouteGuider extends THREE.EventDispatcher{
                         let pos = item.location.slice(0)
                          
                         pos = new THREE.Vector3().fromArray(pos)//.setZ(item.z)
+                        pos.z -= initialPointcloud.datasetData.location[2]
                         this.route.push(pos)
                     })
                     
@@ -484,14 +486,29 @@ export class RouteGuider extends THREE.EventDispatcher{
             
             
             
-            var query = {
+            /* var query = {
                 source_longitude: start.x,
                 source_latitude: start.y,
                 source_z: start.z,
                 destination_longitude: end.x,
                 destination_latitude: end.y,
                 destination_z: end.z
+            }; */
+            
+            
+            var query = {
+                source_longitude: start.x,
+                source_latitude: start.y,
+                source_z: start.z+initialPointcloud.datasetData.location[2],
+                destination_longitude: end.x,
+                destination_latitude: end.y,
+                destination_z: end.z+initialPointcloud.datasetData.location[2]
             };
+            
+            
+            
+            
+            
             /* var query = {
                 source_longitude: startLonlat.x,
                 source_latitude: startLonlat.y,

+ 3 - 3
src/custom/objects/TextSprite.js

@@ -190,8 +190,8 @@ export class TextSprite extends THREE.Object3D{
          
 		let margin = (this.margin ? new THREE.Vector2().copy(this.margin) : new THREE.Vector2(this.fontsize, Math.max(  this.fontsize*0.4, 10)  )).clone().multiplyScalar(r); 
 		const lineSpace = (this.fontsize + margin.y) * 0.5
-        let spriteWidth = 2 * margin.x + textMaxWidth + 2 * this.rectBorderThick * r ;
-		let spriteHeight = 2 * margin.y + this.fontsize * r * this.text.length + 2 * this.rectBorderThick * r + lineSpace * (this.text.length - 1); 
+        let spriteWidth = 2 * margin.x + textMaxWidth + 2 * (this.rectBorderThick + this.textBorderThick)* r;   //还要考虑this.textshadowColor,太麻烦了不写了
+		let spriteHeight = 2 * margin.y + (this.fontsize + this.textBorderThick*2)* r * this.text.length + 2 * this.rectBorderThick * r + lineSpace * (this.text.length - 1); 
 		context.canvas.width = spriteWidth;
 		context.canvas.height = spriteHeight;
 		context.font = this.fontWeight + ' ' + this.fontsize * r + 'px ' + this.fontface; 
@@ -228,7 +228,7 @@ export class TextSprite extends THREE.Object3D{
 
             //文字y向距离从textBaseline向上算
             let actualBoundingBoxAscent = infos[i].actualBoundingBoxAscent == void 0 ? this.fontsize * r * 0.8 : infos[i].actualBoundingBoxAscent //有的流览器没有。只能大概给一个
-            y += actualBoundingBoxAscent + expand
+            y += actualBoundingBoxAscent + expand + this.textBorderThick
             //console.log(actualBoundingBoxAscent)
 
             //console.log(this.text, 'y' , y, 'actualBoundingBoxAscent', metrics.actualBoundingBoxAscent,'expand',expand )

+ 7 - 0
src/custom/objects/tool/AxisViewer.js

@@ -43,6 +43,12 @@ export default class AxisViewer extends ViewerBase{
     
         this.listenViewport = listenViewport
         
+        Object.defineProperty(listenViewport, 'axis', {
+          value: this,
+          writable: true, // 可写(可选)
+          enumerable: false, // 不可枚举
+          configurable: true // 可配置(可选)
+        });
       
         this.scene = new THREE.Scene   
         //this.camera = new THREE.PerspectiveCamera(30, 1,  1, this.radius*3); 
@@ -193,6 +199,7 @@ export default class AxisViewer extends ViewerBase{
             }
         })
         super.dispose()
+        delete this.listenViewport.axis
     }
 }
         

+ 24 - 23
src/custom/objects/tool/Measure.js

@@ -118,7 +118,7 @@ export class Measure extends ctrlPolygon{
         Potree.Utils.setObjectLayers(this, 'measure' )
         
         
-        if(this.measureType == 'MulDistance'){
+        if(this.measureType == 'MulDistance' || this.measureType == 'Hor MulDistance' || this.measureType == 'Ver MulDistance'){
             //this.showTotalDis = true 
             this.totalDisLabel = this.createTotalDisLabel()
             this.add(this.totalDisLabel) 
@@ -396,24 +396,24 @@ export class Measure extends ctrlPolygon{
     
     
     ifShowTotalDis(){ 
-        if(this.measureType == 'MulDistance' ){ 
-            let show = this.points.length > 2
-            
-            if(show){
-                let maxDis = 0.15 
-                let lastIndex = this.points.length - 1; 
-                for(let i=0;i<lastIndex;i++){
-                    let len = this.edges[i].distance_
-                    
-                    if(len > maxDis){
-                        show = false; break;
-                    }
-                } 
-            }
-            
-            
-            this.showTotalDis = show
-        }  
+         
+        let show = this.points.length > 2
+        
+        if(show){
+            let maxDis = 0.15 
+            let lastIndex = this.points.length - 1; 
+            for(let i=0;i<lastIndex;i++){
+                let len = this.edges[i].distance_
+                
+                if(len > maxDis){
+                    show = false; break;
+                }
+            } 
+        }
+        
+        
+        this.showTotalDis = show
+   
         /* 连续测量:
         1. ≥2次测量,单个距离<15cm时,居中显示总长, hover、选中时显示每段长度
         2. 若连续测量的线段中,大于等于1段超出15cm,所有线段均显示长度
@@ -756,8 +756,9 @@ export class Measure extends ctrlPolygon{
         this.closed && this.edgeLabels.forEach(e=>Utils.updateVisible(e,'hover',state)) 
         
         
-        if(this.totalDisLabel){
-            this.edgeLabels.forEach(e=> Utils.updateVisible(e, 'hover', state,  1, state ? 'add' : 'cancel'))     
+        if(this.totalDisLabel && !viewer.screenshoting){
+            this.edgeLabels.forEach(e=> Utils.updateVisible(e, 'hover', state,  1, state ? 'add' : 'cancel'))  
+            Utils.updateVisible(this.totalDisLabel,'hover', !state )              
         }
     
         
@@ -1294,8 +1295,8 @@ export class Measure extends ctrlPolygon{
             this.area = {value:0};
             this.areaLabel && Utils.updateVisible(this.areaLabel, 'setVisible', false )
         }
-        if(this.showTotalDis){
-            this.totalDisLabel && Utils.updateVisible(this.totalDisLabel, 'setVisible', false )
+        if(this.totalDisLabel && this.showTotalDis){
+             Utils.updateVisible(this.totalDisLabel, 'setVisible', false )
         }
         viewer.inputHandler.dispatchEvent( {type:'measuring', v:true, cause:'reDraw',object:this, situation:'dragging'}  )
 	            

+ 1 - 1
src/custom/objects/tool/TransformControls.js

@@ -784,7 +784,7 @@ var TransformControls = function ( camera, domElement, options ) {
                 this.player.cameraControls.activeControl.enabled = true
             } */
             this.rotateStart = null//add
-            this.dispatchEvent({type:'transform_end'})
+         
             
 
 		}

+ 5 - 15
src/custom/potree.shim.js

@@ -916,7 +916,8 @@ Utils.imgAddText = async (img, text, labelInfo)=>{
     
     let label = new Potree.TextSprite(Object.assign({//如果直接在canvas里写字,要另外写很多和canvas.drawText有关的,所以还是借助textSprite吧
         backgroundColor: { r: 0, g: 0, b: 0, a: 0 },
-        textColor: { r: 255, g: 255, b: 255, a: 1 }, 
+        textColor: { r: 255, g: 255, b: 255, a: 1 },
+        margin:{x:3,y:3},       
         renderOrder: 50,  fontsize : 20,
         text, 
     },labelInfo))
@@ -2017,26 +2018,15 @@ LRU.prototype.freeMemory = function(){
     } 
     let memoryRatio = browser.isMobile() ? 2 : 5;
     //改成navvis的,使用pointBudget,否则四屏点云闪烁。 (似乎要比updateVisiblede的node时限制要宽些,作为缓存继续存着。否则会闪烁)
-    let max = THREE.Math.clamp( viewer.viewports.length * memoryRatio * Potree.pointBudget, 0, 35e6)
+    let max = THREE.Math.clamp( viewer.viewports.length * memoryRatio * Potree.pointBudget, 0, 40e6)
        
     for (; this.numPoints > max;  ) { 
         var node = this.getLRUItem();
-        node && this.disposeDescendants(node); //this.disposeSubtree(node)
+        node && this.disposeDescendants(node);
     } 
     
 } 
-/* 
-LRU.prototype.disposeSubtree = function(t) {//add from navvis 25.js  和原来的disposeDescendants功能一样
-    var e = [t];
-    t.traverse((function(t) {
-        t.loaded && e.push(t)
-    }));
-    for (var n = 0, i = e; n < i.length; n++) {
-        var o = i[n];
-        o.dispose(),
-        this.remove(o)
-    }
-}*/
+
 
 VolumeTool.prototype.update = function(){}
 

+ 3 - 1
src/custom/settings.js

@@ -472,13 +472,15 @@ let settings = {//设置   可修改
     adsorption:false,//测量时吸附点 
     pickFrontPointRatio:config.pickFrontPointRatio, //默认pick点云时选中靠近镜头的点的偏向
     dragPolyBeyondPoint: browser.urlHasValue('dragPolyBeyondPoint'),  //ctrlPolygon是否可以拖拽到没点云的地方
+    panoZoomByPointer: false,//全景图是否定点缩放
+    
 }
 
 
 Potree.config = config
 Potree.settings = settings
  
-settings.isLocalhost = settings.prefix.includes('localhost')
+settings.isLocalhost = settings.prefix.includes('localhost:') || settings.prefix.includes('192.168.0.113:') 
 
 settings.isFormal = browser.urlHasValue('formal')//正式环境 本地测试
 if(settings.isFormal){ 

+ 32 - 42
src/custom/start.js

@@ -254,56 +254,40 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
         }
         
         var transformPointcloud = (pointcloud, dataset)=>{
-            var locationLonLat = dataset.location.slice(0,3)
+            var locationLonLat = dataset.location.slice(0,3) // [lon,lat,高程海拔]
              
            
             //当只有一个dataset时,无论如何transform 点云和漫游点都能对应上。
-            
-            /* if(window.AMapWith84 && Potree.settings.mapCompany != 'google'){
-                 locationLonLat = AMapWith84.wgs84ToAMap({x:locationLonLat[0], y:locationLonLat[1]})
-                  
-                locationLonLat = [locationLonLat.x,locationLonLat.y] 
-            } */
-            
+             
             var location = viewer.transform.lonlatToLocal.forward(locationLonLat)  //transform.inverse()
             //初始化位置 
-            
-            /* 
-            location[0] = Math.sign(location[0]) * Math.min(7000, Math.abs(location[0]))
-            location[1] = Math.sign(location[1]) * Math.min(7000, Math.abs(location[1]))
-             */
-            
+             
             viewer.sidebar && viewer.sidebar.addAlignmentButton(pointcloud) 
             
             //dataset.orientation = 0
             
             Alignment.rotate(pointcloud, null, dataset.orientation)   
-            Alignment.translate(pointcloud, new THREE.Vector3(location[0], location[1],  dataset.location[2]-originDataset.location[2])) 
+            Alignment.translate(pointcloud, new THREE.Vector3(location[0], location[1],  dataset.location[2]-originDataset.location[2])) //要使初始数据集的z为0,所以要减去初始数据集的z
             
             pointcloud.updateMatrixWorld()
             
             
             Potree.Log(`点云${pointcloud.dataset_id}(${pointcloud.name})旋转值:${pointcloud.orientationUser}, 位置${math.toPrecision(pointcloud.translateUser.toArray(),3)}, 经纬度 ${dataset.location}, spacing ${pointcloud.material.spacing}`,  {font:[null, 13]} )
-            
-            
-            //-------------------
              
-            //viewer.mapView.showSources(false);  
         }
         
         if(!Potree.settings.originDatasetId)Potree.settings.originDatasetId = data[0].id
         var originDataset = data.find(e=>e.id == Potree.settings.originDatasetId)  
         /* originDataset.location[0] = 113.60608878174709
         originDataset.location[1] = 22.381189423935155
-         
-        
+          
         let ano = data.find(e=>e.name == 'SG-t-Jw0xyhL6oSY')
         ano.location[0] = 113.6060509967498
         ano.location[1] = 22.381061273279244 */
         
          
-        {//拿初始数据集作为基准。它的位置000
-            var locationLonLat = originDataset.location.slice(0,2)
+        {//拿初始数据集作为基准。它的位置要放到000
+            var locationLonLat = originDataset.location.slice(0,2) 
             
             if(window.AMapWith84){//需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差.    navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
                 locationLonLat = AMapWith84.wgs84ToAMap({x:locationLonLat[0], y:locationLonLat[1]})
@@ -506,7 +490,30 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
                 viewer.images360.cube.material.wireframe = false
                 viewer.images360.cube.visible = Potree.settings.displayMode == 'showPanos'
             }                
-        }) 
+        })
+
+
+        //--------------------------------
+        /* if(!number){
+            Potree.settings.boundAddObjs = true
+            Potree.settings.intersectOnObjs = true
+            
+            // Load untextured bunny from ply
+            viewer.loadModel({
+                fileType:'ply',
+                url:Potree.resourcePath + "/models/indoor.ply",
+                name:'test',
+                },
+                (object)=>{
+                    object.isModel = true
+                    viewer.updateModelBound()
+                }
+            )  
+      
+        } */
+ 
+
+
         
     }  
     
@@ -514,24 +521,7 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
     
     
     
-    //--------------------------------
-    if(!number){
-        Potree.settings.boundAddObjs = true
-        Potree.settings.intersectOnObjs = true
-        
-        // Load untextured bunny from ply
-        viewer.loadModel({
-            fileType:'ply',
-            url:Potree.resourcePath + "/models/indoor.ply",
-            name:'test',
-            },
-            (object)=>{
-                object.isModel = true
-                viewer.updateModelBound()
-            }
-        )  
-  
-    }
+    
     
     
     

+ 12 - 4
src/custom/utils/Common.js

@@ -483,9 +483,17 @@ var Common = {
 
         let canvas = document.createElement('canvas')
         let context = canvas.getContext('2d')
-        context.canvas.width = img.width
-        context.canvas.height = img.height
-        context.drawImage(img, 0, 0, img.width, img.height)
+        let marginLeft = labelInfo.bgMargin && labelInfo.bgMargin.left || 0 
+        let marginRight = labelInfo.bgMargin && labelInfo.bgMargin.right || 0 
+        let marginTop = labelInfo.bgMargin && labelInfo.bgMargin.top || 0 
+        let marginBottom = labelInfo.bgMargin && labelInfo.bgMargin.bottom || 0 
+        
+        
+        let width = img.width + marginLeft + marginRight
+        let height = img.height + marginTop + marginBottom
+        context.canvas.width = width
+        context.canvas.height = height
+        context.drawImage(img, marginLeft, marginTop, img.width, img.height)
 
         let labelWidth = labelInfo.widthRatioToImg ? img.width * labelInfo.widthRatioToImg : labelImg.width //widthRatioToImg:label的width占img的width的比例
         let labelHeight = (labelWidth * labelImg.height) / labelImg.width
@@ -506,7 +514,7 @@ var Common = {
 
         var dataUrl = canvas.toDataURL('image/png', labelInfo.compressRatio)
         //Common.downloadFile(dataUrl, 'screenshot.png')
-        context.clearRect(0,0,img.width,img.height)
+        context.clearRect(0,0,width,height)
         return dataUrl
 
  

+ 2 - 2
src/custom/utils/SplitScreen4Views.js

@@ -166,7 +166,7 @@ SplitScreen4Views.split = function(o={}){
     }    
     viewports.forEach(viewport=>{
         viewport.beforeRender = beforeRender
-        viewport.axis = new AxisViewer(viewport, viewer.renderArea,{domStyle:{
+        new AxisViewer(viewport, viewer.renderArea,{domStyle:{
             bottom: viewport.name == 'MainView' ? '2px' : '-25px',
             right: (viewport.name == 'right' || viewport.name == 'back') ? '-25px' : viewport.name == 'MainView'?'20px':'5px',
             width:'80px',height:'80px'}
@@ -195,7 +195,7 @@ SplitScreen4Views.split = function(o={}){
 
 SplitScreen4Views.recover = function(){
     
-    viewer.viewports.forEach(e=>{e.axis.dispose(),e.axis = null})
+    viewer.viewports.forEach(e=>{e.axis.dispose()})
     
     this.unSplit()
     viewer.mapViewer.viewports[0].beforeRender = null; 

+ 12 - 2
src/custom/viewer/ViewerNew.js

@@ -1390,6 +1390,10 @@ export class Viewer extends ViewerBase{
     
     
     updateCadVisibles(visiClouds, force){
+        
+        
+        console.log('visiClouds',visiClouds)
+        
         let oldVisi = this.fpVisiDatasets
         var visiClouds = this.fpVisiDatasets = visiClouds
         
@@ -3598,7 +3602,7 @@ export class Viewer extends ViewerBase{
         var startTime = Date.now()
         //抗锯齿待加 1 post处理 2截图大张再抗锯齿缩小
         this.pauseTestMaxLevel = true
-    
+        this.screenshoting = true
     
         console.log('startScreenshot: '+startTime)
         
@@ -4001,7 +4005,7 @@ export class Viewer extends ViewerBase{
             测量线的截图因为要调用分屏的,会改变画面
             但是普通截图的话,不会改变画面
          */
-        this.screenshoting = true
+        
         return {getImagePromise:getImageDeferred.promise(), finishPromise:finishDeferred.promise()}
         
         
@@ -4099,6 +4103,12 @@ export class Viewer extends ViewerBase{
         let boundSize   
         
         
+        if(o.dontChangeCamDir && (o.endYaw == void 0 || o.endPitch == void 0)){ //在俯视时仅靠dir来算不准
+            o.endYaw = viewer.mainViewport.view.yaw
+            o.endPitch = viewer.mainViewport.view.pitch
+        }
+        
+        
         let moveMap = (done)=>{
             if(this.mapViewer && !o.dontMoveMap){ 
                 //console.log('mapFocusOn: '+target.toArray())

+ 3 - 3
src/utils/TransformationToolNew.js

@@ -694,7 +694,7 @@ export class TransformationTool extends THREE.EventDispatcher{
 		let handle = this.activeHandle;
 		let camera = this.viewer.mainViewport.camera//this.viewer.scene.getActiveCamera();
 
-		if(!handle){
+		if(!handle || !handle.name.includes('rotation') ){
 			return
 		};
 
@@ -771,7 +771,7 @@ export class TransformationTool extends THREE.EventDispatcher{
 		let handle = this.activeHandle;
 		let camera = this.viewer.mainViewport.camera//this.viewer.scene.getActiveCamera();
 		
-        if(handle && this.selection[0]){
+        if(handle && handle.name.includes('translation') && this.selection[0]){
         
             let posWorld = this.selection[0].getWorldPosition(new THREE.Vector3()); //是需要世界坐标吗
                 
@@ -889,7 +889,7 @@ export class TransformationTool extends THREE.EventDispatcher{
 	dragScaleHandle(e){
 		let drag = e.drag;
 		let handle = this.activeHandle;
-        if(!handle)return
+        if(!handle || !handle.name.includes('scale'))return
 		let camera = this.viewer.mainViewport.camera//this.viewer.scene.getActiveCamera();
 
 		if(!drag.intersectionStart){