@design-core/core 0.0.6 → 50.1.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 (173) hide show
  1. package/.eslintrc.json +4 -0
  2. package/.github/workflows/DesignCoreQA.yml +3 -0
  3. package/TODO.md +49 -6
  4. package/core/core/core.js +0 -3
  5. package/core/designCore.js +1 -1
  6. package/core/dimensions/alignedDimension.js +12 -11
  7. package/core/dimensions/angularDimension.js +38 -37
  8. package/core/dimensions/{baseCircularDimension.js → circularDimensionBase.js} +22 -21
  9. package/core/dimensions/diametricDimension.js +14 -13
  10. package/core/dimensions/dimension.js +62 -55
  11. package/core/dimensions/{baseDimension.js → dimensionBase.js} +73 -107
  12. package/core/dimensions/{baseLinearDimension.js → linearDimensionBase.js} +15 -14
  13. package/core/dimensions/radialDimension.js +12 -11
  14. package/core/dimensions/rotatedDimension.js +20 -19
  15. package/core/entities/arc.js +123 -156
  16. package/core/entities/arctext.js +222 -184
  17. package/core/entities/circle.js +77 -99
  18. package/core/entities/entity.js +114 -93
  19. package/core/entities/hatch.js +346 -273
  20. package/core/entities/insert.js +68 -83
  21. package/core/entities/line.js +21 -142
  22. package/core/entities/lwpolyline.js +16 -11
  23. package/core/entities/point.js +19 -19
  24. package/core/entities/polyline.js +7 -7
  25. package/core/entities/{basePolyline.js → polylineBase.js} +47 -299
  26. package/core/entities/rectangle.js +3 -1
  27. package/core/entities/solid.js +6 -15
  28. package/core/entities/text.js +190 -201
  29. package/core/lib/auxiliary/rubberBand.js +32 -0
  30. package/core/lib/auxiliary/selectionWindow.js +63 -0
  31. package/core/lib/auxiliary/snapPoint.js +113 -0
  32. package/core/lib/auxiliary/trackingLine.js +76 -0
  33. package/core/lib/boundingBox.js +11 -11
  34. package/core/lib/canvas.js +232 -168
  35. package/core/lib/clipboard.js +9 -3
  36. package/core/lib/colour.js +16 -0
  37. package/core/lib/commandLine.js +1 -6
  38. package/core/lib/commandManager.js +18 -8
  39. package/core/lib/constants.js +28 -0
  40. package/core/lib/dxf/dxf.js +15 -14
  41. package/core/lib/dxf/dxfIterator.js +2 -2
  42. package/core/lib/entityManager.js +33 -26
  43. package/core/lib/inputManager.js +36 -12
  44. package/core/lib/intersect.js +25 -0
  45. package/core/lib/matrix.js +1 -1
  46. package/core/lib/patterns.js +9 -2
  47. package/core/lib/plotOptions.js +67 -0
  48. package/core/lib/polylineUtils.js +75 -0
  49. package/core/lib/renderers/cairoRenderer.js +371 -0
  50. package/core/lib/renderers/canvasRenderer.js +315 -0
  51. package/core/lib/renderers/pdfRenderer.js +366 -0
  52. package/core/lib/renderers/rendererBase.js +284 -0
  53. package/core/lib/renderers/svgRenderer.js +343 -0
  54. package/core/lib/scene.js +28 -6
  55. package/core/lib/selectionManager.js +20 -20
  56. package/core/lib/settings.js +4 -2
  57. package/core/lib/snapping.js +4 -191
  58. package/core/lib/stateManager.js +30 -1
  59. package/core/lib/utils.js +26 -7
  60. package/core/properties/entityProperties.js +104 -0
  61. package/core/properties/property.js +106 -2
  62. package/core/properties/propertyManager.js +60 -44
  63. package/core/tables/block.js +50 -81
  64. package/core/tables/dimStyle.js +5 -5
  65. package/core/tables/endblk.js +1 -1
  66. package/core/tables/layer.js +8 -0
  67. package/core/tables/ltypeManager.js +1 -1
  68. package/core/tables/styleManagerBase.js +3 -2
  69. package/core/tables/tableManagerBase.js +8 -3
  70. package/core/tables/vport.js +2 -2
  71. package/core/tools/chamfer.js +117 -143
  72. package/core/tools/chamferFilletBase.js +138 -37
  73. package/core/tools/copy.js +11 -11
  74. package/core/tools/copybase.js +3 -3
  75. package/core/tools/copyclip.js +3 -3
  76. package/core/tools/cornerEntity.js +2 -2
  77. package/core/tools/cutclip.js +3 -3
  78. package/core/tools/explode.js +7 -7
  79. package/core/tools/extend.js +138 -25
  80. package/core/tools/fillet.js +92 -189
  81. package/core/tools/matchProp.js +3 -12
  82. package/core/tools/mirror.js +15 -14
  83. package/core/tools/move.js +8 -8
  84. package/core/tools/offset.js +31 -33
  85. package/core/tools/pasteclip.js +1 -1
  86. package/core/tools/purge.js +10 -10
  87. package/core/tools/rotate.js +19 -16
  88. package/core/tools/scale.js +7 -7
  89. package/core/tools/trim.js +271 -29
  90. package/core/tools/zoom.js +1 -1
  91. package/cspell.json +321 -0
  92. package/jest.config.js +6 -0
  93. package/package.json +5 -3
  94. package/test/dimensions/alignedDimension.test.js +17 -10
  95. package/test/dimensions/angularDimension.test.js +13 -13
  96. package/test/dimensions/diametricDimension.test.js +15 -15
  97. package/test/dimensions/dimension.test.js +12 -12
  98. package/test/dimensions/{baseDimension.test.js → dimensionBase.test.js} +73 -12
  99. package/test/dimensions/linearDimensionBase.test.js +62 -0
  100. package/test/dimensions/radialDimension.test.js +15 -15
  101. package/test/dimensions/rotatedDimension.test.js +18 -11
  102. package/test/entities/arc.test.js +83 -86
  103. package/test/entities/arctext.test.js +184 -57
  104. package/test/entities/circle.test.js +68 -96
  105. package/test/entities/entity.test.js +42 -8
  106. package/test/entities/hatch.test.js +569 -96
  107. package/test/entities/insert.test.js +99 -4
  108. package/test/entities/line.test.js +15 -41
  109. package/test/entities/lwpolyline.test.js +104 -0
  110. package/test/entities/point.test.js +3 -3
  111. package/test/entities/polyline.test.js +11 -0
  112. package/test/entities/{basePolyline.test.js → polylineBase.test.js} +192 -57
  113. package/test/entities/rectangle.test.js +11 -0
  114. package/test/entities/solid.test.js +1 -1
  115. package/test/entities/text.test.js +302 -77
  116. package/test/integration/exportIntegration.reference.dxf +9 -9
  117. package/test/integration/exportIntegration.test.js +5 -5
  118. package/test/integration/intersectionIntegration.test.js +4 -5
  119. package/test/integration/pdfRendererIntegration.reference.pdf +17709 -0
  120. package/test/integration/pdfRendererIntegration.test.js +61 -0
  121. package/test/integration/svgRendererIntegration.reference.svg +3343 -0
  122. package/test/integration/svgRendererIntegration.test.js +61 -0
  123. package/test/integration/userInputIntegration.reference.dxf +1165 -105
  124. package/test/integration/userInputIntegration.test.js +239 -132
  125. package/test/lib/boundingBox.test.js +3 -3
  126. package/test/lib/canvas.test.js +744 -125
  127. package/test/lib/constants.test.js +27 -0
  128. package/test/lib/entityManager.test.js +4 -4
  129. package/test/lib/inputManager.test.js +81 -20
  130. package/test/lib/intersect.test.js +83 -0
  131. package/test/lib/plotOptions.test.js +179 -0
  132. package/test/lib/rubberBand.test.js +84 -0
  133. package/test/lib/scene.test.js +9 -9
  134. package/test/lib/selectionManager.test.js +3 -3
  135. package/test/lib/settings.test.js +5 -6
  136. package/test/lib/snapping.test.js +72 -130
  137. package/test/lib/stateManager.test.js +7 -7
  138. package/test/lib/utils.test.js +36 -2
  139. package/test/properties/entityProperties.test.js +132 -0
  140. package/test/properties/property.test.js +53 -0
  141. package/test/properties/propertyManager.test.js +25 -25
  142. package/test/renderers/canvasRenderer.test.js +317 -0
  143. package/test/renderers/pdfRenderer.test.js +271 -0
  144. package/test/renderers/rendererBase.test.js +213 -0
  145. package/test/renderers/svgRenderer.test.js +326 -0
  146. package/test/tables/block.test.js +92 -13
  147. package/test/tables/endblk.test.js +2 -2
  148. package/test/tables/layer.test.js +30 -0
  149. package/test/tables/layerManager.test.js +2 -2
  150. package/test/test-helpers/hatchGridRenderer.js +180 -0
  151. package/test/test-helpers/test-helpers.js +158 -6
  152. package/test/tools/chamfer.test.js +273 -51
  153. package/test/tools/chamferFilletBase.test.js +125 -36
  154. package/test/tools/copy.test.js +8 -8
  155. package/test/tools/copybase.test.js +2 -2
  156. package/test/tools/copyclip.test.js +2 -2
  157. package/test/tools/cornerEntity.test.js +8 -8
  158. package/test/tools/cutclip.test.js +2 -2
  159. package/test/tools/erase.test.js +6 -6
  160. package/test/tools/explode.test.js +5 -5
  161. package/test/tools/extend.test.js +373 -42
  162. package/test/tools/fillet.test.js +230 -49
  163. package/test/tools/matchProp.test.js +11 -11
  164. package/test/tools/mirror.test.js +39 -39
  165. package/test/tools/move.test.js +7 -7
  166. package/test/tools/offset.test.js +222 -55
  167. package/test/tools/pasteclip.test.js +5 -5
  168. package/test/tools/purge.test.js +4 -4
  169. package/test/tools/rotate.test.js +39 -9
  170. package/test/tools/scale.test.js +33 -33
  171. package/test/tools/trim.test.js +579 -53
  172. package/test/tools/zoom.test.js +12 -12
  173. package/core/lib/selectionWindow.js +0 -83
