|
@@ -22,7 +22,7 @@ var markerMats;
|
|
|
var lineMats;
|
|
|
var planeMats
|
|
|
|
|
|
-const textSizeRatio = math.linearClamp(window.innerWidth * window.innerHeight , 360*720, 1920*1080, 0.75, 1) //pc字显示大一些
|
|
|
+const textSizeRatio = math.linearClamp(window.innerWidth * window.innerHeight , 360*720, 1920*1080, 0.7, 1) //pc字显示大一些
|
|
|
|
|
|
const lineDepthInfo = {
|
|
|
clipDistance : 4,//消失距离
|
|
@@ -137,14 +137,23 @@ export class Measure extends ctrlPolygon{
|
|
|
this.setUnitSystem(prop.unit || viewer.unitConvert.UnitService.defaultSystem)
|
|
|
Potree.Utils.setObjectLayers(this, 'measure' )
|
|
|
|
|
|
+
|
|
|
+ /* if(this.measureType == 'MulDistance'){
|
|
|
+ this.showTotalDis = true
|
|
|
+
|
|
|
+ this.totalDisLabel = this.createTotalDisLabel()
|
|
|
+ this.add(this.totalDisLabel)
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
//addMarkers:
|
|
|
-
|
|
|
+
|
|
|
this.initData(prop)
|
|
|
|
|
|
|
|
|
this.points_datasets || (this.points_datasets = []) //存每个点是哪个数据集
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
|
|
|
this.addEventListener('marker_dropped',(e)=>{
|
|
@@ -303,13 +312,20 @@ export class Measure extends ctrlPolygon{
|
|
|
let distance = point.distanceTo(nextPoint)
|
|
|
edgeLabel.shouldVisi = (index < lastIndex || this.isRect || this.closed && !this.isNew ) && distance>0
|
|
|
/* this.closed || */edgeLabel.setVisible(edgeLabel.shouldVisi)
|
|
|
- if(edgeLabel.visible){
|
|
|
+
|
|
|
+ if(edgeLabel.shouldVisi){
|
|
|
edgeLabel.lineDir = new THREE.Vector3().subVectors(point,nextPoint).normalize() //[point,nextPoint]
|
|
|
setEdgeLabel(edgeLabel,point,nextPoint,distance)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+ if(Potree.config.measure.mulLabelHideFaraway ){
|
|
|
+ this.measureType == 'MulDistance' && this.clearEdgeLabelVisi()
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
if(this.measureType == 'Distance' && this.points.length>1){//设置水平垂直辅助线
|
|
|
var pTop, pBtm
|
|
|
if(this.points[0].z > this.points[1].z ){
|
|
@@ -353,10 +369,117 @@ export class Measure extends ctrlPolygon{
|
|
|
this.areaLabel.setVisible(true)
|
|
|
//}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ if(this.showTotalDis && this.points.length > 2){
|
|
|
+ //this.ifShowTotalDis()
|
|
|
+ let dis = this.getTotalDistance()
|
|
|
+ let msg = viewer.unitConvert.convert(dis, 'distance', Potree.settings.precision , this.unitSystem, 0.01 , true )
|
|
|
+ this.center = this.getCenter()
|
|
|
+ this.totalDisLabel.setPos(this.center);
|
|
|
+ this.totalDisLabel.setText(msg);
|
|
|
+ this.totalDisLabel.setVisible(true)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
};
|
|
|
|
|
|
|
|
|
-
|
|
|
+ ifShowTotalDis(){
|
|
|
+ if(this.measureType == 'MulDistance' ){
|
|
|
+ let show = this.points.length > 2
|
|
|
+
|
|
|
+ if(show){
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ this.showTotalDis = show
|
|
|
+ }
|
|
|
+ /* 连续测量:
|
|
|
+ 1. ≥2次测量,单个距离<15cm时,居中显示总长
|
|
|
+ 2. 若连续测量的线段中,大于等于1段超出15cm,所有线段均显示长度
|
|
|
+ -------------------
|
|
|
+ 所有连续测量共用逻辑:
|
|
|
+ 选中或者鼠标悬浮时,显示所有单个线段的长度(第1点不同,选中或悬浮也显示总长)
|
|
|
+ 离开时,均显示总长 */
|
|
|
+ }
|
|
|
+
|
|
|
+ clearEdgeLabelVisi(){//修改点位置后清空,下次render时会自动getEdgeLabelVisi
|
|
|
+ let lastIndex = this.points.length - 1;
|
|
|
+ for (let index = 0; index <= lastIndex; index++) {
|
|
|
+ if(!this.closed && index == lastIndex)continue
|
|
|
+ let edgeLabel = this.edgeLabels[index];
|
|
|
+ edgeLabel.visiMap.clear()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ getEdgeLabelVisi(viewport){//获取多折线的edgelabel在不同视图里的可见性。要保证任何时候label能出现的线最小二维长度一致
|
|
|
+ let camera = viewport.camera
|
|
|
+ let lastIndex = this.points.length - 1;
|
|
|
+ /* let pos2ds = this.points.map(point=> point.clone().project(camera) ) //即使只是旋转也会变动,尤其是转到屏幕外后变为显示。所以不用这种
|
|
|
+ let minDis = 0.01; */
|
|
|
+ let minDis = 0.02 , minAngleRatio = 0.07, minAngle
|
|
|
+ let vecs
|
|
|
+ let forceShow
|
|
|
+ if(camera.type == 'OrthographicCamera'){
|
|
|
+ minDis *= Math.pow(camera.top / camera.zoom, 2);
|
|
|
+ //console.log(minDis)
|
|
|
+ }else{
|
|
|
+ if(Potree.settings.displayMode == 'showPanos' && viewer.images360.zoomLevel == Potree.settings.zoom.max){
|
|
|
+ forceShow = true //当zoom到最大时强制显示,避免有的线太短永远显示不出长度
|
|
|
+ }else{
|
|
|
+ vecs = this.points.map(point=> new THREE.Vector3().subVectors(point, camera.position).normalize())
|
|
|
+ minAngleRatio /= viewport.resolution.y / 1000 / textSizeRatio //角度占fov最小比率
|
|
|
+ minAngle = minAngleRatio * THREE.Math.degToRad(camera.fov)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for (let index = 0; index <= lastIndex; index++) {
|
|
|
+ if(!this.closed && index == lastIndex)continue
|
|
|
+ let edgeLabel = this.edgeLabels[index];
|
|
|
+
|
|
|
+ let nextIndex = (index + 1 > lastIndex) ? 0 : index + 1;
|
|
|
+ let previousIndex = (index === 0) ? lastIndex : index - 1;
|
|
|
+
|
|
|
+ let point = this.points[index];
|
|
|
+ let nextPoint = this.points[nextIndex];
|
|
|
+ /* let point2d = pos2ds[index];
|
|
|
+ let nextPoint2d = pos2ds[nextIndex];
|
|
|
+ let dis2d = point2d.distanceToSquared(nextPoint2d)
|
|
|
+ let v = dis2d > minDis //可见长度太小,为避免拥挤,不显示
|
|
|
+ edgeLabel.visiMap.set(camera, v) */
|
|
|
+ let v
|
|
|
+
|
|
|
+ if(forceShow){
|
|
|
+ v = true
|
|
|
+
|
|
|
+ }else if(camera.type == 'OrthographicCamera'){
|
|
|
+ let vec = new THREE.Vector3().subVectors(point,nextPoint)
|
|
|
+ let projVec = vec.projectOnPlane(viewport.view.direction)
|
|
|
+ v = projVec.lengthSq() > minDis
|
|
|
+ }else{
|
|
|
+ let vec0 = vecs[index];
|
|
|
+ let vec1 = vecs[nextIndex];
|
|
|
+ v = Math.acos(vec0.dot(vec1)) > minAngle //角度过小代表可见长度太小,为避免拥挤,不显示
|
|
|
+
|
|
|
+ }
|
|
|
+ edgeLabel.visiMap.set(camera, v)
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
setEdgeLabelPos(label,p1,p2){ //调整label的位置,使倾斜后看起来在线的中心,而不要挡住端点
|
|
|
let center = new THREE.Vector3().addVectors(p1,p2).multiplyScalar(0.5);
|
|
@@ -461,6 +584,11 @@ export class Measure extends ctrlPolygon{
|
|
|
edge.addEventListener('mouseover', mouseover);
|
|
|
edge.addEventListener('mouseleave', mouseleave);
|
|
|
edge.removeEventListener('addHoverEvent', addHoverEvent);
|
|
|
+
|
|
|
+ edge.addEventListener('click',()=>{
|
|
|
+ this.isNew || viewer.focusOnObject(this, 'measure')
|
|
|
+ })
|
|
|
+
|
|
|
}
|
|
|
edge.addEventListener('addHoverEvent', addHoverEvent);
|
|
|
}
|
|
@@ -787,32 +915,51 @@ export class Measure extends ctrlPolygon{
|
|
|
edgeLabel.sprite.material.depthTestWhenPick = true
|
|
|
Potree.Utils.setObjectLayers(edgeLabel, 'measure' )
|
|
|
this.add(edgeLabel)
|
|
|
+
|
|
|
+ if(this.measureType == 'MulDistance'){
|
|
|
+ edgeLabel.visiMap = new Map()
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
return edgeLabel
|
|
|
}
|
|
|
|
|
|
- createAreaLabel(){
|
|
|
+ createAreaLabel(){
|
|
|
+ const areaLabel = this.createCenterLabel('areaLabel')
|
|
|
+
|
|
|
+ return areaLabel;
|
|
|
+ }
|
|
|
+
|
|
|
+ createTotalDisLabel(){
|
|
|
+ const totalDisLabel = this.createCenterLabel('totalDisLabel')
|
|
|
+
|
|
|
+ return totalDisLabel;
|
|
|
+ }
|
|
|
|
|
|
- const areaLabel = new TextSprite(
|
|
|
- $.extend({},mainLabelProp,{sizeInfo: labelSizeInfo, name:'areaLabel_', disToLine:0, fontsize:16*textSizeRatio} )
|
|
|
+ createCenterLabel(name){
|
|
|
+ const centerLabel = new TextSprite(
|
|
|
+ $.extend({},mainLabelProp,{sizeInfo: labelSizeInfo, name, disToLine:0, fontsize:16*textSizeRatio} )
|
|
|
)
|
|
|
|
|
|
- areaLabel.addEventListener('mouseover',()=>{
|
|
|
- this.setSelected(true, 'areaLabel')
|
|
|
+ centerLabel.addEventListener('mouseover',()=>{
|
|
|
+ this.setSelected(true, 'centerLabel')
|
|
|
})
|
|
|
- areaLabel.addEventListener('mouseleave',()=>{
|
|
|
- this.setSelected(false, 'areaLabel')
|
|
|
+ centerLabel.addEventListener('mouseleave',()=>{
|
|
|
+ this.setSelected(false, 'centerLabel')
|
|
|
})
|
|
|
- areaLabel.addEventListener('click',()=>{
|
|
|
+ centerLabel.addEventListener('click',()=>{
|
|
|
this.isNew || viewer.focusOnObject(this, 'measure')
|
|
|
})
|
|
|
- Potree.Utils.setObjectLayers(areaLabel, 'measure' )
|
|
|
- areaLabel.setVisible(false)
|
|
|
-
|
|
|
- return areaLabel;
|
|
|
-
|
|
|
+ Potree.Utils.setObjectLayers(centerLabel, 'measure' )
|
|
|
+ centerLabel.setVisible(false)
|
|
|
|
|
|
+ return centerLabel;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
getMarkerMaterial(type) {
|
|
|
if(!markerMats){
|
|
@@ -1052,6 +1199,9 @@ export class Measure extends ctrlPolygon{
|
|
|
this.area = {value:0};
|
|
|
this.areaLabel && this.areaLabel.setVisible(false)
|
|
|
}
|
|
|
+ if(this.showTotalDis){
|
|
|
+ this.totalDisLabel && this.totalDisLabel.setVisible(false)
|
|
|
+ }
|
|
|
viewer.inputHandler.dispatchEvent( {type:'isMeasuring', v:true, cause:'reDraw'} )
|
|
|
|
|
|
}
|