@realsee/dnalogel 2.0.0-alpha.6 → 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 (117) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +44 -5
  3. package/dist/dnalogel.cjs.js +7 -2
  4. package/dist/dnalogel.es.js +3516 -159
  5. package/dist/dnalogel.umd.js +7 -2
  6. package/libs/PanoCompassPlugin/index.d.ts +3 -3
  7. package/libs/PanoCompassPlugin/index.js +56 -44
  8. package/libs/PanoMeasurePlugin/Controller/BaseController.d.ts +36 -0
  9. package/libs/PanoMeasurePlugin/Controller/BaseController.js +69 -0
  10. package/libs/PanoMeasurePlugin/Controller/EditController.d.ts +52 -0
  11. package/libs/PanoMeasurePlugin/Controller/EditController.js +216 -0
  12. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.d.ts +12 -0
  13. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.js +44 -0
  14. package/libs/PanoMeasurePlugin/Controller/WatchController.d.ts +25 -0
  15. package/libs/PanoMeasurePlugin/Controller/WatchController.js +223 -0
  16. package/libs/PanoMeasurePlugin/Controller/index.d.ts +61 -0
  17. package/libs/PanoMeasurePlugin/Controller/index.js +176 -0
  18. package/libs/PanoMeasurePlugin/Model/index.d.ts +38 -0
  19. package/libs/PanoMeasurePlugin/Model/index.js +114 -0
  20. package/libs/PanoMeasurePlugin/Model/line.d.ts +30 -0
  21. package/libs/PanoMeasurePlugin/Model/line.js +64 -0
  22. package/libs/PanoMeasurePlugin/Model/point.d.ts +16 -0
  23. package/libs/PanoMeasurePlugin/Model/point.js +28 -0
  24. package/libs/PanoMeasurePlugin/Model/polyline.d.ts +16 -0
  25. package/libs/PanoMeasurePlugin/Model/polyline.js +48 -0
  26. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.d.ts +2 -0
  27. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.js +15 -0
  28. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.d.ts +2 -0
  29. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.js +2 -0
  30. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.d.ts +2 -0
  31. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.js +2 -0
  32. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.d.ts +22 -0
  33. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.js +108 -0
  34. package/libs/PanoMeasurePlugin/Modules/FiveHelper.d.ts +11 -0
  35. package/libs/PanoMeasurePlugin/Modules/FiveHelper.js +33 -0
  36. package/libs/PanoMeasurePlugin/Modules/GuideController.d.ts +18 -0
  37. package/libs/PanoMeasurePlugin/Modules/GuideController.js +75 -0
  38. package/libs/PanoMeasurePlugin/Modules/Magnifier.d.ts +24 -0
  39. package/libs/PanoMeasurePlugin/Modules/Magnifier.js +103 -0
  40. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.d.ts +6 -0
  41. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.js +117 -0
  42. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.d.ts +18 -0
  43. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.js +102 -0
  44. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.d.ts +12 -0
  45. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.js +35 -0
  46. package/libs/PanoMeasurePlugin/Modules/UIController/index.d.ts +16 -0
  47. package/libs/PanoMeasurePlugin/Modules/UIController/index.js +69 -0
  48. package/libs/PanoMeasurePlugin/Modules/UIController/style.d.ts +17 -0
  49. package/libs/PanoMeasurePlugin/Modules/UIController/style.js +78 -0
  50. package/libs/PanoMeasurePlugin/index.d.ts +7 -0
  51. package/libs/PanoMeasurePlugin/index.js +5 -0
  52. package/libs/PanoMeasurePlugin/typings/data.d.ts +28 -0
  53. package/libs/PanoMeasurePlugin/typings/data.js +1 -0
  54. package/libs/PanoMeasurePlugin/typings/event.type.d.ts +28 -0
  55. package/libs/PanoMeasurePlugin/typings/event.type.js +1 -0
  56. package/libs/PanoMeasurePlugin/typings/utils.type.d.ts +1 -0
  57. package/libs/PanoMeasurePlugin/typings/utils.type.js +1 -0
  58. package/libs/PanoMeasurePlugin/utils/clearGroup.d.ts +2 -0
  59. package/libs/PanoMeasurePlugin/utils/clearGroup.js +3 -0
  60. package/libs/PanoMeasurePlugin/utils/constants.d.ts +4 -0
  61. package/libs/PanoMeasurePlugin/utils/constants.js +31 -0
  62. package/libs/PanoMeasurePlugin/utils/distanceDom.d.ts +28 -0
  63. package/libs/PanoMeasurePlugin/utils/distanceDom.js +114 -0
  64. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.d.ts +2 -0
  65. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.js +21 -0
  66. package/libs/PanoMeasurePlugin/utils/findClosestPoint.d.ts +10 -0
  67. package/libs/PanoMeasurePlugin/utils/findClosestPoint.js +27 -0
  68. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.d.ts +4 -0
  69. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.js +9 -0
  70. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.d.ts +10 -0
  71. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.js +14 -0
  72. package/libs/PanoMeasurePlugin/utils/ironbox.d.ts +1 -0
  73. package/libs/PanoMeasurePlugin/utils/ironbox.js +1 -0
  74. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.d.ts +2 -0
  75. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.js +6 -0
  76. package/libs/PanoMeasurePlugin/utils/line.d.ts +17 -0
  77. package/libs/PanoMeasurePlugin/utils/line.js +32 -0
  78. package/libs/PanoMeasurePlugin/utils/math.d.ts +17 -0
  79. package/libs/PanoMeasurePlugin/utils/math.js +44 -0
  80. package/libs/PanoMeasurePlugin/utils/mouseGroup.d.ts +2 -0
  81. package/libs/PanoMeasurePlugin/utils/mouseGroup.js +21 -0
  82. package/libs/PanoMeasurePlugin/utils/ndc2Screen.d.ts +5 -0
  83. package/libs/PanoMeasurePlugin/utils/ndc2Screen.js +6 -0
  84. package/libs/index.d.ts +2 -0
  85. package/libs/index.js +1 -0
  86. package/package.json +1 -1
  87. package/docs/.nojekyll +0 -1
  88. package/docs/assets/highlight.css +0 -29
  89. package/docs/assets/icons.css +0 -1043
  90. package/docs/assets/icons.png +0 -0
  91. package/docs/assets/icons@2x.png +0 -0
  92. package/docs/assets/main.js +0 -52
  93. package/docs/assets/search.js +0 -1
  94. package/docs/assets/style.css +0 -1413
  95. package/docs/assets/widgets.png +0 -0
  96. package/docs/assets/widgets@2x.png +0 -0
  97. package/docs/classes/ModelRoomLabelController.html +0 -20
  98. package/docs/enums/FLOOR_PLAN_ATTACHED_TO.html +0 -1
  99. package/docs/enums/ModelFloorplanErrorType.html +0 -1
  100. package/docs/index.html +0 -10
  101. package/docs/interfaces/ModelChassisCompassPluginData.html +0 -1
  102. package/docs/interfaces/ModelChassisCompassPluginExportType.html +0 -1
  103. package/docs/interfaces/ModelChassisCompassPluginParameterType.html +0 -1
  104. package/docs/interfaces/ModelEntryDoorGuidePluginData.html +0 -1
  105. package/docs/interfaces/ModelEntryDoorGuidePluginExportType.html +0 -1
  106. package/docs/interfaces/ModelFloorplanParameterType.html +0 -1
  107. package/docs/interfaces/ModelFloorplanViewEvent.html +0 -5
  108. package/docs/interfaces/ModelRoomLabelPluginData.html +0 -1
  109. package/docs/interfaces/PanoCompassPluginData.html +0 -1
  110. package/docs/interfaces/PanoCompassPluginParameterType.html +0 -1
  111. package/docs/interfaces/PanoCursorRaycasterPluginExportType.html +0 -11
  112. package/docs/interfaces/PanoRulerPluginExportType.html +0 -1
  113. package/docs/interfaces/PanoRulerPluginOptions.html +0 -1
  114. package/docs/interfaces/PanoRulerPluginParameterType.html +0 -1
  115. package/docs/interfaces/RoomLabel.html +0 -13
  116. package/docs/interfaces/TopviewFloorplanPluginParameterType.html +0 -1
  117. package/docs/modules.html +0 -26
