MeasuringTool.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. import * as THREE from "../../../../libs/three.js/build/three.module.js";
  2. import {Measure} from "./Measure.js";
  3. import {Utils} from "../../../utils.js";
  4. import math from "../../utils/math.js";
  5. import {CameraMode} from "../../../defines.js";
  6. import {TextSprite} from '../TextSprite.js'
  7. import {Prism} from "../../modules/volumeCompute/Prism.js";
  8. function updateAzimuth(viewer, measure){
  9. if(!measure.showAzimuth)return
  10. const azimuth = measure.azimuth;
  11. const isOkay = measure.points.length === 2;
  12. azimuth.node.visible = isOkay
  13. if(!azimuth.node.visible){
  14. return;
  15. }
  16. const camera = viewer.scene.getActiveCamera();
  17. const renderAreaSize = viewer.renderer.getSize(new THREE.Vector2());
  18. const width = renderAreaSize.width;
  19. const height = renderAreaSize.height;
  20. const [p0, p1] = measure.points;
  21. const r = p0.position.distanceTo(p1.position);
  22. const northVec = Utils.getNorthVec(p0.position, r, viewer.getProjection());
  23. const northPos = p0.position.clone().add(northVec);
  24. azimuth.center.position.copy(p0.position);
  25. azimuth.center.scale.set(2, 2, 2);
  26. azimuth.center.visible = false;
  27. // azimuth.target.visible = false;
  28. { // north
  29. azimuth.north.position.copy(northPos);
  30. azimuth.north.scale.set(2, 2, 2);
  31. let distance = azimuth.north.position.distanceTo(camera.position);
  32. let pr = Utils.projectedRadius(1, camera, distance, width, height);
  33. let scale = (5 / pr);
  34. azimuth.north.scale.set(scale, scale, scale);
  35. }
  36. { // target
  37. azimuth.target.position.copy(p1.position);
  38. azimuth.target.position.z = azimuth.north.position.z;
  39. let distance = azimuth.target.position.distanceTo(camera.position);
  40. let pr = Utils.projectedRadius(1, camera, distance, width, height);
  41. let scale = (5 / pr);
  42. azimuth.target.scale.set(scale, scale, scale);
  43. }
  44. azimuth.circle.position.copy(p0.position);
  45. azimuth.circle.scale.set(r, r, r);
  46. azimuth.circle.material.resolution.set(width, height);
  47. // to target
  48. azimuth.centerToTarget.geometry.setPositions([
  49. 0, 0, 0,
  50. ...p1.position.clone().sub(p0.position).toArray(),
  51. ]);
  52. azimuth.centerToTarget.position.copy(p0.position);
  53. azimuth.centerToTarget.geometry.verticesNeedUpdate = true;
  54. azimuth.centerToTarget.geometry.computeBoundingSphere();
  55. azimuth.centerToTarget.computeLineDistances();
  56. azimuth.centerToTarget.material.resolution.set(width, height);
  57. // to target ground
  58. azimuth.centerToTargetground.geometry.setPositions([
  59. 0, 0, 0,
  60. p1.position.x - p0.position.x,
  61. p1.position.y - p0.position.y,
  62. 0,
  63. ]);
  64. azimuth.centerToTargetground.position.copy(p0.position);
  65. azimuth.centerToTargetground.geometry.verticesNeedUpdate = true;
  66. azimuth.centerToTargetground.geometry.computeBoundingSphere();
  67. azimuth.centerToTargetground.computeLineDistances();
  68. azimuth.centerToTargetground.material.resolution.set(width, height);
  69. // to north
  70. azimuth.centerToNorth.geometry.setPositions([
  71. 0, 0, 0,
  72. northPos.x - p0.position.x,
  73. northPos.y - p0.position.y,
  74. 0,
  75. ]);
  76. azimuth.centerToNorth.position.copy(p0.position);
  77. azimuth.centerToNorth.geometry.verticesNeedUpdate = true;
  78. azimuth.centerToNorth.geometry.computeBoundingSphere();
  79. azimuth.centerToNorth.computeLineDistances();
  80. azimuth.centerToNorth.material.resolution.set(width, height);
  81. // label
  82. const radians = Utils.computeAzimuth(p0.position, p1.position, viewer.getProjection());
  83. let degrees = THREE.Math.radToDeg(radians);
  84. if(degrees < 0){
  85. degrees = 360 + degrees;
  86. }
  87. const txtDegrees = `${degrees.toFixed(2)}°`;
  88. const labelDir = northPos.clone().add(p1.position).multiplyScalar(0.5).sub(p0.position);
  89. if(labelDir.length() > 0){
  90. labelDir.z = 0;
  91. labelDir.normalize();
  92. const labelVec = labelDir.clone().multiplyScalar(r);
  93. const labelPos = p0.position.clone().add(labelVec);
  94. azimuth.label.position.copy(labelPos);
  95. }
  96. azimuth.label.setText(txtDegrees);
  97. let distance = azimuth.label.position.distanceTo(camera.position);
  98. let pr = Utils.projectedRadius(1, camera, distance, width, height);
  99. let scale = (70 / pr);
  100. azimuth.label.scale.set(scale, scale, scale);
  101. }
  102. export class MeasuringTool extends THREE.EventDispatcher{
  103. constructor (viewer) {
  104. super();
  105. this.viewer = viewer;
  106. this.renderer = viewer.renderer;
  107. this.viewer.addEventListener('start_inserting_measurement', e => {
  108. this.viewer.dispatchEvent({
  109. type: 'cancel_insertions'
  110. });
  111. });
  112. this.showLabels = true;
  113. this.scene = new THREE.Scene();
  114. this.scene.name = 'scene_measurement';
  115. //this.light = new THREE.PointLight(0xffffff, 1.0);
  116. //this.scene.add(this.light);
  117. this.viewer.inputHandler.registerInteractiveScene(this.scene);
  118. //this.scene = viewer.overlay//
  119. this.onRemove = (e) => { e.measurement.dispose()/* this.scene.remove(e.measurement); */};
  120. this.onAdd = e => {this.scene.add(e.measurement);};
  121. for(let measurement of viewer.scene.measurements){
  122. this.onAdd({measurement: measurement});
  123. }
  124. viewer.addEventListener('camera_changed', this.update.bind(this),{importance:10})//优先级高于sprite
  125. if(Potree.config.measure.mulLabelHideFaraway ){
  126. viewer.addEventListener("raycaster", this.beforeDraw.bind(this),{importance:10}) //before render
  127. viewer.addEventListener("render.begin", this.beforeDraw.bind(this),{importance:10}) //before render
  128. viewer.addEventListener("render.begin2", this.beforeDraw.bind(this),{importance:10})
  129. }
  130. //viewer.addEventListener("update", this.update.bind(this));
  131. viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this));
  132. viewer.addEventListener("scene_changed", this.onSceneChange.bind(this));
  133. viewer.scene.addEventListener('measurement_added', this.onAdd);
  134. viewer.scene.addEventListener('measurement_removed', this.onRemove);
  135. viewer.addEventListener('resize',this.setSize.bind(this))
  136. }
  137. onSceneChange(e){
  138. if(e.oldScene){
  139. e.oldScene.removeEventListener('measurement_added', this.onAdd);
  140. e.oldScene.removeEventListener('measurement_removed', this.onRemove);
  141. }
  142. e.scene.addEventListener('measurement_added', this.onAdd);
  143. e.scene.addEventListener('measurement_removed', this.onRemove);
  144. }
  145. createMeasureFromData(data){//add
  146. const measure = data.measureType == 'MulDistance Ring' ? new Prism(data) : new Measure(data);
  147. if(measure.failBuilded){
  148. return
  149. }
  150. viewer.scene.addMeasurement(measure);
  151. if(measure.guideLine)measure.guideLine.visible = false
  152. return measure
  153. }
  154. beforeDraw(e){
  155. if(e.viewport.name == 'mapViewport' && !viewer.mapViewer.attachedToViewer)return //no measures
  156. viewer.scene.measurements.forEach(measure=>{
  157. if(measure.measureType != 'MulDistance' || (measure.isNew ? measure.points.length<4 : measure.points.length<3)) return
  158. let lastIndex = measure.points.length - 1;
  159. for (let index = 0; index <= lastIndex; index++) {
  160. if(!measure.closed && index == lastIndex)continue
  161. let edgeLabel = measure.edgeLabels[index];
  162. let v = edgeLabel.visiMap.get(e.viewport.camera)
  163. if(v == void 0){
  164. return measure.getEdgeLabelVisi(e.viewport)
  165. }
  166. Potree.Utils.updateVisible(edgeLabel, 'tooFar', v === false ? false : true)
  167. }
  168. })
  169. }
  170. update(e){
  171. if(viewer.inputHandler.measuring && Potree.settings.adsorption){
  172. viewer.scene.measurements.forEach(measure=>{
  173. measure.getPointsPos2d(e.viewport, true)
  174. })
  175. }
  176. if(Potree.config.measure.mulLabelHideFaraway){
  177. if(e.changeInfo.projectionChanged || e.viewport.camera.type == 'PerspectiveCamera' && e.changeInfo.positionChanged){//for MulDistance
  178. viewer.scene.measurements.forEach(measure=>{
  179. if(measure.measureType != 'MulDistance' || (measure.isNew ? measure.points.length<4 : measure.points.length<3)) return
  180. measure.getEdgeLabelVisi(e.viewport)
  181. return
  182. let lastIndex = measure.points.length - 1;
  183. for (let index = 0; index <= lastIndex; index++) {
  184. if(!measure.closed && index == lastIndex)continue
  185. let nextIndex = (index + 1 > lastIndex) ? 0 : index + 1;
  186. let previousIndex = (index === 0) ? lastIndex : index - 1;
  187. let point = measure.points[index];
  188. let nextPoint = measure.points[nextIndex];
  189. let previousPoint = measure.points[previousIndex];
  190. let point2d = new THREE.Vector2().copy(pos2ds[index]);
  191. let nextPoint2d = new THREE.Vector2().copy(pos2ds[nextIndex]);
  192. if(measure.showDistances || measure.labelText){ // edge labels
  193. let edgeLabel = measure.edgeLabels[index];
  194. if(edgeLabel.visible){
  195. measure.setEdgeLabelPos(edgeLabel, point, nextPoint )
  196. }
  197. }
  198. }
  199. })
  200. }
  201. }
  202. return;
  203. let camera = this.viewer.scene.getActiveCamera();
  204. let domElement = this.renderer.domElement;
  205. let measurements = this.viewer.scene.measurements;
  206. // make size independant of distance
  207. let mainLabels = [], subLabels = [];
  208. for (let measure of measurements) {
  209. measure.lengthUnit = this.viewer.lengthUnit;
  210. measure.lengthUnitDisplay = this.viewer.lengthUnitDisplay;
  211. //measure.update();
  212. updateAzimuth(this.viewer, measure);
  213. /* [...measure.markers, ...measure.edgeLabels, measure.areaLabel].forEach(e=>{
  214. e && e.update()
  215. }); */
  216. // labels
  217. /* let labels = measure.edgeLabels.concat(measure.angleLabels);
  218. for(let label of labels){
  219. label.update()
  220. if(label.elem.hasClass('sub')){
  221. subLabels.push(label)
  222. }else{
  223. mainLabels.push(label)
  224. }
  225. }
  226. // coordinate labels
  227. for (let j = 0; j < measure.coordinateLabels.length; j++) {
  228. let label = measure.coordinateLabels[j];
  229. label.update()
  230. mainLabels.push(label)
  231. }
  232. if(measure.showArea){ // area label
  233. let label = measure.areaLabel;
  234. label.update()
  235. mainLabels.push(label)
  236. } */
  237. /* if(measure.showCircle){ // radius label
  238. let label = measure.circleRadiusLabel;
  239. let distance = label.position.distanceTo(camera.position);
  240. let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);
  241. let scale = (70 / pr);
  242. label.scale.set(scale, scale, scale);
  243. } */
  244. if(!this.showLabels){
  245. const labels = [
  246. ...measure.sphereLabels,
  247. ...measure.angleLabels,
  248. measure.circleRadiusLabel,
  249. ];
  250. for(const label of labels){
  251. label.visible = false;
  252. }
  253. }
  254. }
  255. //this.updateLabelZIndex([{labels:subLabels},{labels:mainLabels}])
  256. }
  257. setSize(e){ //e.resolution
  258. /* if(Measure.lineMats){
  259. for(var m in Measure.lineMats){
  260. Measure.lineMats[m].resolution.set(e.canvasWidth, e.canvasHeight);
  261. }
  262. }
  263. if(Measure.sphereMats){
  264. for(var s in Measure.sphereMats){
  265. Measure.sphereMats[s].uniforms.resolution.value.set(e.canvasWidth, e.canvasHeight);
  266. }
  267. }
  268. for (let measure of this.viewer.scene.measurements) {
  269. measure.edgeLabels.concat(measure.areaLabel).forEach(label=>{
  270. label.sprite.material.uniforms.resolution.value.set(e.canvasWidth, e.canvasHeight);
  271. })
  272. } */
  273. }
  274. updateLabelZIndex(group){//[{labels:[]},{}] 顺序按照z-index低到高
  275. group.forEach((e,i)=>{
  276. e.base = group[i-1] ? group[i-1].base + group[i-1].labels.length : 0
  277. var labels = e.labels.sort((a,b)=>{
  278. return b.pos2d.z - a.pos2d.z
  279. })
  280. labels.forEach((label,index)=>{
  281. $(label.elem).css('z-index', e.base+index)
  282. })
  283. })
  284. }
  285. editStateChange(e){
  286. //console.log("editStateChange" , e.state)
  287. let state = e.state
  288. if(!state){
  289. state = viewer.scene.measurements.some(e=>e.isEditing)
  290. }
  291. if(state){
  292. viewer.dispatchEvent({type:"measureMovePoint"})//重新激活reticule状态
  293. }else{
  294. viewer.dispatchEvent({type:"endMeasureMove"})
  295. }
  296. //this.editing =
  297. }
  298. startInsertion (args = {}, callback, cancelFun) {
  299. let domElement = this.viewer.renderer.domElement;
  300. let measure = args.measureType == 'MulDistance Ring' ? new Prism(args) : new Measure(args);
  301. this.scene.add(measure);
  302. measure.isNew = true
  303. this.viewer.dispatchEvent({
  304. type: 'start_inserting_measurement',
  305. measure: measure
  306. });
  307. measure.addEventListener('editStateChange', this.editStateChange.bind(this))
  308. measure.editStateChange(true)
  309. let timer;
  310. let endDragFun = (e) => {
  311. let length = measure.points.length
  312. if (e.button == THREE.MOUSE.LEFT || e.isTouch) {
  313. if (length >= measure.maxMarkers) {
  314. end({finish:true});
  315. }else{
  316. var marker = measure.addMarker({point:measure.points[length - 1].clone()})
  317. if(args.isRect && measure.markers.length == 3){//marker全可见
  318. measure.addMarker({point:measure.points[0].clone()})
  319. }else{
  320. measure.markers[length].visible = false
  321. measure.edges[length].visible = false
  322. }
  323. measure.edges[length-1].visible = true
  324. measure.markers[length-1].visible = true;
  325. marker.isDragging = true
  326. measure.continueDrag(marker, e)
  327. }
  328. } else if (e.button === THREE.MOUSE.RIGHT ) { //触屏怎么取消?
  329. if(e.pressDistance < Potree.config.clickMaxDragDis){//非拖拽的话
  330. var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d.slice(0,measure.point2dInfo.points2d.length-1))//检测除了最后一个点的相交情况
  331. if(!isIntersectSelf)end(e);
  332. else measure.continueDrag(null, e)
  333. }else measure.continueDrag(null, e)
  334. }
  335. };
  336. let end = (e={}) => {//确定、结束
  337. if(!measure.isNew )return
  338. if(args.minMarkers != void 0 ){
  339. if(!e.finish && measure.markers.length<=args.minMarkers ){//右键 当个数不够时取消
  340. //this.viewer.scene.removeMeasurement(measure)
  341. //重新开始画
  342. if(measure.markers.length>0){
  343. measure.markers[0].removeEventListener('mousedown',end)
  344. measure.reDraw()
  345. this.viewer.addEventListener('global_click', click, {importance:10})
  346. measure.editStateChange(true)
  347. }
  348. return
  349. /* if(!Potree.settings.isOfficial) this.viewer.scene.removeMeasurement(measure)
  350. else if(e.drag){ //正式版本不允许右键退出, 继续
  351. continueDrag(e.drag.object)
  352. measure.editStateChange(true)
  353. return
  354. } */
  355. }
  356. }
  357. let lastMarker = measure.markers[measure.markers.length-1]
  358. if (/* !e.finish&& */ measure.markers.length > args.minMarkers) {
  359. measure.removeMarker(measure.points.length - 1);
  360. measure.markers[0].removeEventListener('mouseover', mouseover);
  361. measure.markers[0].removeEventListener('mouseleave', mouseleave);
  362. measure.markers[0].removeEventListener('click'/* 'mousedown' */,Exit)
  363. if(e.byClickMarker && measure.markers.length > args.minMarkers ){//通过点击第一个marker而结束的话,会多一个marker。但点击marker后可能会因为和它坐标一致而没有添加成功,就不删,根据添加的时间来判断。
  364. let delta = Date.now() - lastMarker.createTime
  365. //console.log('delta',delta)
  366. if(delta < 10){//刚生成的,说明点击后新增了一个marker
  367. measure.removeMarker(measure.points.length - 1);
  368. }
  369. }
  370. }
  371. measure.isNew = false
  372. let length = measure.points.length
  373. if(length){
  374. measure.markers[length-1].visible = true;
  375. measure.edges[length-1].visible = !!measure.closed
  376. measure.markers.forEach(marker=>{marker.dispatchEvent('addHoverEvent') })
  377. measure.edges.forEach(edge=>{edge.dispatchEvent('addHoverEvent') })
  378. measure.update();//update last edgeLabel
  379. }
  380. clearTimeout(timer)
  381. this.viewer.removeEventListener('cancel_insertions', Exit);
  382. //pressExit && this.viewer.inputHandler.removeEventListener('keydown', pressExit);
  383. this.viewer.removeEventListener('global_click', click)
  384. this.viewer.removeEventListener('global_mousemove', ifAtWrongPlace)
  385. viewer.dispatchEvent({
  386. type : "CursorChange", action : "remove", name:"polygon_AtWrongPlace"
  387. });
  388. viewer.inputHandler.dispatchEvent({type:'measuring', v:false, cause:'stopInsertion', situation:'adding', object:measure} )
  389. //var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d.slice(0,measure.point2dInfo.points2d.length-1))//检测除了最后一个点的相交情况
  390. var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d)
  391. if(isIntersectSelf) return cancelFun && cancelFun() //请求删除,不重建
  392. e.remove || callback && callback()
  393. /* this.viewer.dispatchEvent({
  394. type: 'finish_inserting_measurement',
  395. measure: measure
  396. }); */
  397. measure.dispatchEvent('createDone')
  398. };
  399. measure.addEventListener('finish', end) //完成
  400. let Exit = (e)=>{//强制退出
  401. if(e.measure && e.measure != measure || !viewer.scene.measurements.includes(measure) || !measure.isNew){
  402. return;//若指定了退出的measure但和该measure不一致,就返回
  403. }
  404. if(e.remove || e.type == 'cancel_insertions'){
  405. viewer.scene.removeMeasurement(measure)
  406. }
  407. measure.editStateChange(false)
  408. measure.cannotConfirmNormal = false //一些dropMarker中的句子
  409. measure.guideLine && (measure.guideLine.visible = false)
  410. /*
  411. if(this.viewer.inputHandler.drag && !e.remove ){//还未触发drop的话
  412. this.viewer.inputHandler.drag.object.dispatchEvent({ //这句会导致又增一个marker
  413. type: 'drop',
  414. drag: this.viewer.inputHandler.drag,
  415. viewer: this.viewer,
  416. pressDistance:0,
  417. button : THREE.MOUSE.RIGHT
  418. });
  419. } else {*///未结束时添加新的measure时会触发
  420. end({finish:true, remove:e.remove, byClickMarker: e.type == 'click'})
  421. //}
  422. this.viewer.inputHandler.drag && (this.viewer.inputHandler.drag.object = null)
  423. }
  424. this.viewer.addEventListener('cancel_insertions', Exit);
  425. /*let pressExit
  426. if(!Potree.settings.isOfficial){
  427. pressExit = (e)=>{
  428. if(e.keyCode == 27){//Esc
  429. //Exit()
  430. //怎么模拟右键???//现由前端发出
  431. }
  432. }
  433. this.viewer.inputHandler.addEventListener('keydown', pressExit)
  434. } */
  435. let mouseover = (e) => {
  436. measure.setMarkerSelected(e.object, 'hover', 'single');
  437. };
  438. let mouseleave = (e) => {
  439. measure.setMarkerSelected(e.object, 'unhover', 'single');
  440. }
  441. let click = (e)=>{//一旦点击就立刻增加两marker
  442. if(ifAtWrongPlace(e))return
  443. if(e.clickElement)return //如点击label时focusOnObject
  444. if(e.button === THREE.MOUSE.RIGHT)return
  445. //console.log('measure clicked33', !!e.intersectPoint)
  446. //var I = e.intersectPoint && (e.intersectPoint.orthoIntersect || e.intersectPoint.location)
  447. var I = e.intersect && (e.intersect.orthoIntersect || e.intersect.location)
  448. if(!I){
  449. return measure.dispatchEvent('intersectNoPointcloud')
  450. }
  451. var atMap = e.drag.dragViewport.name == 'mapViewport'
  452. //在地图上测量的首个点按楼层高度(暂时先只按mainViewport相机高度吧,但navvis是按楼层,画在楼层的地面上,可能因为平面图显示的是楼层近地面),
  453. if(atMap){
  454. I = I.clone().setZ(viewer.mainViewport.camera.position.z )
  455. }
  456. var marker = measure.addMarker({point:I})
  457. marker.isDragging = true
  458. this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽
  459. e.drag = this.viewer.inputHandler.drag
  460. e.drag.endDragFun = endDragFun
  461. e.drag.notPressMouse = true
  462. //if(!measure.dragMarker(e) || !measure.dropMarker(e))return
  463. measure.dragMarker(e)
  464. measure.dropMarker(e)
  465. if(measure.maxMarkers > 1 ){
  466. measure.markers[1].visible = false
  467. measure.edges[1].visible = false
  468. }
  469. if(measure.closed && !measure.isRect){
  470. measure.markers[0].addEventListener('mouseover', mouseover);
  471. measure.markers[0].addEventListener('mouseleave', mouseleave);
  472. measure.markers[0].addEventListener('click'/* 'mousedown' */,Exit) //点击到第一个marker就结束
  473. }
  474. this.viewer.removeEventListener('global_click', click)///* global_drop */
  475. //console.log('measure clicked')
  476. e.consume && e.consume()
  477. return {stopContinue:true}//防止继续执行别的侦听,如flytopano
  478. }
  479. //点击第n下拥有n+1个marker, n>0
  480. viewer.inputHandler.dispatchEvent({type: 'measuring', v: true, cause:'startInsertion', situation:'adding', object:measure})
  481. this.viewer.addEventListener('global_click', click, {importance:10})//add importance
  482. let ifAtWrongPlace = (e)=>{
  483. if(measure.unableDragAtMap && e.hoverViewport.name == 'mapViewport' ){
  484. if(e.isTouch){
  485. viewer.dispatchEvent({type:'reticule_forbit', v:true})
  486. }else{
  487. viewer.dispatchEvent({
  488. type : "CursorChange", action : "add", name:"polygon_AtWrongPlace"
  489. });
  490. }
  491. return true
  492. }else{
  493. if(e.isTouch){
  494. viewer.dispatchEvent({type:'reticule_forbit',v:false})
  495. }else{
  496. viewer.dispatchEvent({
  497. type : "CursorChange", action : "remove", name:"polygon_AtWrongPlace"
  498. });
  499. }
  500. }
  501. }
  502. if(measure.unableDragAtMap){
  503. this.viewer.addEventListener('global_mousemove', ifAtWrongPlace)
  504. }
  505. this.viewer.scene.addMeasurement(measure);
  506. return measure;
  507. }
  508. render(o={}){
  509. if(this.scene.children.filter(e=>e.visible).length == 0)return
  510. let renderer = o.renderer || this.viewer.renderer
  511. Potree.Utils.setCameraLayers(o.camera, ['measure'])
  512. /* if(o.screenshot && this.viewer.fxaaPass.enabled){ //抗锯齿
  513. this.viewer.ssaaRenderPass.sampleLevel = 4
  514. this.viewer.composer.render(this.scene, o.camera );
  515. }else{ */
  516. viewer.dispatchEvent({type: "render.begin2" , name:'measure', viewport:o.viewport })
  517. renderer.render(this.scene, o.camera );
  518. //}
  519. }
  520. };