@realsee/dnalogel 2.0.0-alpha.4 → 2.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +44 -5
  3. package/dist/dnalogel.cjs.js +7 -2
  4. package/dist/dnalogel.es.js +3668 -184
  5. package/dist/dnalogel.umd.js +7 -2
  6. package/dist/style.css +1 -1
  7. package/libs/CSS3DRenderPlugin/index.js +1 -1
  8. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.d.ts +1 -0
  9. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.js +1 -0
  10. package/libs/PanoCompassPlugin/getRoomInfoInstance.d.ts +8 -0
  11. package/libs/PanoCompassPlugin/getRoomInfoInstance.js +48 -0
  12. package/libs/PanoCompassPlugin/index.d.ts +29 -3
  13. package/libs/PanoCompassPlugin/index.js +126 -44
  14. package/libs/PanoMeasurePlugin/Controller/BaseController.d.ts +36 -0
  15. package/libs/PanoMeasurePlugin/Controller/BaseController.js +69 -0
  16. package/libs/PanoMeasurePlugin/Controller/EditController.d.ts +52 -0
  17. package/libs/PanoMeasurePlugin/Controller/EditController.js +216 -0
  18. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.d.ts +12 -0
  19. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.js +44 -0
  20. package/libs/PanoMeasurePlugin/Controller/WatchController.d.ts +25 -0
  21. package/libs/PanoMeasurePlugin/Controller/WatchController.js +223 -0
  22. package/libs/PanoMeasurePlugin/Controller/index.d.ts +61 -0
  23. package/libs/PanoMeasurePlugin/Controller/index.js +176 -0
  24. package/libs/PanoMeasurePlugin/Model/index.d.ts +38 -0
  25. package/libs/PanoMeasurePlugin/Model/index.js +114 -0
  26. package/libs/PanoMeasurePlugin/Model/line.d.ts +30 -0
  27. package/libs/PanoMeasurePlugin/Model/line.js +64 -0
  28. package/libs/PanoMeasurePlugin/Model/point.d.ts +16 -0
  29. package/libs/PanoMeasurePlugin/Model/point.js +28 -0
  30. package/libs/PanoMeasurePlugin/Model/polyline.d.ts +16 -0
  31. package/libs/PanoMeasurePlugin/Model/polyline.js +48 -0
  32. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.d.ts +2 -0
  33. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.js +15 -0
  34. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.d.ts +2 -0
  35. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.js +2 -0
  36. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.d.ts +2 -0
  37. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.js +2 -0
  38. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.d.ts +22 -0
  39. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.js +108 -0
  40. package/libs/PanoMeasurePlugin/Modules/FiveHelper.d.ts +11 -0
  41. package/libs/PanoMeasurePlugin/Modules/FiveHelper.js +33 -0
  42. package/libs/PanoMeasurePlugin/Modules/GuideController.d.ts +18 -0
  43. package/libs/PanoMeasurePlugin/Modules/GuideController.js +75 -0
  44. package/libs/PanoMeasurePlugin/Modules/Magnifier.d.ts +24 -0
  45. package/libs/PanoMeasurePlugin/Modules/Magnifier.js +103 -0
  46. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.d.ts +6 -0
  47. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.js +117 -0
  48. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.d.ts +18 -0
  49. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.js +102 -0
  50. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.d.ts +12 -0
  51. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.js +35 -0
  52. package/libs/PanoMeasurePlugin/Modules/UIController/index.d.ts +16 -0
  53. package/libs/PanoMeasurePlugin/Modules/UIController/index.js +69 -0
  54. package/libs/PanoMeasurePlugin/Modules/UIController/style.d.ts +17 -0
  55. package/libs/PanoMeasurePlugin/Modules/UIController/style.js +78 -0
  56. package/libs/PanoMeasurePlugin/index.d.ts +7 -0
  57. package/libs/PanoMeasurePlugin/index.js +5 -0
  58. package/libs/PanoMeasurePlugin/typings/data.d.ts +28 -0
  59. package/libs/PanoMeasurePlugin/typings/data.js +1 -0
  60. package/libs/PanoMeasurePlugin/typings/event.type.d.ts +28 -0
  61. package/libs/PanoMeasurePlugin/typings/event.type.js +1 -0
  62. package/libs/PanoMeasurePlugin/typings/utils.type.d.ts +1 -0
  63. package/libs/PanoMeasurePlugin/typings/utils.type.js +1 -0
  64. package/libs/PanoMeasurePlugin/utils/clearGroup.d.ts +2 -0
  65. package/libs/PanoMeasurePlugin/utils/clearGroup.js +3 -0
  66. package/libs/PanoMeasurePlugin/utils/constants.d.ts +4 -0
  67. package/libs/PanoMeasurePlugin/utils/constants.js +31 -0
  68. package/libs/PanoMeasurePlugin/utils/distanceDom.d.ts +28 -0
  69. package/libs/PanoMeasurePlugin/utils/distanceDom.js +114 -0
  70. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.d.ts +2 -0
  71. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.js +21 -0
  72. package/libs/PanoMeasurePlugin/utils/findClosestPoint.d.ts +10 -0
  73. package/libs/PanoMeasurePlugin/utils/findClosestPoint.js +27 -0
  74. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.d.ts +4 -0
  75. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.js +9 -0
  76. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.d.ts +10 -0
  77. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.js +14 -0
  78. package/libs/PanoMeasurePlugin/utils/ironbox.d.ts +1 -0
  79. package/libs/PanoMeasurePlugin/utils/ironbox.js +1 -0
  80. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.d.ts +2 -0
  81. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.js +6 -0
  82. package/libs/PanoMeasurePlugin/utils/line.d.ts +17 -0
  83. package/libs/PanoMeasurePlugin/utils/line.js +32 -0
  84. package/libs/PanoMeasurePlugin/utils/math.d.ts +17 -0
  85. package/libs/PanoMeasurePlugin/utils/math.js +44 -0
  86. package/libs/PanoMeasurePlugin/utils/mouseGroup.d.ts +2 -0
  87. package/libs/PanoMeasurePlugin/utils/mouseGroup.js +21 -0
  88. package/libs/PanoMeasurePlugin/utils/ndc2Screen.d.ts +5 -0
  89. package/libs/PanoMeasurePlugin/utils/ndc2Screen.js +6 -0
  90. package/libs/PanoRulerPlugin/index.js +1 -0
  91. package/libs/PanoRulerPlugin/style.d.ts +1 -1
  92. package/libs/PanoRulerPlugin/style.js +1 -0
  93. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte +3 -3
  94. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte.map +1 -1
  95. package/libs/floorplan/ModelFloorplanPlugin/Controller.d.ts +2 -0
  96. package/libs/floorplan/ModelFloorplanPlugin/Controller.js +3 -1
  97. package/libs/floorplan/TopviewFloorplanPlugin/Controller.d.ts +2 -0
  98. package/libs/floorplan/TopviewFloorplanPlugin/Controller.js +4 -3
  99. package/libs/floorplan/constant.d.ts +5 -0
  100. package/libs/floorplan/constant.js +6 -0
  101. package/libs/floorplan/typings/floorplanServerData.d.ts +4 -0
  102. package/libs/index.d.ts +4 -1
  103. package/libs/index.js +4 -1
  104. package/libs/shared-utils/getPxmm.d.ts +6 -1
  105. package/libs/shared-utils/getPxmm.js +26 -12
  106. package/package.json +2 -1
