plotboilerplate 1.14.0 → 1.17.0

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 (232) hide show
  1. package/README.md +2 -0
  2. package/changelog.md +57 -0
  3. package/dist/index.esm.js +856 -694
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.esm.min.js +1 -1
  6. package/dist/index.esm.min.js.map +1 -1
  7. package/dist/plotboilerplate.browser.min.js +1 -1
  8. package/dist/plotboilerplate.browser.min.js.map +1 -1
  9. package/dist/plotboilerplate.js +858 -598
  10. package/dist/plotboilerplate.min.js +1 -1
  11. package/package.json +1 -1
  12. package/src/cjs/BezierPath.d.ts +32 -14
  13. package/src/cjs/BezierPath.js +65 -24
  14. package/src/cjs/BezierPath.js.map +1 -1
  15. package/src/cjs/Bounds.d.ts +22 -1
  16. package/src/cjs/Bounds.js +24 -1
  17. package/src/cjs/Bounds.js.map +1 -1
  18. package/src/cjs/Circle.d.ts +15 -13
  19. package/src/cjs/Circle.js +16 -34
  20. package/src/cjs/Circle.js.map +1 -1
  21. package/src/cjs/CircleSector.d.ts +17 -16
  22. package/src/cjs/CircleSector.js +12 -24
  23. package/src/cjs/CircleSector.js.map +1 -1
  24. package/src/cjs/CubicBezierCurve.d.ts +16 -15
  25. package/src/cjs/CubicBezierCurve.js +57 -94
  26. package/src/cjs/CubicBezierCurve.js.map +1 -1
  27. package/src/cjs/KeyHandler.d.ts +10 -3
  28. package/src/cjs/KeyHandler.js +28 -23
  29. package/src/cjs/KeyHandler.js.map +1 -1
  30. package/src/cjs/Line.d.ts +2 -15
  31. package/src/cjs/Line.js +6 -31
  32. package/src/cjs/Line.js.map +1 -1
  33. package/src/cjs/MouseHandler.js +43 -53
  34. package/src/cjs/MouseHandler.js.map +1 -1
  35. package/src/cjs/PBImage.d.ts +15 -13
  36. package/src/cjs/PBImage.js +11 -15
  37. package/src/cjs/PBImage.js.map +1 -1
  38. package/src/cjs/PBText.d.ts +13 -12
  39. package/src/cjs/PBText.js +8 -12
  40. package/src/cjs/PBText.js.map +1 -1
  41. package/src/cjs/PlotBoilerplate.js +3 -2
  42. package/src/cjs/PlotBoilerplate.js.map +1 -1
  43. package/src/cjs/Polygon.d.ts +44 -14
  44. package/src/cjs/Polygon.js +116 -66
  45. package/src/cjs/Polygon.js.map +1 -1
  46. package/src/cjs/Triangle.d.ts +15 -13
  47. package/src/cjs/Triangle.js +23 -64
  48. package/src/cjs/Triangle.js.map +1 -1
  49. package/src/cjs/VEllipse.d.ts +14 -9
  50. package/src/cjs/VEllipse.js +10 -18
  51. package/src/cjs/VEllipse.js.map +1 -1
  52. package/src/cjs/VEllipseSector.d.ts +15 -1
  53. package/src/cjs/VEllipseSector.js +11 -1
  54. package/src/cjs/VEllipseSector.js.map +1 -1
  55. package/src/cjs/Vector.d.ts +3 -15
  56. package/src/cjs/Vector.js +9 -49
  57. package/src/cjs/Vector.js.map +1 -1
  58. package/src/cjs/VertTuple.d.ts +15 -1
  59. package/src/cjs/VertTuple.js +14 -19
  60. package/src/cjs/VertTuple.js.map +1 -1
  61. package/src/cjs/Vertex.d.ts +47 -13
  62. package/src/cjs/Vertex.js +62 -22
  63. package/src/cjs/Vertex.js.map +1 -1
  64. package/src/cjs/VertexListeners.d.ts +12 -8
  65. package/src/cjs/VertexListeners.js +18 -25
  66. package/src/cjs/VertexListeners.js.map +1 -1
  67. package/src/cjs/draw.d.ts +41 -2
  68. package/src/cjs/draw.js +140 -3
  69. package/src/cjs/draw.js.map +1 -1
  70. package/src/cjs/drawgl.d.ts +38 -2
  71. package/src/cjs/drawgl.js +41 -2
  72. package/src/cjs/drawgl.js.map +1 -1
  73. package/src/cjs/drawutilssvg.d.ts +66 -3
  74. package/src/cjs/drawutilssvg.js +140 -15
  75. package/src/cjs/drawutilssvg.js.map +1 -1
  76. package/src/cjs/index.d.ts +0 -1
  77. package/src/cjs/index.js +0 -1
  78. package/src/cjs/index.js.map +1 -1
  79. package/src/cjs/interfaces/DrawLib.d.ts +61 -26
  80. package/src/cjs/interfaces/DrawLib.js +2 -0
  81. package/src/cjs/interfaces/DrawLib.js.map +1 -1
  82. package/src/cjs/interfaces/core.d.ts +0 -12
  83. package/src/cjs/module.d.ts +1 -3
  84. package/src/cjs/module.js +2 -5
  85. package/src/cjs/module.js.map +1 -1
  86. package/src/cjs/utils/creategui.js +16 -2
  87. package/src/cjs/utils/datastructures/Girih.d.ts +5 -0
  88. package/src/cjs/utils/datastructures/Girih.js +18 -14
  89. package/src/cjs/utils/datastructures/Girih.js.map +1 -1
  90. package/src/cjs/utils/datastructures/GirihPenroseRhombus.js +42 -25
  91. package/src/cjs/utils/datastructures/GirihPenroseRhombus.js.map +1 -1
  92. package/src/cjs/utils/datastructures/GirihTile.js +2 -13
  93. package/src/cjs/utils/datastructures/GirihTile.js.map +1 -1
  94. package/src/cjs/utils/findInVertexArray.d.ts +19 -0
  95. package/src/cjs/utils/findInVertexArray.js +29 -0
  96. package/src/cjs/utils/findInVertexArray.js.map +1 -0
  97. package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +17 -1
  98. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +50 -32
  99. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  100. package/src/cjs/utils/io/DndFileHandler.d.ts +63 -0
  101. package/src/cjs/utils/io/DndFileHandler.js +112 -0
  102. package/src/cjs/utils/io/DndFileHandler.js.map +1 -0
  103. package/src/cjs/utils/io/FileDrop.d.ts +98 -0
  104. package/src/cjs/utils/io/FileDrop.js +142 -0
  105. package/src/cjs/utils/io/FileDrop.js.map +1 -0
  106. package/src/esm/BezierPath.d.ts +32 -14
  107. package/src/esm/BezierPath.js +65 -24
  108. package/src/esm/BezierPath.js.map +1 -1
  109. package/src/esm/Bounds.d.ts +22 -1
  110. package/src/esm/Bounds.js +24 -1
  111. package/src/esm/Bounds.js.map +1 -1
  112. package/src/esm/Circle.d.ts +15 -13
  113. package/src/esm/Circle.js +16 -34
  114. package/src/esm/Circle.js.map +1 -1
  115. package/src/esm/CircleSector.d.ts +17 -16
  116. package/src/esm/CircleSector.js +12 -24
  117. package/src/esm/CircleSector.js.map +1 -1
  118. package/src/esm/CubicBezierCurve.d.ts +16 -15
  119. package/src/esm/CubicBezierCurve.js +57 -94
  120. package/src/esm/CubicBezierCurve.js.map +1 -1
  121. package/src/esm/KeyHandler.d.ts +10 -3
  122. package/src/esm/KeyHandler.js +28 -23
  123. package/src/esm/KeyHandler.js.map +1 -1
  124. package/src/esm/Line.d.ts +2 -15
  125. package/src/esm/Line.js +6 -31
  126. package/src/esm/Line.js.map +1 -1
  127. package/src/esm/MouseHandler.js +43 -53
  128. package/src/esm/MouseHandler.js.map +1 -1
  129. package/src/esm/PBImage.d.ts +15 -13
  130. package/src/esm/PBImage.js +11 -15
  131. package/src/esm/PBImage.js.map +1 -1
  132. package/src/esm/PBText.d.ts +13 -12
  133. package/src/esm/PBText.js +8 -12
  134. package/src/esm/PBText.js.map +1 -1
  135. package/src/esm/PlotBoilerplate.js +3 -2
  136. package/src/esm/PlotBoilerplate.js.map +1 -1
  137. package/src/esm/Polygon.d.ts +44 -14
  138. package/src/esm/Polygon.js +116 -66
  139. package/src/esm/Polygon.js.map +1 -1
  140. package/src/esm/Triangle.d.ts +15 -13
  141. package/src/esm/Triangle.js +23 -64
  142. package/src/esm/Triangle.js.map +1 -1
  143. package/src/esm/VEllipse.d.ts +14 -9
  144. package/src/esm/VEllipse.js +10 -18
  145. package/src/esm/VEllipse.js.map +1 -1
  146. package/src/esm/VEllipseSector.d.ts +15 -1
  147. package/src/esm/VEllipseSector.js +11 -1
  148. package/src/esm/VEllipseSector.js.map +1 -1
  149. package/src/esm/Vector.d.ts +3 -15
  150. package/src/esm/Vector.js +9 -49
  151. package/src/esm/Vector.js.map +1 -1
  152. package/src/esm/VertTuple.d.ts +15 -1
  153. package/src/esm/VertTuple.js +14 -19
  154. package/src/esm/VertTuple.js.map +1 -1
  155. package/src/esm/Vertex.d.ts +47 -13
  156. package/src/esm/Vertex.js +62 -22
  157. package/src/esm/Vertex.js.map +1 -1
  158. package/src/esm/VertexListeners.d.ts +12 -8
  159. package/src/esm/VertexListeners.js +18 -25
  160. package/src/esm/VertexListeners.js.map +1 -1
  161. package/src/esm/draw.d.ts +41 -2
  162. package/src/esm/draw.js +139 -3
  163. package/src/esm/draw.js.map +1 -1
  164. package/src/esm/drawgl.d.ts +38 -2
  165. package/src/esm/drawgl.js +41 -2
  166. package/src/esm/drawgl.js.map +1 -1
  167. package/src/esm/drawutilssvg.d.ts +66 -3
  168. package/src/esm/drawutilssvg.js +140 -15
  169. package/src/esm/drawutilssvg.js.map +1 -1
  170. package/src/esm/index.d.ts +0 -1
  171. package/src/esm/index.js +0 -1
  172. package/src/esm/index.js.map +1 -1
  173. package/src/esm/interfaces/DrawLib.d.ts +61 -26
  174. package/src/esm/interfaces/DrawLib.js +2 -0
  175. package/src/esm/interfaces/DrawLib.js.map +1 -1
  176. package/src/esm/interfaces/core.d.ts +0 -12
  177. package/src/esm/module.d.ts +1 -3
  178. package/src/esm/module.js +5 -4
  179. package/src/esm/module.js.map +1 -1
  180. package/src/esm/utils/datastructures/Girih.d.ts +5 -0
  181. package/src/esm/utils/datastructures/Girih.js +18 -14
  182. package/src/esm/utils/datastructures/Girih.js.map +1 -1
  183. package/src/esm/utils/datastructures/GirihPenroseRhombus.js +42 -25
  184. package/src/esm/utils/datastructures/GirihPenroseRhombus.js.map +1 -1
  185. package/src/esm/utils/datastructures/GirihTile.js +2 -13
  186. package/src/esm/utils/datastructures/GirihTile.js.map +1 -1
  187. package/src/esm/utils/findInVertexArray.d.ts +19 -0
  188. package/src/esm/utils/findInVertexArray.js +25 -0
  189. package/src/esm/utils/findInVertexArray.js.map +1 -0
  190. package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +17 -1
  191. package/src/esm/utils/helpers/BezierPathInteractionHelper.js +49 -32
  192. package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  193. package/src/esm/utils/io/DndFileHandler.d.ts +63 -0
  194. package/src/esm/utils/io/DndFileHandler.js +106 -0
  195. package/src/esm/utils/io/DndFileHandler.js.map +1 -0
  196. package/src/esm/utils/io/FileDrop.d.ts +98 -0
  197. package/src/esm/utils/io/FileDrop.js +136 -0
  198. package/src/esm/utils/io/FileDrop.js.map +1 -0
  199. package/src/ts/BezierPath.ts +78 -22
  200. package/src/ts/Bounds.ts +25 -1
  201. package/src/ts/Circle.ts +187 -200
  202. package/src/ts/CircleSector.ts +141 -141
  203. package/src/ts/CubicBezierCurve.ts +738 -810
  204. package/src/ts/KeyHandler.ts +221 -212
  205. package/src/ts/Line.ts +48 -80
  206. package/src/ts/MouseHandler.ts +356 -368
  207. package/src/ts/PBImage.ts +67 -69
  208. package/src/ts/PBText.ts +16 -14
  209. package/src/ts/PlotBoilerplate.ts +4 -2
  210. package/src/ts/Polygon.ts +493 -451
  211. package/src/ts/Triangle.ts +444 -489
  212. package/src/ts/VEllipse.ts +18 -17
  213. package/src/ts/VEllipseSector.ts +20 -1
  214. package/src/ts/Vector.ts +124 -160
  215. package/src/ts/VertTuple.ts +333 -338
  216. package/src/ts/Vertex.ts +75 -21
  217. package/src/ts/VertexListeners.ts +248 -266
  218. package/src/ts/draw.ts +192 -3
  219. package/src/ts/drawgl.ts +44 -2
  220. package/src/ts/drawutilssvg.ts +181 -15
  221. package/src/ts/index.ts +0 -1
  222. package/src/ts/interfaces/DrawLib.ts +69 -26
  223. package/src/ts/interfaces/core.ts +0 -11
  224. package/src/ts/module.ts +2 -4
  225. package/src/ts/utils/datastructures/Girih.ts +204 -209
  226. package/src/ts/utils/datastructures/GirihPenroseRhombus.ts +170 -152
  227. package/src/ts/utils/datastructures/GirihTile.ts +394 -419
  228. package/src/ts/utils/findInVertexArray.ts +28 -0
  229. package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +56 -34
  230. package/src/ts/utils/io/FileDrop.ts +178 -0
  231. package/src/ts/SVGBuilder.ts +0 -109
  232. package/src/ts/utils/algorithms/sh-tmp.ts~ +0 -59
