xzw 8 hónapja
szülő
commit
2ed4b58e43
3 módosított fájl, 172 hozzáadás és 58 törlés
  1. 169 55
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map
  3. 2 2
      src/sdk/cover/index.js

+ 169 - 55
public/lib/potree/potree.js

@@ -17820,7 +17820,7 @@
 	    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
 	    super();
 	    var map = new Texture();
-	    map.minFilter = LinearFilter;
+	    map.minFilter = LinearFilter; //清晰一些?
 	    map.magFilter = LinearFilter;
 	    this.sprite = new Sprite$2(Object.assign({
 	      root: this
@@ -17922,6 +17922,10 @@
 	      textBorderThick = this.textBorderThick * r;
 	    var spriteWidth = 2 * (margin.x + rectBorderThick + textBorderThick) + textMaxWidth; //还要考虑this.textshadowColor,太麻烦了不写了
 	    var spriteHeight = 2 * (margin.y + rectBorderThick + textBorderThick * this.text.length) + lineSpace * (this.text.length - 1) + textHeightAll;
+
+	    //canvas宽高只会向下取整数,所以为了防止拉伸模糊这里必须先取整
+	    spriteWidth = Math.floor(spriteWidth);
+	    spriteHeight = Math.floor(spriteHeight);
 	    context.canvas.width = spriteWidth;
 	    context.canvas.height = spriteHeight;
 	    context.font = this.fontWeight + ' ' + this.fontsize * r + 'px ' + this.fontface; //为何要再写一遍??
@@ -19634,6 +19638,21 @@
 	    posInViewport: new Vector2(x, y)
 	  };
 	};
+	Utils.getPointerPosAtHeight = function () {
+	  var planeZ = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+	  var pointer = arguments.length > 1 ? arguments[1] : undefined;
+	  var camera = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : viewer.mainViewport.camera;
+	  var origin = new Vector3(pointer.x, pointer.y, -1).unproject(camera),
+	    end = new Vector3(pointer.x, pointer.y, 1).unproject(camera);
+	  var dir = end.sub(origin);
+	  var r = (planeZ - origin.z) / dir.z;
+	  var x = r * dir.x + origin.x;
+	  var y = r * dir.y + origin.y;
+	  return {
+	    x,
+	    y
+	  };
+	};
 	Utils.screenPass = new function () {
 	  this.screenScene = new Scene();
 	  this.screenQuad = new Mesh(new PlaneBufferGeometry(2, 2, 1));
@@ -21956,15 +21975,10 @@
 	  var moveModel = e => {
 	    //根据鼠标移动的位置改变位置
 
-	    var camera = viewer.mainViewport.camera;
-	    var origin = new Vector3(e.pointer.x, e.pointer.y, -1).unproject(camera),
-	      end = new Vector3(e.pointer.x, e.pointer.y, 1).unproject(camera);
-	    var dir = end.sub(origin);
-	    var planeZ = 0;
-	    var r = (planeZ - origin.z) / dir.z;
-	    var x = r * dir.x + origin.x;
-	    var y = r * dir.y + origin.y;
-
+	    var {
+	      x,
+	      y
+	    } = Potree.Utils.getPointerPosAtHeight(0, e.pointer);
 	    //过后改为根据intersect的点来设置底部高度;这样的话,需要发送高度
 
 	    /*let pos = new THREE.Vector3(x,y,  planeZ  )
@@ -25450,10 +25464,14 @@
 	        if (hoveredElements.length > 0) {
 	          var object = hoveredElements.map(e => e.object).find(e => e._listeners && e._listeners['mousemove']);
 	          if (object) {
-	            object.dispatchEvent({
+	            /* object.dispatchEvent({
+	                type: 'mousemove',
+	                object: object
+	            }); */
+	            object.dispatchEvent($.extend(this.getEventDesc(e), {
 	              type: 'mousemove',
-	              object: object
-	            });
+	              hoveredElement: hoveredElements.find(e => e.object == object)
+	            }));
 	          }
 	        }
 	        this.hoveredElements = hoveredElements;
