ctrlPolygon.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. import * as THREE from "../../../libs/three.js/build/three.module.js";
  2. import {LineDraw, MeshDraw} from "../../utils/DrawUtil.js";
  3. import math from "../../utils/math.js";
  4. const verticalLine = new THREE.Line3()
  5. //控制点和边的合集。具有可以拖拽修改的功能,拖拽时能防止线相交。
  6. export class ctrlPolygon extends THREE.Object3D {
  7. constructor (type, prop) {
  8. super()
  9. this.type = type
  10. this.maxMarkers = Number.MAX_SAFE_INTEGER;
  11. this.transformData(prop);
  12. for(let i in prop){
  13. this[i] = prop[i]
  14. }
  15. if(this.closed && this.dimension == '2d'){
  16. this.areaPlane = this.createAreaPlane();
  17. this.add(this.areaPlane)
  18. }
  19. //数据--刚开始一定是空的
  20. this.points = [];
  21. //mesh 不一定有
  22. this.markers = [];
  23. this.edges = [];
  24. this.center
  25. }
  26. initData(prop){
  27. //开始加数据
  28. if(Potree.settings.editType == 'merge'){ //融合页面没有地图,measure的不需要指定datasetId,每个点都有各自的datasetId,跟着各自的模型走
  29. if(this.dataset_points){
  30. this.dataset_points = this.dataset_points.map(e=>{
  31. return e && new THREE.Vector3().copy(e)
  32. })
  33. prop.points = this.dataset_points.map((p,i)=>{
  34. return Potree.Utils.datasetPosTransform({fromDataset:true, datasetId:this.points_datasets[i], position: p})
  35. })
  36. if(prop.points.some(e=>e == void 0)){
  37. return false
  38. }
  39. }else{
  40. this.dataset_points = []
  41. }
  42. }
  43. if(prop.points){
  44. for(const p of prop.points){
  45. const pos = new THREE.Vector3().copy(p)
  46. this.addMarker({point:pos});
  47. }
  48. if(Potree.settings.editType != 'merge'){
  49. if(this.datasetId != void 0){//初始化位置
  50. if(this.dataset_points){
  51. this.dataset_points = this.dataset_points.map(e=>{
  52. return e && new THREE.Vector3().copy(e)
  53. })
  54. this.transformByPointcloud() //根据dataset_points生成points
  55. }
  56. }else{
  57. if(prop.dataset_points && prop.dataset_points.some(e=>e != void 0)){
  58. console.error('存在测量线的datasetId为空而dataset_points有值,请检查并删除:'+this.sid)//存在过的bug,原因未知,可能是后台处理dataset时替换的错误:http://192.168.0.21/index.php?m=bug&f=view&bugID=23601
  59. console.log(this)
  60. }
  61. }
  62. }
  63. this.getFacePlane()
  64. this.getPoint2dInfo(this.points)
  65. this.update({ifUpdateMarkers:true})
  66. //this.dragChange(new THREE.Vector3().copy(prop.points[prop.points.length-1]), prop.points.length-1);
  67. this.setSelected(false )
  68. this.markers.forEach(marker=>{marker.dispatchEvent('addHoverEvent') })
  69. return true
  70. }
  71. }
  72. addMarker(o={}){
  73. var index = o.index == void 0 ? this.points.length : o.index //要当第几个
  74. this.points = [...this.points.slice(0,index), o.point, ...this.points.slice(index,this.points.length)]
  75. //this.points.push(o.point);
  76. if(o.marker){
  77. this.add(o.marker)
  78. this.markers = [...this.markers.slice(0,index), o.marker, ...this.markers.slice(index,this.markers.length)]
  79. this.updateMarker(o.marker, o.point)
  80. o.marker.addEventListener('drag', this.dragMarker.bind(this));
  81. o.marker.addEventListener('drop', this.dropMarker.bind(this));
  82. let addHoverEvent = (e)=>{
  83. let mouseover = (e) => {
  84. this.setMarkerSelected(e.object, 'hover', 'single');
  85. viewer.dispatchEvent({
  86. type : "CursorChange", action : "add", name:"markerMove"
  87. })
  88. };
  89. let mouseleave = (e) => {
  90. this.setMarkerSelected(e.object, 'unhover', 'single');
  91. viewer.dispatchEvent({
  92. type : "CursorChange", action : "remove", name:"markerMove"
  93. })
  94. }
  95. o.marker.addEventListener('mouseover', mouseover);
  96. o.marker.addEventListener('mouseleave', mouseleave);
  97. o.marker.removeEventListener('addHoverEvent',addHoverEvent)
  98. }
  99. o.marker.addEventListener('addHoverEvent',addHoverEvent)//当非isNew时才添加事件
  100. if(!this.isNew){
  101. o.marker.dispatchEvent('addHoverEvent')
  102. }
  103. }
  104. if(o.edge){
  105. this.add(o.edge)
  106. this.edges = [...this.edges.slice(0,index), o.edge, ...this.edges.slice(index,this.edges.length)]
  107. }
  108. }
  109. dragMarker(e){
  110. var I, atMap
  111. if(e.hoverViewport != e.drag.dragViewport){//不能使用e.dragViewport,要使用drag中的,因为drag中存储的要一直继承下来,不因mouseup了而改变。
  112. viewer.dispatchEvent({
  113. type : "CursorChange", action : "add", name:"polygon_AtWrongPlace"
  114. })
  115. return
  116. }
  117. viewer.dispatchEvent({
  118. type : "CursorChange", action : "remove", name:"polygon_AtWrongPlace"
  119. })
  120. atMap = e.drag.dragViewport.name == 'mapViewport'
  121. if(atMap && this.unableDragAtMap){
  122. e.drag.object = null //取消拖拽
  123. return
  124. }
  125. e.drag.object.isDragging = true
  126. I = e.intersect && (e.intersect.orthoIntersect || e.intersect.location)
  127. //记录数据集
  128. //在三维中脱离点云(在map中拉到周围都没有点云的地方)的顶点,无法拖拽怎么办
  129. if (I) {
  130. let i = this.markers.indexOf(e.drag.object);
  131. if (i !== -1) {
  132. this.dragChange(I.clone(), i, atMap)
  133. /* if(this.points_datasets){
  134. if(e.intersect.pointcloud) this.points_datasets[i] = e.intersect.pointcloud.dataset_id
  135. else this.points_datasets[i] = null
  136. } */
  137. if(this.points_datasets){
  138. if(e.intersect.pointcloud) this.points_datasets[i] = e.intersect.pointcloud.dataset_id
  139. else if(e.intersect.object) this.points_datasets[i] = e.intersect.object.dataset_id
  140. else this.points_datasets[i] = null
  141. }
  142. }
  143. this.editStateChange(true)
  144. return true
  145. }
  146. };
  147. dragChange(intersectPos, i, atMap){
  148. let len = this.markers.length
  149. let oldPoint = this.points[i];
  150. if(atMap){
  151. intersectPos.setZ(oldPoint.z) //在地图上拖拽,不改变其高度。
  152. }
  153. let location = intersectPos.clone()
  154. if(this.faceDirection && this.maxMarkers == 2 && len == 2){//add 固定方向的点不直接拖拽
  155. var p1 = this.markers[0].position
  156. if(this.faceDirection == 'horizontal'){
  157. var projectPos = location.clone().setZ(p1.z)
  158. }else{
  159. var projectPos = p1.clone().setZ(location.z)
  160. }
  161. //var p2 = p1.clone().add(this.direction)
  162. //var projectPos = math.getFootPoint(location, p1, p2)
  163. LineDraw.updateLine(this.guideLine, [location, projectPos])
  164. location = projectPos
  165. this.guideLine.visible = true
  166. }else if( len > 1){
  167. var points = this.points.map(e=>e.clone())
  168. points[i].copy(location) //算normal需要提前确认point
  169. //若为定义了面朝向的矩形
  170. if(this.faceDirection == 'horizontal'){
  171. if(len == 2){
  172. location.setZ(points[0].z)
  173. }
  174. if(!this.facePlane){//一个点就能确定面
  175. this.facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint( new THREE.Vector3(0,0,1), this.points[0] )
  176. }
  177. }else if(this.faceDirection == 'vertical'){//当有两个点时, 有两个方向的可能
  178. if(len == 2){
  179. if(this.isRect){
  180. let vec = points[0].clone().sub(location)
  181. if(Math.sqrt(vec.x*vec.x+vec.y*vec.y) > Math.abs(vec.z) ){//水平(高度差小于水平距离时)
  182. location.setZ(points[0].z)
  183. //this.cannotConfirmNormal = false;//能确定面为水平方向
  184. }else{//垂直 (当两点一样时也属于这种)
  185. location.setX(points[0].x);
  186. location.setY(points[0].y);
  187. //this.cannotConfirmNormal = true; //不能确定面,因第三点可绕着纵轴线自由移动
  188. }
  189. }
  190. }else{
  191. {//判断cannotConfirmNormal. 如果前几段都在竖直线上,就不能固定出面方向。
  192. this.cannotConfirmNormal = true
  193. let max = this.isRect ? 1 : len-2
  194. for(let i=0;i<max;i++){
  195. let p1 = points[i].clone()
  196. let p2 = points[i+1].clone()
  197. let vec = p1.sub(p2);
  198. if(vec.x != 0 || vec.y != 0){
  199. this.cannotConfirmNormal = false
  200. break;
  201. }
  202. }
  203. }
  204. if(!this.facePlane || this.cannotConfirmNormal){//三个点且为水平方向时,计算面
  205. var points_ = points.map(e=>new THREE.Vector2(e.x,e.y))
  206. var points2 = getDifferentPoint(points_, 2);
  207. if(points2){
  208. let normal = math.getNormal2d({p1:points2[0], p2:points2[1]})
  209. normal = new THREE.Vector3(normal.x, normal.y, 0)
  210. this.facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint( normal, this.points[0] )
  211. }
  212. }
  213. }
  214. }
  215. if(len > 2){//area
  216. if(!this.faceDirection){
  217. if(len == 3 || this.isRect) this.cannotConfirmNormal = true //当第三个点固定后(有四个点时)才能固定面
  218. if(!this.facePlane || this.cannotConfirmNormal){
  219. var points3 = getDifferentPoint(points, 3);//只有找到三个不同的点算拥有面和area
  220. if(points3){
  221. this.facePlane = new THREE.Plane().setFromCoplanarPoints(...points3 )
  222. }
  223. }
  224. }
  225. if( this.facePlane && !this.cannotConfirmNormal ){//之后加的点一定要在面上
  226. if(atMap){
  227. //地图上用垂直线,得到和面的交点。
  228. verticalLine.set(location.clone().setZ(100000), location.clone().setZ(-100000))//确保长度范围覆盖所有测量面
  229. location = this.facePlane.intersectLine(verticalLine, new THREE.Vector3() )
  230. if(!location) return;
  231. }else{
  232. location = this.facePlane.projectPoint(intersectPos, new THREE.Vector3() )
  233. }
  234. }
  235. points[i].copy(location)//再copy确认一次
  236. if(this.isRect){ //是矩形 (即使没有faceDirection也能执行)
  237. //根据前两个点计算当前和下一个点
  238. var p1 = points[(i-2+len)%len]
  239. var p2 = points[(i-1+len)%len]
  240. if(p1.equals(p2)){//意外情况:重复点两次 ( bug点,改了好多遍)
  241. if(this.faceDirection == 'vertical'){
  242. p2.add(new THREE.Vector3(0,0,0.0001))
  243. }else{
  244. p2.add(new THREE.Vector3(0,0.0001,0))
  245. }
  246. }
  247. //p3 : location
  248. var foot = math.getFootPoint(location, p1, p2)//p2 修改p2到垂足的位置
  249. var vec = foot.clone().sub(location)
  250. var p4 = p1.clone().sub(vec)
  251. points[(i-1+len)%len].copy(foot)
  252. points[(i+1)%len].copy(p4)
  253. this.setPosition((i-1+len)%len, foot);//p2
  254. this.setPosition((i+1)%len, p4);
  255. }
  256. /* let points2d;
  257. if(this.facePlane){
  258. var originPoint0 = points[0].clone()
  259. var qua = math.getQuaBetween2Vector(this.facePlane.normal, new THREE.Vector3(0,0,1), new THREE.Vector3(0,0,1));
  260. points2d = points.map(e=>e.clone().applyQuaternion(qua))
  261. } */
  262. this.getPoint2dInfo(points)
  263. var isIntersectSelf = !this.isRect && len > 3 && this.intersectSelf(this.point2dInfo.points2d)//检测相交
  264. if(isIntersectSelf){
  265. //not-allowed
  266. viewer.dispatchEvent({
  267. type : "CursorChange", action : "add", name:"polygon_isIntersectSelf"
  268. })
  269. this.isIntersectSelf = true
  270. return
  271. }else{
  272. this.isIntersectSelf = false
  273. viewer.dispatchEvent({
  274. type : "CursorChange", action : "remove", name:"polygon_isIntersectSelf"
  275. })
  276. /* this.facePlane && (this.point2dInfo = {
  277. originPoint0 ,
  278. points2d,
  279. quaInverse : qua.clone().invert()
  280. }) */
  281. }
  282. }
  283. var showGuideLine = len>1 && (this.faceDirection || len > 3)
  284. if(showGuideLine && this.guideLine){
  285. LineDraw.updateLine(this.guideLine, [intersectPos, location])
  286. this.guideLine.visible = true
  287. }
  288. //console.log(this.points.map(e=>e.toArray()))
  289. }
  290. if(this.restrictArea){
  291. let holes = this.restrictArea.holes.concat(this.restrictArea.parentHoles)
  292. let holesPoints = holes.filter(e=>e!=this && e.points.length>2).map(e=>e.points)
  293. if(!math.isPointInArea(this.restrictArea.points, holesPoints, location)){
  294. viewer.dispatchEvent({
  295. type : "CursorChange", action : "add", name:"polygon_AtWrongPlace"
  296. })
  297. this.isAtWrongPlace = true
  298. return
  299. }
  300. //就不处理相交线了。 有个缺点:floor上的hole可以限制room,但hole不受room限制,会导致room的marker被框在hole里而动不了。只能去调整hole了
  301. }
  302. viewer.dispatchEvent({
  303. type : "CursorChange", action : "remove", name:"polygon_AtWrongPlace"
  304. })
  305. this.isAtWrongPlace = false
  306. this.setPosition(i, location);
  307. this.update()
  308. this.dispatchEvent({type:'dragChange', index:i})
  309. }
  310. dropMarker(e){
  311. //console.log('dropMarker')
  312. if (this.isNew && e.pressDistance>Potree.config.clickMaxDragDis){//拖拽的话返回
  313. return this.continueDrag(null,e)
  314. }
  315. if(e.isTouch){
  316. if(e.hoverViewport != viewer.mainViewport && this.unableDragAtMap){
  317. viewer.dispatchEvent({type:'reticule_forbit', v:true})
  318. //console.log('reticule_forbit',true)
  319. return this.continueDrag(null,e)
  320. }else{
  321. viewer.dispatchEvent({type:'reticule_forbit', v:false})
  322. //console.log('reticule_forbit',false)
  323. }
  324. this.dragMarker(e) //触屏时必须先更新下点
  325. }
  326. if (e.button != THREE.MOUSE.RIGHT && (//右键click的话继续执行,因为会停止
  327. this.isIntersectSelf && this.isNew //有线相交了
  328. || this.isAtWrongPlace && this.isNew
  329. || !e.isAtDomElement && this.isNew//如果是刚添加时在其他dom点击, 不要响应
  330. || e.hoverViewport != viewer.mainViewport && this.unableDragAtMap //垂直的测量线不允许在地图上放点
  331. || this.isNew && !getDifferentPoint(this.points, this.points.length ) //不允许和之前的点相同, 但这句在点云稀疏时会导致难结束
  332. )
  333. ){
  334. return this.continueDrag(null,e)
  335. }
  336. //console.log('drop marker' )
  337. let i = this.markers.indexOf(e.drag.object);
  338. if (i !== -1) {
  339. this.dispatchEvent({
  340. 'type': 'marker_dropped',
  341. 'index': i
  342. });
  343. if(this.markers.length>2 && this.facePlane)this.cannotConfirmNormal = false
  344. this.guideLine &&(this.guideLine.visible = false)
  345. }
  346. this.setMarkerSelected(e.drag.object, 'unhover', 'single')
  347. this.editStateChange(false)
  348. e.drag.endDragFun && e.drag.endDragFun(e)// addmarker
  349. //if(this.changeCallBack)this.changeCallBack()
  350. return true
  351. };
  352. getFacePlane(){//最普通一种get方法,根据顶点。且假设所有点已经共面,且不重合
  353. if(this.points.length<3) return
  354. this.facePlane = new THREE.Plane().setFromCoplanarPoints(...this.points.slice(0,3) )
  355. }
  356. getPoint2dInfo(points){ //在更新areaplane之前必须更新过point2dInfo
  357. if(this.facePlane){
  358. var originPoint0 = points[0].clone()
  359. var qua = math.getQuaBetween2Vector(this.facePlane.normal, new THREE.Vector3(0,0,1), new THREE.Vector3(0,0,1));
  360. let points2d = points.map(e=>e.clone().applyQuaternion(qua))
  361. this.point2dInfo = {
  362. originPoint0 ,
  363. points2d,
  364. quaInverse : qua.clone().invert()
  365. }
  366. }
  367. }
  368. setPosition (index, position) {//拖拽后设置位置
  369. let point = this.points[index];
  370. point.copy(position);
  371. /* if(this.datasetId){
  372. this.dataset_points[index] = Potree.Utils.datasetPosTransform({toDataset:true, datasetId:this.datasetId, position:point.clone()})
  373. } */
  374. /* if(Potree.settings.editType == 'merge'){
  375. this.dataset_points[index] = Potree.Utils.datasetPosTransform({toDataset:true,this.points_datasets[i], position:point.clone()})
  376. } */
  377. let marker = this.markers[index];
  378. this.updateMarker(marker, point)
  379. }
  380. updateMarker(marker, pos){
  381. marker.position.copy(pos);
  382. marker.update();
  383. }
  384. intersectSelf(points2d){//add
  385. var len = points2d.length
  386. for(var i=0;i<len;i++){
  387. for(var j=i+2;j<len;j++){
  388. if(Math.abs(j-len-i)<2)continue;//不和邻边比
  389. var p1 = points2d[i]
  390. var p2 = points2d[i+1]
  391. var p3 = points2d[j]
  392. var p4 = points2d[(j+1)%len]
  393. if(p1.equals(p2) || p3.equals(p4) || p1.equals(p3) || p2.equals(p3) || p1.equals(p4) || p2.equals(p4))continue
  394. var line1 = [p1,p2]
  395. var line2 = [p3,p4]
  396. var intersect = math.isLineIntersect(line1, line2, false, 0.001)
  397. if(intersect){
  398. return true
  399. break
  400. }
  401. }
  402. }
  403. }
  404. removeMarker (index) {
  405. this.points.splice(index, 1);
  406. const marker = this.markers[index]
  407. //this.remove(marker);
  408. this.markers.splice(index, 1);
  409. marker.dispatchEvent({type:'dispose'})
  410. let edgeIndex = index //(index === 0) ? 0 : (index - 1);
  411. const edge = this.edges[edgeIndex]
  412. if(edge){
  413. this.remove(edge);
  414. this.edges.splice(edgeIndex, 1);
  415. edge.dispatchEvent({type:'dispose'})
  416. }
  417. this.point2dInfo && this.point2dInfo.points2d.splice(index, 1); //add
  418. this.dispatchEvent({type:'removeMarker',index,marker})
  419. }
  420. createAreaPlane(mat){
  421. var geometry = new THREE.Geometry();
  422. var mesh = new THREE.Mesh(geometry, mat)
  423. return mesh
  424. }
  425. updateAreaPlane(){
  426. if(!this.point2dInfo)return
  427. this.areaPlane.geometry.dispose()
  428. if(this.points.length>2){
  429. this.areaPlane.geometry = MeshDraw.getShapeGeo(this.point2dInfo.points2d)
  430. var center = math.getCenterOfGravityPoint(this.point2dInfo.points2d) //重心
  431. var firstPos = this.point2dInfo.points2d[0].clone()
  432. firstPos.z = 0 //因为shape只读取了xy,所以位移下, 再算出最终位置,得到差距
  433. firstPos.applyQuaternion(this.point2dInfo.quaInverse)
  434. var vec = this.point2dInfo.originPoint0.clone().sub(firstPos)
  435. center = new THREE.Vector3(center.x, center.y, 0)
  436. center.applyQuaternion(this.point2dInfo.quaInverse)
  437. this.areaPlane.quaternion.copy(this.point2dInfo.quaInverse)
  438. this.areaPlane.position.copy(vec)
  439. center.add(vec)
  440. this.center = center
  441. }else{
  442. this.areaPlane.geometry = new THREE.Geometry()
  443. }
  444. }
  445. update(options={}){
  446. if(this.points.length === 0){
  447. return;
  448. }
  449. let lastIndex = this.points.length - 1;
  450. for (let index = 0; index <= lastIndex; index++) {
  451. let nextIndex = (index + 1 > lastIndex) ? 0 : index + 1;
  452. let previousIndex = (index === 0) ? lastIndex : index - 1;
  453. let point = this.points[index];
  454. let nextPoint = this.points[nextIndex];
  455. let previousPoint = this.points[previousIndex];
  456. if(options.ifUpdateMarkers){
  457. this.updateMarker(this.markers[index], point)
  458. }
  459. { // edges
  460. let edge = this.edges[index];
  461. if(edge){
  462. LineDraw.updateLine(edge, [point, nextPoint])
  463. //edge.visible = index < lastIndex || this.isRect || (this.closed && !this.isNew);
  464. }
  465. }
  466. }
  467. if(this.areaPlane){
  468. this.updateAreaPlane()
  469. }
  470. //this.dispatchEvent({type:'update'})
  471. viewer.mapViewer && viewer.mapViewer.dispatchEvent('content_changed') //暂时先这么都通知
  472. }
  473. dispose(){//add
  474. this.parent.remove(this)
  475. this.markers.concat(this.edges).forEach(e=>e.dispatchEvent({type:'dispose'}))
  476. }
  477. reDraw(restMarkerCount=0){//重新开始画
  478. let pointCount = this.points.length - restMarkerCount // restMarkerCount为需要留下的marker数量
  479. while(pointCount > 0){
  480. this.removeMarker(--pointCount)
  481. }
  482. this.point2dInfo = null
  483. this.facePlane = null
  484. }
  485. setMarkerSelected(){}
  486. editStateChange(state){
  487. if(!state){
  488. viewer.dispatchEvent({
  489. type : "CursorChange", action : "remove", name:"polygon_isIntersectSelf"
  490. })
  491. viewer.dispatchEvent({
  492. type : "CursorChange", action : "remove", name:"polygon_AtWrongPlace"
  493. })
  494. viewer.dispatchEvent({type:'reticule_forbit', v:false})
  495. this.markers.forEach(e=>e.isDragging = false )
  496. }
  497. }
  498. transformData(){}
  499. setSelected(){}
  500. continueDrag(marker, e){
  501. let object = marker || e.drag.object
  502. object.isDragging = true
  503. var timer = setTimeout(()=>{//等 drag=null之后 //右键拖拽结束后需要重新得到drag
  504. if(this.parent && object.isDragging){
  505. //console.log('continueDrag')
  506. viewer.inputHandler.startDragging( object ,
  507. {endDragFun: e.drag.endDragFun, notPressMouse:e.drag.notPressMouse, dragViewport:e.drag.dragViewport}
  508. )
  509. }
  510. },1)
  511. return timer
  512. }
  513. }
  514. function getDifferentPoint(points, count){//for facePlane
  515. var result = [];
  516. for(let i=0;i<points.length;i++){
  517. var p = points[i];
  518. if(result.find(e=>e.equals(p)))continue;
  519. else result.push(p)
  520. if(result.length == count)break
  521. }
  522. if(result.length == count)return result
  523. }