enter.js 57 KB

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