@design-core/core 0.0.1 → 0.0.3

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 (254) hide show
  1. package/.eslintrc.json +14 -7
  2. package/.github/workflows/DesignCoreQA.yml +3 -1
  3. package/README.md +11 -4
  4. package/TODO.md +19 -0
  5. package/core/core/core.js +49 -42
  6. package/core/designCore.js +61 -2
  7. package/core/dimensions/alignedDimension.js +142 -0
  8. package/core/dimensions/angularDimension.js +550 -0
  9. package/core/dimensions/baseCircularDimension.js +244 -0
  10. package/core/dimensions/baseDimension.js +558 -0
  11. package/core/dimensions/baseLinearDimension.js +371 -0
  12. package/core/dimensions/diametricDimension.js +82 -0
  13. package/core/dimensions/dimension.js +298 -0
  14. package/core/dimensions/linearDimension.js +29 -0
  15. package/core/dimensions/radialDimension.js +78 -0
  16. package/core/dimensions/rotatedDimension.js +167 -0
  17. package/core/entities/arc.js +314 -60
  18. package/core/entities/arctext.js +642 -0
  19. package/core/entities/basePolyline.js +553 -94
  20. package/core/entities/circle.js +181 -54
  21. package/core/entities/entity.js +154 -74
  22. package/core/entities/hatch.js +807 -0
  23. package/core/entities/insert.js +200 -39
  24. package/core/entities/line.js +196 -134
  25. package/core/entities/lwpolyline.js +21 -44
  26. package/core/entities/point.js +194 -29
  27. package/core/entities/polyline.js +54 -7
  28. package/core/entities/rectangle.js +43 -13
  29. package/core/entities/solid.js +43 -6
  30. package/core/entities/text.js +324 -181
  31. package/core/lib/boundingBox.js +73 -13
  32. package/core/lib/canvas.js +256 -65
  33. package/core/lib/clipboard.js +198 -0
  34. package/core/lib/colour.js +144 -0
  35. package/core/lib/colours.js +367 -301
  36. package/core/lib/commandLine.js +16 -28
  37. package/core/lib/commandManager.js +115 -58
  38. package/core/lib/constants.js +23 -0
  39. package/core/lib/dxf/dxf.js +249 -34
  40. package/core/lib/dxf/dxfFile.js +23 -38
  41. package/core/lib/dxf/dxfIterator.js +17 -5
  42. package/core/lib/dxf/dxfRead.js +23 -7
  43. package/core/lib/dxf/dxfWrite.js +39 -129
  44. package/core/lib/dxf/handleManager.js +97 -0
  45. package/core/lib/dxf/sections/blocks.js +16 -2
  46. package/core/lib/dxf/sections/entities.js +17 -3
  47. package/core/lib/dxf/sections/header.js +10 -1
  48. package/core/lib/dxf/sections/objects.js +36 -0
  49. package/core/lib/dxf/sections/section.js +43 -5
  50. package/core/lib/dxf/sections/tables.js +17 -3
  51. package/core/lib/entityManager.js +178 -0
  52. package/core/lib/fileio.js +14 -4
  53. package/core/lib/headers.js +229 -0
  54. package/core/lib/input.js +46 -0
  55. package/core/lib/inputManager.js +199 -194
  56. package/core/lib/intersect.js +341 -468
  57. package/core/lib/logging.js +25 -1
  58. package/core/lib/matrix.js +6 -8
  59. package/core/lib/mouse.js +24 -79
  60. package/core/lib/patterns.js +690 -0
  61. package/core/lib/promptOptions.js +133 -0
  62. package/core/lib/scene.js +71 -174
  63. package/core/lib/selectionManager.js +74 -48
  64. package/core/lib/selectionWindow.js +24 -10
  65. package/core/lib/settings.js +18 -11
  66. package/core/lib/snapping.js +129 -21
  67. package/core/lib/stateManager.js +288 -0
  68. package/core/lib/strings.js +57 -5
  69. package/core/lib/utils.js +95 -11
  70. package/core/objects/dictionary.js +43 -0
  71. package/core/objects/dictionaryManager.js +80 -0
  72. package/core/properties/dimType.js +117 -0
  73. package/core/properties/flags.js +66 -0
  74. package/core/properties/property.js +26 -0
  75. package/core/properties/propertyManager.js +65 -19
  76. package/core/tables/appId.js +31 -0
  77. package/core/tables/appIdManager.js +44 -0
  78. package/core/tables/block.js +323 -0
  79. package/core/tables/blockManager.js +48 -0
  80. package/core/tables/blockRecord.js +29 -0
  81. package/core/tables/blockRecordManager.js +37 -0
  82. package/core/tables/dimStyle.js +627 -0
  83. package/core/tables/dimStyleManager.js +187 -0
  84. package/core/tables/endblk.js +28 -0
  85. package/core/tables/layer.js +219 -0
  86. package/core/tables/layerManager.js +47 -0
  87. package/core/tables/ltype.js +85 -0
  88. package/core/tables/ltypeManager.js +65 -0
  89. package/core/tables/style.js +145 -0
  90. package/core/tables/styleManager.js +55 -0
  91. package/core/tables/styleManagerBase.js +110 -0
  92. package/core/tables/tableManagerBase.js +354 -0
  93. package/core/tables/ucs.js +28 -0
  94. package/core/tables/ucsManager.js +44 -0
  95. package/core/tables/view.js +28 -0
  96. package/core/tables/viewManager.js +44 -0
  97. package/core/tables/vport.js +70 -0
  98. package/core/tables/vportManager.js +65 -0
  99. package/core/tools/chamfer.js +343 -0
  100. package/core/tools/chamferFilletBase.js +162 -0
  101. package/core/tools/copy.js +68 -40
  102. package/core/tools/copybase.js +65 -0
  103. package/core/tools/copyclip.js +59 -0
  104. package/core/tools/cornerEntity.js +138 -0
  105. package/core/tools/cutclip.js +72 -0
  106. package/core/tools/distance.js +37 -9
  107. package/core/tools/erase.js +43 -13
  108. package/core/tools/explode.js +117 -0
  109. package/core/tools/extend.js +71 -32
  110. package/core/tools/fillet.js +336 -0
  111. package/core/tools/identify.js +33 -6
  112. package/core/tools/matchProp.js +106 -0
  113. package/core/tools/mirror.js +141 -0
  114. package/core/tools/move.js +65 -32
  115. package/core/tools/offset.js +321 -0
  116. package/core/tools/pan.js +54 -0
  117. package/core/tools/pasteclip.js +93 -0
  118. package/core/tools/purge.js +90 -0
  119. package/core/tools/rotate.js +105 -70
  120. package/core/tools/scale.js +166 -0
  121. package/core/tools/tool.js +14 -4
  122. package/core/tools/trim.js +71 -32
  123. package/core/tools/zoom.js +152 -0
  124. package/package.json +3 -305
  125. package/test/dimensions/alignedDimension.test.js +211 -0
  126. package/test/dimensions/angularDimension.test.js +243 -0
  127. package/test/dimensions/baseDimension.test.js +239 -0
  128. package/test/dimensions/diametricDimension.test.js +203 -0
  129. package/test/dimensions/dimension.test.js +102 -0
  130. package/test/dimensions/radialDimension.test.js +203 -0
  131. package/test/dimensions/rotatedDimension.test.js +224 -0
  132. package/test/entities/arc.test.js +463 -41
  133. package/test/entities/arctext.test.js +329 -0
  134. package/test/entities/basePolyline.test.js +459 -10
  135. package/test/entities/circle.test.js +312 -7
  136. package/test/entities/entity.test.js +28 -9
  137. package/test/entities/hatch.test.js +606 -0
  138. package/test/entities/insert.test.js +90 -0
  139. package/test/entities/line.test.js +182 -6
  140. package/test/entities/point.test.js +375 -37
  141. package/test/entities/solid.test.js +156 -0
  142. package/test/entities/text.test.js +533 -7
  143. package/test/integration/exportIntegration.reference.dxf +1706 -0
  144. package/test/integration/exportIntegration.test.js +186 -0
  145. package/test/integration/importExportIntegration.test.js +126 -0
  146. package/test/integration/intersectionIntegration.test.js +880 -0
  147. package/test/integration/userInputIntegration.reference.dxf +1410 -0
  148. package/test/integration/userInputIntegration.test.js +269 -0
  149. package/test/lib/boundingBox.test.js +26 -2
  150. package/test/lib/canvas.test.js +613 -5
  151. package/test/lib/clipboard.test.js +70 -0
  152. package/test/lib/colour.test.js +114 -0
  153. package/test/lib/colours.test.js +63 -18
  154. package/test/lib/commandLine.test.js +159 -22
  155. package/test/lib/commandManager.test.js +4 -4
  156. package/test/lib/constants.test.js +9 -0
  157. package/test/lib/dxf/dxfFile.test.js +6 -2
  158. package/test/lib/dxf/dxfIterator.test.js +1 -1
  159. package/test/lib/dxf/dxfWrite.test.js +173 -0
  160. package/test/lib/dxf/handleManager.test.js +137 -0
  161. package/test/lib/dxf/sections/blocks.test.js +5 -5
  162. package/test/lib/dxf/sections/entities.test.js +4 -4
  163. package/test/lib/dxf/sections/header.test.js +18 -4
  164. package/test/lib/dxf/sections/objects.test.js +132 -0
  165. package/test/lib/dxf/sections/section.test.js +29 -29
  166. package/test/lib/dxf/sections/tables.test.js +3 -3
  167. package/test/lib/entityManager.test.js +163 -0
  168. package/test/lib/headers.test.js +233 -0
  169. package/test/lib/inputManager.test.js +1144 -5
  170. package/test/lib/intersect.test.js +454 -331
  171. package/test/lib/logging.test.js +1 -1
  172. package/test/lib/matrix.test.js +1 -1
  173. package/test/lib/mouse.test.js +327 -4
  174. package/test/lib/patterns.test.js +105 -0
  175. package/test/lib/promptOptions.test.js +179 -0
  176. package/test/lib/scene.test.js +16 -52
  177. package/test/lib/selectionManager.test.js +17 -5
  178. package/test/lib/settings.test.js +111 -5
  179. package/test/lib/snapping.test.js +142 -4
  180. package/test/lib/stateManager.test.js +155 -0
  181. package/test/lib/utils.test.js +81 -1
  182. package/test/objects/dictionary.test.js +81 -0
  183. package/test/objects/dictionaryManager.test.js +34 -0
  184. package/test/properties/dimType.test.js +62 -0
  185. package/test/properties/flags.test.js +164 -0
  186. package/test/properties/property.test.js +13 -0
  187. package/test/properties/propertyManager.test.js +10 -11
  188. package/test/tables/appId.test.js +46 -0
  189. package/test/tables/appIdManager.test.js +72 -0
  190. package/test/tables/block.test.js +157 -0
  191. package/test/tables/blockManager.test.js +52 -0
  192. package/test/tables/blockRecord.test.js +39 -0
  193. package/test/tables/blockRecordManager.test.js +60 -0
  194. package/test/tables/dimstyle.test.js +72 -0
  195. package/test/tables/endblk.test.js +30 -0
  196. package/test/tables/layer.test.js +95 -0
  197. package/test/tables/layerManager.test.js +172 -0
  198. package/test/{styles → tables}/ltype.test.js +7 -7
  199. package/test/{styles → tables}/ltypeManager.test.js +2 -2
  200. package/test/tables/style.test.js +44 -0
  201. package/test/tables/stylemanagerbase.test.js +220 -0
  202. package/test/tables/tableManagerBase.test.js +194 -0
  203. package/test/tables/ucs.test.js +37 -0
  204. package/test/tables/ucsManager.test.js +48 -0
  205. package/test/tables/view.test.js +37 -0
  206. package/test/tables/viewManager.test.js +48 -0
  207. package/test/tables/vport.test.js +117 -0
  208. package/test/tables/vportManager.test.js +54 -0
  209. package/test/test-helpers/test-helpers.js +66 -0
  210. package/test/tools/chamfer.test.js +970 -0
  211. package/test/tools/chamferFilletBase.test.js +446 -0
  212. package/test/tools/copy.test.js +22 -14
  213. package/test/tools/copybase.test.js +93 -0
  214. package/test/tools/copyclip.test.js +92 -0
  215. package/test/tools/cornerEntity.test.js +201 -0
  216. package/test/tools/cutclip.test.js +94 -0
  217. package/test/tools/distance.test.js +140 -18
  218. package/test/tools/erase.test.js +12 -12
  219. package/test/tools/explode.test.js +45 -0
  220. package/test/tools/extend.test.js +326 -44
  221. package/test/tools/fillet.test.js +831 -0
  222. package/test/tools/identify.test.js +115 -16
  223. package/test/tools/matchProp.test.js +84 -0
  224. package/test/tools/mirror.test.js +475 -0
  225. package/test/tools/move.test.js +75 -19
  226. package/test/tools/offset.test.js +748 -0
  227. package/test/tools/pan.test.js +72 -0
  228. package/test/tools/pasteclip.test.js +100 -0
  229. package/test/tools/purge.test.js +89 -0
  230. package/test/tools/rotate.test.js +89 -23
  231. package/test/tools/scale.test.js +529 -0
  232. package/test/tools/trim.test.js +419 -84
  233. package/test/tools/zoom.test.js +504 -0
  234. package/core/entities/alignedDimension.js +0 -279
  235. package/core/entities/angularDimension.js +0 -194
  236. package/core/entities/baseDimension.js +0 -227
  237. package/core/entities/block.js +0 -247
  238. package/core/entities/diametricDimension.js +0 -133
  239. package/core/entities/dimension.js +0 -202
  240. package/core/entities/radialDimension.js +0 -126
  241. package/core/styles/dimStyle.js +0 -719
  242. package/core/styles/dimStyleManager.js +0 -47
  243. package/core/styles/layer.js +0 -133
  244. package/core/styles/layerManager.js +0 -40
  245. package/core/styles/ltype.js +0 -86
  246. package/core/styles/ltypeManager.js +0 -50
  247. package/core/styles/style.js +0 -158
  248. package/core/styles/styleManager.js +0 -43
  249. package/core/styles/styleManagerBase.js +0 -299
  250. package/test/entities/block.test.js +0 -22
  251. package/test/styles/dimstyle.test.js +0 -19
  252. package/test/styles/layerManager.test.js +0 -150
  253. package/test/styles/style.test.js +0 -33
  254. package/test/styles/stylemanagerbase.test.js +0 -219
