|
@@ -179,6 +179,134 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ createMeasureFromData(data){//add
|
|
|
+ const measure = new Measure(data);
|
|
|
+
|
|
|
+ viewer.scene.addMeasurement(measure);
|
|
|
+
|
|
|
+ if(measure.guideLine)measure.guideLine.visible = false
|
|
|
+ return measure
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ update(){
|
|
|
+ return;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ let camera = this.viewer.scene.getActiveCamera();
|
|
|
+ let domElement = this.renderer.domElement;
|
|
|
+ let measurements = this.viewer.scene.measurements;
|
|
|
+
|
|
|
+
|
|
|
+ // make size independant of distance
|
|
|
+ let mainLabels = [], subLabels = [];
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for (let measure of measurements) {
|
|
|
+ measure.lengthUnit = this.viewer.lengthUnit;
|
|
|
+ measure.lengthUnitDisplay = this.viewer.lengthUnitDisplay;
|
|
|
+ //measure.update();
|
|
|
+
|
|
|
+ updateAzimuth(this.viewer, measure);
|
|
|
+
|
|
|
+
|
|
|
+ /* [...measure.markers, ...measure.edgeLabels, measure.areaLabel].forEach(e=>{
|
|
|
+ e && e.update()
|
|
|
+ }); */
|
|
|
+
|
|
|
+
|
|
|
+ // labels
|
|
|
+ /* let labels = measure.edgeLabels.concat(measure.angleLabels);
|
|
|
+ for(let label of labels){
|
|
|
+ label.update()
|
|
|
+ if(label.elem.hasClass('sub')){
|
|
|
+ subLabels.push(label)
|
|
|
+ }else{
|
|
|
+ mainLabels.push(label)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // coordinate labels
|
|
|
+ for (let j = 0; j < measure.coordinateLabels.length; j++) {
|
|
|
+ let label = measure.coordinateLabels[j];
|
|
|
+ label.update()
|
|
|
+ mainLabels.push(label)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(measure.showArea){ // area label
|
|
|
+ let label = measure.areaLabel;
|
|
|
+ label.update()
|
|
|
+ mainLabels.push(label)
|
|
|
+ } */
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /* if(measure.showCircle){ // radius label
|
|
|
+ let label = measure.circleRadiusLabel;
|
|
|
+ let distance = label.position.distanceTo(camera.position);
|
|
|
+ let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);
|
|
|
+
|
|
|
+ let scale = (70 / pr);
|
|
|
+ label.scale.set(scale, scale, scale);
|
|
|
+ } */
|
|
|
+ if(!this.showLabels){
|
|
|
+ const labels = [
|
|
|
+ ...measure.sphereLabels,
|
|
|
+ ...measure.angleLabels,
|
|
|
+ measure.circleRadiusLabel,
|
|
|
+ ];
|
|
|
+ for(const label of labels){
|
|
|
+ label.visible = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //this.updateLabelZIndex([{labels:subLabels},{labels:mainLabels}])
|
|
|
+
|
|
|
+ }
|
|
|
+ setSize(e){ //e.resolution
|
|
|
+ /* if(Measure.lineMats){
|
|
|
+ for(var m in Measure.lineMats){
|
|
|
+ Measure.lineMats[m].resolution.set(e.canvasWidth, e.canvasHeight);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(Measure.sphereMats){
|
|
|
+ for(var s in Measure.sphereMats){
|
|
|
+ Measure.sphereMats[s].uniforms.resolution.value.set(e.canvasWidth, e.canvasHeight);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (let measure of this.viewer.scene.measurements) {
|
|
|
+ measure.edgeLabels.concat(measure.areaLabel).forEach(label=>{
|
|
|
+ label.sprite.material.uniforms.resolution.value.set(e.canvasWidth, e.canvasHeight);
|
|
|
+ })
|
|
|
+ } */
|
|
|
+ }
|
|
|
+
|
|
|
+ updateLabelZIndex(group){//[{labels:[]},{}] 顺序按照z-index低到高
|
|
|
+
|
|
|
+ group.forEach((e,i)=>{
|
|
|
+ e.base = group[i-1] ? group[i-1].base + group[i-1].labels.length : 0
|
|
|
+
|
|
|
+ var labels = e.labels.sort((a,b)=>{
|
|
|
+ return b.pos2d.z - a.pos2d.z
|
|
|
+ })
|
|
|
+ labels.forEach((label,index)=>{
|
|
|
+ $(label.elem).css('z-index', e.base+index)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
editStateChange(e){
|
|
|
//console.log("editStateChange" , e.state)
|
|
|
let state = e.state
|
|
@@ -192,9 +320,12 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
viewer.dispatchEvent({type:"endMeasureMove"})
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ //this.editing =
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
startInsertion (args = {}, callback, cancelFun) {
|
|
|
|
|
|
|
|
@@ -237,9 +368,9 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
measure: measure
|
|
|
});
|
|
|
|
|
|
-
|
|
|
- measure.editStateChange(true)
|
|
|
measure.addEventListener('editStateChange', this.editStateChange.bind(this))
|
|
|
+ measure.editStateChange(true)
|
|
|
+
|
|
|
let timer;
|
|
|
|
|
|
|
|
@@ -270,7 +401,7 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
}
|
|
|
|
|
|
} else if (e.button === THREE.MOUSE.RIGHT /* e.drag.mouse === MOUSE.RIGHT */) {
|
|
|
- if(e.pressDistance < 2 )end(e);//非拖拽的话
|
|
|
+ if(e.pressDistance < Potree.config.clickMaxDragDis )end(e);//非拖拽的话
|
|
|
else continueDrag(e.drag.object)
|
|
|
|
|
|
}
|
|
@@ -283,10 +414,11 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
//this.viewer.scene.removeMeasurement(measure)
|
|
|
//cancelFun && cancelFun()
|
|
|
//重新开始画
|
|
|
- let pointCount = measure.points.length-1
|
|
|
- for(let i=0;i<pointCount;i++){
|
|
|
- measure.removeMarker(i)
|
|
|
- }
|
|
|
+ let pointCount = measure.points.length
|
|
|
+ while(pointCount > 0){
|
|
|
+ measure.removeMarker(--pointCount)
|
|
|
+ }
|
|
|
+
|
|
|
if(measure.showArea){
|
|
|
measure.point2dInfo = null
|
|
|
measure.area = {value:0};
|
|
@@ -294,8 +426,8 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
}
|
|
|
|
|
|
|
|
|
- measure.markers[0].visible = false
|
|
|
- continueDrag(measure.markers[0])
|
|
|
+ this.viewer.addEventListener('global_click', click, 10)
|
|
|
+
|
|
|
measure.editStateChange(true)
|
|
|
return
|
|
|
|
|
@@ -314,7 +446,8 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
clearTimeout(timer)
|
|
|
this.viewer.removeEventListener('cancel_insertions', Exit);
|
|
|
pressExit && this.viewer.inputHandler.removeEventListener('keydown', pressExit);
|
|
|
- callback && callback()
|
|
|
+ this.viewer.removeEventListener('global_click', click)
|
|
|
+ e.remove || callback && callback()
|
|
|
/* this.viewer.dispatchEvent({
|
|
|
type: 'finish_inserting_measurement',
|
|
|
measure: measure
|
|
@@ -323,8 +456,11 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
|
|
|
|
|
|
let Exit = (e)=>{//模拟右键点击
|
|
|
- console.log('Exit')
|
|
|
- if(this.viewer.inputHandler.drag){//还未触发drop的话
|
|
|
+ console.log('Exit: ' + measure.id)
|
|
|
+ if(e.remove){
|
|
|
+ viewer.scene.removeMeasurement(measure)
|
|
|
+ }
|
|
|
+ if(this.viewer.inputHandler.drag && !e.remove){//还未触发drop的话
|
|
|
this.viewer.inputHandler.drag.object.dispatchEvent({
|
|
|
type: 'drop',
|
|
|
drag: this.viewer.inputHandler.drag,
|
|
@@ -332,13 +468,15 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
pressDistance:0,
|
|
|
button : THREE.MOUSE.RIGHT
|
|
|
});
|
|
|
- this.viewer.inputHandler.drag = null
|
|
|
+
|
|
|
}else{
|
|
|
- end({finish:true}) //未结束时添加新的measure时会触发
|
|
|
+ end({finish:true, remove:e.remove}) //未结束时添加新的measure时会触发
|
|
|
}
|
|
|
+ this.viewer.inputHandler.drag = null
|
|
|
+ measure.editStateChange(false)
|
|
|
}
|
|
|
this.viewer.addEventListener('cancel_insertions', Exit);
|
|
|
-
|
|
|
+
|
|
|
|
|
|
let pressExit
|
|
|
if(!Potree.settings.isOfficial){
|
|
@@ -351,13 +489,30 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
}
|
|
|
|
|
|
|
|
|
- var marker = measure.addMarker({point:new THREE.Vector3(0, 0, 0)})
|
|
|
+ /* var marker = measure.addMarker({point:new THREE.Vector3(0, 0, 0)})
|
|
|
this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽
|
|
|
|
|
|
if(measure.maxMarkers > 1){
|
|
|
marker.visible = false
|
|
|
- }
|
|
|
-
|
|
|
+ } */
|
|
|
+ let click = (e)=>{
|
|
|
+
|
|
|
+ var marker = measure.addMarker({point:new THREE.Vector3(0, 0, 0)})
|
|
|
+ this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽
|
|
|
+ e.drag = this.viewer.inputHandler.drag
|
|
|
+ e.drag.endDragFun = endDragFun
|
|
|
+ e.drag.notPressMouse = true
|
|
|
+ e.intersectPoint = this.viewer.inputHandler.intersectPoint
|
|
|
+ measure.dragMarker(e)
|
|
|
+ measure.dropMarker(e)
|
|
|
+
|
|
|
+ this.viewer.removeEventListener('global_click', click)///* global_drop */
|
|
|
+
|
|
|
+ return {stopContinue:true}//防止继续执行别的侦听,如flytopano
|
|
|
+ }
|
|
|
+ this.viewer.addEventListener('global_click', click, 10)//add importance:10
|
|
|
+
|
|
|
+
|
|
|
|
|
|
this.viewer.scene.addMeasurement(measure);
|
|
|
|
|
@@ -365,128 +520,6 @@ export class MeasuringTool extends EventDispatcher{
|
|
|
}
|
|
|
|
|
|
|
|
|
- createMeasureFromData(data){//add
|
|
|
- const measure = new Measure(data);
|
|
|
-
|
|
|
- viewer.scene.addMeasurement(measure);
|
|
|
-
|
|
|
- if(measure.guideLine)measure.guideLine.visible = false
|
|
|
- return measure
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- update(){
|
|
|
- return;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- let camera = this.viewer.scene.getActiveCamera();
|
|
|
- let domElement = this.renderer.domElement;
|
|
|
- let measurements = this.viewer.scene.measurements;
|
|
|
-
|
|
|
-
|
|
|
- // make size independant of distance
|
|
|
- let mainLabels = [], subLabels = [];
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- for (let measure of measurements) {
|
|
|
- measure.lengthUnit = this.viewer.lengthUnit;
|
|
|
- measure.lengthUnitDisplay = this.viewer.lengthUnitDisplay;
|
|
|
- //measure.update();
|
|
|
-
|
|
|
- updateAzimuth(this.viewer, measure);
|
|
|
-
|
|
|
-
|
|
|
- /* [...measure.markers, ...measure.edgeLabels, measure.areaLabel].forEach(e=>{
|
|
|
- e && e.update()
|
|
|
- }); */
|
|
|
-
|
|
|
-
|
|
|
- // labels
|
|
|
- /* let labels = measure.edgeLabels.concat(measure.angleLabels);
|
|
|
- for(let label of labels){
|
|
|
- label.update()
|
|
|
- if(label.elem.hasClass('sub')){
|
|
|
- subLabels.push(label)
|
|
|
- }else{
|
|
|
- mainLabels.push(label)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // coordinate labels
|
|
|
- for (let j = 0; j < measure.coordinateLabels.length; j++) {
|
|
|
- let label = measure.coordinateLabels[j];
|
|
|
- label.update()
|
|
|
- mainLabels.push(label)
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(measure.showArea){ // area label
|
|
|
- let label = measure.areaLabel;
|
|
|
- label.update()
|
|
|
- mainLabels.push(label)
|
|
|
- } */
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- /* if(measure.showCircle){ // radius label
|
|
|
- let label = measure.circleRadiusLabel;
|
|
|
- let distance = label.position.distanceTo(camera.position);
|
|
|
- let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);
|
|
|
-
|
|
|
- let scale = (70 / pr);
|
|
|
- label.scale.set(scale, scale, scale);
|
|
|
- } */
|
|
|
- if(!this.showLabels){
|
|
|
- const labels = [
|
|
|
- ...measure.sphereLabels,
|
|
|
- ...measure.angleLabels,
|
|
|
- measure.circleRadiusLabel,
|
|
|
- ];
|
|
|
- for(const label of labels){
|
|
|
- label.visible = false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //this.updateLabelZIndex([{labels:subLabels},{labels:mainLabels}])
|
|
|
-
|
|
|
- }
|
|
|
- setSize(e){ //e.resolution
|
|
|
- /* if(Measure.lineMats){
|
|
|
- for(var m in Measure.lineMats){
|
|
|
- Measure.lineMats[m].resolution.set(e.canvasWidth, e.canvasHeight);
|
|
|
- }
|
|
|
- }
|
|
|
- if(Measure.sphereMats){
|
|
|
- for(var s in Measure.sphereMats){
|
|
|
- Measure.sphereMats[s].uniforms.resolution.value.set(e.canvasWidth, e.canvasHeight);
|
|
|
- }
|
|
|
- }
|
|
|
- for (let measure of this.viewer.scene.measurements) {
|
|
|
- measure.edgeLabels.concat(measure.areaLabel).forEach(label=>{
|
|
|
- label.sprite.material.uniforms.resolution.value.set(e.canvasWidth, e.canvasHeight);
|
|
|
- })
|
|
|
- } */
|
|
|
- }
|
|
|
-
|
|
|
- updateLabelZIndex(group){//[{labels:[]},{}] 顺序按照z-index低到高
|
|
|
-
|
|
|
- group.forEach((e,i)=>{
|
|
|
- e.base = group[i-1] ? group[i-1].base + group[i-1].labels.length : 0
|
|
|
-
|
|
|
- var labels = e.labels.sort((a,b)=>{
|
|
|
- return b.pos2d.z - a.pos2d.z
|
|
|
- })
|
|
|
- labels.forEach((label,index)=>{
|
|
|
- $(label.elem).css('z-index', e.base+index)
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
render(o={}){
|
|
|
viewer.setCameraLayers(o.camera, ['measure'])
|
|
|
this.viewer.renderer.render(this.scene, o.camera/* this.viewer.scene.getActiveCamera() */);
|