@@ -40114,15 +40132,24 @@
 	    }
 	    e.drag.object.isDragging = true;
 	    I = e.intersect && (e.intersect.adsorption ? e.intersect.location : e.intersect.orthoIntersect || e.intersect.location);
-	    if (viewer.inputHandler.pressedKeys[18] || Potree.settings.dragPolyBeyondPoint && !I) {
-	      //alt    dragPolyBeyondPoint可以平移拖拽到无点的地方---测试用
-	      var i = this.markers.indexOf(e.drag.object);
-	      I = this.points[i].clone();
-	      var projected = I.clone().project(e.drag.dragViewport.camera);
-	      projected.x = e.pointer.x;
-	      projected.y = e.pointer.y;
-	      var unprojected = projected.clone().unproject(e.drag.dragViewport.camera);
-	      I.copy(unprojected);
+	    if (!I) {
+	      if (this.zPlaneWhenNoIntersect != void 0) {
+	        var {
+	          x,
+	          y
+	        } = Potree.Utils.getPointerPosAtHeight(this.zPlaneWhenNoIntersect, e.pointer);
+	        I = new Vector3(x, y, this.zPlaneWhenNoIntersect);
+	      }
+	      if (viewer.inputHandler.pressedKeys[18] || Potree.settings.dragPolyBeyondPoint) {
+	        //alt    dragPolyBeyondPoint可以平移拖拽到无点的地方---测试用
+	        var i = this.markers.indexOf(e.drag.object);
+	        I = this.points[i].clone();
+	        var projected = I.clone().project(e.drag.dragViewport.camera);
+	        projected.x = e.pointer.x;
+	        projected.y = e.pointer.y;
+	        var unprojected = projected.clone().unproject(e.drag.dragViewport.camera);
+	        I.copy(unprojected);
+	      }
 	    }
 	    if (I) {
 	      var _i = this.markers.indexOf(e.drag.object);
@@ -40138,6 +40165,8 @@
 	                this.points_datasets[_i] = pointcloud.dataset_id;
 	              } else this.points_datasets[_i] = null;
 	            }
+	          } else if (this.zPlaneWhenNoIntersect != void 0) {
+	            this.points_datasets[_i] = this.dataset_points[_i] = null;
 	          }
 	        }
 	      }
@@ -40800,7 +40829,10 @@
 	  },
 	  renderOrder: Potree.config.renderOrders.measureLabel,
 	  pickOrder: Potree.config.renderOrders.measureLabel,
-	  transform2D: [0, -0.15],
+	  transform2D: {
+	    x: 0,
+	    y: -0.15
+	  },
 	  useDepth: true,
 	  // 2023.10 尽量不让数字被挡住
 	  clipDistance: 10,
@@ -40833,7 +40865,10 @@
 	  fontsize: 14 * textSizeRatio,
 	  renderOrder: Potree.config.renderOrders.measureLabelSub,
 	  pickOrder: Potree.config.renderOrders.measureLabelSub,
-	  transform2D: [0, -0.13]
+	  transform2D: {
+	    x: 0,
+	    y: -0.13
+	  }
 	};
 	var angle = MathUtils.degToRad(5); //显示水平垂直辅助线的最小角度
 	var guideShowMinAngle = {
@@ -42138,8 +42173,9 @@
 	var texLoader$7 = new TextureLoader();
 	var markerMats$1;
 	var labelSizeInfo$1 = {
-	  width2d: 200
-	};
+	  width2d: 180
+	}; //稍微小点防止字体模糊
+
 	var titleLineHeight = 2;
 	var arrowCountMax = 100; //箭头总数不能超过这个值。 The count value passed into the constructor represents the maximum number of instances of this mesh. You can change the number of instances at runtime to an integer value in the range [0, count].If you need more instances than the original count value, you have to create a new InstancedMesh.
 	var lastArrowCamPos,