@@ -0,0 +1,103 @@
1
+ import { Vector2 } from 'three';
2
+ /** 交换数组元素 */
3
+ function exchange(array, index1, index2) {
4
+ const value = array[index1];
5
+ array[index1] = array[index2];
6
+ array[index2] = value;
7
+ }
8
+ export default class Magnifier {
9
+ five;
10
+ scale;
11
+ width;
12
+ height;
13
+ pixelRatio;
14
+ originWidth;
15
+ originHeight;
16
+ context;
17
+ canvas = document.createElement('canvas');
18
+ container;
19
+ constructor(five, options) {
20
+ if (!five.renderer)
21
+ throw new Error('Five Render 未初始化');
22
+ this.five = five;
23
+ const scale = options.scale;
24
+ const pixelRatio = five.renderer.getPixelRatio();
25
+ const originWidth = options.width;
26
+ const originHeight = options.height;
27
+ const width = originWidth * pixelRatio;
28
+ const height = originHeight * pixelRatio;
29
+ const magnifier = this.canvas;
30
+ const context = this.canvas.getContext('2d');
31
+ if (!context)
32
+ throw new Error('CANNOT CREATE CONTEXT2D');
33
+ this.scale = scale;
34
+ this.context = context;
35
+ this.width = width;
36
+ this.height = height;
37
+ this.originWidth = originWidth;
38
+ this.originHeight = originHeight;
39
+ this.pixelRatio = pixelRatio;
40
+ magnifier.classList.add('plugin-measure-magnifier');
41
+ magnifier.style.position = 'absolute';
42
+ magnifier.style.pointerEvents = 'none';
43
+ magnifier.style.borderRadius = '50%';
44
+ magnifier.style.left = -width / 2 + 'px';
45
+ magnifier.style.top = -height - 90 + 'px';
46
+ magnifier.setAttribute('width', width.toString());
47
+ magnifier.setAttribute('height', height.toString());
48
+ this.canvas.style.width = originWidth + 'px';
49
+ this.canvas.style.height = originHeight + 'px';
50
+ }
51
+ dispose() {
52
+ this.clear();
53
+ this.canvas.remove();
54
+ }
55
+ clear() {
56
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
57
+ }
58
+ appendTo(element) {
59
+ this.container = element;
60
+ element.append(this.canvas);
61
+ }
62
+ updateWithPoint(point) {
63
+ if (!this.five.renderer || !this.container)
64
+ return;
65
+ const { scale, pixelRatio, context, originWidth, originHeight, width, height } = this;
66
+ const position2d = point.clone().project(this.five.camera);
67
+ const left = ((position2d.x + 1) / 2) * this.container.clientWidth;
68
+ const right = (-(position2d.x - 1) / 2) * this.container.clientWidth;
69
+ const top = (-(position2d.y - 1) / 2) * this.container.clientHeight;
70
+ if (left < 183) {
71
+ this.canvas.style.top = -originHeight / 2 + 'px';
72
+ this.canvas.style.left = 90 + 'px';
73
+ }
74
+ else if (top < 183) {
75
+ this.canvas.style.top = 90 + 'px';
76
+ this.canvas.style.left = -originWidth / 2 + 'px';
77
+ }
78
+ else if (right < 183) {
79
+ this.canvas.style.top = -originHeight / 2 + 'px';
80
+ this.canvas.style.left = -originWidth - 90 + 'px';
81
+ }
82
+ else {
83
+ this.canvas.style.left = -originWidth / 2 + 'px';
84
+ this.canvas.style.top = -originHeight - 90 + 'px';
85
+ }
86
+ this.canvas.style.transform = `translate3d(${left}px, ${top}px, 10px)`;
87
+ const renderSize = this.five.renderer.getSize(new Vector2());
88
+ const x = ((position2d.x + 1) / 2) * renderSize.x;
89
+ const y = ((position2d.y + 1) / 2) * renderSize.y;
90
+ const pixels = this.five.getPixels(x - originWidth / scale / 2, y - originHeight / scale / 2, originWidth / scale, originHeight / scale, pixelRatio * scale);
91
+ const length = (width * height) / 2;
92
+ for (let index = 0; index < length; index++) {
93
+ const targetIndex = (height - Math.floor(index / width) - 1) * width + (index % width);
94
+ exchange(pixels, index * 4 + 0, targetIndex * 4 + 0);
95
+ exchange(pixels, index * 4 + 1, targetIndex * 4 + 1);
96
+ exchange(pixels, index * 4 + 2, targetIndex * 4 + 2);
97
+ exchange(pixels, index * 4 + 3, targetIndex * 4 + 3);
98
+ }
99
+ const imageData = context.createImageData(width, height);
100
+ imageData.data.set(pixels);
101
+ context.putImageData(imageData, 0, 0);
102
+ }
103
+ }
@@ -0,0 +1,6 @@
1
+ export declare const MAIN_NORMAL_PATH = "M31.379 15.466a1.045 1.045 0 0 1-.92 1.076l-11.276.607a1.6 1.6 0 0 0-1.512 1.511l-.599 11.113a1.045 1.045 0 0 1-.92 1.075l-.164.008a1.183 1.183 0 0 1-1.123-.975l-.016-.164-.221-10.768a1.6 1.6 0 0 0-1.567-1.567l-11.3-.231-.165-.016a1.187 1.187 0 0 1-.964-.996l-.01-.127.007-.164c.061-.496.455-.876.958-.917l.118-.003 11.112-.599a1.6 1.6 0 0 0 1.498-1.37l.014-.142.607-11.276a1.045 1.045 0 0 1 1.076-.92c.573.015 1.055.46 1.13 1.019l.009.121.221 10.766a1.6 1.6 0 0 0 1.567 1.566l11.3.234a1.181 1.181 0 0 1 1.14 1.139z";
2
+ export declare const MAIN_DONE_PATH = "M27.1772552,8.15828895 C27.8664561,7.48070421 28.5574369,7.81156875 28.8336646,8.04968716 C29.1098924,8.28780557 29.3990219,9.110014 28.8256559,9.79263351 L28.7110903,9.9165024 L13.9697229,25.1399531 C13.3288458,25.7700285 12.3239388,25.8070917 11.6402346,25.2511429 L11.5159715,25.1399531 L3.7056151,18.0063788 C3.01641417,17.3287941 3.00699739,16.2207954 3.68458213,15.5315945 C4.32230894,14.8829348 5.3413021,14.8364368 6.03356826,15.3981178 L6.15936649,15.5105615 L12.6856594,21.9049888 L27.1772552,8.15828895 Z";
3
+ export declare const MAIN_MOUSE_ENTER_FILL = "url(#fpm__main-b)";
4
+ export declare const MAIN_MOUSE_LEAVE_FILL = "url(#fpm__main-c)";
5
+ declare const _default: string;
6
+ export default _default;
@@ -0,0 +1,117 @@
1
+ export const MAIN_NORMAL_PATH = 'M31.379 15.466a1.045 1.045 0 0 1-.92 1.076l-11.276.607a1.6 1.6 0 0 0-1.512 1.511l-.599 11.113a1.045 1.045 0 0 1-.92 1.075l-.164.008a1.183 1.183 0 0 1-1.123-.975l-.016-.164-.221-10.768a1.6 1.6 0 0 0-1.567-1.567l-11.3-.231-.165-.016a1.187 1.187 0 0 1-.964-.996l-.01-.127.007-.164c.061-.496.455-.876.958-.917l.118-.003 11.112-.599a1.6 1.6 0 0 0 1.498-1.37l.014-.142.607-11.276a1.045 1.045 0 0 1 1.076-.92c.573.015 1.055.46 1.13 1.019l.009.121.221 10.766a1.6 1.6 0 0 0 1.567 1.566l11.3.234a1.181 1.181 0 0 1 1.14 1.139z';
2
+ export const MAIN_DONE_PATH = 'M27.1772552,8.15828895 C27.8664561,7.48070421 28.5574369,7.81156875 28.8336646,8.04968716 C29.1098924,8.28780557 29.3990219,9.110014 28.8256559,9.79263351 L28.7110903,9.9165024 L13.9697229,25.1399531 C13.3288458,25.7700285 12.3239388,25.8070917 11.6402346,25.2511429 L11.5159715,25.1399531 L3.7056151,18.0063788 C3.01641417,17.3287941 3.00699739,16.2207954 3.68458213,15.5315945 C4.32230894,14.8829348 5.3413021,14.8364368 6.03356826,15.3981178 L6.15936649,15.5105615 L12.6856594,21.9049888 L27.1772552,8.15828895 Z';
3
+ export const MAIN_MOUSE_ENTER_FILL = 'url(#fpm__main-b)';
4
+ export const MAIN_MOUSE_LEAVE_FILL = 'url(#fpm__main-c)';
5
+ const revokeSvg = `
6
+ <svg class="fpm__revoke-icon" width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
7
+ <defs>
8
+ <linearGradient x1="47.631%" y1="55.183%" x2="2.967%" y2="86.323%" id="fpm__revoke-a">
9
+ <stop stop-color="#FFF" offset="0%" />
10
+ <stop stop-color="#FFF" stop-opacity=".5" offset="100%" />
11
+ </linearGradient>
12
+ <linearGradient x1="5.297%" y1="43.016%" x2="38.238%" y2="79.932%" id="fpm__revoke-b">
13
+ <stop stop-color="#FFF" offset="0%" />
14
+ <stop stop-color="#FFF" stop-opacity="0" offset="100%" />
15
+ </linearGradient>
16
+ </defs>
17
+ <path
18
+ d="M13.388 7.108c.552 0 1.005.42 1.06.957l.006.11v1.224c0 .921.745 1.667 1.666 1.667h7.184c5.804 0 10.509 4.616 10.509 10.309 0 5.595-4.544 10.15-10.21 10.305l-.3.004H8.924c-.917 0-1.66-.729-1.66-1.628 0-.846.658-1.541 1.5-1.62l.16-.008h14.38c3.972 0 7.191-3.158 7.191-7.053 0-3.81-3.08-6.916-6.933-7.049l-.257-.004H10.029l-.109-.005H8.212c-.245 0-.482-.085-.67-.237l-.09-.082a1.066 1.066 0 0 1-.065-1.422l.079-.086 5.175-5.077c.2-.195.468-.305.747-.305z"
19
+ fill="url(#fpm__revoke-a)"
20
+ fill-rule="nonzero"
21
+ stroke="url(#fpm__revoke-b)"
22
+ stroke-width=".5"
23
+ />
24
+ </svg>
25
+ `;
26
+ const exitSvg = `
27
+ <svg class="fpm__exit-icon width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
28
+ <defs>
29
+ <linearGradient x1="36.288%" y1="73.736%" x2="54.242%" y2="97.166%" id="fpm__exit-a">
30
+ <stop stop-color="#FFF" offset="0%" />
31
+ <stop stop-color="#FFF" stop-opacity=".5" offset="100%" />
32
+ </linearGradient>
33
+ <linearGradient x1="100%" y1="47.234%" x2="24.047%" y2="47.234%" id="fpm__exit-b">
34
+ <stop stop-color="#FFF" offset="0%" />
35
+ <stop stop-color="#FFF" stop-opacity=".005" offset="99.535%" />
36
+ <stop stop-color="#FFF" stop-opacity="0" offset="100%" />
37
+ </linearGradient>
38
+ </defs>
39
+ <path
40
+ d="M22 7a1.5 1.5 0 0 1 .144 2.993L22 10h-9a1.5 1.5 0 0 0-1.493 1.356l-.007.144v17a1.5 1.5 0 0 0 1.356 1.493L13 30h9a1.5 1.5 0 0 1 .144 2.993L22 33h-9a4.5 4.5 0 0 1-4.495-4.288L8.5 28.5v-17a4.5 4.5 0 0 1 4.288-4.495L13 7h9zm6.317 7.755a1 1 0 0 1 .7.286l4.856 4.764a1 1 0 0 1-.7 1.713h-5.856V21.5h-8.032a1.5 1.5 0 1 1 0-3h6.365c.92 0 1.666-.746 1.667-1.667v-1.078a1 1 0 0 1 1-1z"
41
+ fill="url(#fpm__exit-a)"
42
+ fill-rule="nonzero"
43
+ stroke="url(#fpm__exit-b)"
44
+ stroke-width=".5"
45
+ />
46
+ </svg>
47
+ `;
48
+ const mainSvg = `
49
+ <svg class="fpm__main-icon" width="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg">
50
+ <defs>
51
+ <mask id="fpm__main-icon-mask">
52
+ <rect id="fpm__main-icon-mask-black" x="0" y="0" width="30" height="30" fill="black"></rect>
53
+ <rect id="fpm__main-icon-mask-white" x="0" y="0" width="0" height="30" fill="white"></rect>
54
+ </mask>
55
+ <linearGradient id="fpm__main-a" x1="25.371%" y1="0%" x2="109.587%" y2="172.268%">
56
+ <stop stop-color="#FFF" offset="0%" />
57
+ <stop stop-color="#FFF" stop-opacity=".77" offset="44.051%" />
58
+ <stop stop-color="#FFF" stop-opacity=".201" offset="100%" />
59
+ </linearGradient>
60
+ <radialGradient id="fpm__main-b" fx="50%" fy="50%" r="50.864%" gradientTransform="matrix(-.98302 0 0 -1 .992 1)">
61
+ <stop stop-color="#2D7CFF" offset="0%" />
62
+ <stop stop-color="#2D7CFF" stop-opacity=".3" offset="100%" />
63
+ </radialGradient>
64
+ <radialGradient id="fpm__main-c" fx="50%" fy="50%" r="50.864%" gradientTransform="matrix(-.98302 0 0 -1 .992 1)">
65
+ <stop stop-opacity=".4" offset="0%" />
66
+ <stop stop-opacity=".12" offset="100%" />
67
+ </radialGradient>
68
+ </defs>
69
+ <g fill="none" fill-rule="evenodd">
70
+ <circle fill="url(#fpm__main-a)" cx="30" cy="30" r="30" />
71
+ <path
72
+ class="fpm__main-icon-path"
73
+ d="${MAIN_NORMAL_PATH}"
74
+ fill="${MAIN_MOUSE_LEAVE_FILL}"
75
+ fill-rule="nonzero"
76
+ transform="translate(14 14)"
77
+ />
78
+ </g>
79
+ </svg>
80
+ `;
81
+ export default `
82
+ <style>
83
+ .fpm__revoke {
84
+ opacity: 0.3;
85
+ }
86
+
87
+ .fpm__revoke.enabled {
88
+ opacity: 0.7;
89
+ }
90
+
91
+ .fpm__revoke.enabled:hover {
92
+ opacity: 1;
93
+ }
94
+
95
+ .fpm__revoke-icon {
96
+ width: 40px;
97
+ height: 40px;
98
+ margin-top: 10px;
99
+ cursor: pointer;
100
+ }
101
+ </style>
102
+ <div class="fpm_ui-bg"></div>
103
+ <div class="fpm_operating-space">
104
+ <div class="fpm__ui-item fpm__revoke">
105
+ ${revokeSvg}
106
+ <span class="fpm__text fpm__revoke-text">撤销</span>
107
+ </div>
108
+ <div class="fpm__ui-item fpm__main">
109
+ ${mainSvg}
110
+ <span class="fpm__text fpm__main-text">添加</span>
111
+ </div>
112
+ <div class="fpm__ui-item fpm__exit">
113
+ ${exitSvg}
114
+ <span class="fpm__text fpm__exit-text">退出</span>
115
+ </div>
116
+ </div>
117
+ `;
@@ -0,0 +1,18 @@
1
+ import MeasureController from '../../Controller';
2
+ export declare class MainBtnController {
3
+ private container;
4
+ private measureController;
5
+ private mainIconMaskTween?;
6
+ private mainElement;
7
+ constructor(measureController: MeasureController, container: Element);
8
+ dispose(): void;
9
+ private getMainElement;
10
+ private change2Add;
11
+ private change2Cancel;
12
+ private change2Done;
13
+ private onMouseEnter;
14
+ private onMouseLeave;
15
+ private onClick;
16
+ private editedLineChangeHandler;
17
+ private modeChangeHandler;
18
+ }
@@ -0,0 +1,102 @@
1
+ import TWEEN from '@tweenjs/tween.js';
2
+ import { mainIconStyle as mainIconStyle, mainItemStyle as mainItemStyle } from './style';
3
+ import { tweenProgress } from '../../../shared-utils/animationFrame/BetterTween';
4
+ import { MAIN_NORMAL_PATH, MAIN_DONE_PATH, MAIN_MOUSE_ENTER_FILL, MAIN_MOUSE_LEAVE_FILL } from './HTML';
5
+ export class MainBtnController {
6
+ container;
7
+ measureController;
8
+ mainIconMaskTween;
9
+ mainElement;
10
+ constructor(measureController, container) {
11
+ this.measureController = measureController;
12
+ this.container = container;
13
+ this.mainElement = this.getMainElement();
14
+ Object.assign(this.mainElement.mainIcon.style, mainIconStyle);
15
+ Object.assign(this.mainElement.mainItem.style, mainItemStyle);
16
+ this.change2Add();
17
+ this.measureController.hook.on('modeChange', this.modeChangeHandler);
18
+ this.mainElement.mainIcon.addEventListener('click', this.onClick);
19
+ this.mainElement.mainIcon.addEventListener('mouseenter', this.onMouseEnter);
20
+ this.mainElement.mainIcon.addEventListener('mouseleave', this.onMouseLeave);
21
+ }
22
+ dispose() {
23
+ this.measureController.hook.off('modeChange', this.modeChangeHandler);
24
+ this.measureController.hook.off('editedLineChange', this.editedLineChangeHandler);
25
+ this.mainElement.mainIcon.removeEventListener('click', this.onClick);
26
+ this.mainElement.mainIcon.removeEventListener('mouseenter', this.onMouseEnter);
27
+ this.mainElement.mainIcon.removeEventListener('mouseleave', this.onMouseLeave);
28
+ }
29
+ getMainElement() {
30
+ const mainTextDom = this.container.querySelector('.fpm__main-text');
31
+ const mainItem = this.container.querySelector('.fpm__main');
32
+ const mainIcon = this.container.querySelector('.fpm__main-icon');
33
+ const pathDom = mainItem?.querySelector('.fpm__main-icon-path');
34
+ const maskWhiteRect = mainIcon?.querySelector('#fpm__main-icon-mask-white');
35
+ if (!mainItem || !mainTextDom || !mainIcon || !pathDom || !maskWhiteRect)
36
+ throw new Error('cannot find dom');
37
+ return { mainTextDom, mainItem, mainIcon, pathDom, maskWhiteRect };
38
+ }
39
+ change2Add() {
40
+ this.measureController.hook.off('editedLineChange', this.editedLineChangeHandler);
41
+ const { mainIcon, mainTextDom, pathDom } = this.mainElement;
42
+ mainIcon.style.transition = mainTextDom.innerText === '完成' ? 'none' : 'transform 300ms ease-in-out';
43
+ mainIcon.style.transform = 'rotate(0deg)';
44
+ mainTextDom.innerText = '添加';
45
+ pathDom?.setAttribute('d', MAIN_NORMAL_PATH);
46
+ }
47
+ change2Cancel(withAnime = true) {
48
+ const { mainIcon, mainTextDom, pathDom } = this.mainElement;
49
+ pathDom.setAttribute('d', MAIN_NORMAL_PATH);
50
+ pathDom.setAttribute('mask', '');
51
+ mainIcon.style.transition = withAnime ? 'transform 300ms ease-in-out' : 'none';
52
+ mainIcon.style.transform = 'rotate(45deg)';
53
+ mainTextDom && (mainTextDom.innerText = '取消');
54
+ this.measureController.hook.on('editedLineChange', this.editedLineChangeHandler);
55
+ }
56
+ change2Done() {
57
+ const { mainTextDom, mainIcon, pathDom, maskWhiteRect } = this.getMainElement();
58
+ if (mainTextDom.innerText === '完成')
59
+ return;
60
+ mainIcon.style.transition = 'none';
61
+ mainIcon.style.transform = 'rotate(0deg)';
62
+ mainTextDom.innerText = '完成';
63
+ pathDom.setAttribute('d', MAIN_DONE_PATH);
64
+ pathDom.setAttribute('mask', `url(#fpm__main-icon-mask)`);
65
+ this.mainIconMaskTween?.dispose();
66
+ this.mainIconMaskTween = tweenProgress()
67
+ .easing(TWEEN.Easing.Quartic.InOut)
68
+ .onUpdate(({ progress }) => {
69
+ maskWhiteRect.setAttribute('width', (progress * 30).toString());
70
+ })
71
+ .onComplete(() => this.mainIconMaskTween?.dispose())
72
+ .play();
73
+ }
74
+ /* 鼠标移入时变成蓝色 */
75
+ onMouseEnter = () => {
76
+ const { mainItem, pathDom } = this.mainElement;
77
+ mainItem.style.opacity = '1';
78
+ pathDom.setAttribute('fill', MAIN_MOUSE_ENTER_FILL);
79
+ };
80
+ /* 鼠标移出时变成灰色 */
81
+ onMouseLeave = () => {
82
+ const { mainItem, pathDom } = this.mainElement;
83
+ mainItem.style.opacity = '0.7';
84
+ pathDom.setAttribute('fill', MAIN_MOUSE_LEAVE_FILL);
85
+ };
86
+ onClick = () => {
87
+ const mode = this.measureController.getCurrentMode();
88
+ mode === 'Watch' ? this.measureController.changeMode('Edit') : this.measureController.save().changeMode('Watch');
89
+ };
90
+ editedLineChangeHandler = (lines) => {
91
+ // 线的数量大于 1 时,没有状态的变化
92
+ if (lines.length > 1)
93
+ return;
94
+ // 因为撤销导致的状态变更 -> 取消
95
+ if (lines.length === 0)
96
+ return this.change2Cancel(false);
97
+ this.change2Done();
98
+ };
99
+ modeChangeHandler = (mode) => {
100
+ mode === 'Watch' ? this.change2Add() : this.change2Cancel();
101
+ };
102
+ }
@@ -0,0 +1,12 @@
1
+ import MeasureController, { Mode } from '../../../Controller';
2
+ export default class Revoke {
3
+ private container;
4
+ private revokeIcon;
5
+ private revokeItem;
6
+ private measureController;
7
+ constructor(measureController: MeasureController, container: Element);
8
+ dispose(): void;
9
+ onClick: () => void;
10
+ onModeChange: (mode: Mode) => void;
11
+ handleRevoke: () => () => void;
12
+ }
@@ -0,0 +1,35 @@
1
+ export default class Revoke {
2
+ container;
3
+ revokeIcon;
4
+ revokeItem;
5
+ measureController;
6
+ constructor(measureController, container) {
7
+ this.measureController = measureController;
8
+ this.container = container;
9
+ const revokeIcon = this.container.querySelector('.fpm__revoke-icon');
10
+ const revokeItem = this.container.querySelector('.fpm__revoke');
11
+ if (!revokeIcon || !revokeItem)
12
+ throw new Error('不正确的选择器');
13
+ this.revokeIcon = revokeIcon;
14
+ this.revokeItem = revokeItem;
15
+ this.revokeIcon.addEventListener('click', this.onClick);
16
+ measureController.hook.on('modeChange', this.onModeChange);
17
+ }
18
+ dispose() {
19
+ this.revokeIcon.removeEventListener('click', this.onClick);
20
+ this.measureController.hook.off('modeChange', this.onModeChange);
21
+ }
22
+ onClick = () => {
23
+ this.measureController.revoke();
24
+ };
25
+ onModeChange = (mode) => {
26
+ if (mode !== 'Edit') {
27
+ this.revokeItem.classList.remove('enabled');
28
+ return;
29
+ }
30
+ this.revokeItem.classList.add('enabled');
31
+ };
32
+ handleRevoke = () => {
33
+ return () => { };
34
+ };
35
+ }
@@ -0,0 +1,16 @@
1
+ import MeasureController from '../../Controller';
2
+ export interface UIControllerParams {
3
+ container: Element;
4
+ }
5
+ export declare class UIController {
6
+ private revoke?;
7
+ private container;
8
+ private mainController?;
9
+ private disposers;
10
+ private measureController;
11
+ constructor(measureController: MeasureController, params: UIControllerParams);
12
+ dispose(): void;
13
+ show(): this;
14
+ hide(): this;
15
+ private handleExit;
16
+ }
@@ -0,0 +1,69 @@
1
+ import htmlString from './HTML';
2
+ import { uiWrapperStyle, operatingSpaceStyle, controllerBackgroundStyle, buttonGroupStyle, exitIconStyle, exitItemStyle, textStyle, } from './style';
3
+ import { MainBtnController } from './MainBtnController';
4
+ import Revoke from './Revoke';
5
+ export class UIController {
6
+ revoke;
7
+ container;
8
+ mainController;
9
+ disposers = [];
10
+ measureController;
11
+ constructor(measureController, params) {
12
+ this.measureController = measureController;
13
+ this.container = document.createElement('div');
14
+ this.container.innerHTML = htmlString;
15
+ this.container.classList.add('fpm__ui-controller');
16
+ params.container.appendChild(this.container);
17
+ const textDoms = this.container.querySelectorAll('.fpm__text');
18
+ const UIItems = this.container.querySelectorAll('.fpm__ui-item');
19
+ const bgDom = this.container.querySelector('.fpm_ui-bg');
20
+ const operatingSpaceDom = this.container.querySelector('.fpm_operating-space');
21
+ Object.assign(bgDom?.style, controllerBackgroundStyle);
22
+ Object.assign(operatingSpaceDom?.style, operatingSpaceStyle);
23
+ Object.assign(this.container.style, uiWrapperStyle);
24
+ UIItems.forEach((item) => Object.assign(item.style, buttonGroupStyle));
25
+ textDoms.forEach((item) => Object.assign(item.style, textStyle));
26
+ }
27
+ dispose() {
28
+ this.hide();
29
+ this.container.remove();
30
+ }
31
+ show() {
32
+ this.container.style.opacity = '1';
33
+ this.container.style.transform = 'translate(0, 0)';
34
+ this.revoke = new Revoke(this.measureController, this.container);
35
+ this.mainController = new MainBtnController(this.measureController, this.container);
36
+ this.disposers.push(this.handleExit());
37
+ return this;
38
+ }
39
+ hide() {
40
+ this.container.style.opacity = '0';
41
+ this.container.style.transform = 'translate(0, 10px)';
42
+ this.revoke?.dispose();
43
+ this.mainController?.dispose();
44
+ this.disposers.forEach((disposer) => disposer());
45
+ this.disposers = [];
46
+ return this;
47
+ }
48
+ handleExit = () => {
49
+ const exitIcon = this.container.querySelector('.fpm__exit-icon');
50
+ const exitItem = this.container.querySelector('.fpm__exit');
51
+ if (!exitItem || !exitIcon)
52
+ throw new Error('cannot find dom');
53
+ Object.assign(exitItem.style, exitItemStyle);
54
+ Object.assign(exitIcon?.style, exitIconStyle);
55
+ const onMouseEnter = () => (exitItem.style.opacity = '1');
56
+ const onMouseLeave = () => (exitItem.style.opacity = '0.7');
57
+ const handleClick = () => {
58
+ this.measureController.disable();
59
+ };
60
+ exitIcon.addEventListener('click', handleClick);
61
+ exitIcon.addEventListener('mouseenter', onMouseEnter);
62
+ exitIcon.addEventListener('mouseleave', onMouseLeave);
63
+ return () => {
64
+ exitIcon.removeEventListener('click', handleClick);
65
+ exitIcon.removeEventListener('mouseenter', onMouseEnter);
66
+ exitIcon.removeEventListener('mouseleave', onMouseLeave);
67
+ };
68
+ };
69
+ }
@@ -0,0 +1,17 @@
1
+ export declare const addHoverImage = "//vrlab-static.ljcdn.com/release/web/measure/add-hover.944fffad.png";
2
+ export declare const addNormalImage = "//vrlab-static.ljcdn.com/release/web/measure/add-normal.39e967e9.png";
3
+ export declare const cancelHoverImage = "//vrlab-static.ljcdn.com/release/web/measure/canale-hover.74b37e24.png";
4
+ export declare const cancelNormalImage = "//vrlab-static.ljcdn.com/release/web/measure/cancle-normal.77bb326c.png";
5
+ export declare const doneHoverImage = "//vrlab-static.ljcdn.com/release/web/measure/done-hover.9e09438b.png";
6
+ export declare const doneNormalImage = "//vrlab-static.ljcdn.com/release/web/measure/done-normal.4fcddd73.png";
7
+ export declare const exitImage = "//vrlab-static.ljcdn.com/release/web/measure/exit.6693ad51.png";
8
+ export declare const revokeImage = "//vrlab-static.ljcdn.com/release/web/measure/revoke.3e424843.png";
9
+ export declare const uiWrapperStyle: Partial<CSSStyleDeclaration>;
10
+ export declare const operatingSpaceStyle: Partial<CSSStyleDeclaration>;
11
+ export declare const buttonGroupStyle: Partial<CSSStyleDeclaration>;
12
+ export declare const controllerBackgroundStyle: Partial<CSSStyleDeclaration>;
13
+ export declare const mainItemStyle: Partial<CSSStyleDeclaration>;
14
+ export declare const exitItemStyle: Partial<CSSStyleDeclaration>;
15
+ export declare const mainIconStyle: Partial<CSSStyleDeclaration>;
16
+ export declare const exitIconStyle: Partial<CSSStyleDeclaration>;
17
+ export declare const textStyle: Partial<CSSStyleDeclaration>;
@@ -0,0 +1,78 @@
1
+ export const addHoverImage = '//vrlab-static.ljcdn.com/release/web/measure/add-hover.944fffad.png';
2
+ export const addNormalImage = '//vrlab-static.ljcdn.com/release/web/measure/add-normal.39e967e9.png';
3
+ export const cancelHoverImage = '//vrlab-static.ljcdn.com/release/web/measure/canale-hover.74b37e24.png';
4
+ export const cancelNormalImage = '//vrlab-static.ljcdn.com/release/web/measure/cancle-normal.77bb326c.png';
5
+ export const doneHoverImage = '//vrlab-static.ljcdn.com/release/web/measure/done-hover.9e09438b.png';
6
+ export const doneNormalImage = '//vrlab-static.ljcdn.com/release/web/measure/done-normal.4fcddd73.png';
7
+ export const exitImage = '//vrlab-static.ljcdn.com/release/web/measure/exit.6693ad51.png';
8
+ export const revokeImage = '//vrlab-static.ljcdn.com/release/web/measure/revoke.3e424843.png';
9
+ export const uiWrapperStyle = {
10
+ position: 'absolute',
11
+ top: '0',
12
+ left: '0',
13
+ width: '100%',
14
+ height: '100%',
15
+ opacity: '0',
16
+ transform: 'translate(0, 10px)',
17
+ transition: 'opacity 500ms ease-in-out, transform 500ms ease-in-out',
18
+ };
19
+ export const operatingSpaceStyle = {
20
+ position: 'absolute',
21
+ left: '50%',
22
+ bottom: '32px',
23
+ transform: 'translateX(-50%)',
24
+ width: '300px',
25
+ height: '89px',
26
+ display: 'flex',
27
+ justifyContent: 'space-between',
28
+ fontSize: '16px',
29
+ pointerEvents: 'all',
30
+ color: '#fff',
31
+ zIndex: '10',
32
+ };
33
+ export const buttonGroupStyle = {
34
+ height: '100%',
35
+ width: 'max-content',
36
+ display: 'flex',
37
+ flexDirection: 'column',
38
+ justifyContent: 'space-between',
39
+ alignItems: 'center',
40
+ };
41
+ // 操作区下方的背景
42
+ export const controllerBackgroundStyle = {
43
+ position: 'absolute',
44
+ bottom: '0',
45
+ left: '0',
46
+ opacity: '0.5',
47
+ width: '100%',
48
+ height: '184px',
49
+ background: `linear-gradient(180deg, rgba(0,0,0,0.00) 0%, #000000 100%)`,
50
+ zIndex: '0',
51
+ };
52
+ // item
53
+ export const mainItemStyle = {
54
+ margin: '0 80px',
55
+ opacity: '0.7',
56
+ };
57
+ export const exitItemStyle = {
58
+ opacity: '0.7',
59
+ };
60
+ // icon
61
+ export const mainIconStyle = {
62
+ width: '60px',
63
+ height: '60px',
64
+ backgroundSize: '100%',
65
+ cursor: 'pointer',
66
+ };
67
+ export const exitIconStyle = {
68
+ width: '40px',
69
+ height: '40px',
70
+ marginTop: '10px',
71
+ backgroundSize: '100%',
72
+ cursor: 'pointer',
73
+ };
74
+ // text
75
+ export const textStyle = {
76
+ cursor: 'default',
77
+ userSelect: 'none',
78
+ };
@@ -0,0 +1,7 @@
1
+ import { FivePlugin } from '@realsee/five';
2
+ import MeasureController, { MeasurePluginParameter } from './Controller';
3
+ declare const PanoMeasurePlugin: FivePlugin<MeasurePluginParameter, PluginReturns>;
4
+ export default PanoMeasurePlugin;
5
+ export declare type PluginReturns = MeasureController;
6
+ export type { PluginEvent } from './typings/event.type';
7
+ export type { LineJson, PointJson } from './typings/data';
@@ -0,0 +1,5 @@
1
+ import MeasureController from './Controller';
2
+ const PanoMeasurePlugin = function MeasurePlugin(five, params) {
3
+ return new MeasureController(five, params);
4
+ };
5
+ export default PanoMeasurePlugin;
@@ -0,0 +1,28 @@
1
+ export interface LineCompletelyJson {
2
+ id: string;
3
+ points: PointJson[];
4
+ }
5
+ export interface PolylineCompletelyJson {
6
+ id: string;
7
+ points: PointJson[];
8
+ lines: LineCompletelyJson[];
9
+ }
10
+ export interface LineJson {
11
+ id: string;
12
+ points: string[];
13
+ }
14
+ export interface PolylineJson {
15
+ id: string;
16
+ points: string[];
17
+ lines: string[];
18
+ }
19
+ export interface PointJson {
20
+ id: string;
21
+ lines: string[];
22
+ position: number[];
23
+ }
24
+ export interface PluginData {
25
+ lines: LineJson[];
26
+ points: PointJson[];
27
+ polylines: PolylineJson[];
28
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import { SubscribeEventMap } from '@realsee/five';
2
+ import { Vector3 } from 'three';
3
+ import { Mode } from '../Controller';
4
+ import { LineCompletelyJson } from './data';
5
+ interface ControllerEvent extends SubscribeEventMap {
6
+ /**
7
+ * Mode 变更
8
+ */
9
+ modeChange: (mode: Mode) => void;
10
+ }
11
+ interface WatchEvent extends SubscribeEventMap {
12
+ selectedChange: (lines: LineCompletelyJson[]) => void;
13
+ }
14
+ interface EditEvent {
15
+ /**
16
+ * 编辑线条变更
17
+ */
18
+ editedLineChange: (lines: LineCompletelyJson[]) => void;
19
+ anchorChange: (anchor: Vector3 | null) => void;
20
+ }
21
+ interface DragEvent extends SubscribeEventMap {
22
+ wantsDragLine: (event: {
23
+ point: string;
24
+ lines: string[];
25
+ }) => boolean;
26
+ }
27
+ export declare type PluginEvent = ControllerEvent & EditEvent & WatchEvent & DragEvent;
28
+ export {};