@@ -0,0 +1,106 @@
1
+ /**
2
+ * A basic IO handler for file drop (Drag-and-drop).
3
+ *
4
+ * @author Ikaros Kappler
5
+ * @date 2021-10-13
6
+ * @modified 2022-01-31 (ported from the ngdg project, then generalized)
7
+ * @version 2.0.0
8
+ */
9
+ export class ConfigIO {
10
+ /**
11
+ *
12
+ * @param {HTMLElement} element - The element you wish to operate as the drop zone (like <body/>).
13
+ */
14
+ constructor(element) {
15
+ /**
16
+ * Internally handle a drop event.
17
+ *
18
+ * @param {DragEvent} event
19
+ * @returns {void}
20
+ */
21
+ this.handleDropEvent = (event) => {
22
+ event.preventDefault();
23
+ event.stopPropagation();
24
+ this.element.style.opacity = "1.0";
25
+ if (!event.dataTransfer.files || event.dataTransfer.files.length === 0) {
26
+ // No files were dropped
27
+ return;
28
+ }
29
+ if (event.dataTransfer.files.length > 1) {
30
+ // Multiple file drop is not nupported
31
+ return;
32
+ }
33
+ if (!this.fileDroppedCallbackJSON) {
34
+ // No handling callback defined.
35
+ return;
36
+ }
37
+ if (event.dataTransfer.files[0]) {
38
+ const file = event.dataTransfer.files[0];
39
+ console.log("file", file);
40
+ if (file.type.match(/json.*/) && this.fileDroppedCallbackJSON) {
41
+ var reader = new FileReader();
42
+ reader.onload = (readEvent) => {
43
+ // Finished reading file data.
44
+ const jsonObject = JSON.parse(readEvent.target.result);
45
+ // TODO: what happens on fail?
46
+ this.fileDroppedCallbackJSON(jsonObject);
47
+ };
48
+ reader.readAsText(file); // start reading the file data.
49
+ }
50
+ else if (file.type.match(/text\/plain.*/) && this.fileDroppedCallbackText) {
51
+ var reader = new FileReader();
52
+ reader.onload = (readEvent) => {
53
+ // Finished reading file data.
54
+ this.fileDroppedCallbackText(readEvent.target.result);
55
+ };
56
+ reader.readAsText(file); // start reading the file data.
57
+ }
58
+ }
59
+ };
60
+ this.handleDragOverEvent = (event) => {
61
+ event.preventDefault();
62
+ event.stopPropagation();
63
+ this.element.style.opacity = "0.5";
64
+ };
65
+ this.handleDragLeaveEvent = (event) => {
66
+ event.preventDefault();
67
+ event.stopPropagation();
68
+ this.element.style.opacity = "1.0";
69
+ };
70
+ this.element = element;
71
+ // Init the drop listeners
72
+ element.addEventListener("drop", this.handleDropEvent.bind(this));
73
+ element.addEventListener("dragover", this.handleDragOverEvent.bind(this));
74
+ element.addEventListener("dragleave", this.handleDragLeaveEvent.bind(this));
75
+ }
76
+ /**
77
+ * Install the JSON (MIME type json*) file drop callback. Note than only one callback can be installed
78
+ * in this implementation. Calling this method multiple times will overwrite previously
79
+ * installed listeners.
80
+ *
81
+ * The callback will receive the dropped file content as an object (parsed JSON).
82
+ *
83
+ * @param {(data:object)=>void} callback
84
+ */
85
+ onFileJSONDropped(callback) {
86
+ this.fileDroppedCallbackJSON = callback;
87
+ }
88
+ /**
89
+ * Install the text file (MIME type text/plain) drop callback. Note than only one callback can be installed
90
+ * in this implementation. Calling this method multiple times will overwrite previously
91
+ * installed listeners.
92
+ *
93
+ * The callback will receive the dropped file content as a string.
94
+ *
95
+ * @param {(data:object)=>void} callback
96
+ */
97
+ onFileTextDropped(callback) {
98
+ this.fileDroppedCallbackText = callback;
99
+ }
100
+ destroy() {
101
+ this.element.removeEventListener("drop", this.handleDropEvent);
102
+ this.element.removeEventListener("dragover", this.handleDragOverEvent);
103
+ this.element.removeEventListener("dragleave", this.handleDragLeaveEvent);
104
+ }
105
+ }
106
+ //# sourceMappingURL=DndFileHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DndFileHandler.js","sourceRoot":"","sources":["../../../ts/utils/io/DndFileHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * A basic IO handler for file drop (Drag-and-drop).
3
+ *
4
+ * Example use:
5
+ * ```javascript
6
+ * var body = document.getElememtByTagName("body")[0];
7
+ * var fileDrop = new FileDrop(body);
8
+ * fileDrop.onFileJSONDropped(function (jsonObject) {
9
+ * console.log("jsonObject", jsonObject);
10
+ * });
11
+ * ```
12
+ *
13
+ * @author Ikaros Kappler
14
+ * @date 2021-10-13
15
+ * @modified 2022-01-31 (ported from the ngdg project, then generalized)
16
+ * @version 2.0.0
17
+ */
18
+ declare type IDroppedCallbackJSON = (jsonData: object) => void;
19
+ declare type IDroppedCallbackText = (textData: string) => void;
20
+ export declare class FileDrop {
21
+ /**
22
+ * The 'dropzone' element.
23
+ * @private
24
+ * @memberof FileDrop
25
+ * @member {HTMLElement}
26
+ */
27
+ private element;
28
+ /**
29
+ * The JSON file drop callback.
30
+ * @private
31
+ * @memberof FileDrop
32
+ * @member {HTMLElement}
33
+ */
34
+ private fileDroppedCallbackJSON;
35
+ /**
36
+ * The text file drop callback.
37
+ * @private
38
+ * @memberof FileDrop
39
+ * @member {HTMLElement}
40
+ */
41
+ private fileDroppedCallbackText;
42
+ /**
43
+ * The binary file drop callback.
44
+ * @private
45
+ * @memberof FileDrop
46
+ * @member {HTMLElement}
47
+ */
48
+ private fileDroppedCallbackBinary;
49
+ /**
50
+ *
51
+ * @param {HTMLElement} element - The element you wish to operate as the drop zone (like <body/>).
52
+ */
53
+ constructor(element: HTMLElement);
54
+ /**
55
+ * Install the JSON (MIME type json*) file drop callback. Note than only one callback can be installed
56
+ * in this implementation. Calling this method multiple times will overwrite previously
57
+ * installed listeners.
58
+ *
59
+ * The callback will receive the dropped file content as an object (parsed JSON).
60
+ *
61
+ * @param {(data:object)=>void} callback
62
+ */
63
+ onFileJSONDropped(callback: IDroppedCallbackJSON): void;
64
+ /**
65
+ * Install the text file (MIME type text/plain) drop callback. Note than only one callback can be installed
66
+ * in this implementation. Calling this method multiple times will overwrite previously
67
+ * installed listeners.
68
+ *
69
+ * The callback will receive the dropped file content as a string.
70
+ *
71
+ * @param {(data:object)=>void} callback
72
+ */
73
+ onFileTextDropped(callback: IDroppedCallbackText): void;
74
+ /**
75
+ * Internally handle a drop event.
76
+ *
77
+ * @param {DragEvent} event
78
+ * @returns {void}
79
+ */
80
+ private handleDropEvent;
81
+ /**
82
+ * Toggles the drop sensitive element's opacity to 0.5.
83
+ *
84
+ * @param {DragEvent} event - The event.
85
+ */
86
+ private handleDragOverEvent;
87
+ /**
88
+ * Restored the drop sensitive element's opacity back to 1.0.
89
+ *
90
+ * @param {DragEvent} event - The event.
91
+ */
92
+ private handleDragLeaveEvent;
93
+ /**
94
+ * Removes all listeners (drop, dragover and dragleave).
95
+ */
96
+ destroy(): void;
97
+ }
98
+ export {};
@@ -0,0 +1,136 @@
1
+ /**
2
+ * A basic IO handler for file drop (Drag-and-drop).
3
+ *
4
+ * Example use:
5
+ * ```javascript
6
+ * var body = document.getElememtByTagName("body")[0];
7
+ * var fileDrop = new FileDrop(body);
8
+ * fileDrop.onFileJSONDropped(function (jsonObject) {
9
+ * console.log("jsonObject", jsonObject);
10
+ * });
11
+ * ```
12
+ *
13
+ * @author Ikaros Kappler
14
+ * @date 2021-10-13
15
+ * @modified 2022-01-31 (ported from the ngdg project, then generalized)
16
+ * @version 2.0.0
17
+ */
18
+ export class FileDrop {
19
+ /**
20
+ *
21
+ * @param {HTMLElement} element - The element you wish to operate as the drop zone (like <body/>).
22
+ */
23
+ constructor(element) {
24
+ /**
25
+ * Internally handle a drop event.
26
+ *
27
+ * @param {DragEvent} event
28
+ * @returns {void}
29
+ */
30
+ this.handleDropEvent = (event) => {
31
+ event.preventDefault();
32
+ event.stopPropagation();
33
+ this.element.style.opacity = "1.0";
34
+ if (!event.dataTransfer.files || event.dataTransfer.files.length === 0) {
35
+ // No files were dropped
36
+ return;
37
+ }
38
+ if (event.dataTransfer.files.length > 1) {
39
+ // Multiple file drop is not nupported
40
+ return;
41
+ }
42
+ if (!this.fileDroppedCallbackJSON) {
43
+ // No handling callback defined.
44
+ return;
45
+ }
46
+ if (event.dataTransfer.files[0]) {
47
+ const file = event.dataTransfer.files[0];
48
+ // console.log("file", file);
49
+ if (file.type.match(/json.*/) && this.fileDroppedCallbackJSON) {
50
+ var reader = new FileReader();
51
+ reader.onload = (readEvent) => {
52
+ // Finished reading file data.
53
+ const jsonObject = JSON.parse(readEvent.target.result);
54
+ // TODO: what happens on fail?
55
+ this.fileDroppedCallbackJSON(jsonObject);
56
+ };
57
+ reader.readAsText(file); // start reading the file data.
58
+ }
59
+ else if (file.type.match(/text\/plain.*/) && this.fileDroppedCallbackText) {
60
+ var reader = new FileReader();
61
+ reader.onload = (readEvent) => {
62
+ // Finished reading file data.
63
+ this.fileDroppedCallbackText(readEvent.target.result);
64
+ };
65
+ reader.readAsText(file); // start reading the file data.
66
+ }
67
+ else if (this.fileDroppedCallbackBinary) {
68
+ var reader = new FileReader();
69
+ reader.onload = (readEvent) => {
70
+ // Finished reading file data.
71
+ this.fileDroppedCallbackBinary(new Blob([readEvent.target.result]), file);
72
+ };
73
+ reader.readAsBinaryString(file); // start reading the file data.
74
+ }
75
+ }
76
+ };
77
+ /**
78
+ * Toggles the drop sensitive element's opacity to 0.5.
79
+ *
80
+ * @param {DragEvent} event - The event.
81
+ */
82
+ this.handleDragOverEvent = (event) => {
83
+ event.preventDefault();
84
+ event.stopPropagation();
85
+ this.element.style.opacity = "0.5";
86
+ };
87
+ /**
88
+ * Restored the drop sensitive element's opacity back to 1.0.
89
+ *
90
+ * @param {DragEvent} event - The event.
91
+ */
92
+ this.handleDragLeaveEvent = (event) => {
93
+ event.preventDefault();
94
+ event.stopPropagation();
95
+ this.element.style.opacity = "1.0";
96
+ };
97
+ this.element = element;
98
+ // Init the drop listeners
99
+ element.addEventListener("drop", this.handleDropEvent.bind(this));
100
+ element.addEventListener("dragover", this.handleDragOverEvent.bind(this));
101
+ element.addEventListener("dragleave", this.handleDragLeaveEvent.bind(this));
102
+ }
103
+ /**
104
+ * Install the JSON (MIME type json*) file drop callback. Note than only one callback can be installed
105
+ * in this implementation. Calling this method multiple times will overwrite previously
106
+ * installed listeners.
107
+ *
108
+ * The callback will receive the dropped file content as an object (parsed JSON).
109
+ *
110
+ * @param {(data:object)=>void} callback
111
+ */
112
+ onFileJSONDropped(callback) {
113
+ this.fileDroppedCallbackJSON = callback;
114
+ }
115
+ /**
116
+ * Install the text file (MIME type text/plain) drop callback. Note than only one callback can be installed
117
+ * in this implementation. Calling this method multiple times will overwrite previously
118
+ * installed listeners.
119
+ *
120
+ * The callback will receive the dropped file content as a string.
121
+ *
122
+ * @param {(data:object)=>void} callback
123
+ */
124
+ onFileTextDropped(callback) {
125
+ this.fileDroppedCallbackText = callback;
126
+ }
127
+ /**
128
+ * Removes all listeners (drop, dragover and dragleave).
129
+ */
130
+ destroy() {
131
+ this.element.removeEventListener("drop", this.handleDropEvent);
132
+ this.element.removeEventListener("dragover", this.handleDragOverEvent);
133
+ this.element.removeEventListener("dragleave", this.handleDragLeaveEvent);
134
+ }
135
+ }
136
+ //# sourceMappingURL=FileDrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDrop.js","sourceRoot":"","sources":["../../../ts/utils/io/FileDrop.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,10 @@
20
20
  * @modified 2020-07-24 Added the getClosestT(Vertex) function.