@@ -42174,6 +42210,11 @@
 	        delete: new MeshBasicMaterial({
 	          transparent: true,
 	          map: texLoader$7.load(Potree.resourcePath + '/textures/dot_r.png')
+	        }),
+	        adding: new MeshBasicMaterial({
+	          transparent: true,
+	          opacity: 0.3,
+	          map: texLoader$7.load(Potree.resourcePath + '/textures/dot_n.png')
 	        })
 	      };
 	      for (var i in mats) {
@@ -42217,27 +42258,30 @@
 	  var s = halfPathWidth * 2.9;
 	  marker.scale.set(s, s, s);
 	};
-	/* let getFakeMarker = ()=>{//添加marker时指示位置 
-	    let marker
-	    if(!marker){
-	        let marker = new THREE.Mesh(planeGeo, getMarkerMat('default'))  
-	            marker.name = 'fakeMarker'
-	            setMarkerScale(marker,this.halfPathWidth)
-	            marker.markerSelectStates = {} 
-	            Potree.Utils.setObjectLayers(marker, 'measure' )
-	            marker.renderOrder = Potree.config.renderOrders.path.marker
-	 
-	    } 
-	    return 
-	}
-	  */
-
+	var fakeMarker;
+	var showFakeMarker = (path, position) => {
+	  //添加marker时指示位置  
+	  if (!fakeMarker) {
+	    fakeMarker = new Mesh(planeGeo$2, getMarkerMat('adding'));
+	    fakeMarker.name = 'fakeMarker';
+	    fakeMarker.renderOrder = Potree.config.renderOrders.path.marker;
+	  }
+	  setMarkerScale(fakeMarker, path.halfPathWidth);
+	  path.add(fakeMarker);
+	  fakeMarker.position.copy(position);
+	  Potree.Utils.updateVisible(fakeMarker, 'add', true);
+	  return fakeMarker;
+	};
+	var hideFakeMarker = () => {
+	  fakeMarker && Potree.Utils.updateVisible(fakeMarker, 'add', false);
+	};
 	class Path$1 extends ctrlPolygon {
 	  constructor(prop) {
 	    super('Path', prop);
+	    this.zPlaneWhenNoIntersect = 0; //允许不在model上,直接绘制此高度的水平面上
 	    this.markerLabels = [];
 	    this.points_datasets || (this.points_datasets = []); //存每个点是哪个数据集
-
+	    this.hoverStates = {};
 	    {
 	      var group = new Object3D();
 	      group.name = 'titleGroup';
@@ -42341,6 +42385,7 @@
 	      var addHoverEvent = () => {
 	        var mouseover = e => {
 	          this.setSelected(true, 'edge');
+	          this.hoverStates.edge = true;
 	          if (this.addOrRemovePoint && !this.isNew) {
 	            viewer.dispatchEvent({
 	              type: "CursorChange",
@@ -42351,23 +42396,35 @@
 	        };
 	        var mouseleave = e => {
 	          this.setSelected(false, 'edge');
+	          this.hoverStates.edge = false;
 	          viewer.dispatchEvent({
 	            type: "CursorChange",
 	            action: 'remove',
 	            name: 'pen_addPoint'
 	          });
+	          hideFakeMarker();
 	        };
 	        this.edge.addEventListener('mouseover', mouseover);
 	        this.edge.addEventListener('mouseleave', mouseleave);
+	        this.edge.addEventListener('mousemove', e => {
+	          if (this.addOrRemovePoint && !this.isNew && !this.hoverStates.marker) {
+	            var {
+	              index,
+	              prevIndex,
+	              point
+	            } = this.getPosByIntersect(e);
+	            showFakeMarker(this, point);
+	          }
+	        });
 	        this.edge.addEventListener('click', e => {
 	          var now = Date.now();
 	          if (now - this.lastDropTime < 100 || this.isNew || e.button !== MOUSE.LEFT) return;
 	          if (this.addOrRemovePoint) {
-	            viewer.measuringTool.history.beforeChange(this);
-	            var prevIndex = Math.floor(e.hoveredElement.faceIndex / 2); //端点1(可能是最后一个)
-	            var nextIndex = this.getIndex(prevIndex, 1); //端点2(可能是第一个)
-	            var index = prevIndex + 1; //新点在端点1后
-	            var point = math.getFootPoint(e.hoveredElement.point, this.points[prevIndex], this.points[nextIndex]);
+	            var {
+	              index,
+	              prevIndex,
+	              point
+	            } = this.getPosByIntersect(e);
 	            this.addMarker({
 	              index,
 	              point,
@@ -42428,6 +42485,18 @@
 	      this.titleLabel.updatePose();
 	    }
 	  }
+	  getPosByIntersect(e) {
+	    //intersect落在线上的位置
+	    var prevIndex = Math.floor(e.hoveredElement.faceIndex / 2); //端点1(可能是最后一个)
+	    var nextIndex = this.getIndex(prevIndex, 1); //端点2(可能是第一个)
+	    var index = prevIndex + 1; //新点在端点1后
+	    var point = math.getFootPoint(e.hoveredElement.point, this.points[prevIndex], this.points[nextIndex]);
+	    return {
+	      index,
+	      prevIndex,
+	      point
+	    };
+	  }
 	  createMarkerLabel(text, hasHoverEvent) {
 	    var label = new TextSprite$2($.extend({}, depthProps, {
 	      sizeInfo: labelSizeInfo$1,
@@ -42531,9 +42600,17 @@
 	          var OA = new Vector3().subVectors(A, O).setZ(0).normalize(); //只保证俯视角度正确。(如果两点有高度差,该段四个点不会在同一平面,看起来有扭转,有的地方会肥大,但从俯视角度看是正确的。)
 	          var OB = new Vector3().subVectors(B, O).setZ(0).normalize();
 	          var angle = math.getAngle(OA, OB, 'z');
-	          if (angle == 0) return console.log('updatePath 180度折回了,不绘制'); //添加点的时候偶会这样,拉开就好
-	          var midVecLength = this.halfPathWidth / Math.sin(angle / 2);
-	          sideVec = new Vector3().addVectors(OA, OB).normalize().multiplyScalar(midVecLength); //角平分线  ( 和上一个方向保持在同一侧,故而顺时针和逆时针方向不同  )
+	          if (math.closeTo(angle, 0, 1e-4) || math.closeTo(angle, Math.PI, 1e-4) || math.closeTo(angle, -Math.PI, 1e-4)) {
+	            //这时候直接加两个向量算出的平分线不准,故直接找垂线
+	            sideVec = new Vector3().copy(math.getNormal2d({
+	              p1: O,
+	              p2: A
+	            })).setZ(0).multiplyScalar(this.halfPathWidth); //垂线
+	            //console.log('接近0或180',angle, sideVec)
+	          } else {
+	            var midVecLength = this.halfPathWidth / Math.sin(angle / 2);
+	            sideVec = new Vector3().addVectors(OA, OB).normalize().multiplyScalar(midVecLength); //角平分线  ( 和上一个方向保持在同一侧,故而顺时针和逆时针方向不同  )
+	          }
 	        }
 	        var P1 = new Vector3().addVectors(O, sideVec);
 	        var P2 = new Vector3().subVectors(O, sideVec);
@@ -42579,7 +42656,9 @@
 	          action: 'add',
 	          name: 'pen_delPoint'
 	        });
+	        hideFakeMarker();
 	      }
+	      this.hoverStates.marker = marker;
 	    } /* ,{importance:1} */);
 	    marker.addEventListener('mouseleave', e => {
 	      viewer.dispatchEvent({
@@ -42587,6 +42666,7 @@
 	        action: 'remove',
 	        name: 'pen_delPoint'
 	      });
+	      marker == this.hoverStates.marker && (this.hoverStates.marker = null);
 	    });
 	    marker.addEventListener('click', e => {
 	      if (this.isNew || e.button !== MOUSE.LEFT) return;
@@ -42689,11 +42769,38 @@
 	  setAddOrRemPoint(state) {
 	    //是否可以加减点, 此时不能拖拽marker
 	    this.addOrRemovePoint = !!state;
+	    this.updateCursorState();
+	  }
+	  updateCursorState() {
+	    //可能在hover时修改addOrRemovePoint,也可能从marker和edge之间切换, 主要是addOrRemovePoint开关时要记得之前的hover状态
 	    viewer.dispatchEvent({
 	      type: "CursorChange",
-	      action: state ? 'add' : 'remove',
+	      action: this.addOrRemovePoint ? 'add' : 'remove',
 	      name: 'pen'
 	    });
+	    if (this.addOrRemovePoint && !this.isNew) {
+	      viewer.dispatchEvent({
+	        type: "CursorChange",
+	        action: this.hoverStates.edge ? 'add' : 'remove',
+	        name: 'pen_addPoint'
+	      });
+	      viewer.dispatchEvent({
+	        type: "CursorChange",
+	        action: this.hoverStates.marker ? 'add' : 'remove',
+	        name: 'pen_delPoint'
+	      });
+	    } else {
+	      viewer.dispatchEvent({
+	        type: "CursorChange",
+	        action: 'remove',
+	        name: 'pen_addPoint'
+	      });
+	      viewer.dispatchEvent({
+	        type: "CursorChange",
+	        action: 'remove',
+	        name: 'pen_delPoint'
+	      });
+	    }
 	  }
 	  setTitleVisi(label, v) {
 	    var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
@@ -43864,10 +43971,17 @@
 
 	      //console.log('measure clicked33', !!e.intersectPoint)
 
-	      //var I = e.intersectPoint && (e.intersectPoint.orthoIntersect || e.intersectPoint.location)
 	      var I = e.intersect && (e.intersect.orthoIntersect || e.intersect.location);
 	      if (!I) {
-	        return measure.dispatchEvent('intersectNoPointcloud');
+	        if (measure.zPlaneWhenNoIntersect != void 0) {
+	          var {
+	            x,
+	            y
+	          } = Potree.Utils.getPointerPosAtHeight(measure.zPlaneWhenNoIntersect, e.pointer);
+	          I = new Vector3(x, y, measure.zPlaneWhenNoIntersect);
+	        } else {
+	          return measure.dispatchEvent('intersectNoPointcloud');
+	        }
 	      }
 	      var atMap = e.drag.dragViewport.name == 'mapViewport';
 	      //在地图上测量的首个点按楼层高度(暂时先只按mainViewport相机高度吧,但navvis是按楼层,画在楼层的地面上,可能因为平面图显示的是楼层近地面),
@@ -56604,7 +56718,7 @@
 	      root: group,
 	      text: '',
 	      sizeInfo: {
-	        width2d: 200
+	        width2d: 130
 	      },
 	      textColor: {
 	        r: 255,
@@ -56619,7 +56733,7 @@
 	        a: 0.7
 	      },
 	      borderRadius: 6,
-	      fontsize: this.fontsize || 13,
+	      fontsize: this.fontsize || 14,
 	      fontWeight: '',
 	      //thick
 	      renderOrder: Potree.config.renderOrders.tag.label,

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1 - 1
public/lib/potree/potree.js.map


+ 2 - 2
src/sdk/cover/index.js

@@ -340,7 +340,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                 //未被删除  
                 console.warn('changePoints', measure.dataset_points.length )   
                 if(measure.type == 'Path'){ 
-                    bus.emit('changePoints', measure.dataset_points.map((p,i)=>{return {position:p.clone(), modelId:measure.points_datasets[i], name:measure.markerLabels[i].originText}}))
+                    bus.emit('changePoints', measure.dataset_points.map((p,i)=>{return {position: (p || measure.points[i]).clone(), modelId:measure.points_datasets[i], name:measure.markerLabels[i].originText}}))
                 }else{
                     bus.emit('update', [
                         measure.dataset_points.map(p => p.clone()),
@@ -1977,7 +1977,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
 
             cDir = Cesium.Cartesian3.normalize(cDir, new Cesium.Cartesian3());
             cUp = Cesium.Cartesian3.normalize(cUp, new Cesium.Cartesian3());
- 
+            //console.log('ces', 'cPos', cPos, 'cDir',cDir, 'cUp', cUp)
             cesiumViewer.camera.setView({
                 destination: cPos,
                 orientation: {