@@ -43,7 +43,7 @@ test.each(inputScenarios)('Scale.execute handles $desc', async (scenario) => {
43
43
  core.scene.clear();
44
44
  core.scene.selectionManager.reset();
45
45
 
46
- core.scene.addItem('Line', { points });
46
+ core.scene.addEntity('Line', { points });
47
47
  core.scene.selectionManager.addToSelectionSet(0);
48
48
 
49
49
  const origInputManager = core.scene.inputManager;
@@ -76,7 +76,7 @@ test('Scale.execute - cancel at base point does not scale', async () => {
76
76
  core.scene.clear();
77
77
  core.scene.selectionManager.reset();
78
78
 
79
- core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
79
+ core.scene.addEntity('Line', { points: [new Point(10, 0), new Point(20, 0)] });
80
80
  core.scene.selectionManager.addToSelectionSet(0);
81
81
 
82
82
  const origInputManager = core.scene.inputManager;
@@ -100,7 +100,7 @@ test('Scale.execute - cancel at factor prompt does not scale', async () => {
100
100
  core.scene.clear();
101
101
  core.scene.selectionManager.reset();
102
102
 
103
- core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
103
+ core.scene.addEntity('Line', { points: [new Point(10, 0), new Point(20, 0)] });
104
104
  core.scene.selectionManager.addToSelectionSet(0);
105
105
 
106
106
  const origInputManager = core.scene.inputManager;
@@ -130,8 +130,8 @@ test('Scale.execute - entity count unchanged after execute', async () => {
130
130
  core.scene.clear();
131
131
  core.scene.selectionManager.reset();
132
132
 
133
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
134
- core.scene.addItem('Circle', { points: [new Point(5, 0), new Point(10, 0)] });
133
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
134
+ core.scene.addEntity('Circle', { points: [new Point(5, 0), new Point(10, 0)] });
135
135
 
136
136
  const entityCount = core.scene.entities.count();
137
137
 
@@ -165,11 +165,11 @@ test('Test Scale.action - scale by factor 2 from origin', () => {
165
165
  core.scene.clear();
166
166
  core.scene.selectionManager.reset();
167
167
 
168
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
169
- core.scene.addItem('Circle', { points: [new Point(5, 0), new Point(10, 0)] });
170
- core.scene.addItem('Polyline', { points: [new Point(5, 0), new Point(10, 0)] });
171
- core.scene.addItem('Arc', { points: [new Point(5, 0), new Point(10, 0), new Point(5, 5)] });
172
- core.scene.addItem('Rectangle', { points: [new Point(5, 0), new Point(10, 0)] });
168
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
169
+ core.scene.addEntity('Circle', { points: [new Point(5, 0), new Point(10, 0)] });
170
+ core.scene.addEntity('Polyline', { points: [new Point(5, 0), new Point(10, 0)] });
171
+ core.scene.addEntity('Arc', { points: [new Point(5, 0), new Point(10, 0), new Point(5, 5)] });
172
+ core.scene.addEntity('Rectangle', { points: [new Point(5, 0), new Point(10, 0)] });
173
173
 
174
174
  for (let i = 0; i < core.scene.entities.count(); i++) {
175
175
  core.scene.selectionManager.addToSelectionSet(i);
@@ -193,7 +193,7 @@ test('Test Scale.action - scale by factor 0.5 from origin', () => {
193
193
  core.scene.clear();
194
194
  core.scene.selectionManager.reset();
195
195
 
196
- core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
196
+ core.scene.addEntity('Line', { points: [new Point(10, 0), new Point(20, 0)] });
197
197
 
198
198
  core.scene.selectionManager.addToSelectionSet(0);
199
199
 
@@ -214,7 +214,7 @@ test('Test Scale.action - scale from offset base point', () => {
214
214
  core.scene.clear();
215
215
  core.scene.selectionManager.reset();
216
216
 
217
- core.scene.addItem('Line', { points: [new Point(10, 10), new Point(20, 10)] });
217
+ core.scene.addEntity('Line', { points: [new Point(10, 10), new Point(20, 10)] });
218
218
 
219
219
  core.scene.selectionManager.addToSelectionSet(0);
220
220
 
@@ -236,8 +236,8 @@ test('Test Scale.action - entity count unchanged (in-place update)', () => {
236
236
  core.scene.clear();
237
237
  core.scene.selectionManager.reset();
238
238
 
239
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
240
- core.scene.addItem('Circle', { points: [new Point(5, 0), new Point(10, 0)] });
239
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
240
+ core.scene.addEntity('Circle', { points: [new Point(5, 0), new Point(10, 0)] });
241
241
 
242
242
  const entityCount = core.scene.entities.count();
243
243
 
@@ -259,7 +259,7 @@ test('Test Scale.action - scale factor 1 leaves points unchanged', () => {
259
259
  core.scene.clear();
260
260
  core.scene.selectionManager.reset();
261
261
 
262
- core.scene.addItem('Line', { points: [new Point(10, 20), new Point(30, 40)] });
262
+ core.scene.addEntity('Line', { points: [new Point(10, 20), new Point(30, 40)] });
263
263
 
264
264
  core.scene.selectionManager.addToSelectionSet(0);
265
265
 
@@ -280,7 +280,7 @@ test('Test Scale.action - scale 2D point (non-axis-aligned)', () => {
280
280
  core.scene.clear();
281
281
  core.scene.selectionManager.reset();
282
282
 
283
- core.scene.addItem('Line', { points: [new Point(5, 5), new Point(10, 10)] });
283
+ core.scene.addEntity('Line', { points: [new Point(5, 5), new Point(10, 10)] });
284
284
 
285
285
  core.scene.selectionManager.addToSelectionSet(0);
286
286
 
@@ -301,7 +301,7 @@ test('Test Scale.action - empty selection does not throw', () => {
301
301
  core.scene.clear();
302
302
  core.scene.selectionManager.reset();
303
303
 
304
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
304
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
305
305
  // deliberately do not add anything to the selection set
306
306
 
307
307
  const scale = new Scale();
@@ -361,7 +361,7 @@ test('Scale.execute - requests selection set when none pre-selected', async () =
361
361
  core.scene.clear();
362
362
  core.scene.selectionManager.reset();
363
363
 
364
- core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
364
+ core.scene.addEntity('Line', { points: [new Point(10, 0), new Point(20, 0)] });
365
365
  // Intentionally do NOT add to selection set — triggers the SELECTIONSET prompt
366
366
 
367
367
  const origInputManager = core.scene.inputManager;
@@ -396,7 +396,7 @@ test('Scale.execute - reference with zero length returns without scaling', async
396
396
  core.scene.clear();
397
397
  core.scene.selectionManager.reset();
398
398
 
399
- core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
399
+ core.scene.addEntity('Line', { points: [new Point(10, 0), new Point(20, 0)] });
400
400
  core.scene.selectionManager.addToSelectionSet(0);
401
401
 
402
402
  const origInputManager = core.scene.inputManager;
@@ -431,21 +431,21 @@ test('Scale.preview - no points set, adds no temp entities', () => {
431
431
  core.scene.clear();
432
432
  core.scene.selectionManager.reset();
433
433
 
434
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
434
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
435
435
  core.scene.selectionManager.addToSelectionSet(0);
436
436
 
437
437
  const scale = new Scale();
438
438
  // No points — guard condition prevents any work
439
439
  scale.preview();
440
440
 
441
- expect(core.scene.tempEntities.count()).toBe(0);
441
+ expect(core.scene.previewEntities.count()).toBe(0);
442
442
  });
443
443
 
444
444
  test('Scale.preview - referencePoint set, suppresses preview', () => {
445
445
  core.scene.clear();
446
446
  core.scene.selectionManager.reset();
447
447
 
448
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
448
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
449
449
  core.scene.selectionManager.addToSelectionSet(0);
450
450
 
451
451
  const scale = new Scale();
@@ -454,14 +454,14 @@ test('Scale.preview - referencePoint set, suppresses preview', () => {
454
454
 
455
455
  scale.preview();
456
456
 
457
- expect(core.scene.tempEntities.count()).toBe(0);
457
+ expect(core.scene.previewEntities.count()).toBe(0);
458
458
  });
459
459
 
460
460
  test('Scale.preview - mouse on base point (distance 0), draws line but skips scaling', () => {
461
461
  core.scene.clear();
462
462
  core.scene.selectionManager.reset();
463
463
 
464
- core.scene.addItem('Line', { points: [new Point(5, 0), new Point(10, 0)] });
464
+ core.scene.addEntity('Line', { points: [new Point(5, 0), new Point(10, 0)] });
465
465
  core.scene.selectionManager.addToSelectionSet(0);
466
466
 
467
467
  const scale = new Scale();
@@ -472,10 +472,10 @@ test('Scale.preview - mouse on base point (distance 0), draws line but skips sca
472
472
  scale.preview();
473
473
 
474
474
  // Temp line is still created
475
- expect(core.scene.tempEntities.count()).toBeGreaterThanOrEqual(1);
475
+ expect(core.scene.previewEntities.count()).toBeGreaterThanOrEqual(1);
476
476
 
477
477
  // Selected item points should be unchanged (scaling skipped)
478
- const previewItem = core.scene.selectionManager.selectedItems[0];
478
+ const previewItem = core.scene.selectionManager.selectedEntities[0];
479
479
  expect(previewItem.points[0].x).toBeCloseTo(5);
480
480
  });
481
481
 
@@ -483,7 +483,7 @@ test('Scale.preview - one point set, draws temp line and scales selected items',
483
483
  core.scene.clear();
484
484
  core.scene.selectionManager.reset();
485
485
 
486
- core.scene.addItem('Line', { points: [new Point(1, 0), new Point(2, 0)] });
486
+ core.scene.addEntity('Line', { points: [new Point(1, 0), new Point(2, 0)] });
487
487
  core.scene.selectionManager.addToSelectionSet(0);
488
488
 
489
489
  const scale = new Scale();
@@ -494,10 +494,10 @@ test('Scale.preview - one point set, draws temp line and scales selected items',
494
494
  scale.preview();
495
495
 
496
496
  // Temp line should be created
497
- expect(core.scene.tempEntities.count()).toBeGreaterThanOrEqual(1);
497
+ expect(core.scene.previewEntities.count()).toBeGreaterThanOrEqual(1);
498
498
 
499
499
  // Preview item should have been scaled (x differs from original 1.0)
500
- const previewItem = core.scene.selectionManager.selectedItems[0];
500
+ const previewItem = core.scene.selectionManager.selectedEntities[0];
501
501
  expect(previewItem.points[0].x).not.toBeCloseTo(1);
502
502
  });
503
503
 
@@ -506,7 +506,7 @@ test('Scale.preview - reference mode uses referenceLength to compute factor', ()
506
506
  core.scene.selectionManager.reset();
507
507
 
508
508
  // Line at x=10..20, y=0
509
- core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
509
+ core.scene.addEntity('Line', { points: [new Point(10, 0), new Point(20, 0)] });
510
510
  core.scene.selectionManager.addToSelectionSet(0);
511
511
 
512
512
  const scale = new Scale();
@@ -516,14 +516,14 @@ test('Scale.preview - reference mode uses referenceLength to compute factor', ()
516
516
 
517
517
  // The default mouse scene position will give some distance from (0,0).
518
518
  // We can't control the mouse, so just verify the factor applied is
519
- // distance/referenceLength rather than raw distance: reload the selectedItems
519
+ // distance/referenceLength rather than raw distance: reload the selectedEntities
520
520
  // before and after with a known referenceLength to confirm scaling occurred.
521
521
  scale.preview();
522
522
 
523
- expect(core.scene.tempEntities.count()).toBeGreaterThanOrEqual(1);
523
+ expect(core.scene.previewEntities.count()).toBeGreaterThanOrEqual(1);
524
524
 
525
525
  // The preview item's first point should differ from the original (10,0)
526
526
  // because the factor (distance/10) is applied
527
- const previewItem = core.scene.selectionManager.selectedItems[0];
527
+ const previewItem = core.scene.selectionManager.selectedEntities[0];
528
528
  expect(previewItem.points[0].x).not.toBeCloseTo(10);
529
529
  });