@@ -1,28 +1,47 @@
1
- import {Strings} from '../lib/strings.js';
2
- import {Tool} from './tool.js';
3
- import {Input, PromptOptions} from '../lib/inputManager.js';
4
- import {Logging} from '../lib/logging.js';
1
+ import { Strings } from '../lib/strings.js';
2
+ import { Utils } from '../lib/utils.js';
3
+ import { Tool } from './tool.js';
4
+ import { Input, PromptOptions } from '../lib/inputManager.js';
5
+ import { Logging } from '../lib/logging.js';
5
6
 
6
- import {DesignCore} from '../designCore.js';
7
+ import { DesignCore } from '../designCore.js';
7
8
 
9
+ /**
10
+ * Distance Command Class
11
+ * @extends Tool
12
+ */
8
13
  export class Distance extends Tool {
14
+ /** Create a Distance command */
9
15
  constructor() {
10
16
  super();
11
17
  }
12
18
 
19
+ /**
20
+ * Register the command
21
+ * @return {Object}
22
+ * command = name of the command
23
+ * shortcut = shortcut for the command
24
+ * type = type to group command in toolbars (omitted if not shown)
25
+ */
13
26
  static register() {
14
- const command = {command: 'Distance', shortcut: 'DI'}; // , type: 'Tool'};
27
+ const command = { command: 'Distance', shortcut: 'DI' }; // , type: 'Tool'};
15
28
  return command;
16
29
  }
17
30
 
31
+ /**
32
+ * Execute method
33
+ * executes the workflow, requesting input required to perform the command
34
+ */
18
35
  async execute() {
19
36
  try {
20
37
  const op = new PromptOptions(Strings.Input.START, [Input.Type.POINT]);
21
38
  const pt1 = await DesignCore.Scene.inputManager.requestInput(op);
39
+ if (pt1 === undefined) return;
22
40
  this.points.push(pt1);
23
41
 
24
42
  const op2 = new PromptOptions(Strings.Input.END, [Input.Type.POINT]);
25
43
  const pt2 = await DesignCore.Scene.inputManager.requestInput(op2);
44
+ if (pt2 === undefined) return;
26
45
  this.points.push(pt2);
27
46
 
28
47
  DesignCore.Scene.inputManager.executeCommand();
@@ -31,15 +50,24 @@ export class Distance extends Tool {
31
50
  }
32
51
  }
33
52
 
53
+ /**
54
+ * Preview the command during execution
55
+ */
34
56
  preview() {
35
57
  // TODO: Draw a preview of the measurement
36
58
  }
37
59
 
60
+ /**
61
+ * Perform the command
62
+ */
38
63
  action() {
64
+ const dx = this.points[1].x - this.points[0].x;
65
+ const dy = this.points[1].y - this.points[0].y;
39
66
  const length = this.points[0].distance(this.points[1]).toFixed(1);
40
- const x = (this.points[1].x - this.points[0].x).toFixed(1);
41
- const y = (this.points[1].y - this.points[0].y).toFixed(1);
42
- const di = (`${Strings.Strings.LENGTH}: ${length} ΔX: ${x} ΔY: ${y}`);
67
+ const angle = Utils.radians2degrees(this.points[0].angle(this.points[1])).toFixed(1);
68
+ const x = dx.toFixed(1);
69
+ const y = dy.toFixed(1);
70
+ const di = (`${Strings.Strings.LENGTH}: ${length} Angle: ${angle}${Strings.Symbol.DEGREE} ${Strings.Symbol.DELTA}X: ${x} ${Strings.Symbol.DELTA}Y: ${y}`);
43
71
  DesignCore.Core.notify(di);
44
72
  }
45
73
  }
@@ -1,44 +1,74 @@
1
- import {Strings} from '../lib/strings.js';
2
- import {Tool} from './tool.js';
3
- import {Input, PromptOptions} from '../lib/inputManager.js';
4
- import {Logging} from '../lib/logging.js';
1
+ import { Strings } from '../lib/strings.js';
2
+ import { Tool } from './tool.js';
3
+ import { Input, PromptOptions } from '../lib/inputManager.js';
4
+ import { Logging } from '../lib/logging.js';
5
+ import { RemoveState } from '../lib/stateManager.js';
5
6
 
6
- import {DesignCore} from '../designCore.js';
7
+ import { DesignCore } from '../designCore.js';
7
8
 
9
+ /**
10
+ * Erase Command Class
11
+ * @extends Tool
12
+ */
8
13
  export class Erase extends Tool {
14
+ /** Create an Erase command */
9
15
  constructor() {
10
16
  super();
11
17
  }
12
18
 
19
+ /**
20
+ * Register the command
21
+ * @return {Object}
22
+ * command = name of the command
23
+ * shortcut = shortcut for the command
24
+ * type = type to group command in toolbars (omitted if not shown)
25
+ */
13
26
  static register() {
14
- const command = {command: 'Erase', shortcut: 'E', type: 'Tool'};
27
+ const command = { command: 'Erase', shortcut: 'E', type: 'Tool' };
15
28
  return command;
16
29
  }
17
30
 
31
+ /**
32
+ * Execute method
33
+ * executes the workflow, requesting input required to perform the command
34
+ */
18
35
  async execute() {
19
36
  try {
20
37
  const op = new PromptOptions(Strings.Input.SELECTIONSET, [Input.Type.SELECTIONSET]);
21
38
 
22
39
  if (!DesignCore.Scene.selectionManager.selectionSet.selectionSet.length) {
23
- await DesignCore.Scene.inputManager.requestInput(op);
40
+ const result = await DesignCore.Scene.inputManager.requestInput(op);
41
+ if (result === undefined) return;
24
42
  }
25
43
 
26
44
  DesignCore.Scene.inputManager.executeCommand();
27
- } catch (error) {
45
+ } catch (err) {
28
46
  Logging.instance.error(`${this.type} - ${err}`);
29
47
  }
30
48
  }
31
49
 
50
+ /**
51
+ * Preview the command during execution
52
+ */
53
+ preview() {
54
+ // No Preview
55
+ }
56
+
57
+ /**
58
+ * Perform the command
59
+ */
32
60
  action() {
33
61
  // get a copy of the selection set
34
62
  const selections = DesignCore.Scene.selectionManager.selectionSet.selectionSet.slice();
35
- // sort the selection in descending order
36
- selections.sort((a, b)=>b-a);
37
63
 
38
- // delete each of the selections from the scene items
39
- // This is done in descending order to preserve the indices i.e if index 1 is deleted, index 2 becomes index 1
64
+ const stateChanges = [];
65
+
40
66
  for (let i = 0; i < selections.length; i++) {
41
- DesignCore.Scene.items.splice((selections[i]), 1);
67
+ const stateChange = new RemoveState(DesignCore.Scene.entities.get(selections[i]));
68
+ stateChanges.push(stateChange);
42
69
  }
70
+
71
+ // delete each of the selections from the scene items
72
+ DesignCore.Scene.commit(stateChanges);
43
73
  }
44
74
  }
@@ -0,0 +1,117 @@
1
+ import { Utils } from '../lib/utils.js';
2
+ import { Strings } from '../lib/strings.js';
3
+ import { Tool } from './tool.js';
4
+ import { Input, PromptOptions } from '../lib/inputManager.js';
5
+ import { Logging } from '../lib/logging.js';
6
+ import { Insert } from '../entities/insert.js';
7
+ import { Point } from '../entities/point.js';
8
+ import { AddState, RemoveState } from '../lib/stateManager.js';
9
+
10
+ import { DesignCore } from '../designCore.js';
11
+
12
+ /**
13
+ * Explode Command Class
14
+ * @extends Tool
15
+ */
16
+ export class Explode extends Tool {
17
+ /** Create an Explode command */
18
+ constructor() {
19
+ super();
20
+ }
21
+
22
+ /**
23
+ * Register the command
24
+ * @return {Object}
25
+ * command = name of the command
26
+ * shortcut = shortcut for the command
27
+ * type = type to group command in toolbars (omitted if not shown)
28
+ */
29
+ static register() {
30
+ const command = { command: 'Explode', shortcut: 'X' };
31
+ return command;
32
+ }
33
+
34
+ /**
35
+ * Execute method
36
+ * executes the workflow, requesting input required to perform the command
37
+ */
38
+ async execute() {
39
+ try {
40
+ const op = new PromptOptions(Strings.Input.SELECTIONSET, [Input.Type.SELECTIONSET]);
41
+
42
+ if (!DesignCore.Scene.selectionManager.selectionSet.selectionSet.length) {
43
+ const result = await DesignCore.Scene.inputManager.requestInput(op);
44
+ if (result === undefined) return;
45
+ }
46
+
47
+ DesignCore.Scene.inputManager.executeCommand();
48
+ } catch (err) {
49
+ Logging.instance.error(`${this.type} - ${err}`);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Preview the command during execution
55
+ */
56
+ preview() {
57
+ // No Preview
58
+ }
59
+
60
+ /**
61
+ * Perform the command
62
+ */
63
+ action() {
64
+ // count how many items couldn't be exploded
65
+ let counter = 0;
66
+ // get a copy of the selection set
67
+ const selections = DesignCore.Scene.selectionManager.selectionSet.selectionSet.slice();
68
+ // sort the selection in descending order
69
+ selections.sort((a, b) => b - a);
70
+
71
+ const stateChanges = [];
72
+
73
+ for (let i = 0; i < selections.length; i++) {
74
+ const insert = DesignCore.Scene.entities.get(selections[i]);
75
+
76
+ // check the selected item in an insert
77
+ if (!(insert instanceof Insert)) {
78
+ counter++;
79
+ continue;
80
+ }
81
+
82
+ // check the insert has a block and
83
+ // check the block has items
84
+ if (insert.block === undefined || insert.block.items.length == 0) {
85
+ counter++;
86
+ continue;
87
+ }
88
+
89
+ const insertPoint = insert.points[0];
90
+ const block = insert.block;
91
+ const blockItems = block.items;
92
+
93
+ const rotation = Utils.degrees2radians(insert.rotation);
94
+ const origin = new Point(0, 0);
95
+
96
+ blockItems.forEach((blockItem) => {
97
+ const copyofitem = Utils.cloneObject(blockItem);
98
+ const points = copyofitem.points.map((p) => new Point(p.x, p.y, p.bulge, p.sequence).rotate(origin, rotation).add(insertPoint));
99
+ copyofitem.setProperty('points', points);
100
+ const stateChange = new AddState(copyofitem);
101
+ stateChanges.push(stateChange);
102
+ });
103
+
104
+ const stateChangeRemove = new RemoveState(insert);
105
+ stateChanges.push(stateChangeRemove);
106
+ }
107
+
108
+
109
+ // add the exploded items to the scene
110
+ DesignCore.Scene.commit(stateChanges);
111
+
112
+
113
+ if (counter) {
114
+ DesignCore.Core.notify(`${this.type} - ${counter} ${Strings.Strings.ITEMS} ${Strings.Message.CANNOTBEACTIONED}`);
115
+ }
116
+ };
117
+ }
@@ -1,72 +1,111 @@
1
- import {Intersection} from '../lib/intersect.js';
2
- import {Strings} from '../lib/strings.js';
3
- import {Tool} from './tool.js';
4
- import {Input, PromptOptions} from '../lib/inputManager.js';
5
- import {Logging} from '../lib/logging.js';
1
+ import { Intersection } from '../lib/intersect.js';
2
+ import { Strings } from '../lib/strings.js';
3
+ import { Tool } from './tool.js';
4
+ import { Input, PromptOptions } from '../lib/inputManager.js';
5
+ import { Logging } from '../lib/logging.js';
6
6
 
7
- import {DesignCore} from '../designCore.js';
7
+ import { DesignCore } from '../designCore.js';
8
8
 
9
+ /**
10
+ * Extend Command Class
11
+ * @extends Tool
12
+ */
9
13
  export class Extend extends Tool {
14
+ /** Create an Extend command */
10
15
  constructor() {
11
16
  super();
12
- this.selectedIndex;
17
+ this.selectedItem = null;
18
+ this.selectedBoundaryItems = [];
13
19
  }
14
20
 
21
+ /**
22
+ * Register the command
23
+ * @return {Object}
24
+ * command = name of the command
25
+ * shortcut = shortcut for the command
26
+ * type = type to group command in toolbars (omitted if not shown)
27
+ */
15
28
  static register() {
16
- const command = {command: 'Extend', shortcut: 'EX', type: 'Tool'};
29
+ const command = { command: 'Extend', shortcut: 'EX', type: 'Tool' };
17
30
  return command;
18
31
  }
19
32
 
33
+ /**
34
+ * Execute method
35
+ * executes the workflow, requesting input required to perform the command
36
+ */
20
37
  async execute() {
21
38
  try {
22
39
  const op = new PromptOptions(Strings.Input.BOUNDARY, [Input.Type.SELECTIONSET]);
23
40
 
24
41
  if (!DesignCore.Scene.selectionManager.selectionSet.selectionSet.length) {
25
- await DesignCore.Scene.inputManager.requestInput(op);
42
+ const boundary = await DesignCore.Scene.inputManager.requestInput(op);
43
+ if (boundary === undefined) return;
44
+ }
45
+
46
+ // add all selected items to boundary items
47
+ for (let i = 0; i < DesignCore.Scene.selectionManager.selectionSet.selectionSet.length; i++) {
48
+ const boundaryItem = DesignCore.Scene.entities.get(DesignCore.Scene.selectionManager.selectionSet.selectionSet[i]);
49
+ this.selectedBoundaryItems.push(boundaryItem);
26
50
  }
27
51
 
28
52
  const op2 = new PromptOptions(Strings.Input.SELECT, [Input.Type.SINGLESELECTION]);
29
53
  while (true) {
30
54
  const selection = await DesignCore.Scene.inputManager.requestInput(op2);
31
- this.selectedIndex = selection.selectedItemIndex;
55
+ if (selection === undefined) break;
56
+ this.selectedItem = DesignCore.Scene.entities.get(selection.selectedItemIndex);
57
+ DesignCore.Scene.selectionManager.removeLastSelection();
32
58
  DesignCore.Scene.inputManager.actionCommand();
33
59
  }
34
- } catch (error) {
60
+
61
+ DesignCore.Scene.inputManager.executeCommand();
62
+ } catch (err) {
35
63
  Logging.instance.error(`${this.type} - ${err}`);
36
64
  }
37
65
  }
38
66
 
39
- action() {
40
- const item = this.selectedIndex;
67
+ /**
68
+ * Preview the command during execution
69
+ */
70
+ preview() {
71
+ // No Preview
72
+ }
41
73
 
42
- if (item !== undefined) {
74
+ /**
75
+ * Perform the command
76
+ */
77
+ action() {
78
+ if (this.selectedItem && this.selectedBoundaryItems.length) {
43
79
  const intersectPoints = [];
44
- let extendItem;
45
80
 
46
- for (let i = 0; i <DesignCore.Scene.selectionManager.selectionSet.selectionSet.length; i++) {
47
- if (DesignCore.Scene.selectionManager.selectionSet.selectionSet[i] !== item) {
48
- const boundaryItem = DesignCore.Scene.items[DesignCore.Scene.selectionManager.selectionSet.selectionSet[i]];
49
- extendItem = DesignCore.Scene.items[item];
50
-
51
- const functionName = 'intersect' + boundaryItem.type + extendItem.type;
52
- const intersect = Intersection[functionName](boundaryItem.intersectPoints(), extendItem.intersectPoints(), true);
53
-
54
- if (intersect.points.length) {
55
- for (let point = 0; point < intersect.points.length; point++) {
56
- intersectPoints.push(intersect.points[point]);
81
+ for (const boundaryItem of this.selectedBoundaryItems) {
82
+ if (boundaryItem !== this.selectedItem) {
83
+ try {
84
+ const intersect = Intersection.intersectPolylinePolyline(boundaryItem.toPolylinePoints(), this.selectedItem.toPolylinePoints(), true);
85
+ if (intersect.points.length) {
86
+ for (let point = 0; point < intersect.points.length; point++) {
87
+ intersectPoints.push(intersect.points[point]);
88
+ }
57
89
  }
90
+ } catch {
91
+ Logging.instance.warn(`${this.constructor.name}: Error intersecting between ${boundaryItem.type} and ${this.selectedItem.type}`);
92
+ continue;
58
93
  }
59
94
  }
60
95
  }
61
96
 
62
- if (intersectPoints) {
63
- extendItem.extend(intersectPoints);
97
+ if (intersectPoints.length) {
98
+ const stateChanges = this.selectedItem.extend(intersectPoints);
99
+ if (stateChanges?.length) {
100
+ DesignCore.Scene.commit(stateChanges);
101
+ }
102
+ } else {
103
+ DesignCore.Core.notify(`${this.type} - ${this.selectedItem.type} ${Strings.Message.NOEXTEND}`);
64
104
  }
65
-
66
- // remove item from selection set and reset the selectedIndex
67
- DesignCore.Scene.selectionManager.removeFromSelectionSet(this.selectedIndex);
68
- this.selectedIndex = undefined;
69
105
  }
106
+
107
+ // reset selected item
108
+ this.selectedItem = null;
70
109
  }
71
110
  }
72
111