enter.js 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544
  1. import parameter from "./parameter";
  2. import mitt from "mitt";
  3. import {
  4. CoordType
  5. }
  6. from "../../types";
  7. import {
  8. Loading
  9. }
  10. from "@kankan/components/index";
  11. import revision from "./REVISION";
  12. import {
  13. ui18n
  14. }
  15. from "@/lang";
  16. import libTransform from "coordtransform";
  17. //交通版laser 主要适用设备:MatePad Pro 11英寸
  18. const pointMeasureColor = "#3290ff"
  19. const CloneJson = function (data) {
  20. var str = JSON.stringify(data);
  21. return JSON.parse(str);
  22. };
  23. var enter = ({
  24. dom,
  25. mapDom,
  26. number,
  27. //datasetId, //初始数据集
  28. webSite, //废弃,改为用dataset.webBin
  29. isLocal = false,
  30. basePath,
  31. isDebug = false,
  32. mapCompany, // 地图版本 'default' | 'google' default就跟现在一样
  33. axios,
  34. version, //'V3''V4' 废弃,改为从getDataset获取
  35. staticPrefix,
  36. cropArgs,
  37. getFileUrl,
  38. }) => {
  39. let isScreenshoting = false;
  40. let lastSiteModelData;
  41. let page; //所在页面
  42. const sceneBus = mitt();
  43. Potree.settings.isOfficial = true; //标记为正式、非测试版本
  44. Potree.settings.isDebug = isDebug;
  45. //Potree.settings.originDatasetId = datasetId;
  46. /*if (isLocal) {
  47. //本地配置
  48. Potree.settings.isLocal = isLocal;
  49. for (let i in Potree.settings.urls) {
  50. Potree.settings.urls[i] = basePath; //全部替换
  51. }
  52. }
  53. webSite && (Potree.settings.webSite = webSite);
  54. //axios && (Potree.fileServer = axios); //暂时不用,比如vision那里
  55. if (staticPrefix) {
  56. // "/dev/SS-t-4pMXagRDjk"
  57. Potree.settings.isLocal = true;
  58. Potree.settings.urls.prefix1 = Potree.settings.urls.prefix3 = staticPrefix;
  59. Potree.settings.webSite = "wwwroot";
  60. } */
  61. Potree.getFileUrl = getFileUrl //转化为另一种得到url的方法
  62. Potree.start(dom, mapDom, number);
  63. parameter.dom = dom;
  64. parameter.number = number;
  65. parameter.viewer = viewer;
  66. parameter.sceneBus = sceneBus;
  67. //Potree.settings.rotAroundPoint = false; //试验
  68. viewer.fixPoints = []//固定点
  69. sceneBus.on("visible", (v) => {
  70. viewer.visible = v;
  71. /* if(v){
  72. viewer.dispatchEvent('content_changed') //避免白屏
  73. } */
  74. //console.log('sceneBus visible', v)
  75. });
  76. viewer.addEventListener("allLoaded", (e) => {
  77. //全部加载完,除了地图
  78. console.log('emit allLoad')
  79. sceneBus.emit("allLoaded");
  80. });
  81. viewer.addEventListener("webglError", (e) => {
  82. console.error("viewer webglError: " + e);
  83. sceneBus.emit("webglError", {
  84. msg: e.msg
  85. });
  86. });
  87. viewer.addEventListener("viewChanged", (e) => {
  88. sceneBus.emit("viewChange", e.name)
  89. });
  90. let cameraChange = (e) => {
  91. var camera = e.viewport.camera;
  92. var pos = camera.position;
  93. if (e.viewport.name == "MainView") {
  94. let meterPerPixel = viewer.mainViewport.camera.type == 'OrthographicCamera' ? 1 / viewer.mainViewport.camera.zoom : null//原本我设定的每像素代表1米, 然后再除以zoom
  95. //console.log('meterPerPixel', meterPerPixel)
  96. sceneBus.emit("posChange", {
  97. x: pos.x,
  98. y: pos.y,
  99. z: pos.z,
  100. rotate: camera.rotation,
  101. meterPerPixel,
  102. });
  103. }
  104. viewer.fixPoints.forEach(point=>{
  105. point.pos2d = Potree.Utils.getPos2d(point, e.viewport, viewer.renderArea )
  106. point.pos2d.pos3d = point.clone()
  107. })
  108. };
  109. viewer.addEventListener("camera_changed", cameraChange);
  110. viewer.addEventListener("shelterComputed", () => {
  111. cameraChange({
  112. viewport: viewer.mainViewport
  113. });
  114. });
  115. {
  116. Potree.loadingByTex = false;
  117. let delayShow = 400;
  118. let timer;
  119. viewer.addEventListener("loading", (e) => {
  120. //加载的等待页面
  121. if (e.show) {
  122. if (!isScreenshoting) {
  123. //截图时不显示
  124. Potree.loadingByTex = true;
  125. timer && clearTimeout(timer);
  126. timer = setTimeout(() => {
  127. if (Potree.loadingByTex) {
  128. Loading.show();
  129. }
  130. }, delayShow);
  131. }
  132. } else {
  133. Potree.loadingByTex = false;
  134. timer && clearTimeout(timer);
  135. Loading.hide();
  136. }
  137. });
  138. }
  139. let info;
  140. const units = {
  141. 1: "metric",
  142. 2: "imperial"
  143. };
  144. let getMeasureType = function (type, unit) {
  145. switch (type) {
  146. case 'BASE_LINE':
  147. info = {
  148. measureType: "Hor LINE with Text", //带有文字label的线
  149. labelText : '基准线',
  150. isBaseLine : true, //暂时只有基准线是这种measureType
  151. };
  152. break;
  153. case "LINE":
  154. info = {
  155. measureType: "Distance"
  156. };
  157. break;
  158. case "SERIES":
  159. info = {
  160. measureType: "MulDistance"
  161. };
  162. break;
  163. case "AREA":
  164. info = {
  165. measureType: "Area"
  166. };
  167. break;
  168. case "L_LINE":
  169. info = {
  170. measureType: "Hor Distance"
  171. };
  172. break;
  173. case "L_SERIES":
  174. info = {
  175. measureType: "Hor MulDistance"
  176. };
  177. break;
  178. case "L_AREA":
  179. info = {
  180. measureType: "Hor Area"
  181. };
  182. break;
  183. case "L_RECTANGLE":
  184. info = {
  185. measureType: "Hor Rect Area"
  186. };
  187. break;
  188. case "V_LINE":
  189. info = {
  190. measureType: "Ver Distance"
  191. };
  192. break;
  193. case "V_SERIES":
  194. info = {
  195. measureType: "Ver MulDistance"
  196. };
  197. break;
  198. case "V_AREA":
  199. info = {
  200. measureType: "Ver Area"
  201. };
  202. break;
  203. case "V_RECTANGLE":
  204. info = {
  205. measureType: "Ver Rect Area"
  206. };
  207. break;
  208. default:
  209. console.error("无此 measure type", type);
  210. }
  211. info.unit = units[unit];
  212. return info;
  213. };
  214. let getMeasureFunction = function (measure, bus, isShape) {
  215. measure.addEventListener("marker_dropped", (e) => {
  216. //拖拽结束后发送changeCallBack
  217. if (measure.parent) {
  218. //未被删除
  219. isShape ? bus.emit("graphChange", {path:measure.points, center:measure.getCenter()}) : bus.emit("update");
  220. if(measure.isBaseLine){
  221. viewer.dispatchEvent('baseLineChanged')
  222. }
  223. }
  224. });
  225. /* measure.addEventListener("highlight", (e) => {
  226. bus.emit("highlight", e.state);
  227. }); */
  228. measure.addEventListener("selected", (e) => {
  229. bus.emit(isShape ? "selectGraph":"selected", e.state)
  230. isShape && measure.mainPoint.ret.selected(e.state, true)
  231. });
  232. return {
  233. quit: () => {
  234. Potree.Log("quit结束且删除: " + measure.id, {
  235. font: {
  236. color: "#00c7b2"
  237. },
  238. });
  239. viewer.dispatchEvent({
  240. type: "cancel_insertions",
  241. remove: true,
  242. measure,
  243. });
  244. }, //触发结束。退出测量模式,清除之前操作
  245. clear: () => {
  246. //删除
  247. Potree.Log("clear删除: " + measure.id, {
  248. font: {
  249. color: "#00c7b2"
  250. }
  251. });
  252. viewer.dispatchEvent({
  253. type: "cancel_insertions",
  254. remove: true,
  255. measure,
  256. });
  257. viewer.scene.removeMeasurement(measure);
  258. if(measure.isBaseLine){
  259. viewer.dispatchEvent('baseLineRemoved')
  260. }
  261. },
  262. end: () => {
  263. //完成 相当于右键
  264. measure.dispatchEvent({
  265. type: "finish",
  266. measure
  267. });
  268. },
  269. getPoints: () => {
  270. return measure.points;
  271. },
  272. getDatasetLocations: () => {
  273. return measure.dataset_points;
  274. },
  275. getDatasets: () => {
  276. return [1]//measure.points_datasets;
  277. },
  278. getDatasetId: () => {
  279. return 1//measure.datasetId;
  280. },
  281. getArea: () => {
  282. return measure.area; //{value:area, string:..}
  283. },
  284. getDistance: () => {
  285. if (measure.points.length < 2)
  286. return null;
  287. var value = measure.getTotalDistance(); //measure.points[0].distanceTo(measure.points[1])
  288. return {
  289. value, //米
  290. string: viewer.unitConvert.convert(
  291. value,
  292. "distance",
  293. Potree.settings.precision,
  294. measure.unitSystem,
  295. 0.01,
  296. true,true),
  297. };
  298. },
  299. changeUnit: (unit) => {
  300. //公制|英制 , 1 | 2 单位
  301. measure.setUnitSystem(units[unit]);
  302. },
  303. toDataURL: (width, height) => {
  304. //截图
  305. isScreenshoting = true;
  306. var {
  307. getImagePromise,
  308. finishPromise
  309. } = viewer.startScreenshot({
  310. type: "measure",
  311. measurement: measure,
  312. hideMarkers: true,
  313. ifGetPose: true,
  314. },
  315. width,
  316. height);
  317. finishPromise.done(() => {
  318. isScreenshoting = false;
  319. });
  320. return finishPromise; //getImagePromise.done时是可以getPose的, finishPromise.done时才开始截下一张图
  321. },
  322. //手动开启或关闭:
  323. show: () => {
  324. Potree.Utils.updateVisible(measure, "forceByUser", true);
  325. viewer.dispatchEvent('content_changed')
  326. },
  327. hide: () => {
  328. Potree.Utils.updateVisible(measure, "forceByUser", false);
  329. viewer.dispatchEvent('content_changed')
  330. },
  331. /* highlight: (isHight) => {
  332. measure.setSelected(isHight, "byList");
  333. }, */
  334. selected: (state, dontMoveCamera ) => {
  335. //measure.setSelected(state, "byList");
  336. if(state){
  337. measure.focus({dontMoveCamera})
  338. }else{
  339. measure.dispatchEvent('cancelSelect')
  340. }
  341. },
  342. };
  343. };
  344. /* let getMeasurePointsInfo = (fixPoint, onlyMoveBasePoint)=>{
  345. let baseLine = viewer.scene.measurements.find(e=>e.isBaseLine && e.points.length == 2)
  346. if(!baseLine){
  347. return console.error('创建失败,因基准线不存在')
  348. }
  349. if(!fixPoint.basePoint){
  350. return //console.log('no basePoint')
  351. }
  352. let fixPoint2d = new THREE.Vector2().copy(fixPoint)
  353. let baselineP12d = new THREE.Vector2().copy(baseLine.points[0])
  354. let baselineP22d = new THREE.Vector2().copy(baseLine.points[1])
  355. let foot1_2d = Potree.math.getFootPoint(fixPoint2d, baselineP12d, baselineP22d)
  356. let minZ = Math.min(fixPoint.basePoint.z, baseLine.points[0].z, fixPoint.z)
  357. let maxZ = Math.max(fixPoint.basePoint.z, baseLine.points[0].z, fixPoint.z)
  358. let foot1_P1 = new THREE.Vector3(foot1_2d.x, foot1_2d.y, fixPoint.z)
  359. let foot1_P2 = new THREE.Vector3(foot1_2d.x, foot1_2d.y, minZ)
  360. let foot1_P3 = new THREE.Vector3(foot1_2d.x, foot1_2d.y, maxZ)
  361. let info = {
  362. disMeasure1:{
  363. points: [new THREE.Vector3().copy(fixPoint), foot1_P1],
  364. guideLinePoints : [foot1_P2, foot1_P3] //垂足上的垂线,从最低点到最高点(包含disMeasure2那一段)
  365. }
  366. }
  367. let basePoint2d = new THREE.Vector2().copy(fixPoint.basePoint)
  368. let anotherPoint2d = new THREE.Vector2().addVectors(basePoint2d, new THREE.Vector2().subVectors(baselineP12d,baselineP22d))//测量线方向上另一点
  369. let foot2_2d = Potree.math.getFootPoint(fixPoint2d, basePoint2d, anotherPoint2d)
  370. let foot2_P1 = new THREE.Vector3(foot2_2d.x, foot2_2d.y, fixPoint.basePoint.z)
  371. let foot2_P2 = new THREE.Vector3(foot1_2d.x, foot1_2d.y, fixPoint.basePoint.z)
  372. info.disMeasure2 = {
  373. points : [new THREE.Vector3().copy(fixPoint.basePoint), foot2_P1],
  374. guideLinePoints : [foot2_P1, foot2_P2 ],
  375. }
  376. fixPoint.bus.emit('measureChange',[
  377. {line: info.disMeasure1.points, dis: info.disMeasure1.points[0].distanceTo(info.disMeasure1.points[1])},
  378. {line: info.disMeasure2.points, dis: info.disMeasure2.points[0].distanceTo(info.disMeasure2.points[1])}
  379. ])
  380. return info
  381. } */
  382. let getMeasurePointsInfo = (fixPoint, baseMeasurePoints )=>{
  383. let baseLine = viewer.scene.measurements.find(e=>e.isBaseLine && e.points.length == 2)
  384. if(!baseLine){
  385. return console.error('创建失败,因基准线不存在')
  386. }
  387. if(!fixPoint.basePoint){
  388. return //console.log('no basePoint')
  389. }
  390. let fixPoint2d = new THREE.Vector2().copy(fixPoint)
  391. let baselineP12d = new THREE.Vector2().copy(baseLine.points[0])
  392. let baselineP22d = new THREE.Vector2().copy(baseLine.points[1])
  393. let foot1_2d = Potree.math.getFootPoint(fixPoint2d, baselineP12d, baselineP22d)
  394. let foot1_P1 = new THREE.Vector3(foot1_2d.x, foot1_2d.y, baseLine.points[0].z)
  395. let fixPointProj = fixPoint.clone().setZ(baseLine.points[0].z)
  396. let info = {
  397. disMeasure1:{
  398. points: [fixPointProj, foot1_P1],
  399. guideLinePoints : [new THREE.Vector3().copy(fixPoint), fixPointProj] //垂足上的垂线,从最低点到最高点(包含disMeasure2那一段)
  400. }
  401. }
  402. let basePointProj = fixPoint.basePoint.clone().setZ(baseLine.points[0].z)
  403. if(baseMeasurePoints){//初始创建
  404. info.disMeasure2 = {
  405. points : baseMeasurePoints,
  406. guideLinePoints:[fixPoint.basePoint.clone(), basePointProj,
  407. basePointProj, baseMeasurePoints[0].clone(),
  408. baseMeasurePoints[1].clone(), foot1_P1]
  409. }
  410. }else{
  411. let basePoint2d = new THREE.Vector2().copy(fixPoint.basePoint)
  412. let anotherPoint2d = new THREE.Vector2().addVectors(basePoint2d, new THREE.Vector2().subVectors(baselineP12d,baselineP22d))//测量线方向上另一点
  413. let foot2_2d = Potree.math.getFootPoint(fixPoint2d, basePoint2d, anotherPoint2d)
  414. let foot2_P1 = new THREE.Vector3(foot2_2d.x, foot2_2d.y, baseLine.points[0].z)
  415. info.disMeasure2 = {
  416. points : [basePointProj, foot2_P1 ],
  417. guideLinePoints : [fixPoint.basePoint.clone(), basePointProj, foot2_P1, foot1_P1],
  418. }
  419. }
  420. //fixPoint.emitLines()
  421. return info
  422. }
  423. //基准点处的测量线会重叠在一起,建议错开,向道路外移动。但是容易看起来很多线,为了整齐,让最长的在最里层;但需要每次排序更新所有的线……
  424. let createMeasureForPoint = (fixPoint, baseMeasurePoints)=>{
  425. let info = getMeasurePointsInfo(fixPoint, baseMeasurePoints)
  426. if(!info)return
  427. let info1 = {//垂直于基准线的水平测量线
  428. measureType : 'Hor Distance', color : pointMeasureColor ,
  429. unableDrag: true,
  430. points: info.disMeasure1.points,
  431. guideLinePoints : info.disMeasure1.guideLinePoints
  432. }
  433. let disMeasure1 = viewer.measuringTool.createMeasureFromData(info1);
  434. let info2 = {//平行于基准线的水平测量线
  435. measureType : 'Hor Distance', color : pointMeasureColor ,
  436. unableDrag: true,
  437. points: info.disMeasure2.points,
  438. guideLinePoints : info.disMeasure2.guideLinePoints
  439. }
  440. let disMeasure2 = viewer.measuringTool.createMeasureFromData(info2);
  441. //因多个measure在同一直线上,会重叠,所以使可拖拽
  442. let mouseover = (e) => {
  443. viewer.dispatchEvent({
  444. type : "CursorChange", action : "add", name:"markerMove"
  445. })
  446. };
  447. let mouseleave = (e) => {
  448. viewer.dispatchEvent({
  449. type : "CursorChange", action : "remove", name:"markerMove"
  450. })
  451. }
  452. disMeasure2.edges[0].addEventListener('mouseover', mouseover);
  453. disMeasure2.edges[0].addEventListener('mouseleave', mouseleave);
  454. let dragInfo = {}
  455. disMeasure2.edges[0].addEventListener('startDragging',(e)=>{
  456. dragInfo = {
  457. startMeasurePoints : disMeasure2.points.map(e=>e.clone()),
  458. dragPoint : e.drag.location.clone(),
  459. normal : new THREE.Vector3().copy(Potree.math.getNormal2d({p1:disMeasure2.points[0], p2:disMeasure2.points[1]})).setZ(0), //measure的法线
  460. plane: new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(0,0,1), disMeasure2.points[0]), //水平面
  461. }
  462. })
  463. disMeasure2.edges[0].addEventListener('drag',(e)=>{ //平移
  464. let ray = Potree.Utils.mouseToRay(e.pointer, e.drag.dragViewport.camera);
  465. let I = ray.intersectPlane(dragInfo.plane, new THREE.Vector3())
  466. if(!I)return //向上了
  467. let dragVec = new THREE.Vector3().subVectors(I, dragInfo.dragPoint);
  468. dragVec.projectOnVector(dragInfo.normal)
  469. dragDisMeasure2(fixPoint, dragVec, dragInfo.startMeasurePoints)
  470. fixPoint.emitLines()
  471. })
  472. fixPoint.disMeasure1 = disMeasure1;
  473. fixPoint.disMeasure2 = disMeasure2;
  474. let selected
  475. ;[disMeasure1,disMeasure2].forEach(measure=>{
  476. measure.addEventListener("selected", (e) => {
  477. let newState = disMeasure1.clickSelected || disMeasure2.clickSelected
  478. if(selected != newState){
  479. selected = newState
  480. console.error('selectMeasure', selected, fixPoint.index11)
  481. fixPoint.bus.emit('selectMeasure', selected)
  482. }
  483. })
  484. })
  485. fixPoint.emitLines()
  486. }
  487. let dragDisMeasure2 = (fixPoint, dragVec, startMeasurePoints)=>{//将disMeasure2拖拽一定距离
  488. let disMeasure1 = fixPoint.disMeasure1,
  489. disMeasure2 = fixPoint.disMeasure2
  490. startMeasurePoints = startMeasurePoints || disMeasure2.points //开始拖拽时的点
  491. disMeasure2.points = startMeasurePoints.map(e=>new THREE.Vector3().addVectors(e,dragVec))
  492. let basePointProj = disMeasure2.guideLinePoints[1]
  493. let foot1_P1 = disMeasure2.guideLinePoints[disMeasure2.guideLinePoints.length-1]
  494. disMeasure2.guideLinePoints = [fixPoint.basePoint.clone(), basePointProj, //修改虚线
  495. basePointProj, disMeasure2.points[0].clone(),
  496. disMeasure2.points[1].clone(), foot1_P1]
  497. disMeasure2.updateGuideLines()
  498. disMeasure2.update({ifUpdateMarkers:true})
  499. viewer.dispatchEvent('content_changed')
  500. }
  501. let updateMeasureForPoint = (fixPoint, {onlyBasePoint,updateBaseLine}={})=>{
  502. if(!fixPoint.disMeasure1)return
  503. let ps = fixPoint.disMeasure2.guideLinePoints
  504. let dragVec = ps.length == 6 && new THREE.Vector3().subVectors(ps[3],ps[2])
  505. let info = getMeasurePointsInfo(fixPoint)
  506. if(!info)return
  507. if(!onlyBasePoint){
  508. fixPoint.disMeasure1.points = info.disMeasure1.points
  509. fixPoint.disMeasure1.update({ifUpdateMarkers:true})
  510. }
  511. fixPoint.disMeasure1.guideLinePoints = info.disMeasure1.guideLinePoints
  512. fixPoint.disMeasure1.updateGuideLines()
  513. fixPoint.disMeasure2.points = info.disMeasure2.points
  514. fixPoint.disMeasure2.update({ifUpdateMarkers:true})
  515. fixPoint.disMeasure2.guideLinePoints = info.disMeasure2.guideLinePoints
  516. fixPoint.disMeasure2.updateGuideLines()
  517. if(dragVec){//基准点的那条垂线如果移动过
  518. if(updateBaseLine){//移动基准线的话dragVec也改变方向了
  519. let baseLine = viewer.scene.measurements.find(e=>e.isBaseLine && e.points.length == 2)
  520. let dragDir = dragVec.cross(baseLine.lineDir).z < 0 ? 1 : -1//相对于基准线向外or向内
  521. ps = fixPoint.disMeasure2.guideLinePoints
  522. let newVec = new THREE.Vector3().subVectors(ps[ps.length-2],ps[ps.length-1]).normalize()
  523. let dis = dragVec.length() * dragDir
  524. newVec.multiplyScalar(dis)
  525. dragVec = newVec
  526. }
  527. dragDisMeasure2(fixPoint, dragVec)//恢复之前拖拽的距离
  528. }
  529. fixPoint.emitLines()
  530. }
  531. let removeMeasureForPoint = (fixPoint)=>{
  532. viewer.scene.removeMeasurement(fixPoint.disMeasure1);
  533. viewer.scene.removeMeasurement(fixPoint.disMeasure2);
  534. fixPoint.disMeasure1 = null
  535. fixPoint.disMeasure2 = null
  536. fixPoint.basePoint = null
  537. }
  538. var sdk = {
  539. temp: {}, //记录
  540. debug: isDebug,
  541. scene: {
  542. getScreenByPoint(pos, canShelter) {
  543. //通过真实坐标获取DOM坐标
  544. let pos3d = new THREE.Vector3().copy(pos);
  545. if (canShelter) {
  546. if (viewer.ifPointBlockedByIntersect(pos3d)) {
  547. //console.log('shelter')
  548. return {
  549. trueSide: false
  550. };
  551. }
  552. }
  553. var viewport = viewer.mainViewport;
  554. var camera = viewport.camera;
  555. var dom = viewer.renderArea;
  556. //Potree.Log('getScreenByPoint scene' , pos3d.toArray(), {font:{toFixed:2,fontSize:10}})
  557. return Potree.Utils.getPos2d(pos3d, viewport, dom );
  558. },
  559. getPointByScreen(pos2d) {
  560. //获取当前画面鼠标所在位置的三维点(必须是点云点)
  561. let position,
  562. /* datasetId,
  563. dataset_location, */
  564. intersect;
  565. let Handler = viewer.inputHandler;
  566. let needReGet =
  567. !Potree.settings.depTexLocBindDataset &&
  568. Potree.settings.useDepthTex &&
  569. Handler.intersect &&
  570. !Handler.intersect.pointcloud; //如果开启了depTexLocBindDataset,热点就可能使用深度图了,属于该漫游点。全景得到的位置更均匀
  571. if ((pos2d && pos2d.inDrag) || needReGet) {
  572. //不使用当前鼠标所在位置的intersect,单独算
  573. if (!pos2d) {
  574. // needReGet
  575. intersect = Handler.getIntersect({viewport:Handler.hoverViewport, onlyGetIntersect:true, usePointcloud: true}) //数据集多的时候卡顿
  576. intersect = Handler.getIntersect(
  577. Handler.hoverViewport,
  578. true,
  579. null,
  580. null,
  581. true); //数据集多的时候卡顿
  582. } else {
  583. pos2d.clientX = pos2d.x;
  584. pos2d.clientY = pos2d.y;
  585. pos2d.onlyGetIntersect = true;
  586. pos2d.whichPointcloud = !Potree.settings.depTexLocBindDataset;
  587. pos2d.usePointcloud = true // 深度图不准
  588. intersect = Handler.onMouseMove(pos2d);
  589. }
  590. } else {
  591. intersect = Handler.intersect;
  592. }
  593. if (intersect && intersect.location) {
  594. position = intersect.location.clone();
  595. /* datasetId = intersect.pointcloud.dataset_id;
  596. dataset_location = Potree.Utils.datasetPosTransform({
  597. toDataset: true,
  598. pointcloud: intersect.pointcloud,
  599. position,
  600. }); */
  601. } else
  602. return null;
  603. //console.log('getPointByScreen',position )
  604. return {
  605. position,
  606. /* datasetId,
  607. dataset_location */
  608. };
  609. }, //全景模式一直获取会很卡
  610. getPose2() {
  611. const camera = viewer.scene.getActiveCamera();
  612. const target = viewer.scene.view.getPivot();
  613. const position = viewer.scene.view.position;
  614. return {
  615. position,
  616. target
  617. };
  618. },
  619. currentCamera() {
  620. return viewer.scene.getActiveCamera().position.clone();
  621. },
  622. // 切换模式 1 点云 0 全景图
  623. changeMode(v) {
  624. //Potree.settings.displayMode = Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
  625. Potree.settings.displayMode = v == 0 ? "showPanos" : "showPointCloud";
  626. },
  627. getCurrentMode() {
  628. return Potree.settings.displayMode == "showPanos" ? 0 : 1;
  629. },
  630. comeToTag(tag) {
  631. let dontLookUp = page == "geoRegistration"; //防止相机在地面以下
  632. return viewer.focusOnObject({
  633. position: new THREE.Vector3().copy(tag)
  634. },
  635. "tag",
  636. null, {
  637. dontLookUp,
  638. maxDis: Potree.config.panoFieldRadius,
  639. checkIntersect: true /*, sameFloor:true */,
  640. }).promise;
  641. },
  642. comeToMeasure(measure) {
  643. let result = viewer.focusOnObject(measure.object, "measure", 1200);
  644. return result.msg ? result.msg : result.promise;
  645. //返回值 1 deferred 表示即将位移 2 'posNoChange' 表示已在最佳位置 3 'tooFar' 表示距离最佳位置太远
  646. //后两种都代表停在原位
  647. },
  648. comeTo(o = {}) {
  649. //飞到某个点 暂时没写全景模式
  650. let deferred = $.Deferred();
  651. viewer.scene.view.setView(
  652. $.extend({}, o, {
  653. duration: o.dur,
  654. callback: () => {
  655. o.callback && o.callback();
  656. deferred.resolve(true);
  657. },
  658. }));
  659. return deferred.promise();
  660. },
  661. /**
  662. * 开始测量
  663. */
  664. startMeasure(type, unit, color) {
  665. const bus = mitt();
  666. let info = getMeasureType(type, unit);
  667. //info.bus = bus
  668. info.color = color
  669. let measure = viewer.measuringTool.startInsertion( info,
  670. () => {
  671. //done:
  672. bus.emit("end", ret); //完成
  673. },
  674. () => {
  675. //cancel
  676. bus.emit("quit", ret); //删除
  677. });
  678. Potree.Log("startMeasure: " + measure.id, {
  679. font: {
  680. color: "#00c7b2"
  681. },
  682. });
  683. viewer.setPointStandardMat(true);
  684. const ret = {
  685. bus,
  686. type,
  687. object: measure,
  688. ...getMeasureFunction(measure, bus),
  689. };
  690. measure.addEventListener("intersectNoPointcloud", () => {
  691. bus.emit("invalidPoint");
  692. });
  693. measure.addEventListener("firstClick", () => {
  694. bus.emit("firstClickMarker");
  695. });
  696. return ret;
  697. },
  698. quitMeasure() {
  699. viewer.setPointStandardMat(false);
  700. },
  701. /**
  702. * 绘画测量点
  703. */
  704. drawMeasure(
  705. type,
  706. unit,
  707. points,
  708. datasetId,
  709. dataset_points,
  710. points_datasets,
  711. sid, color) {
  712. const bus = mitt();
  713. /* if(!viewer.scene.measurements.find(e=>e.isBaseLine)){
  714. type = 'BASE_LINE'
  715. }
  716. */
  717. let info = getMeasureType(type, unit);
  718. info.points = points;
  719. //info.datasetId = datasetId;
  720. info.dataset_points = dataset_points;
  721. info.points_datasets = points_datasets;
  722. info.sid = sid;
  723. info.bus = bus;
  724. info.color = color
  725. let measure = viewer.measuringTool.createMeasureFromData(info);
  726. Potree.Log("drawMeasure由数据新建: " + measure.id, {
  727. font: {
  728. color: "#00c7b2"
  729. },
  730. });
  731. //console.log(info)
  732. /* if(measure.isBaseLine && viewer.mainViewport.camera.type != 'OrthographicCamera'){
  733. Potree.Utils.updateVisible(measure,'enterOrthoView',false)//基准线仅在正交视图可见
  734. } */
  735. const ret = {
  736. // 退出测量模式,清除之前操作
  737. object: measure,
  738. bus,
  739. ...getMeasureFunction(measure, bus),
  740. };
  741. viewer.dispatchEvent({type:'camera_changed', viewport:viewer.mainViewport, changeInfo:{}})//update sprite
  742. return ret;
  743. },
  744. /*
  745. // 创建固定点对象,measure是否是测量模式,
  746. //graph 如果是形状则有形状路径点,如果不是形状则传入pos当前固定点的位置
  747. sdk.scene.createFixPoint({ measure: boolean,
  748. graph: Array<{x,y,z}>, pos: {xyz} })
  749. */
  750. createFixPoint({measure, graph, pos, basePoint }, lines){//创建固定点或多线段
  751. console.log('createFixPoint',measure, graph, pos, basePoint, lines)
  752. let ifDrawVerMeasure = measure//是否绘制垂线
  753. let shape, measureFun, mainPoint = new THREE.Vector3(), bus = mitt();
  754. basePoint && (mainPoint.basePoint = new THREE.Vector3().copy(basePoint))
  755. mainPoint.bus = bus
  756. mainPoint.index11 = Math.random()
  757. let disMeasure2points = lines && lines[1].points.map(e=>new THREE.Vector3().copy(e))
  758. const baseLineChanged = ()=>{
  759. updateMeasureForPoint(mainPoint,{updateBaseLine:true})
  760. }
  761. const setDisplay = (show)=>{
  762. if(graph){
  763. Potree.Utils.updateVisible(shape, "forceByUser", show);
  764. }
  765. if(ifDrawVerMeasure){
  766. Potree.Utils.updateVisible(mainPoint.disMeasure1, "forceByUser", show);
  767. Potree.Utils.updateVisible(mainPoint.disMeasure2, "forceByUser", show);
  768. }
  769. viewer.dispatchEvent('content_changed')
  770. }
  771. mainPoint.emitLines = ()=>{
  772. mainPoint.bus.emit('measureChange',[
  773. {line: mainPoint.disMeasure1.points.map(e=>e.clone()), dis: mainPoint.disMeasure1.points[0].distanceTo(mainPoint.disMeasure1.points[1])},
  774. {line: mainPoint.disMeasure2.points.map(e=>e.clone()), dis: mainPoint.disMeasure2.points[0].distanceTo(mainPoint.disMeasure2.points[1])}
  775. ])
  776. }
  777. if(graph){ //多线段形状
  778. let info = {
  779. measureType : 'MulDistance_shape', color : pointMeasureColor
  780. }
  781. let updateMeasure = ()=>{
  782. if(!shape.isNew){//更新中心点和垂线
  783. mainPoint.copy(shape.getCenter())
  784. updateMeasureForPoint(mainPoint)
  785. }
  786. }
  787. if(graph.length == 0){//开始绘制
  788. shape = viewer.measuringTool.startInsertion( info,
  789. () => {
  790. bus.emit("end", ret); //完成
  791. shape.dispatchEvent('cancelSelect')
  792. ifDrawVerMeasure && (createMeasureForPoint(mainPoint) , updateMeasure())
  793. },
  794. () => {
  795. bus.emit("quit", ret); //删除
  796. });
  797. }else{//已经得到全部点
  798. info.points = graph;
  799. info.sid = Math.random()//sid;
  800. info.bus = bus;
  801. shape = viewer.measuringTool.createMeasureFromData(info);
  802. ifDrawVerMeasure && (createMeasureForPoint(mainPoint, disMeasure2points) , updateMeasure())
  803. }
  804. ifDrawVerMeasure && bus.on("graphChange",updateMeasure)
  805. measureFun = getMeasureFunction(shape, bus, true)
  806. shape.mainPoint = mainPoint
  807. //和普通MulDistance不同点:选中才能拖拽 非选中时不展示marker (clickSelected);选中后marker是非选中状态, 但是颜色一样
  808. //https://lanhuapp.com/web/#/item/project/stage?tid=de3e5e3e-a489-4b19-862a-7c87ce113467&pid=fa4ff928-d61e-438a-b8ee-f848048b7f52
  809. }else{//固定点
  810. mainPoint.copy(pos)
  811. mainPoint.isFixPoint = true
  812. mainPoint.pos2d = Potree.Utils.getPos2d(mainPoint, viewer.mainViewport, viewer.renderArea )
  813. if(ifDrawVerMeasure){
  814. createMeasureForPoint(mainPoint, disMeasure2points)
  815. setTimeout(()=>{
  816. mainPoint.emitLines()
  817. },10)
  818. }
  819. viewer.fixPoints.push(mainPoint)
  820. }
  821. ifDrawVerMeasure && viewer.addEventListener('baseLineChanged',baseLineChanged)
  822. const ret = {
  823. bus,
  824. destroy : ()=>{
  825. console.log('destroy' )
  826. ret.quitMeasure()
  827. if(graph){
  828. measureFun.clear()
  829. }else{
  830. let index = viewer.fixPoints.indexOf(mainPoint)
  831. index > -1 && viewer.fixPoints.splice(index,1)
  832. }
  833. },
  834. quitMeasure(){//退出测量模式,删除测量线. 基准线被删时
  835. console.log('quitMeasure' )
  836. if(ifDrawVerMeasure){
  837. ifDrawVerMeasure = false
  838. removeMeasureForPoint(mainPoint)
  839. viewer.removeEventListener('baseLineChanged',baseLineChanged)
  840. }
  841. },
  842. changePos(pos){//固定点修改
  843. console.log('changePos',pos)
  844. mainPoint.copy(pos)
  845. if(ifDrawVerMeasure){
  846. updateMeasureForPoint(mainPoint)
  847. }
  848. },
  849. changeBase(pos){//基准点修改
  850. console.log('changeBase',pos)
  851. if(ifDrawVerMeasure){
  852. mainPoint.basePoint.copy(pos)
  853. updateMeasureForPoint(mainPoint,{onlyBasePoint:true})
  854. }
  855. },
  856. graphDrawComplete: measureFun && measureFun.end,
  857. show:()=>{
  858. setDisplay(true)
  859. },
  860. hide:()=>{
  861. setDisplay(false)
  862. },
  863. selected(state, ignoreShape){
  864. //console.error(mainPoint.index11, 'selected', state)
  865. if(graph){
  866. ignoreShape || measureFun.selected(state)
  867. }
  868. if(ifDrawVerMeasure && mainPoint.disMeasure1){
  869. if(state){
  870. mainPoint.disMeasure1.focus({dontMoveCamera:true, dontEmit:true})
  871. mainPoint.disMeasure2.focus({dontMoveCamera:true, dontEmit:true})
  872. }else{
  873. mainPoint.disMeasure1.dispatchEvent('cancelSelect')
  874. mainPoint.disMeasure2.dispatchEvent('cancelSelect')
  875. }
  876. }
  877. }
  878. };
  879. mainPoint.ret = ret
  880. return ret
  881. },
  882. // 开启放大镜
  883. openMagnifier() {
  884. //console.error('开启放大镜')
  885. viewer.magnifier.dispatchEvent({
  886. type: "setEnable",
  887. value: true
  888. });
  889. },
  890. // 关闭放大镜
  891. closeMagnifier() {
  892. //console.error('关闭放大镜')
  893. viewer.magnifier.dispatchEvent({
  894. type: "setEnable",
  895. value: false
  896. });
  897. },
  898. changePointDensity(levelType) {
  899. //点云密度:低中高
  900. Potree.settings.UserPointDensity = levelType;
  901. return {
  902. percent: Potree.config.pointDensity[levelType].maxLevelPercent,
  903. }; //回调需要更改密度百分比滑动条
  904. },
  905. changeDensityPercent(percent) {
  906. //点云密度百分比(细节) percent : 0-1
  907. //console.log('changeDensityPercent ', percent) //有出现过首次加载大于1的情况???
  908. Potree.settings.UserDensityPercent = percent;
  909. viewer.setPointLevels();
  910. },
  911. // 设置far
  912. changeViewRange(num) {
  913. Potree.settings.cameraFar = num;
  914. },
  915. // 设置色彩模式 0 彩色 1 海拔 2 半透明(透明色)
  916. changeColorMode: function (mode) {
  917. const modes = ["rgba", "elevation", "color"];
  918. mode = modes[mode];
  919. //console.log('设置色彩模式 ', mode)
  920. let otherChange = {};
  921. switch (mode) {
  922. case "rgba": //每个点的颜色
  923. otherChange.opacity = 1;
  924. otherChange.size = 0.4 / 4;
  925. break;
  926. case "elevation":
  927. otherChange.opacity = 0.3;
  928. otherChange.size = 0.4 / 4;
  929. break;
  930. case "color": //透明色
  931. //otherChange.color = ''
  932. otherChange.opacity = 0.3;
  933. otherChange.size = 0.4 / 4;
  934. break;
  935. }
  936. viewer.scene.pointclouds.forEach((e) => {
  937. e.material.activeAttributeName = mode;
  938. });
  939. sdk.scene.changePointSize(otherChange.size);
  940. sdk.scene.changePointOpacity(otherChange.opacity);
  941. delete otherChange.color;
  942. return otherChange;
  943. },
  944. // 设置点大小
  945. changePointSize(num) {
  946. viewer.scene.pointclouds.forEach((e) => {
  947. e.changePointSize(num);
  948. });
  949. },
  950. // 设置点透明度
  951. changePointOpacity: function (num) {
  952. //num:0-1 navvis用的是亮度
  953. viewer.scene.pointclouds.forEach((e) => {
  954. e.changePointOpacity(num);
  955. });
  956. },
  957. // 设置点形状 传入参数 1 矩形 2 圆形
  958. changePointShape(shape) {
  959. viewer.scene.pointclouds.forEach((e) => {
  960. e.material.shape =
  961. Potree.PointShape[shape == 1 ? "SQUARE" : "CIRCLE"]; // and PARABOLOID
  962. });
  963. },
  964. // 设置是否强化边缘
  965. changePointEdge(isStrong) {
  966. //console.log('强化边缘', isStrong)
  967. viewer.setEDLEnabled(isStrong);
  968. },
  969. // 设置漫游点位显示
  970. changePanoPoint(show) {
  971. Potree.settings.ifShowMarker = !!show;
  972. },
  973. getDownloadInfo() {
  974. //获取直接下载点云的参数给后台
  975. return viewer.modules.Clip.downloadNoCrop();
  976. },
  977. /* getDataSets() {
  978. //获取所有数据集对象
  979. let datasets = CloneJson(Potree.datasetData);
  980. datasets.forEach((e) => {
  981. var pointcloud = viewer.scene.pointclouds.find( (p) => p.dataset_id == e.id);
  982. e.changeDisplay = function (show) {
  983. Potree.Utils.updateVisible(pointcloud, "datasetSelection", !!show);
  984. pointcloud.panos.forEach((pano) => {
  985. //数据集隐藏时漫游点也隐藏 //还是不隐藏了,仅隐藏点云
  986. Potree.Utils.updateVisible(pano, "pointcloudVisi", show, 0);
  987. });
  988. if (
  989. viewer.modules.SiteModel.editing ||
  990. viewer.modules.Alignment.editing) {
  991. viewer.updateFpVisiDatasets();
  992. }
  993. };
  994. e.changeColor = function (color) {
  995. pointcloud.material.color = color;
  996. };
  997. e.getColor = function () {
  998. return pointcloud.material.color;
  999. };
  1000. e.focus = function () {
  1001. viewer.modules.Alignment.SplitScreen.focusOnPointCloud(pointcloud);
  1002. };
  1003. e.flyTo = function () {
  1004. return viewer.flyToDataset({
  1005. pointcloud
  1006. }) || false;
  1007. };
  1008. e.getAttachPloygon = function () {
  1009. //计算完后才会有
  1010. return (
  1011. pointcloud.belongToEntity && pointcloud.belongToEntity.polygon);
  1012. };
  1013. });
  1014. return datasets;
  1015. }, */
  1016. screenshot: (width, height, bgOpacity=1) => {
  1017. //截图
  1018. let meterPerPixel,
  1019. isScreenshoting = true;
  1020. var {
  1021. getImagePromise,
  1022. finishPromise
  1023. } = viewer.startScreenshot({
  1024. type: "default",
  1025. hideMarkers:true, bgOpacity
  1026. //hideMeasures:true,
  1027. },
  1028. width,
  1029. height);
  1030. finishPromise.done(() => {
  1031. isScreenshoting = false;
  1032. });
  1033. if(viewer.mainViewport.camera.type == 'OrthographicCamera'){
  1034. meterPerPixel = 1 / viewer.mainViewport.camera.zoom
  1035. }
  1036. return {finishPromise, meterPerPixel};
  1037. },
  1038. canTurnToPanoMode(pos) {
  1039. /* if(viewer.hasNoPanoDataset){
  1040. return
  1041. } */
  1042. pos = pos ? new THREE.Vector3().copy(pos) : viewer.images360.position;
  1043. let pano = viewer.images360.findNearestPano(pos);
  1044. if (
  1045. pano &&
  1046. pano.position.distanceTo(pos) < Potree.config.panoFieldRadius) {
  1047. return true;
  1048. }
  1049. //poschange后会调用这个,如果返回false会变为点云模式,且不会自动变回原先的模式
  1050. },
  1051. trackScenePos(){// 单击场景某个位置 返回当前三维坐标, 调用时场景不能漫游与选择直到获取完成
  1052. let deferred = $.Deferred();
  1053. let quit = ()=>{ //取消获取
  1054. viewer.removeEventListener('global_click',gotIntersect)
  1055. Potree.settings.unableNavigate = false
  1056. Potree.settings.unableUseDepTexPick = false
  1057. viewer.controls.setEnable(true)
  1058. }
  1059. let gotIntersect = (e)=>{
  1060. if(e.intersect && e.intersect.location){
  1061. console.log('quit', e.intersect.location)
  1062. quit()
  1063. deferred.resolve(e.intersect.location)
  1064. }
  1065. }
  1066. viewer.addEventListener('global_click',gotIntersect)
  1067. Potree.settings.unableNavigate = true
  1068. Potree.settings.unableUseDepTexPick = true
  1069. viewer.controls.setEnable(false)
  1070. viewer.scene.measurements.forEach(e=>e.dispatchEvent('cancelSelect')) //避免stopContinue
  1071. return {
  1072. promise: deferred.promise() , //获取的promise, 获取到了返回三维坐标,没获取到返回null
  1073. quit
  1074. }
  1075. },
  1076. getSceneCropSetting(){
  1077. let boxData = viewer.modules.Clip.getBoxData()
  1078. return {
  1079. top : {value:boxData.scaleZ*100, minTop:0, maxTop:10},
  1080. scale : {value: boxData.scaleXY*100},
  1081. rotate : {value: THREE.Math.radToDeg(boxData.rotAngle)},
  1082. //rotByUser : {value:boxData.rotByUser}
  1083. }
  1084. },
  1085. //设置裁剪值
  1086. setSceneCropSetting({top,scale,rotate }){
  1087. viewer.modules.Clip.boxData = {
  1088. scaleZ: top.value/100,
  1089. scaleXY: scale.value/100,
  1090. rotAngle: THREE.Math.degToRad(rotate.value),
  1091. //rotByUser
  1092. }
  1093. viewer.modules.Clip.setBoxPose()
  1094. },
  1095. enterCropSetting(){
  1096. let Clip = viewer.modules.Clip
  1097. Clip.enter()
  1098. return {
  1099. quit(){
  1100. Clip.leave()
  1101. },
  1102. enterSetScale(){
  1103. Clip.box.frameHorizon.visible = true
  1104. },
  1105. leaveSetScale(){
  1106. Clip.box.frameHorizon.visible = false
  1107. },
  1108. enterSetTop(){
  1109. Clip.box.frameVertical.visible = true
  1110. },
  1111. leaveSetTop(){
  1112. Clip.box.frameVertical.visible = false
  1113. },
  1114. enterSetRotate(){
  1115. Clip.box.frameHorizon.visible = true
  1116. Clip.box.frameVertical.visible = true
  1117. },
  1118. leaveSetRotate(){
  1119. Clip.box.frameHorizon.visible = false
  1120. Clip.box.frameVertical.visible = false
  1121. },
  1122. }
  1123. },
  1124. ...parameter.sceneBus,
  1125. },
  1126. transformPoint(point, datasetId, dataset_location) {
  1127. /* //获取由dataset_location转出的position
  1128. var r = datasetId != void 0
  1129. ? Potree.Utils.datasetPosTransform({
  1130. fromDataset: true,
  1131. datasetId,
  1132. position: dataset_location,
  1133. })
  1134. : point;
  1135. return r; */
  1136. return point
  1137. },
  1138. // 坐标转换
  1139. coordTransform: (originType, pos, targetType, datasetId) => {
  1140. // pos 坐标的类型, 当类型为SCREEN时为 { x, y } 其余为 {x, y, z}
  1141. if (pos.z == void 0)
  1142. pos.z = 0; //否则datasetPosTransform NAN 地理注册
  1143. let needMeshLocal;
  1144. if (originType == targetType)
  1145. return pos;
  1146. if (
  1147. originType == CoordType.SCENE_SCREEN ||
  1148. originType == CoordType.MAP_SCREEN) {
  1149. let tool = originType == CoordType.SCENE_SCREEN ? sdk.scene : sdk.map;
  1150. let result = tool.getPointByScreen(pos) || {}; //{ position, datasetId, dataset_location }
  1151. pos = result.position;
  1152. if (!pos)
  1153. return;
  1154. datasetId = result.datasetId;
  1155. originType = CoordType.LOCAL;
  1156. }
  1157. let pointcloud;
  1158. if (datasetId != void 0) {
  1159. pointcloud = viewer.scene.pointclouds.find(
  1160. (p) => p.dataset_id == datasetId);
  1161. }
  1162. if (originType == CoordType.MESH_LOCAL) {
  1163. pos = Potree.Utils.datasetPosTransform({
  1164. fromDataset: true,
  1165. pointcloud,
  1166. position: pos,
  1167. });
  1168. originType = CoordType.LOCAL;
  1169. }
  1170. if (targetType == CoordType.MESH_LOCAL) {
  1171. needMeshLocal = true;
  1172. targetType = CoordType.LOCAL; //先转化为求CoordType.LOCAL
  1173. }
  1174. if (originType == targetType) {
  1175. //for控制点,获取点云未移动前的坐标值。暂且这么写。
  1176. if (needMeshLocal) {
  1177. //var invMatrix = new THREE.Matrix4().getInverse(viewer.scene.pointclouds[0].transformMatrix)
  1178. pos = Potree.Utils.datasetPosTransform({
  1179. toDataset: true,
  1180. pointcloud,
  1181. position: pos,
  1182. });
  1183. }
  1184. return pos;
  1185. }
  1186. //先转成lonlat(高德)
  1187. switch (originType) {
  1188. //EPSG: 4550大地坐标
  1189. case CoordType.EPSE:
  1190. pos = viewer.transform.lonlatTo4550.inverse(pos);
  1191. break;
  1192. //Wgs84 经纬度
  1193. case CoordType.WGS84: //84转高德
  1194. //pos = wgs84ToAMap(pos)
  1195. break;
  1196. // 本地坐标
  1197. case CoordType.LOCAL:
  1198. pos = viewer.transform.lonlatToLocal.inverse(pos);
  1199. }
  1200. // 需要转换成什么类型的坐标
  1201. switch (targetType) {
  1202. case CoordType.SCENE_SCREEN: // 场景屏幕坐标
  1203. pos = sdk.scene.getScreenByPoint(pos);
  1204. break;
  1205. case CoordType.MAP_SCREEN: // 地图屏幕坐标
  1206. pos = sdk.map.getScreenByPoint(pos);
  1207. break;
  1208. //EPSG: 4550大地坐标
  1209. case CoordType.EPSE:
  1210. pos = viewer.transform.lonlatTo4550.forward(pos);
  1211. break;
  1212. //Wgs84 经纬度
  1213. case CoordType.WGS84:
  1214. //pos = aMapToWgs84(pos)
  1215. break;
  1216. //本地坐标
  1217. case CoordType.LOCAL:
  1218. pos = viewer.transform.lonlatToLocal.forward(pos);
  1219. }
  1220. if (needMeshLocal) {
  1221. pos = Potree.Utils.datasetPosTransform({
  1222. toDataset: true,
  1223. pointcloud,
  1224. position: pos,
  1225. });
  1226. }
  1227. return pos;
  1228. },
  1229. enterMeasurement() {
  1230. //进入测量模块
  1231. viewer.setLimitFar(false);
  1232. },
  1233. leaveMeasurement() {
  1234. //退出测量模块
  1235. viewer.setLimitFar(true);
  1236. },
  1237. loadModel(info) {
  1238. info.moveWithPointcloud = true;
  1239. viewer.loadModel(info);
  1240. },
  1241. enterTopView(){
  1242. viewer.navCubeViewer.dispatchEvent('enterTopView')
  1243. },
  1244. leaveTopView(){
  1245. viewer.navCubeViewer.dispatchEvent('leaveTopView')
  1246. },
  1247. destroy(){//重新创建viewer,删了旧的
  1248. viewer.setDisplay(false)
  1249. }
  1250. };
  1251. Potree.sdk = sdk;
  1252. return sdk;
  1253. };
  1254. export default enter;
  1255. /*
  1256. 热点poi加载到的数据中,pos是错误的,只使用dataset_location
  1257. 关于webgl context lost报错:
  1258. 已知有一iphoneX在创建shadowMap后才报错。
  1259. 所以报错的话很可能是代码中的某一句,去除后就会正常。
  1260. =======
  1261. 如果遇到点云只显示一部分,很可能是裁剪范围出错
  1262. */