@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
@@ -0,0 +1,233 @@
1
+ import { Headers } from '../../core/lib/headers.js';
2
+ import { DXFFile } from '../../core/lib/dxf/dxfFile.js';
3
+ import { DesignCore } from '../../core/designCore.js';
4
+ import { Core } from '../../core/core/core.js';
5
+ import { jest } from '@jest/globals';
6
+
7
+ new Core();
8
+
9
+ // ─── Defaults ────────────────────────────────────────────────────────────────
10
+
11
+ test('Headers defaults', () => {
12
+ const h = new Headers();
13
+ expect(h.filletRadius).toBe(0);
14
+ expect(h.trimMode).toBe(true);
15
+ expect(h.textSize).toBe(2.5);
16
+ expect(h.chamferDistanceA).toBe(0);
17
+ expect(h.chamferDistanceB).toBe(0);
18
+ expect(h.chamferLength).toBe(0);
19
+ expect(h.chamferAngle).toBe(0);
20
+ expect(h.offsetDistance).toBe(0);
21
+ expect(h.dxfVersion).toBe('R2018');
22
+ });
23
+
24
+ // ─── filletRadius ─────────────────────────────────────────────────────────────
25
+
26
+ test('Headers.filletRadius accepts valid values', () => {
27
+ const h = new Headers();
28
+ h.filletRadius = 5;
29
+ expect(h.filletRadius).toBe(5);
30
+ h.filletRadius = 0;
31
+ expect(h.filletRadius).toBe(0);
32
+ h.filletRadius = '3.5'; // coerced from string
33
+ expect(h.filletRadius).toBe(3.5);
34
+ });
35
+
36
+ test('Headers.filletRadius throws on negative value', () => {
37
+ const h = new Headers();
38
+ expect(() => {
39
+ h.filletRadius = -1;
40
+ }).toThrow();
41
+ });
42
+
43
+ test('Headers.filletRadius throws on non-numeric value', () => {
44
+ const h = new Headers();
45
+ expect(() => {
46
+ h.filletRadius = 'abc';
47
+ }).toThrow();
48
+ });
49
+
50
+ // ─── trimMode ─────────────────────────────────────────────────────────────────
51
+
52
+ test('Headers.trimMode accepts true and false', () => {
53
+ const h = new Headers();
54
+ h.trimMode = false;
55
+ expect(h.trimMode).toBe(false);
56
+ h.trimMode = true;
57
+ expect(h.trimMode).toBe(true);
58
+ });
59
+
60
+ test('Headers.trimMode throws on non-boolean value', () => {
61
+ const h = new Headers();
62
+ expect(() => {
63
+ h.trimMode = 1;
64
+ }).toThrow();
65
+ expect(() => {
66
+ h.trimMode = 'true';
67
+ }).toThrow();
68
+ });
69
+
70
+ // ─── textSize ─────────────────────────────────────────────────────────────────
71
+
72
+ test('Headers.textSize accepts positive values', () => {
73
+ const h = new Headers();
74
+ h.textSize = 10;
75
+ expect(h.textSize).toBe(10);
76
+ h.textSize = '1.5';
77
+ expect(h.textSize).toBe(1.5);
78
+ });
79
+
80
+ test('Headers.textSize throws on zero or negative', () => {
81
+ const h = new Headers();
82
+ expect(() => {
83
+ h.textSize = 0;
84
+ }).toThrow();
85
+ expect(() => {
86
+ h.textSize = -1;
87
+ }).toThrow();
88
+ });
89
+
90
+ // ─── chamfer properties ───────────────────────────────────────────────────────
91
+
92
+ test('Headers chamfer properties accept valid values', () => {
93
+ const h = new Headers();
94
+ h.chamferDistanceA = 2;
95
+ expect(h.chamferDistanceA).toBe(2);
96
+ h.chamferDistanceB = 3;
97
+ expect(h.chamferDistanceB).toBe(3);
98
+ h.chamferLength = 4;
99
+ expect(h.chamferLength).toBe(4);
100
+ h.chamferAngle = 45;
101
+ expect(h.chamferAngle).toBe(45);
102
+ });
103
+
104
+ test('Headers chamfer properties throw on negative values', () => {
105
+ const h = new Headers();
106
+ expect(() => {
107
+ h.chamferDistanceA = -1;
108
+ }).toThrow();
109
+ expect(() => {
110
+ h.chamferDistanceB = -1;
111
+ }).toThrow();
112
+ expect(() => {
113
+ h.chamferLength = -1;
114
+ }).toThrow();
115
+ expect(() => {
116
+ h.chamferAngle = -1;
117
+ }).toThrow();
118
+ });
119
+
120
+ // ─── offsetDistance ────────────────────────────────────────────────────────────
121
+
122
+ test('Headers.offsetDistance accepts valid values', () => {
123
+ const h = new Headers();
124
+ h.offsetDistance = 5;
125
+ expect(h.offsetDistance).toBe(5);
126
+ h.offsetDistance = -1; // negative means Through mode
127
+ expect(h.offsetDistance).toBe(-1);
128
+ h.offsetDistance = '3.5';
129
+ expect(h.offsetDistance).toBe(3.5);
130
+ });
131
+
132
+ test('Headers.offsetDistance throws on non-numeric value', () => {
133
+ const h = new Headers();
134
+ expect(() => {
135
+ h.offsetDistance = 'abc';
136
+ }).toThrow();
137
+ });
138
+
139
+ // ─── dxfVersion ───────────────────────────────────────────────────────────────
140
+
141
+ test('Headers.dxfVersion accepts valid version keys', () => {
142
+ const h = new Headers();
143
+ h.dxfVersion = 'R12';
144
+ expect(h.dxfVersion).toBe('R12');
145
+ h.dxfVersion = 'R2000';
146
+ expect(h.dxfVersion).toBe('R2000');
147
+ });
148
+
149
+ test('Headers.dxfVersion accepts DXF version strings and normalises to key', () => {
150
+ const h = new Headers();
151
+ h.dxfVersion = 'AC1009'; // DXF version string for R12
152
+ expect(h.dxfVersion).toBe('R12');
153
+ });
154
+
155
+ test('Headers.dxfVersion throws on invalid version', () => {
156
+ const h = new Headers();
157
+ expect(() => {
158
+ h.dxfVersion = 'R99';
159
+ }).toThrow();
160
+ expect(() => {
161
+ h.dxfVersion = 'BADINPUT';
162
+ }).toThrow();
163
+ });
164
+
165
+ // ─── load() ───────────────────────────────────────────────────────────────────
166
+
167
+ test('Headers.load updates values from parsed DXF header object', () => {
168
+ const h = new Headers();
169
+ h.load({
170
+ $FILLETRAD: { 40: '7' },
171
+ $TEXTSIZE: { 40: '4' },
172
+ $CHAMFERA: { 40: '1' },
173
+ $CHAMFERB: { 40: '2' },
174
+ $CHAMFERC: { 40: '3' },
175
+ $CHAMFERD: { 40: '45' },
176
+ $ACADVER: { 1: 'AC1009' },
177
+ });
178
+ expect(h.filletRadius).toBe(7);
179
+ expect(h.textSize).toBe(4);
180
+ expect(h.chamferDistanceA).toBe(1);
181
+ expect(h.chamferDistanceB).toBe(2);
182
+ expect(h.chamferLength).toBe(3);
183
+ expect(h.chamferAngle).toBe(45);
184
+ expect(h.dxfVersion).toBe('R12');
185
+ });
186
+
187
+ test('Headers.load preserves defaults when header object is empty', () => {
188
+ const h = new Headers();
189
+ h.load({});
190
+ expect(h.filletRadius).toBe(0);
191
+ expect(h.trimMode).toBe(true);
192
+ expect(h.textSize).toBe(2.5);
193
+ expect(h.dxfVersion).toBe('R2018');
194
+ });
195
+
196
+ test('Headers.load preserves defaults when called with undefined', () => {
197
+ const h = new Headers();
198
+ h.load(undefined);
199
+ expect(h.filletRadius).toBe(0);
200
+ expect(h.trimMode).toBe(true);
201
+ });
202
+
203
+ // ─── dxf() ────────────────────────────────────────────────────────────────────
204
+
205
+ test('Headers.dxf writes all expected header variables', () => {
206
+ const h = new Headers();
207
+ h.filletRadius = 3;
208
+ h.trimMode = false;
209
+ h.textSize = 5;
210
+ h.dxfVersion = 'R12';
211
+
212
+ DesignCore.Core.styleManager = { getCstyle: jest.fn(() => 'Standard') };
213
+ DesignCore.Core.layerManager = { getCstyle: jest.fn(() => 'Layer0') };
214
+ DesignCore.Core.dimStyleManager = { getCstyle: jest.fn(() => 'ISO-25') };
215
+ DesignCore.Core.handleManager = { handseed: '1' };
216
+
217
+ const file = new DXFFile('R12');
218
+ h.dxf(file);
219
+
220
+ expect(file.contents).toContain('9\n$ACADVER\n');
221
+ expect(file.contents).toContain('9\n$FILLETRAD\n');
222
+ expect(file.contents).toContain('40\n3\n');
223
+ expect(file.contents).toContain('9\n$TEXTSIZE\n');
224
+ expect(file.contents).toContain('40\n5\n');
225
+ expect(file.contents).toContain('9\n$CHAMFERA\n');
226
+ expect(file.contents).toContain('9\n$CHAMFERB\n');
227
+ expect(file.contents).toContain('9\n$CHAMFERC\n');
228
+ expect(file.contents).toContain('9\n$CHAMFERD\n');
229
+ // $TRIMMODE, $CHAMMODE, $OFFSETDIST are system variables not written to file by AutoCAD
230
+ expect(file.contents).not.toContain('9\n$TRIMMODE\n');
231
+ expect(file.contents).not.toContain('9\n$CHAMMODE\n');
232
+ expect(file.contents).not.toContain('9\n$OFFSETDIST\n');
233
+ });