@@ -0,0 +1,32 @@
1
+ import { Line as FiveLine } from '@realsee/five/line';
2
+ import { lightLineOpts, normalLineOpts } from './constants';
3
+ import { Color } from 'three';
4
+ export function creatLine(start, end, opts) {
5
+ const lineWidth = opts?.lineWidth ?? 2;
6
+ const lineColor = opts?.lineColor ?? new Color(0xffffff);
7
+ const pointSize = opts?.pointSize ?? 5;
8
+ const lineRenderOrder = opts?.lineRenderOrder ?? 10;
9
+ const pointsRenderOrder = opts?.lineRenderOrder ?? 20;
10
+ const line = new FiveLine(start, end);
11
+ // set line
12
+ line.setMaterial({ linewidth: lineWidth, color: lineColor });
13
+ line.line.material.depthTest = false;
14
+ line.line.material.transparent = true;
15
+ line.line.renderOrder = lineRenderOrder;
16
+ // set point
17
+ line.points.renderOrder = pointsRenderOrder;
18
+ const pointMaterial = line.points.material;
19
+ pointMaterial.depthTest = false;
20
+ pointMaterial.size = pointSize;
21
+ opts?.pointColor && pointMaterial.color.set(opts.pointColor).convertSRGBToLinear();
22
+ if (opts?.pointTexture)
23
+ pointMaterial.map = opts.pointTexture;
24
+ return line;
25
+ }
26
+ export function creatLineMesh(line, type) {
27
+ const [point, anotherPoint] = line.points;
28
+ const opts = type === 'light' ? lightLineOpts : normalLineOpts;
29
+ const fiveLine = creatLine(point.position, anotherPoint.position, opts);
30
+ fiveLine.name = 'normalLine_' + line.id;
31
+ return fiveLine;
32
+ }
@@ -0,0 +1,17 @@
1
+ import { Vector2 } from 'three';
2
+ /**
3
+ * 获取一点对于线段上最近的一点,
4
+ * 如果可以是过直线垂线的垂足,不行的话取线段的两端
5
+ * @param point
6
+ * @param linePoints
7
+ * @return
8
+ */
9
+ export declare function closestPointOnLine(point: Vector2, linePoints: Vector2[]): Vector2;
10
+ /**
11
+ * 检查两个点是否位置相同
12
+ * point: { x: number, y: number }
13
+ * @param point1
14
+ * @param point2
15
+ * @return
16
+ */
17
+ export declare function samePointAt(point1: Vector2, point2: Vector2): boolean;
@@ -0,0 +1,44 @@
1
+ import { Vector2 } from 'three';
2
+ /**
3
+ * 获取一点对于线段上最近的一点,
4
+ * 如果可以是过直线垂线的垂足,不行的话取线段的两端
5
+ * @param point
6
+ * @param linePoints
7
+ * @return
8
+ */
9
+ export function closestPointOnLine(point, linePoints) {
10
+ const tA = point.x - linePoints[0].x;
11
+ const tB = point.y - linePoints[0].y;
12
+ const tC = linePoints[1].x - linePoints[0].x;
13
+ const tD = linePoints[1].y - linePoints[0].y;
14
+ // 设线段为 AB 线段,线段外一点为 P
15
+ // tDot = AP 向量与 AB 向量乘积,tLenSq 为 |AB|平方。
16
+ // tParam 是 AP 向量在 AB 向量投影向量 AC 与 AB 向量的比。
17
+ const tDot = tA * tC + tB * tD;
18
+ const tLenSq = tC * tC + tD * tD;
19
+ const tParam = tDot / tLenSq;
20
+ let tXx, tYy;
21
+ if (tParam < 0 || samePointAt(linePoints[0], linePoints[1])) {
22
+ tXx = linePoints[0].x;
23
+ tYy = linePoints[0].y;
24
+ }
25
+ else if (tParam > 1) {
26
+ tXx = linePoints[1].x;
27
+ tYy = linePoints[1].y;
28
+ }
29
+ else {
30
+ tXx = linePoints[0].x + tParam * tC;
31
+ tYy = linePoints[0].y + tParam * tD;
32
+ }
33
+ return new Vector2(tXx, tYy);
34
+ }
35
+ /**
36
+ * 检查两个点是否位置相同
37
+ * point: { x: number, y: number }
38
+ * @param point1
39
+ * @param point2
40
+ * @return
41
+ */
42
+ export function samePointAt(point1, point2) {
43
+ return point1.x === point2.x && point1.y === point2.y;
44
+ }
@@ -0,0 +1,2 @@
1
+ import * as THREE from 'three';
2
+ export declare function getMouseGroup(): THREE.Group;
@@ -0,0 +1,21 @@
1
+ import { CurvePath, DoubleSide, Group, LineCurve3, Mesh, MeshBasicMaterial, PlaneGeometry, SphereGeometry, sRGBEncoding, TextureLoader, TubeGeometry, Vector3, } from 'three';
2
+ const planTextureUrl = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAMAAAAZlhLyAAACB1BMVEUAAAD+/v6qqqqgoKCLi4t7e3u4uLhvb29MTExZWVlCQkJgYGBqamo4ODi9vb3///9FRUXPz887Ozv///9QUFBWVlZdXV38/Pzj4+Pn5+f8/Pz5+fn9/f329vZoaGje3t78/Pz////x8fH8/Pzs7OyBgYHd3d39/f319fX+/v79/f2Kior6+vr////+/v76+vr+/v7////8/Pz9/f3+/v7m5ub7+/v+/v7+/v7j4+P////+/v79/f3d3d3h4eH4+Pj+/v79/f12dnbc3Nz9/f3w8PD9/f34+Pj9/f3+/v5jY2P8/Pz9/f2ioqJubm7v7+/+/v76+vr5+fnv7+/09PSDg4P////t7e3+/v7+/v7+/v7///+ZmZl7e3v7+/vy8vL+/v7+/v7p6en19fX////s7Oz+/v6lpaX+/v7r6+vg4OD9/f3q6ur///////+UlJTt7e329vbz8/Pg4OD///+wsLCdnZ2QkJDe3t77+/vz8/Pw8PD+/v7c3Nyqqqrw8PD4+Pj+/v7////4+Pj////s7Oyurq7f39/p6en8/Pz////8/Pz19fVycnK0tLT////q6ure3t7o6Oj////s7Oz39/fd3d3h4eH+/v7j4+P////+/v7n5+f///////////////+ysrLe3t7////////8/PzHx8fl5eX////39/fv7+/d3d3///8S/hbOAAAArHRSTlMAzhATFhkNGyEfIx4dJQ/OKwoozS4wMh3Uy4SPbjs34kJ9EAkGP+8Snk1nRRo5JYl2eDQiA88wY3PXRDYN6dyTX0s751SxPJdhPjRdV1M4ti0XFa+pQiq5aShQSE09IKJwWMilWr9SVzLC3wvFwplKvKKY9spfUEjge6yqnexaLpqQakgBtVz1wQe9i4s6ZaG788fGKIXx95TZzKbSuKu1s2LlsJb7dqiu/cSWYhzVwQAALl1JREFUeNrs0jFqalEUheE9C9ugAQloCg0WmuIJIbxHUsQUQhQEQUTINNI463fvqU2xT3G5xfetNYQ/+M3PT7SDfDo/T0/SIe+pCJAOt0mHvrgvAqRDUn061/vrNSDrOhqNpEOFURGQNfqWDlW+i4CadJ6lQ95zESAdbpMOfTEcPg+Hw4CsphvpUGM4bsoZB2SNW9JBOnRm/Dkef0qHvM8iQDp0ZNOSDnmbIiBrM5lMNpOArElLOkiHzkwGk4F0qDAoAqTDbdKhL6RDpcHhMBgcArIOLemQNz8c5od5QNa8JR2kQ2fmrceArMeWdJAOv5EOffH12Ew65H0VAVlf2+1WOlTYFgHSoSMf0qHORxEgHW6TDn2x+Fg0D8hatKRD3uVyWSwuAVmXlnSoSWc2kw4VZkVA1mwlHaqsigDpcJt06IvVdLWaTgOypg3pIB26UtJ5fZUOea9FgHToyL8iQDok1adz1zwg664lHaRDV0o6y2VA1rIhHaTDr6RDXyz3y710qExnvw/IarqRDtKhQ+v9fr2WDnnrIiCfzoN0qPFQBEiH26RDXzzsds0DsnYN6VBhd97tzueArHNDOlR4OTeTDnkvRYB06Mh7ESAdOnI8vh+Px4CsphvpUON4aso5BWSdWtJBOnTm9HY6vUmHvLciIOtPESAdbpMOffG3CP6zd38vTYVhAMffeebxJjbivRDmhG0K6TC3WaRkkIGloWBplBWU/STJjYLdJIM1swvnxS70QhR1oBf9mZ09bm6e93nPOe/pzG32fCblMLrp2/O+79lxEkqHXJJxI5zxcUaIqnEDpUMoHXJpIJ04pUPUxQEjhNIhOEqHtItlwAihdMglWd5Y3tigdIi6DcAIcZVOmBGiKlxB6RBKh8hQOqRdrKyshFcoHaJuBTBCVK1MTExQOsQFoxyjHkaIqgkDpUNcSCaNcpKMEFXJCkqHUDpEhtIh7SKVTBkfjBBVqQpKh1A6RIbSIe0iFY1GKR3iQjRaiYcRosrohtIhlA6Ro3RIa8TuDI+nCgfFsUHD1nVDCFy/vrU1WDF2WNpeefd49B4j5Mzio9lQqcg591X0Xwf1dGr6fQbO+X76IDR1c5GR/9qNyHLhEKIB9ukAKKiY2XgcY+R/NDIc/VOLRi2dekAnoeleRv4ng49Sx6ZsxHQSoVAiIaQj5FOOvr7ByH8h9mA7zX0yN+vpgPOnN30yfP8gPsrIFdf7MZeFblyng+MnE19uM3JVjW4ccZ+Nm7p+HR56Aui155COFX64QRufK2lguMR99vr1qlo6Nf0+ezwzPMDI1TKagv2NSjrbAE1HjqejTxi5MqoDRzWdvj7jQykdwI/m6Mh1NYwmYeAop9MHFNMBPLv9kpFO9yXjvJugTTpBhXoKdxjpZGMOwwlWfwkGLdKBrzuPJzPJSKdyFg4EYTyC2XImOjui19zvqzz0mpGpZOEgbfy5CmfxlB4x0okchROEWXKy92MushvQL7gP9IsW8w8mcumz1hzEc3B3k5EO4yCcYMVOLhx5qldh6WB2H6xkio7GDz+6y0gnGbULB1ao4+25OzBqVNMBtx78KDuoh2duMdIp7iWztnubncLnXh0opCPYncpkbfPJTtCdhR3i9aHNYSqYTvyK6aiuupmZ+zMzM111Oir2K3psN3qKw7Tl6QC3Mtx64hz+eBRAmhHMgC6BLsrHT6xHDy89Z6S9DYSzlvubYnLMqpqA8QG/1dOB57UvyvuZDJ2du2T2o/TqRFu7e8ytDlSlVzF5NfBLpR3jl8rHDKg/D5xHhPcTm85ZjR6enmakXT3d4xYTZyeaR7s5KwKaMS1YP38KCxZUZPyG17MbPrS44Mz3aPC0qUiRyyfO0bsbQja1biAcwU/QJYA/L1u8AhGr0VN8zEj7GUhx+RWcvjG9gbC3AXbpiPMHr6f/VL7n4Sm6FaztjB5x6cQp5PUGYjS4oaGfQ0NDXZYC6Mp1pyCNh/+ho1abmd+Rjpy9O0I3sOLYGQJddmDJM9eTT+zL4snO0u3vbSRW4Gg3htMv5m5k2ainI/59+rndUFYSD8+NMNImJg9la1VmTAgHZoR6OuoL1+6ebNFKRxhpB5vxfdmpql9xhwM0Q5fxeDtUeRhP4bnzevRzkRNJPPuzjLTeYIJLruOMB/Qah9lAMjXf3xq+a6Baj11A5ngC4zv4qsVDg4y02I0cx2dO4Y3zPU4lDMHb74a3Gsb55OlNBPF2cvQ2GS325sSHOo7oNXbZGB+o70BDQGg29eg1kwf44CnTbTwtNZlGNznZlRi+VOHdyNP5AOnI8pHFc/GsHpjbQdtJ053LLfQq68Pk8o3hyLux9gFolvB8zMvW7gHaTvYjI62xGebov0g8YL9WaTj1dPDDl3nwhPexeHiUrg62xMA2xy4eH0/ajxwNKKSjXo9p8PSX0XYKdNBqgYEMx7Y5fYt24WgOPQOaQ3b75cVQMEjttAWxnMpBZuedXiWbN3g5eDof8HRwtqvWgyLWzt4WI8q8nzlHeeuRowH3U0d93Qo0xNObw47pe3QbhjLvy4nGLMvR1Kyvrz97tq5pfg24iufiohUIYRueU2rnEg2cIuFkpy9cyxHCUUnHb4Chs+43aJpCQGg8etUsF+PhGWpHhfflpB817HKEchwXU7cO/I1U2sEHTyRN7bTQ1ilyKj8+3+agFKpB0lHtx2Lw5MviSYvnvjIiuoxygsGDXv2Mm12OH7W0tLS+tOTHKW55AvV2RnLI3MnRGf0S3C4g5RRi8nBcZAOWgF9KKR5Q2ywjcydB31ncfElktUoGdKA6cfxWHj5cevjwoR+o1yNpB8SRdpYZabJ5cebsz1mcrNx1A+kAvw3HG57GKzzjyJo1zEhT3cwKixX/LC1H61LuRp6Oej3yq4NT4tzJjjHSRLfSPjM+rctWK/Vw1NMB6u3Mid+plaZ7v5roRlncIU8LI0c5HNzCglHOgt8ZTUZ2Sp8X16wyfUt60wyWxB3yfL0cpYljbwH4nVJtZ1rc7pfopdBmCYlb5DnpodxlN93dfuNR+WRh4beRTv25345iO5+F27/4Nh3RmyOOlYOvVq4mjpFIowVQfw5fdxcP3s4wF9qJM9IEkX1hnzOlg38fOdAFkKcD7PLBrw9KrizPisesL4x4brEo3NkVV5k51msU4gXoxvgtqKxZP4Qz+jF9e5bnNk+5uZyQbOaohQMU0gFWex/na1Zgz2dWYMRjU9w8dHIB5zPHcnujng6Qx+N87sQOhO3OPCOeeilcRS6PNJQTsCxHPRtI59u3b9V0lPPRRPiLEr3H5nZ26IcXe2rgj7mcdF4HtjPHr6mHA4xwjHjgU/V4HLyYroN82tzOEd345aWo8JJnBN3oaAJ34UA6oNuWH4e0gx6z+rOmdniUEc9EhC2y5FjurJxuoJ6OnPKiFTAetcvKQXM79MNsPPO06DOJKpejns4n0O1hO114OyGfSZreMc4jmxmrw5VCOPhSpZ4ODmlHrAd7HT32xzx26ITukVfc/L/yjftyHOg58wlUn7icPEI5aDv5HfMJnd5s0BP3iubXH4bR7w32YJfT02h1dfXTKqRzzoN2GtS3yu/M250ynbK8ILwLe0IHdtdzFLvpMVsFPWaKJ3VNgB2z+sxjJ8zIP3tpftWzvIguV/ZXc2yykaejkI/S3AF6xaL5ymCWbhn8Z5sl8xWdSfRSoPuZ0yOxumaUswafqtajvmaNma/uZBjxdo8c9IV1YLNFVgoHtwbkX3fdjunSoA7GTdsd/poRb/fIpfq5XGHmKHSDp4NztuOxO6LrwPwOKkX6WbP/JmUqJ70rbnTsw/GrhQOura29N1zrseRq7uAn9L/sndtrE0EUxndRqDGbrph616pV44OKN1KvFVQoWkFUKKigqIgPgvoiiJAiXkBQRKQiXtIq6oN/prNfE8O3eyZnZxLf5heFXdsX4cd3zpmZ7D6OmQNRYIgb5ukFqUVWOmQ3cZJkBJ/kDkg694PJo2yF4j91NI2Jr9eigDevWjGzOFqi0fEXJ+nRU6eHxaBSucP2SOpMfI+Z31FgWNueabpFmq7czZGsGUmY6h1QTXpYA8i3ZnHJepnvlMNBZX++xUS636fRKSLGDXtj2GC4syG7SvII7qjNcomVwedhQB8W53OhM7+OypX4tXLHyOHAqUIa8xfqAFwC/Nxqj+6O1O7wlHVzPsTOfwqdI90NCPtc7hw5FDUEqQM4gJw7Hj12zoXYGQ7TudD5JSzpqNVKF4e9YXWaUIexyuPa7xQ75dHFXOyEp1/48Z7NSaeFcsU4Ro7dm4r502xm7mTXFas9avCoYxaXrOk0DbEzOCfqMbFJX9IRFgJdxalk1gCjTrPZrAC4VCJ5lH5nmTqht0LsDIEWh87jj+qSjkuxEryBND2aoNJD1GdEcYdR1dkSup3BOZQLnY1So+NvzkhRnAqwqwNgD2ePnzuguLjzO8TOwDzk0KkroaMOV8XIqSY9bwTazXa7DXVs8iQUPT7uCKcv0jQNsTMQk7nQeevaI+vVivKmSLNtQqddEaHgUdxxnLI+x0Q9nPlyZWNuvHqm1avS1SrJZU7FQhtUgC6Pjzu8h95RZzJNwwb6IJycZ3WesznAJ3M4cWRzVix91me0V+De5g6gnVF9gUeLnecx8SCccHfjdp3Vmfx3kl0rVxjLFXOs3sCcDutB9w5KWZqepKrnjt4p/zu4U0/DA5UHYDEmPmvlyitzZGtEdUBRng5av7Oc0Ab0TVyx3kcBBy7lQucQhY63OdzlCN6QOseOmT8rGGSPIo+aO0q3syXl2AlPTXFhO5vzcJDQsQ5W3N4UOJaB1MkjVa0E2N1xGdBzO1kHo0BpdjxgdV7SZK6bo/c5cuCwOkBUh+VR3dE7ZY6dC6FRHtI3aNI3o96ho5uDxNHVYSrO7rh0O1fmuWJdjwKe21dHhXrlbE4CRHFkvhwzH1JHsQfmlMsdZcjaHodG2Y/DuSb5I8zxqVeWTStVnJXm8wWYC0IsW1XZHe/YeZbGoVH24iib0/LrdFgdOXMka7qcOvXFfDo3okGFopUAtWTpsfM+Jl5EgVK8WoiJe0q9cjZHFwfqgH+35kf9gkec0b0r1nWOncUo4LPz+WBCXdPRW2SpQy5oQ+awOgC/wvwndybecKO8LgqU4RbXq+1Ur/zUUTMH7Q0Q1CFkddgdvVNmdYqPLzgQE3ejQBl+kDnd7Sv/ciVP5eyNwH1QVIfs0XJH73bkPdBDvKLcigIluMaLOt/s5oAS5owIo5ViDqnjFjyyO3rFYncWSJ3H4a0jZbiamy6E7Su3wby3b0UzOYmjq8PJ02/QKjllKUs7YfvcnfdCvRoodDLoNKAuTm1Jna2ZOjVZHmnQqrI6euzYS9Y0v1f2bRRQmfhK6iyIB0v10OHMsZcrSZoa2ApqQPCHgkcpWR6xM8rvjniwMwpoHK/LX4QY1ZtkRZ1SDXIN5NQBojpy7uixozfK+3lBeToKOJ63eDmE0LH3OWwNxJHVAfgVLXeKpwbdtyPwyJSYCO8c0eEHFM1PeIaOfbqyiEPekDqELXkK21kjyWAVa4K3z79HAaetz/S3X73icqX3OfBGVwewO4I8BrfYkWes59Qn18MrRzTu1YVnB3qHDs/ldnNqgjo/gaIOu8PqeMZOV517YTwf6PtXh8VWxz90bG0OKKhz9ufZmoTc7lDJ0oYsvWLdTNPQ7Ljwh8xZ7L9pbg8d3ZwVFnNWdzkL/t2SOjVpgYenLE0dfcbiru9PFOjLbq5XT0kdr9CxlCsqVqSNrA5Q+p1KB+fYkZudt1yxdkeBfmxjda4L5jiGDrD3OYI3q5aYAp2bgj1at8PuOK8o43R7eEeWC5uFo6Ve9QqImSOrQ9oU1AEsT98R3bVigfzJi0k+73U1CvTjNz/Wn0bzIXY6gjjszdjY2BQwFwV7BHf8Y8fe7Izyyk54q2N/+G0iLW91AAZzwZyVeXVYnDGwxngzNzW1ZgywPDWgxU510GanReosRIE+XOFW55bjqo48mQvlym4OrAFzhqm5NWvNJfxxcEdZFtQPCy6ps5kXBa9EATv7eO/ztE+XLJkDbH0OiQNr1mY0AC7xjyRPfkZXhiwpdvSVnW1p2AEtzTk+q3NT6JLV0dwhdNgciANvZsZnxsdN6DTm5sbHx2dmYA/kodxxiB2vinWZ1TkXBcquJb/xqVfKmo5oDtRBpYI3hosXLzaAucjuZyBPt2zJ7sg7WW4Vi5udX+TOxihQ9oTgZ31BUJ+vBHHEzFkSZ2Ym0+bdGUMDZFfvjD7IHgSPmDvWnayRQdT5nIbvD5dlgdTZrKij1SvZHVanZ04ncTJvbtzYtWtXA5iLGzcye5A8a3tFy1qyvJod+ZEXT1MK4ShgZQcfLj2tjuZ2dSCObk6vWiFyMnHgzezsbKPx6VOjYS5gj5EHwQN3qGRp3Y5PsyOvJ4evRdi5yQPWIeG7EGroKOr0xAFkjokciDM7u8fwKeNDdjU7C3lM8JA7vKxM5ijNznJtVVAesSajQLnZPN3rWq/0TQg5dGAOIseIk3nz5NGjRx9efzCYiyeZPUYeBA/c4dixuOPU7MhbER/TNBzZKcdf9s6et2koCsMOQkiACoqYUwmJLe3CwsDCwMCSf+A9Gx4s21tGVxXqZWRgwUMcNfGP5Nw3vT697XXO1am63WfKHD1633M/bH//4H05jfeS2ZzYKZlDJ3wE4YcOm0PiNE2R53l9BWr6WTQNycPucOx47giDsqKw3vlfzf2SJYTDT76so04dOXQA1xXMQeRYcerVanUF6Edt5UHwwB2urDMhdvSbglCH+Pc+vVQwjl+z+/BrtlV99fbklPw4dGDOKM56XZI4Zblej/LAHT925GFHEzuszs9ZOgCN47dwz0uxISj1FcxB6FBbwZzaerPZtCVoNxtrT03uoLMQO3BHbKzIOfnUKdZHb9j5myXitnW+8aijUieur6COZw6J07ZVVYKqalsrj+/O6cZ6HW4sxb2LH7O0sRPH5wVxebk4cvG0UUeqK+Je6NywOZQ4VdeZP8B0XUXJw+7cuNiBOuD55uSLBTH+JV+zxBSf5uAV46eOYE5gQ1AIHacOQme5PJpDiWNMv7vdDsP2dtcbQ8lzdGe5ROyEGytcWJObgvLqnJkfSc+dC+oQIXXib1zIB1hnnjocOnfmdKbfDyP73nR37nDsKIYdzSmWI6mjSB1BHeEASxp13MocodMUzpwDBQ6zPTh3isbFDtbnwdQB8hJLUielzlPUEa5cyKOOnDrcV2PokDm74QE7cmeMHagzPeyAiWFHnnWSOkquPXUUF5OFGxdsDnjQV0WO0DGH4REHg9jJC24sQR2gTp3wrHOdJaaYR6fOS03qcF/56pyf275C6JA5PdrKZ9uTOzZ20Fjx6hAwR1qdy4UFsoSgTmBMVqojrs0x6nBf2dDZDwH2NnZcY7lhB+oAcXWuVwckdTSpIz8zHH2C9eakOuirquuHIH1XobF8dcKxo9/YeeFI6vyn7v5ekwrjOI73L3QRaRZZRypH9mNraWk5mW2NCS0Xzi1wWktcDtqPm5MRG81oIy+a2EToKojov+zz/T7Pc74+Z4e8qJvedD1Y58Xne8p+/As6crH+7sPP4N/WkbfkN+pe/Qym81NdLI/OGVmdf/mr8/+JTvsOisUOHcdpNjOZzOXLl69eLRafouvXr5+lKhMTEzfQ8vJyqbSA7t5tNMbHx9PpdCKRmJmZQ9Fo9D56jnK5eDy+srJSr+fzhUKtVltbW5ufQo+TaGxsrFz+8OE8qlarqdQtdJu6hM6hm9TnCJVFs7Oze7N7e9fQ6urq1kv0DLVarcXFR+gJtbS0tLm5+Qqto42NFyhMTVLfQqHQPWpwD//8+mt0kfs+Pf2AusIdH9GnnTv9X8F0fvX7O/QHeI6voPfvpx9Mc/gyrgpfmv7XPtPkZFjV7XY3ugeqL9xH1aLqnWpVhW9zW5fdjlAd1VfqLYWfsFQqVa2ep8rl8hiVTD5GU1PzqFaoFQr5fL5ex1OIx3PUPnU/iubmZtCFxIV0ehw17lILu6USHu8NhIddqVTw2PH4SUGxeBWBBXA4Tcc5jMViINNun2q3FZ1DyGE6kEN2iiKnMoG0nBLLAZ0G5IAOEjpI0UEn6eBb03S0HZLDdgiOpoP8dGBH6GwF06HYDsthOywn7NEJEZ2HlCdH08FfmTF0YKf/I5jOj/4O0Tk+Zjmgw3hcz85D16Izqel0VQqObUfBWVRwQGdL6Ogi2x0t55ymw2k6xo6Wgx8sh+1oOnXIibMcLsp0EOTQ5xrA02iQnd1dbacHOghyyA7jAQXIQZkmck4bOpgda3UQ6KjVEToVszolJKuj5ICwf3VyQ6tT8NNBJEfoaDsnVydr6PDqIMjRdFoIcihrddYRy0FEx1qdwWCgVse16Sg5ho5osaPV+TRMh3MNHchxQx6dcEhGB3BAR9mxVuejbA7ZYTnIuIls26ODjBzKyDF2khgdZadQo9VBhg5SdPZZDo3OBZodHh2O6OzS7PR6PW910NDqZFDTQZBDCR3YsVYHdJBenQA6jREHS+ismYNlr46xM/pgQY6yQ3LM6iB7dTYDVkeNjqzOIOBgyeocQc4oOkc+OhdlddzQIOQ/WF2ZHRkdgYM8OXKwNJ5sVg7W14DVOW/syMGa1wcLycHyrY6hIwdLrQ7LQWp1gg5Wkw+Wc2gO1il1sLScYDqV4YOFTh6sqHWwct7BylsHK2nRsVfnTwfLvOv4VkfReaRXx09H7Fh02M7fH6wH5mC5rqZDqyNywnKweHV0io7ggRydyJEiHUPnZsdeHT5YMjpMB3jMwfK/6+yLHaKDEgllp6HoLCyU6GD15F0HmdUpenQg5zTJYTpmdWLymmxfLJZDdMROwGsyexY5yHew5kesjv9geReL4Zx4TW49M3SUHKGDhugQHD07SOTYr8n6Yo14TRY6vtUJfE3GxRI7GwcH68Gvye+C7cjqdBSd35qK3ky2QG8mm0NKHUTKwWwmKyCSDrjUgddYoEIH1kyeAk47iFInELnUAQEVSNphGFyAvHEdskeT6dY5Hx0SxAIG97gO/k1YQhQMCYqJiOBbdUHSkCALtvU6o0mHDhMRhEsd3Gd5IdZcED8REUv0RAQn1SYiRqc/KSt1KN9KQ43pT/SZc8pLndH1OlQAnXRar0P5oovR9TqDDKjQab0OnZZ6kbFKcHRtMoC982eNKoii+Iy4UQTzigemCSaxCSlEVIiVsGIQRRs7m4C9ZJu1EbTYKpBuUQwoqESLfEwnlw1vL7kzZ3Je/hX3bLNsufyYuTNz7zlXoEsQdF2cdYOpRgda7Fz3DSuES29rH1yZtvab3tZ+UcLo8HNYem7YXHT4YZrsRITtnkyYMzk6/Ub4YK2DjS4ucoQPeMIR6HQjfPKfPAquOsPtl+c3OHy7YnB4f5w++9bgsJBTbXVxg2gSPN6whm66XamfauZ8jelrJ8Y/WbsCMDiMbb1wf+mn6D6UdZoodEaE0wU29ao3SRnvjoFJSqW/Dt9fOmmih51X6WGc1x/+iIX9dbA103Q3aYqsmer9dQbE8OevOK/l4MrpiVp1Pi4qdLgdK0cONoSbighDuI4d8AyBXb125v112jfBldNGq3z+v/VBB71FQBvK79OcDaW5X0HPbcbp30MiarWpHUxXKXTw8VyEzW9FwPwWLDqMqZfIClNrHwdXTvcUOvE18E0GNilGGJZadpDltghYbnfogEgsKkztWZzXjw/BldUeFxpLZEQAo//tzuh/Gxj9gyKZSzWaBWK50X/veBHmiAWck/vHixTZ6V/qJI2a6C6UTKhR8xesOuhmB4dEaHYSPEIPEWoEkmPJx8+96KFGVJRabN7Oih0i5bw6YMSOUktKQzZJiZq7KkotH4clAil8lc8Qps//MLjyemEfsRQ6dEpEvtxJOhng+EVUDHAUnUOpY1bJ7f3gqo2Njcug24sJxBJ0cGzsnaPE4TSnJdTg2FibnJ4Xgu9j9NhY0nT780LvHSv7kIXDqkUorJq/D8TojPyART+Afl0kcmNRoazh4SLyRWREfv0Ba0eh8y+4Snqn6+RN4z6ZX3ZsdDp4ND1PRYobAxwhh190ylWyP36eQqvWfXLNpSBGR7NjwyM6Rkc8dBQ2Ao5BDo9Oyap9Qz9DvAquktb1EesBuBTEOxZmR+DR9Iiei+Sr5qaeHA4du8+rXQ+uog4VOr8XmOO5fcgSFdERmegINgoccKWDB7BwqaNTzg+Dq6w1hU6zxBU7qNqx4dEIrRwkG5WD7gdAjlUjE0WyaFbq+F0y37ITm63a4/kgu+zgU5YNz4oIgaPJ0Yk0gBwQcj7Upc5WcJW1pNGZcDuWXnZQuSOqRedWac3hK51r4O2z/c/embRGGQRhuEt0xG36MAeJC+goiCKuuERFFEQUBZeDQQXRYMBtZA5zUAgE0Yt6CBgPcbIo6MGf6ZfCMXm/KfJO93wBD/WYgwlzfHirqrun+1FwCN9lJTPNv6kzfOywmrWZqaPiQINsm2OHDl9KxnrV7OBB7eAkHW2P8p6kTkK3Q9xZssJQBwLHyBze6Vji8NR5L8De4CQ+k7+jRhrl9JKFDQ9iqAOVivQ5uO+ZHzoFe7FenQsOY38L1GnBXkSqOnbJMoLHqFxL9yu/eQHeGOKYczkNHX62tLYgK93pNoND+Yzj+W5InUR3lMKc1WqWIY/+vHnxprBnm/4O9GfOv2oF0xUNndVWdaainxBM5jLuRcABZb59brsD6mjugD0mL5TNpjZG5iQt6fB6dQjMkUPB4TQ7bEE5r2ShPNyd4obli6oOL1ZoDleHh05tEVudI8EZgElj9zyxUebucHkuKsQbrVbEHKKOuR54AkPnZ3AG4YbQr9RwddQdMmYhTB0sVZg5imUOws2x5ys5G5z0BWVpNfMaZVQH+x3bHdDHUEc/Mog5iaGzrq9eNVu4a346OAOxKMY+FlQsshtB3eH2qDqjJXUU3uekhI5dr65g6Cz8by8y/LfsEmAaKlZuyYKahe6gPb3i9W3pPZJvvbQBb4Y0h9erSfEDglmcxAXlONVLHRI7pGRRd3CxZ/RbwaiRNoY4y9UK1Ekdr1YcLfWtz9wZC9hLKhaJHcwdo2rZjCr6X8ubUuRwc0jo4LdogMngZB7aaR2AimW7w3PHckdJV0e9oebw0LHVqS9g6BwMzqDswwEj3qyRISvdHR48o/pyH0mc5MyxQwdv998jQGtfcDJPXsQ5o1FmJYvnDkme4jnG4scMnGRzeI+s2E3y2+AMzpEGxs4JOGeacG6H5Q5ua6E6SoI4ljl26LCVZNyEuB2cBKYFeEcqFnWHy6P6EHU29QGRk2POuv7JfBbnq8XgpPCgYW5kDbi4Y8xZxqBly7PJVqf4s+UNLufwasV75NrpUug8DU5eo4zH2+ssdnjubITcMVFL5pfMmddf9PeyN73EMTInR526fc22dPyQVyLHUZ14Oq1kEXeYPKrO/Hzx1PUmBANH1eGZkxQ6U1HEr2gfhvsNAWbJkMVyB2sWymPrc0pZzRxNHDSHZw4LnaNRvEkejlk7dviAzt3B4EF5uDpblkk1h29B1L52BZgNTv7123idaR22IzLdUXUMe6g6xQcNcUi1IqEDk/mO6McthuaXAPEZdDu83el3Byi7o1JY6qA3hjhoTtZ0tRw6HQFeByedZ3bsgDuk3aHuoD0YPyNKb5xSa8AbEIdUK97o9MYrARrng5PBawHibuh2iDtUHixbiHoyUnBqBJQpN8ckcni1Ko9X16PvmVfBiYYAP+u4uKMQc5g7YA8yovSLo4A4YA66k1au6j9F/C2aNTi2Ew8lxA70Ozx4FKLOVhUHShXpcrg5GDpnRPyLe5VwvnRacOZRyR0lwx2UB7DUwbhRb5g5ClcHD1tsnymNV3uCU1HsvGOxw91BeVAfFGh8ZFzVUWmQjTni8NA5GgWY+xCcYW69wJv/4ZgycYd0PIBGCTD+Zbz4KTkD2oA5tFrR0Nkdo/jtFtUNWciPJs8d7o7KQ/UZV0Ab8AbE4ebwHnnOx6sKOdkRIO4iizvEHZDHRi3pqfPqlWENFYdXK2swvxEF6Pj3zIfisSCdryR2zCGdyGPzSiEfouLwzOmtI89EAY4FZxheLggQJ+uwH2FPWeoO2mOSqg4XJ79cTUcBPl0IzlA8bAiyq0b2shTDHZtV1Xn+/BXxJlscNEef+fRv0ADVb0d0d4M6ub0yl+e5kikOmsPVOd+NAkz7YF59p/z9LrTKebmDEHWIN9Qc3ujc/REF6N4LztCcbaA6cWevZNVXru7Q3EF5uD4TzycmQB3QhogD5rBGR0/pAI3jwam+U5Z4E9od4g6RB0B1FKINipNrzuVY7pH9LPuadMpx5iuZstAdHNM5ljobOOtJ5oA4UK4etUTEH4RYC2YbgszBorJhDw8ezoRCPpQZOTiXT0qJX94jV8SBTyLW/YK8VR7GnXa7PdFuJ4hDzcFqBY0O8MnfFg5VPn+O3PjXKkPNIrkDZYvRVtLF4ZmD5lyTKH7WYs04JiW6e2qwiU7cyYmesbF28S9FHJ45uF2u7OmWzfGXRKrk46KUaE2RmjW0PO0lc8Z4c5wqDg5XUy0p8duv06mUIzMCxPh9O8QOyZ0MfcYUGji2OazP6alz+IeU6NwPTqU8bQgSp3tjFshTQIIHu558ddarOTmRs3K4ioI0LgWnWj7AhI6ryugOL1oIV4cXKjSHtDmrDVeN135FMiFvQkfi4xWryugOl4dnz62xWwXEm1Rx0JxD0jeX3wlO5Vzt9rnzZNkdrFlcHm7PLcVob9QbLg7PnGsxCtL1ufwPe/fS2kQUBXB8boRZzqXcRSEPSFOhDxoTq6igYIWmVVrwVUQrVIsiQpmCMJuWQBqtizaLLNJFaGkbSBd+TJNDbXoyZ+YmY/M+f6M4LoTCj3Pv7aSTjvTctd25djcrhOno8NB+QBCmg8yAmkBwcKb706gh9dDgOlJYCa87oW48EIFHz+fy9fJ35uXvl1fXoCYYHHrmrLjl8Mfgd6rbWaGxEwwPXaY2czIZ/G96OLQcfLaCVqWLTva2wXWoRNXXjtXSotUqngwUFA4tpzFzFt1yKlMG17Hu2YLY76AND9Lj0U3TuaVZrPB9K5CjXHLsewbXwZKOnx1MB+wEx5N52xodxEZ/KIfWlWjOSRpcR1tU1JrlveEJricDBXYTorc50IL7i1CbBtfh0so9d6I+dqAget5CweCAHXcmZO1IKQS/Gbnr3c+77YhCgl6z9HyC07nlW8hzn5PIS/fMyfP9hy50u0zYKc6Z6KSF6WjyorOL6WA2ejj0Nmf8hJg5ZT6Wd6UDyk7lCC9aOjx6PruQng29y8E15OTOBYTlHBhcVzq4IPY79hKyQwwefZjO2tru7ppGjR4OnjlLdt15Uxcsp2tNbgtX0lk1fQdPqBU71wytQYSYYHCgRUcKVxf8tsDuRduRaQtteDR4dK1Bt9qKgtOQkwhLYoe8zXK6F9hRhJ0TvOHxPGx1hE4IwaG2OX+EYDm9bzKrhLvSuoluS1j/Q+dLW3QIOGjkmJslyXL6oi3KjpSpNw07qLbXrS9QEDaQhUfOm4ik5GRZTg+aLJB2KvNot0x2w3RCpBw0cubPpXCnCny26kn7n5VwJ51ZsxU8oYB09GzwWgXNOqScKP9sea/65lBzR25vmHi7HGjh+lFLR8fTDZKTywpKjsPPfOthSZuaO6I0ayE8oIfKlw6knTfatSrx2ZGUHJs/sKin3TkXJJ5qrHnVskJ0QegAGz0cKH5OwhGVDYPraW9OlKCSqXGEB9lxVbfgovPpE9Ah0dBZ9V8IzkZeCipV5HeT9rzJvCLpSHvBasZj+fEBO9cATdflTF9DA3/4BP89gmM9LEkp+GjVr92PHgsaz8m8ifHQeugNdGgaqv0FrkOaLLw5hpbOBC3neJaPVv1R8lRRdGqvSA7hQVtmXdNQqLUsoIPgxLaloDudN7g+aaqsPAYPjSdkBaGj2RljOPMXUtJ0VJ4fT9pH7a84gk6qQs6kRo91E3SAIV6poAdlgENVWjW4vupd1cuOADxYD6TRs1eXs6dh03wYh3J5KTxSZ/xRRX3XVlh54ZEEHr2ePUh3nnLDeRyRQnrJucu3O/uxZ7YSnnqy6wmsB38zhqKzvFd7+ZymLMLN1OaZD5xDfgZKnzZ+4WNHHqaPTFSDAsyQZkDLkGvUwBrlZgPlJvD3cXAqP2dw/dpHOKZ7j56ZBKkHI7rcwyxDjWvggs9TqMR6EdxIDzgVHjl93ZO0I3ySh4+OzObIY7aFpg6aNKCmufn0oRQ+OVHe5fR7H4rKz46Q1Ucxy6T96BYsyHRlxXZOpfCTo7b5MRYD0P6iLXyStQ7Dv9DKRQp6Wm8ZmaFK/ArbUkgpfDr9aHAD0RQ6p9N8SvnFOdO3p5Dp28a3fEno4Dhp/gTYwelBFvBo+FTDqzkrKB3rwUrhXOJdMb1W8ePXB6tkUQltUshSNhqfa5fO63g0W9KzATjfDW7QAjzaZL1K5PNqbMMyUZEanEjERFlH8ZWdclUSaxQNh++RD2ZLLeCRAn7XMTjV8s7CXIMOdHU593xiu+JIeTlsGM6Qt3SiRKtJQBHzohO7QsNwRqMXaPJo86EjhGA4o9WHu7bqLh1lp/mtFcPR1uKJap9OIRIpRArt01HFGb7nMES9miipNumkUoVUKtWgwwNnVHuyeabaowO1RUcV13ngDGWvono9sbEx0xxr0KlfwEtLR5395IEzxI0vFI99+STH/pWCri6Tvmyc7NdxgxvyptbzJdUCnXCrdJRdmOGfjxmRJuPhU0XziTXoQFeXMZqNOp9Y4udlj1bjM+GqUoHpAJs/EzP8duPR7HX8fflQqbbpKKVO8+/j/LCKEe8ve3es0kgUhmH4v47FQmFhmYBiIkxEmwgiCUmR3UKMAYmwhNyGdqbxArzZnXO6hQQ5UwxTPM//VVO/xXTn92z643Pf1PB9Ojma/eeP6cOfgMh+7arx8O1rP/rZ+Pg/nY/0bbT/ehuOq9oPMd85ywKkw2HSoS/OzobSoY1h4klOpMMx0qEvpENLl8PLZgGlLhPpIB06c5lcB5S6TqSDdDhGOvTFpnG9CSi1SaRDuZPNSbOAUieJdJAOnTl5lw6tvGcB0qEjT1mAdOjI0+BpMBgElGq6kQ7SoUPjwXgsHVoYZwHS4TDp0BfTLEA6dGQymTYXUGqSSAfp0Jn5ZDKfS4dy8yyg1N8sQDocJh364jWRDuVes4BSi9fFQjq0sMgCSi3u0wWUuk+kQ7ltKmcbUGqbSAfp0Jntc0M6lHvOAkpVz1VVSYdyVRYgHTpSVXfNAkrdJdJBOnRmvb5br9cBpZpupIN06ND6Jl1AqZtEOkiHY6RDX0iHlm5Ok4BSp9KhdTqzmXQoN8sCpENHZrOHZgGlHhLp0Cqdc+nQwnkWIB0Okw59cX6bLqDUbSIdpENnRrcj6dDGKAuQDh3Z7Xaj3S6g1K4hHVqo611d1wHl6dTSoY1lvazrZUCpZSIdpENnlsljQKnHRDpIh2OkQ1+sGo+rgFKrRDqUu1hdXEiHFi6yAOlwmHToi6ssQDocJh364uXqpVnAv3bp0IhBIAig6HaBh5uJQSJpghSQBtIGhq5zd5qIRTCI934LP+vTWIe8YfgM1uGCoQuwDuesw1NYh4vmapgDsubGOliH22zbXAvI2hrrkLe9rcMl7y7AOtzk1QVYh3PW4SnGxjrkjV1A1jquq3W4YO0CrMM56/AU3y7AOtxkmr61gKypsQ5501HPOQKyynGUYh3ySheQVZZSFuuQt3QB1uGcdXiKvY6z7wFpe4R1/vsBKXObiM3QZ5oAAAAASUVORK5CYII=`;
3
+ export function getMouseGroup() {
4
+ const group = new Group();
5
+ const planGeometry = new PlaneGeometry(0.3, 0.3);
6
+ const planTexture = new TextureLoader().load(planTextureUrl);
7
+ planTexture.encoding = sRGBEncoding;
8
+ const planMaterial = new MeshBasicMaterial({ map: planTexture, transparent: true, depthTest: false });
9
+ const planMesh = new Mesh(planGeometry, planMaterial);
10
+ const zPath = new CurvePath();
11
+ zPath.add(new LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 0.1)));
12
+ const zGeometry = new TubeGeometry(zPath, 10, 0.005);
13
+ const zMaterial = new MeshBasicMaterial({ color: 0x33f1ef, depthTest: false, side: DoubleSide });
14
+ const zMesh = new Mesh(zGeometry, zMaterial);
15
+ const ballGeometry = new SphereGeometry(0.01, 32, 32);
16
+ const ballMesh = new Mesh(ballGeometry, zMaterial);
17
+ ballMesh.position.set(0, 0, 0.1);
18
+ group.name = 'mouse-current';
19
+ group.add(planMesh, zMesh, ballMesh);
20
+ return group;
21
+ }
@@ -0,0 +1,5 @@
1
+ import { Vector2, Vector3 } from 'three';
2
+ export default function ndc2Screen(ndcPosition: Vector3, containerSize: {
3
+ width: number;
4
+ height: number;
5
+ }): Vector2;
@@ -0,0 +1,6 @@
1
+ import { Vector2 } from 'three';
2
+ export default function ndc2Screen(ndcPosition, containerSize) {
3
+ const left = ((ndcPosition.x + 1) / 2) * containerSize.width;
4
+ const top = (-(ndcPosition.y - 1) / 2) * containerSize.height;
5
+ return new Vector2(left, top);
6
+ }
@@ -341,6 +341,7 @@ export const PanoRulerPlugin = (five, params) => {
341
341
  $line.style.display = 'none';
342
342
  }