21
21
  * @modified 2020-12-29 Constructor is now private (no explicit use intended).
22
22
  * @modified 2021-05-25 Added BezierPath.fromReducedList( Array<number> ).
23
- * @version 2.3.1
23
+ * @modified 2022-01-31 Added `BezierPath.getEvenDistributionVertices(number)`.
24
+ * @modified 2022-02-02 Added the `destroy` method.
25
+ * @modified 2022-02-02 Cleared the `toSVGString` function (deprecated). Use `drawutilssvg` instead.
26
+ * @version 2.5.0
24
27
  *
25
28
  * @file BezierPath
26
29
  * @public
@@ -96,6 +99,14 @@ export class BezierPath implements SVGSerializable {
96
99
  */
97
100
  bezierCurves: Array<CubicBezierCurve>;
98
101
 
102
+ /**
103
+ * @member {boolean}
104
+ * @memberof BezierPath
105
+ * @type {boolean}
106
+ * @instance
107
+ */
108
+ isDestroyed: boolean;
109
+
99
110
  // +---------------------------------------------------------------------------------
100
111
  // | These constants equal the values from CubicBezierCurve.
101
112
  // +-------------------------------
@@ -1054,6 +1065,64 @@ export class BezierPath implements SVGSerializable {
1054
1065
  return new Bounds(min, max);
1055
1066
  }
1056
1067
 
1068
+ /**
1069
+ * Get n 'equally' distributed vertices along this Bézier path.
1070
+ *
1071
+ * As the changing curvature of the B slines makes prediction of distances difficult, the
1072
+ * returned vertices' distances are only relatively equal:
1073
+ * - the distance grows where curvature is large.
1074
+ * - the distance shrinks where curvature is small.
1075
+ *
1076
+ * Only the distance mean of all consecutive is 1/n-th of the total arc length.
1077
+ *
1078
+ * Usually this approximation is good enough for most use cases.
1079
+ *
1080
+ * @param {number} pointCount - (must be at least 2) The number of desired points (start and end point included).
1081
+ * @return {Array<Vertex>}
1082
+ */
1083
+ getEvenDistributionVertices(pointCount: number): Array<Vertex> {
1084
+ if (pointCount < 2) {
1085
+ throw new Error("pointCount must be larger than one; is " + pointCount + ".");
1086
+ }
1087
+
1088
+ const result: Array<Vertex> = [];
1089
+ if (this.bezierCurves.length === 0) {
1090
+ return result;
1091
+ }
1092
+
1093
+ // Fetch and add the start point from the source polygon
1094
+ var polygonPoint = new Vertex(this.bezierCurves[0].startPoint);
1095
+ result.push(polygonPoint);
1096
+ // if (this.bezierCurves.length === 1) {
1097
+ // return result;
1098
+ // }
1099
+
1100
+ const perimeter: number = this.totalArcLength;
1101
+ const stepSize: number = perimeter / (pointCount - 1);
1102
+ const n: number = this.bezierCurves.length;
1103
+
1104
+ let curveIndex: number = 0;
1105
+ let segmentLength: number = this.bezierCurves[0].arcLength;
1106
+ let curSegmentU: number = stepSize;
1107
+ let i: number = 1;
1108
+ while (i < pointCount && curveIndex < n) {
1109
+ // Check if next eq point is inside this segment
1110
+ if (curSegmentU < segmentLength) {
1111
+ var newPoint = this.bezierCurves[curveIndex].getPoint(curSegmentU);
1112
+ result.push(newPoint);
1113
+ curSegmentU += stepSize;
1114
+ i++;
1115
+ } else {
1116
+ curveIndex++;
1117
+ curSegmentU = curSegmentU - segmentLength;
1118
+ segmentLength = curveIndex < n ? this.bezierCurves[curveIndex].arcLength : 0;
1119
+ }
1120
+ }
1121
+
1122
+ result.push(new Vertex(this.bezierCurves[n - 1].endPoint));
1123
+ return result;
1124
+ }
1125
+
1057
1126
  /**
1058
1127
  * Clone this BezierPath (deep clone).
1059
1128
  *
@@ -1096,28 +1165,15 @@ export class BezierPath implements SVGSerializable {
1096
1165
  }
1097
1166
 
1098
1167
  /**
1099
- * Create a <pre>&lt;path&gt;</pre> SVG representation of this bézier curve.
1100
- *
1101
- * @deprecated DEPRECATION Please use the drawutilssvg library and an XMLSerializer instead.
1102
- * @method toSVGString
1103
- * @param {object=} [options={}] - Like options.className
1104
- * @param {string=} [options.className] - The classname to use for the SVG item.
1105
- * @instance
1106
- * @memberof BezierPath
1107
- * @return {string} The SVG string.
1108
- **/
1109
- toSVGString(options: { className?: string }): string {
1110
- options = options || {};
1111
- var buffer: Array<string> = [];
1112
- buffer.push("<path");
1113
- if (options.className) buffer.push(' class="' + options.className + '"');
1114
- buffer.push(' d="');
1115
- for (var c = 0; c < this.bezierCurves.length; c++) {
1116
- if (c > 0) buffer.push(" ");
1117
- buffer.push(this.bezierCurves[c].toSVGPathData());
1168
+ * This function should invalidate any installed listeners and invalidate this object.
1169
+ * After calling this function the object might not hold valid data any more and
1170
+ * should not be used.
1171
+ */
1172
+ destroy() {
1173
+ for (var i = 0; i < this.bezierCurves.length; i++) {
1174
+ this.bezierCurves[i].destroy();
1118
1175
  }
1119
- buffer.push('" />');
1120
- return buffer.join("");
1176
+ this.isDestroyed = true;
1121
1177
  }
1122
1178
 
1123
1179
  /**
package/src/ts/Bounds.ts CHANGED
@@ -5,7 +5,8 @@
5
5
  * @modified 2020-11-19 Set min, max, width and height to private.
6
6
  * @modified 2021-02-02 Added the `toPolygon` method.
7
7
  * @modified 2021-06-21 (mid-summer) Added `getCenter` method.
8
- * @version 1.3.0
8
+ * @modified 2022-02-01 Added the `toString` function.
9
+ * @version 1.4.0
9
10
  **/
10
11
 
11
12
  import { Polygon } from "./Polygon";
@@ -82,10 +83,33 @@ export class Bounds implements IBounds, XYDimension {
82
83
  );
83
84
  }
84
85
 
86
+ /**
87
+ * Get the center of this boinding box.
88
+ *
89
+ * @method getCenter
90
+ * @instance
91
+ * @memberof Bounds
92
+ * @returns {Vertex} The center of these bounds.
93
+ */
85
94
  getCenter(): Vertex {
86
95
  return new Vertex(this.min.x + (this.max.x - this.min.x) / 2.0, this.min.y + (this.max.y - this.min.y) / 2);
87
96
  }
88
97
 
98
+ /**
99
+ * Convert these bounds to a human readable form.
100
+ *
101
+ * Note: the returned format might change in the future, so please do not
102
+ * rely on the returned string format.
103
+ *
104
+ * @method toString
105
+ * @instance
106
+ * @memberof Bounds
107
+ * @returns {string} Get these bounds in a human readable form.
108
+ */
109
+ toString(): string {
110
+ return `{ min: ${this.min.toString()}, max : ${this.max.toString()}, width: ${this.width}, height : ${this.height} }`;
111
+ }
112
+
89
113
  /**
90
114
  * Compute the minimal bounding box for a given set of vertices.
91
115
  *