Browse Source

fix: 有的平板容易打滑结束测量

xzw 2 years ago
parent
commit
023a2944c9
2 changed files with 82 additions and 6 deletions
  1. 81 5
      public/static/lib/potree/potree.js
  2. 1 1
      public/static/lib/potree/potree.js.map

+ 81 - 5
public/static/lib/potree/potree.js

@@ -81490,6 +81490,8 @@ void main()
 	                || !e.isAtDomElement && this.isNew//如果是刚添加时在其他dom点击, 不要响应
 	                ||  e.hoverViewport != viewer.mainViewport && this.unableDragAtMap //垂直的测量线不允许在地图上放点
 	                || this.isNew && !getDifferentPoint(this.points, this.points.length )   //不允许和之前的点相同, 但这句在点云稀疏时会导致难结束 
+	                || this.isNew && (Date.now() - this.beginAddTime) < Potree.config.clickMaxPressTime && e.pressDistance < Potree.config.clickMaxDragDis/* &&  e.pressTime<Potree.config.clickMaxPressTime */  //有的设备过于灵敏,点击一下就结束测量了,是因为滑动了被判断为拖拽。所以判断下如果滑动距离过近不时间过短就算单击
+	     
 	            ) 
 	        ){
 	            return this.continueDrag(null,e)    
@@ -82013,12 +82015,18 @@ void main()
 	            }
 	            return 
 	        }
+	        
 	         
+	        /* viewer.addEventListener('camera_changed',(e)=>{
+	            if(e.changeInfo.positionChanged){
+	                setLabelPos()
+	            } 
+	        }) */
 	         
 	         
 	        let setEdgeLabel = (label,p1,p2,distance)=>{//设置label位置和字
-	            let center = new Vector3().addVectors(p1,p2).multiplyScalar(0.5);  
-	            label.setPos(center); 
+	            this.setEdgeLabelPos(label,p1,p2);
+	 
 	            distance = distance == void 0 ? p1.distanceTo(p2) : distance; 
 	            var text = this.labelText || viewer.unitConvert.convert(distance, 'distance', Potree.settings.precision, this.unitSystem, 0.1 , true);//distance要传0.1 这个factor
 	            label.setText(text);
@@ -82043,10 +82051,10 @@ void main()
 	                let distance = this.labelText || point.distanceTo(nextPoint);
 	                edgeLabel.shouldVisi = this.labelText || (index < lastIndex || this.isRect || this.closed && !this.isNew ) && distance>0; 
 	                /* this.closed || */edgeLabel.setVisible(edgeLabel.shouldVisi);  
+	                edgeLabel.sprite.lineDir = new Vector3().subVectors(point,nextPoint).normalize(); //[point,nextPoint]
 	                if(edgeLabel.visible){
 	                    setEdgeLabel(edgeLabel,point,nextPoint,distance);
 	                }  
-	                edgeLabel.sprite.lineDir = new Vector3().subVectors(point,nextPoint).normalize(); //[point,nextPoint]
 	            }
 	        } 
 
@@ -82098,7 +82106,28 @@ void main()
 			
 		};
 
-	  
+
+
+	    setEdgeLabelPos(label,p1,p2){ //调整label的位置,使倾斜后看起来在线的中心,而不要挡住端点
+	        let center = new Vector3().addVectors(p1,p2).multiplyScalar(0.5);  
+	         
+	        if(!label.sprite.lineDir || viewer.mainViewport.camera.type == 'OrthographicCamera'){
+	            label.setPos(center);  
+	        }else { 
+	            let eyePos = viewer.mainViewport.camera.position;
+	            let dir = viewer.mainViewport.view.direction; //new THREE.Vector3().subVectors(center,eyePos).normalize()
+	            let vec = label.sprite.lineDir;
+	            let cos = dir.dot(vec);  
+	            
+	            let efficiency = 0.35; // 0-1  数值越高,r越容易接近1或-1,label越容易在倾斜后靠近近端点。 
+	            let r = 0.5*efficiency*cos + 0.5;
+	            //console.log(r,    cos )
+	            center = p1.clone().multiplyScalar(1-r).add(p2.clone().multiplyScalar(r)); //label在线上滑动,使尽量保持在视觉中心
+	            label.setPos(center);  
+	        } 
+	    }
+
+	    
 	      
 		addMarker (o={}) {
 	         
@@ -83295,6 +83324,16 @@ void main()
 	        
 	        viewer.addEventListener('resize',this.setSize.bind(this));
 	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
 		}
 
 		onSceneChange(e){
@@ -83325,7 +83364,41 @@ void main()
 	    }
 	    
 	    
-		update(){
+		update(){ 
+	        //add
+	        viewer.scene.measurements.forEach(measure=>{
+	            
+	            let lastIndex = measure.points.length - 1; 
+	            for (let index = 0; index <= lastIndex; index++) {
+	                
+	                let nextIndex = (index + 1 > lastIndex) ? 0 : index + 1;
+	                let previousIndex = (index === 0) ? lastIndex : index - 1;
+	                
+	                let point = measure.points[index];
+	                let nextPoint = measure.points[nextIndex];
+	                let previousPoint = measure.points[previousIndex];
+	 
+	                if(measure.showDistances || measure.labelText){ // edge labels
+	                    let edgeLabel = measure.edgeLabels[index];
+	                  
+	                    if(edgeLabel.visible){
+	                        measure.setEdgeLabelPos(edgeLabel, point, nextPoint  );
+	                    }  
+	                }
+	            } 
+	            
+	        });
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
+	        
 	        return;
 	        
 	        
@@ -83706,6 +83779,8 @@ void main()
 	            this.viewer.removeEventListener('global_touchstart', click );//add  importance
 	            measure.dispatchEvent('firstClick');
 	            
+	            
+	            measure.beginAddTime = Date.now();
 	            //console.log('measure clicked')
 	            e.consume && e.consume();
 	            
@@ -89507,6 +89582,7 @@ void main()
 	                    {
 	                        type: 'drop',
 	                        pressDistance, 
+	                        pressTime
 	                    }
 	                ));
 	                

File diff suppressed because it is too large
+ 1 - 1
public/static/lib/potree/potree.js.map