343
343
  else {
344
+ $line.style.display = 'block';
344
345
  $line.style.width = distance + 'px';
345
346
  $line.style.left = startLeft + 'px';
346
347
  $line.style.top = startTop + 'px';
@@ -1,2 +1,2 @@
1
- declare const PanoRulerStyle = "<style type=\"text/css\">\n.PanoRulerPlugin-rule-line {\n position: absolute;\n transform-origin: left center;\n width: 0;\n height: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-line::after {\n content: '';\n position: absolute;\n left: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n z-index: 1;\n animation: viewport-rule-point 0.1s 1s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line::before {\n content: '';\n position: absolute;\n right: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n animation: viewport-rule-point 0.1s 1.5s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line em {\n background: #fff;\n display: block;\n height: 100%;\n animation: viewport-rule-line 0.5s ease 1s;\n animation-fill-mode: both;\n box-shadow: 0 0 0.25rem rgb(0 0 0 / 40%);\n}\n\n.PanoRulerPlugin-rule-label {\n position: absolute;\n width: 0;\n height: 0;\n top: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-label-name {\n position: absolute;\n padding: 0.1875rem 0.375rem;\n background: rgba(195,195,195,0.30);\n backdrop-filter: blur(0.25rem);\n border-radius: 6.25rem;\n border: 0.0625rem solid rgba(255,255,255,0.6);\n white-space: nowrap;\n overflow: hidden;\n color: #FFFFFF;\n font-weight: 500;\n font-size: 0.75rem;\n line-height: 1;\n -webkit-animation: viewport-rule-label 0.25s ease 1s;\n animation: viewport-rule-label 0.25s ease 1s;\n animation-fill-mode: both;\n box-shadow: inset 0 0 0.625rem 0 rgba(255,255,255,0.30);\n}\n\n@keyframes viewport-rule-line {\n 0% { width: 0% }\n 100% { width: 100% }\n}\n\n@keyframes viewport-rule-label {\n 0% { opacity: 0; transform: scaleX(0); }\n 100% { opacity: 1; transform: translate(-50%, -50%) scaleX(1); }\n}\n\n@keyframes viewport-rule-point {\n 0% { transform: scaleX(0); }\n 100% { transform: scaleX(1); }\n}\n</style>\n";
1
+ declare const PanoRulerStyle = "<style type=\"text/css\">\n.PanoRulerPlugin-rule-line {\n position: absolute;\n transform-origin: left center;\n width: 0;\n height: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-line::after {\n content: '';\n position: absolute;\n left: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n z-index: 1;\n animation: viewport-rule-point 0.1s 1s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line::before {\n content: '';\n position: absolute;\n right: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n animation: viewport-rule-point 0.1s 1.5s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line em {\n background: #fff;\n display: block;\n height: 100%;\n animation: viewport-rule-line 0.5s ease 1s;\n animation-fill-mode: both;\n box-shadow: 0 0 0.25rem rgb(0 0 0 / 40%);\n}\n\n.PanoRulerPlugin-rule-label {\n position: absolute;\n width: 0;\n height: 0;\n top: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-label-name {\n position: absolute;\n padding: 0.1875rem 0.375rem;\n background: rgba(195,195,195,0.30);\n backdrop-filter: blur(0.25rem);\n -webkit-backdrop-filter: blur(0.25rem);\n border-radius: 6.25rem;\n border: 0.0625rem solid rgba(255,255,255,0.6);\n white-space: nowrap;\n overflow: hidden;\n color: #FFFFFF;\n font-weight: 500;\n font-size: 0.75rem;\n line-height: 1;\n -webkit-animation: viewport-rule-label 0.25s ease 1s;\n animation: viewport-rule-label 0.25s ease 1s;\n animation-fill-mode: both;\n box-shadow: inset 0 0 0.625rem 0 rgba(255,255,255,0.30);\n}\n\n@keyframes viewport-rule-line {\n 0% { width: 0% }\n 100% { width: 100% }\n}\n\n@keyframes viewport-rule-label {\n 0% { opacity: 0; transform: scaleX(0); }\n 100% { opacity: 1; transform: translate(-50%, -50%) scaleX(1); }\n}\n\n@keyframes viewport-rule-point {\n 0% { transform: scaleX(0); }\n 100% { transform: scaleX(1); }\n}\n</style>\n";
2
2
  export default PanoRulerStyle;
@@ -54,6 +54,7 @@ const PanoRulerStyle = `<style type="text/css">
54
54
  padding: 0.1875rem 0.375rem;
55
55
  background: rgba(195,195,195,0.30);
56
56
  backdrop-filter: blur(0.25rem);
57
+ -webkit-backdrop-filter: blur(0.25rem);
57
58
  border-radius: 6.25rem;
58
59
  border: 0.0625rem solid rgba(255,255,255,0.6);
59
60
  white-space: nowrap;
@@ -23,7 +23,10 @@ const domSizeStyle = `${size / 16}rem`;
23
23
  class="floorplan__camera-rotate"
24
24
  style:width="{domSizeStyle}"
25
25
  style:height="{domSizeStyle}"
26
+ style:left="{'-' + domSizeStyle}"
27
+ style:top="{'-' + domSizeStyle}"
26
28
  style:transform="{`rotate(${rotate}deg)`}"
29
+ style:transform-origin="{`${domSizeStyle} ${domSizeStyle}`}"
27
30
  style="background-image: {`url(${cameraImageUrl || CAMERA_IMAGE})`}"
28
31
  ></div>
29
32
  </div>
@@ -37,9 +40,6 @@ const domSizeStyle = `${size / 16}rem`;
37
40
 
38
41
  .floorplan__camera-rotate {
39
42
  position: absolute;
40
- left: 15px;
41
- top: 15px;
42
- transform-origin: 15px 15px;
43
43
  background-repeat: no-repeat;
44
44
  background-size: 100%;
45
45
  }
@@ -1 +1 @@
1
- {"version":3,"mappings":"AAAA,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;AAuBjB,CAAC,CAAC,MAAM;;AAER,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC7F,EAAE,CAAC;AACH,IAAI,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM;AACnC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;AAC/B,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;AAChC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACvE,EAAE,CAAC,CAAC,CAAC,GAAG;AACR,CAAC,CAAC,GAAG;;AAEL,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;AACrB,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAC9B,IAAI,QAAQ,CAAC,CAAC,QAAQ;AACtB,IAAI,KAAK,CAAC,CAAC,CAAC;AACZ,IAAI,MAAM,CAAC,CAAC,CAAC;AACb,EAAE;;AAEF,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAC5B,IAAI,QAAQ,CAAC,CAAC,QAAQ;AACtB,IAAI,IAAI,CAAC,CAAC,IAAI;AACd,IAAI,GAAG,CAAC,CAAC,IAAI;AACb,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI;AAC/B,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM;AAChC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACzB,EAAE;AACF,CAAC,CAAC,KAAK;","names":[],"sources":["Camera.svelte"]}
1
+ {"version":3,"mappings":"AAAA,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;AAuBjB,CAAC,CAAC,MAAM;;AAER,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AAC7F,EAAE,CAAC;AACH,IAAI,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM;AACnC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;AAC/B,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC;AAChC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AACpC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;AACnC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7C,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAC/D,IAAI,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AACvE,EAAE,CAAC,CAAC,CAAC,GAAG;AACR,CAAC,CAAC,GAAG;;AAEL,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;AACrB,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAC9B,IAAI,QAAQ,CAAC,CAAC,QAAQ;AACtB,IAAI,KAAK,CAAC,CAAC,CAAC;AACZ,IAAI,MAAM,CAAC,CAAC,CAAC;AACb,EAAE;;AAEF,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAC5B,IAAI,QAAQ,CAAC,CAAC,QAAQ;AACtB,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM;AAChC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AACzB,EAAE;AACF,CAAC,CAAC,KAAK;","names":[],"sources":["Camera.svelte"]}
@@ -2,6 +2,7 @@ import { Five, Subscribe } from '@realsee/five';
2
2
  import type { FloorplanEventHandlers } from './typings/events.type';
3
3
  import type { FloorplanServerData } from '../typings/floorplanServerData';
4
4
  import type { FloorplanRoomItem } from '../typings/floorplanData';
5
+ import { FLOOR_PLAN_ATTACHED_TO } from '../constant';
5
6
  export interface ModelFloorplanParameterType {
6
7
  selector?: string | Element;
7
8
  scale?: number;
@@ -12,6 +13,7 @@ export interface ModelFloorplanParameterType {
12
13
  ruleLabelsEnable?: boolean;
13
14
  roomLabelsEnable?: boolean;
14
15
  cameraImageUrl?: string;
16
+ attachedTo?: FLOOR_PLAN_ATTACHED_TO;
15
17
  getLabelElement?: (room: FloorplanRoomItem) => Element | null;
16
18
  }
17
19
  export declare type ModelFloorplanPluginsConfigs = Omit<ModelFloorplanParameterType, 'selector' | 'scale'>;
@@ -98,7 +98,8 @@ export default class ModelFloorplanPluginController {
98
98
  const width = max.x - min.x;
99
99
  const height = max.y - min.y;
100
100
  // 每毫米对应的 px 值
101
- const pxmm = getPxmm(this.five, this.wrapper);
101
+ const options = this.configs.attachedTo ? { attachedTo: this.configs.attachedTo } : undefined;
102
+ const pxmm = getPxmm(this.five, this.wrapper, this.floorIndex, options);
102
103
  const _width = Math.ceil(width * pxmm);
103
104
  const _height = Math.ceil(height * pxmm);
104
105
  if (this.size.width === _width && this.size.height === _height)
@@ -225,6 +226,7 @@ export default class ModelFloorplanPluginController {
225
226
  if (shownFloor === null)
226
227
  return;
227
228
  this.floorIndex = shownFloor;
229
+ this.updateSize();
228
230
  this.render();
229
231
  };
230
232
  handleModelLoaded = () => {
@@ -1,6 +1,7 @@
1
1
  import type { Five } from '@realsee/five';
2
2
  import type { FloorplanServerData } from '../typings/floorplanServerData';
3
3
  import type { FloorplanRoomItem } from '../typings/floorplanData';
4
+ import { FLOOR_PLAN_ATTACHED_TO } from '../constant';
4
5
  export interface TopviewFloorplanPluginParameterType {
5
6
  selector?: string | Element;
6
7
  scale?: number;
@@ -12,6 +13,7 @@ export interface TopviewFloorplanPluginParameterType {
12
13
  ruleLabelsEnable?: boolean;
13
14
  roomLabelsEnable?: boolean;
14
15
  preventRoomClick?: boolean;
16
+ attachedTo?: FLOOR_PLAN_ATTACHED_TO;
15
17
  getLabelElement?: (room: FloorplanRoomItem) => Element | null;
16
18
  }
17
19
  export declare type TopviewFloorplanPluginReturnType = TopviewFloorplanPluginController;
@@ -62,6 +62,7 @@ export class TopviewFloorplanPluginController {
62
62
  if (shownFloor === null)
63
63
  return;
64
64
  this.floorIndex = shownFloor;
65
+ this.updateSize();
65
66
  this.render();
66
67
  };
67
68
  /** panoIndex 改变时,更新 floorIndex */
@@ -109,8 +110,8 @@ export class TopviewFloorplanPluginController {
109
110
  };
110
111
  show() {
111
112
  this.visible = true;
112
- this.updateSize();
113
113
  this.five.model.show(this.floorIndex);
114
+ this.updateSize();
114
115
  const renderDuration = 500;
115
116
  const modelOpacity = this.configs.modelOpacity;
116
117
  if (typeof modelOpacity === 'number') {
@@ -142,7 +143,8 @@ export class TopviewFloorplanPluginController {
142
143
  const width = max.x - min.x;
143
144
  const height = max.y - min.y;
144
145
  // 每毫米对应的 px 值
145
- const pxmm = getPxmm(this.five, this.wrapper);
146
+ const options = this.configs.attachedTo ? { attachedTo: this.configs.attachedTo } : undefined;
147
+ const pxmm = getPxmm(this.five, this.wrapper, this.floorIndex, options);
146
148
  const _width = Math.ceil(width * pxmm);
147
149
  const _height = Math.ceil(height * pxmm);
148
150
  this.pxmm = pxmm;
@@ -157,7 +159,6 @@ export class TopviewFloorplanPluginController {
157
159
  return;
158
160
  const { getLabelElement, cameraImageUrl, preventRoomClick, hoverEnable, compassEnable, roomLabelsEnable, ruleLabelsEnable, } = this.configs;
159
161
  const handleClick = preventRoomClick ? () => false : undefined;
160
- console.log('🚀 ~ TopviewFloorplanPluginController ~ handleClick', handleClick);
161
162
  const props = {
162
163
  five: this.five,
163
164
  pxmm: this.pxmm,
@@ -0,0 +1,5 @@
1
+ export declare enum FLOOR_PLAN_ATTACHED_TO {
2
+ FLOOR = 1,
3
+ CEILING = 2,
4
+ BOUNDING_CENTER = 3
5
+ }
@@ -0,0 +1,6 @@
1
+ export var FLOOR_PLAN_ATTACHED_TO;
2
+ (function (FLOOR_PLAN_ATTACHED_TO) {
3
+ FLOOR_PLAN_ATTACHED_TO[FLOOR_PLAN_ATTACHED_TO["FLOOR"] = 1] = "FLOOR";
4
+ FLOOR_PLAN_ATTACHED_TO[FLOOR_PLAN_ATTACHED_TO["CEILING"] = 2] = "CEILING";
5
+ FLOOR_PLAN_ATTACHED_TO[FLOOR_PLAN_ATTACHED_TO["BOUNDING_CENTER"] = 3] = "BOUNDING_CENTER";
6
+ })(FLOOR_PLAN_ATTACHED_TO || (FLOOR_PLAN_ATTACHED_TO = {}));
@@ -79,6 +79,10 @@ export interface FloorplanServerRoomItem {
79
79
  * @description 单位是平方毫米
80
80
  */
81
81
  size: number;
82
+ /** 房屋类型
83
+ * @description 对应关系参考上方 ROOM_DETAILS_TYPE_MAP
84
+ */
85
+ type: number;
82
86
  name: string;
83
87
  /** 围成房间区域的坐标路径
84
88
  * @description 坐标类型是户型图坐标
package/libs/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export type { PanoCursorRaycasterPluginExportType } from './PanoCursorRaycasterP
4
4
  export { default as PanoCursorRaycasterPlugin } from './PanoCursorRaycasterPlugin';
5
5
  export type { ModelRoomLabelController, ModelRoomLabelPluginData, RoomLabel, ModelRoomLabelPluginReturnType, ModelRoomLabelPluginParameters, } from './ModelRoomLabelPlugin';
6
6
  export { default as ModelRoomLabelPlugin } from './ModelRoomLabelPlugin';
7
+ export * from './floorplan/constant';
7
8
  export type { TopviewFloorplanPluginReturnType, TopviewFloorplanPluginParameterType, } from './floorplan/TopviewFloorplanPlugin';
8
9
  export { default as TopviewFloorplanPlugin } from './floorplan/TopviewFloorplanPlugin';
9
10
  export type { PanoFloorplanRadarPluginReturnType, PanoFloorplanRadarPluginParameterType, } from './floorplan/PanoFloorplanRadarPlugin';
@@ -18,4 +19,6 @@ export { default as CameraMovementPlugin } from './CameraMovementPlugin';
18
19
  export type { PanoRulerPluginParameterType, PanoRulerPluginExportType, PanoRulerPluginOptions, } from './PanoRulerPlugin';
19
20
  export { default as PanoRulerPlugin } from './PanoRulerPlugin';
20
21
  export type { PanoCompassPluginParameterType, PanoCompassPluginExportType, PanoCompassPluginData, } from './PanoCompassPlugin';
21
- export { default as PanoCompassPluginPlugin } from './PanoCompassPlugin';
22
+ export { default as PanoCompassPlugin } from './PanoCompassPlugin';
23
+ export type { PluginReturns, PluginEvent, LineJson, PointJson } from './PanoMeasurePlugin';
24
+ export { default as PanoMeasurePlugin } from './PanoMeasurePlugin';
package/libs/index.js CHANGED
@@ -2,6 +2,8 @@ export { default as ModelViewPlugin } from './ModelViewPlugin';
2
2
  export { default as CSS3DRenderPlugin } from './CSS3DRenderPlugin';
3
3
  export { default as PanoCursorRaycasterPlugin } from './PanoCursorRaycasterPlugin';
4
4
  export { default as ModelRoomLabelPlugin } from './ModelRoomLabelPlugin';
5
+ // floorplan
6
+ export * from './floorplan/constant';
5
7
  export { default as TopviewFloorplanPlugin } from './floorplan/TopviewFloorplanPlugin';
6
8
  export { default as PanoFloorplanRadarPlugin } from './floorplan/PanoFloorplanRadarPlugin';
7
9
  export { default as ModelFloorplanPlugin } from './floorplan/ModelFloorplanPlugin';
@@ -9,4 +11,5 @@ export { default as ModelChassisCompassPlugin } from './ModelChassisCompassPlugi
9
11
  export { default as ModelEntryDoorGuidePlugin } from './ModelEntryDoorGuidePlugin';
10
12
  export { default as CameraMovementPlugin } from './CameraMovementPlugin';
11
13
  export { default as PanoRulerPlugin } from './PanoRulerPlugin';
12
- export { default as PanoCompassPluginPlugin } from './PanoCompassPlugin';
14
+ export { default as PanoCompassPlugin } from './PanoCompassPlugin';
15
+ export { default as PanoMeasurePlugin } from './PanoMeasurePlugin';
@@ -1,6 +1,11 @@
1
1
  import type { Five } from '@realsee/five';
2
+ import { FLOOR_PLAN_ATTACHED_TO } from '../floorplan/constant';
3
+ interface GetPxmmOption {
4
+ attachedTo: FLOOR_PLAN_ATTACHED_TO;
5
+ }
2
6
  /**
3
7
  * 获取「在俯视图」状态下,模型 mm 与屏幕像素 px 的对应关系,即每 mm 对应多少 px
4
8
  * @param five five
5
9
  */
6
- export default function getPxmm(five: Five, container: Element): number;
10
+ export default function getPxmm(five: Five, container: Element, floorIndex: number, options?: GetPxmmOption): number;
11
+ export {};
@@ -1,20 +1,34 @@
1
+ import { FLOOR_PLAN_ATTACHED_TO } from '../floorplan/constant';
1
2
  import * as THREE from 'three';
2
3
  /**
3
4
  * 获取「在俯视图」状态下,模型 mm 与屏幕像素 px 的对应关系,即每 mm 对应多少 px
4
5
  * @param five five
5
6
  */
6
- export default function getPxmm(five, container) {
7
- const boundingCenter = new THREE.Vector3(0, 0, 0);
8
- five.model.bounding.getCenter(boundingCenter);
9
- const { y: boundingCenterY } = boundingCenter;
10
- const { longitude } = five.getCurrentState();
11
- // 因为模型可能经过旋转,所以屏幕水平方向上的 1m 对应 X 轴距离需要转换
12
- const X = 1 / Math.abs(Math.cos(longitude));
13
- // 模型绕 (boundingCenterX, boundingCenterY, boundingCenterZ) 旋转
14
- const originPosition = new THREE.Vector3(0, boundingCenterY, 0);
15
- const originPositionXUnit = new THREE.Vector3(X, boundingCenterY, 0);
16
- const mouse = originPosition.project(five.camera);
17
- const xUnitMouse = originPositionXUnit.project(five.camera);
7
+ export default function getPxmm(five, container, floorIndex, options) {
8
+ const maxFloorIndex = Math.max(...five.work.observers.map((ob) => ob.floorIndex));
9
+ function getFloorY(floorIndex) {
10
+ return floorIndex > maxFloorIndex
11
+ ? five.model.bounding.max.y
12
+ : Math.max(...five.work.observers
13
+ .filter((ob) => ob.floorIndex === floorIndex)
14
+ .map((ob) => ob.standingPosition.y));
15
+ }
16
+ function getY() {
17
+ const currentFloorY = getFloorY(floorIndex);
18
+ const nextFloorY = getFloorY(floorIndex + 1);
19
+ const attachedTo = options?.attachedTo || FLOOR_PLAN_ATTACHED_TO.BOUNDING_CENTER;
20
+ if (attachedTo === FLOOR_PLAN_ATTACHED_TO.BOUNDING_CENTER)
21
+ return (five.model.bounding.max.y + five.model.bounding.min.y) / 2;
22
+ else if (attachedTo === FLOOR_PLAN_ATTACHED_TO.CEILING)
23
+ return nextFloorY;
24
+ else
25
+ return currentFloorY;
26
+ }
27
+ const y = getY();
28
+ const originPosition = new THREE.Vector3(0, y, 0);
29
+ const originPositionXUnit = new THREE.Vector3(1, y, 0);
30
+ const mouse = originPosition.clone().project(five.camera);
31
+ const xUnitMouse = originPositionXUnit.clone().project(five.camera);
18
32
  const pxmm = Math.abs((xUnitMouse.x - mouse.x) / 1000) * (container.getBoundingClientRect().width / 2);
19
33
  return pxmm;
20
34
  }
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "author": "REALSEE-DEVELOPER",
6
6
  "repository": "https://github.com/realsee-developer/dnalogel.git",
7
7
  "private": false,
8
- "version": "2.0.0-alpha.4",
8
+ "version": "2.0.0-alpha.7",
9
9
  "license": "SEE LICENSE IN TERMS.txt",
10
10
  "scripts": {
11
11
  "build:dev": "yarn tsb && vite build --watch",
@@ -19,6 +19,7 @@
19
19
  "files": [
20
20
  "libs",
21
21
  "dist",
22
+ "docs",
22
23
  "TERMS.txt"
23
24
  ],
24
25
  "devDependencies": {