@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,9 +1,62 @@
1
- import {Line} from '../../core/entities/line.js';
2
- import {Point} from '../../core/entities/point.js';
1
+ import { Line } from '../../core/entities/line.js';
2
+ import { Point } from '../../core/entities/point.js';
3
+ import { Core } from '../../core/core/core.js';
4
+ import { DesignCore } from '../../core/designCore.js';
5
+ import { AddState, RemoveState } from '../../core/lib/stateManager.js';
6
+ import { File, withMockInput } from '../test-helpers/test-helpers.js';
3
7
 
4
- test('Test BasePolyline.closestPoint', () => {
8
+ // initialise core
9
+ new Core();
10
+
11
+ const inputScenarios = [
12
+ {
13
+ desc: 'horizontal line',
14
+ input1: new Point(0, 0),
15
+ input2: new Point(10, 0),
16
+ expectedLength: 10,
17
+ expectedMid: { x: 5, y: 0 },
18
+ },
19
+ {
20
+ desc: 'vertical line',
21
+ input1: new Point(0, 0),
22
+ input2: new Point(0, 10),
23
+ expectedLength: 10,
24
+ expectedMid: { x: 0, y: 5 },
25
+ },
26
+ {
27
+ desc: 'diagonal line',
28
+ input1: new Point(0, 0),
29
+ input2: new Point(3, 4),
30
+ expectedLength: 5,
31
+ expectedMid: { x: 1.5, y: 2 },
32
+ },
33
+ {
34
+ desc: 'same point',
35
+ input1: new Point(2, 2),
36
+ input2: new Point(2, 2),
37
+ expectedLength: 0,
38
+ expectedMid: { x: 2, y: 2 },
39
+ },
40
+ ];
41
+
42
+ test.each(inputScenarios)('Line.execute handles $desc', async ({ input1, input2, expectedLength, expectedMid }) => {
43
+ await withMockInput(DesignCore.Scene, [input1, input2], async () => {
44
+ const line = new Line({});
45
+ await line.execute();
46
+
47
+ expect(line.points.length).toBe(2);
48
+ expect(line.points[0]).toBe(input1);
49
+ expect(line.points[1]).toBe(input2);
50
+
51
+ expect(line.length()).toBeCloseTo(expectedLength);
52
+ expect(line.midPoint().x).toBeCloseTo(expectedMid.x);
53
+ expect(line.midPoint().y).toBeCloseTo(expectedMid.y);
54
+ });
55
+ });
56
+
57
+ test('Test Line.closestPoint', () => {
5
58
  const points = [new Point(100, 100), new Point(200, 100)];
6
- const line = new Line({points: points});
59
+ const line = new Line({ points: points });
7
60
  // line segment
8
61
  const point1 = new Point(150, 85);
9
62
  const closest1 = line.closestPoint(point1);
@@ -13,15 +66,138 @@ test('Test BasePolyline.closestPoint', () => {
13
66
  });
14
67
 
15
68
  test('Test Line.boundingBox', () => {
16
- let line = new Line({points: [new Point(101, 102), new Point(201, 202)]});
69
+ let line = new Line({ points: [new Point(101, 102), new Point(201, 202)] });
17
70
  expect(line.boundingBox().xMin).toBeCloseTo(101);
18
71
  expect(line.boundingBox().xMax).toBeCloseTo(201);
19
72
  expect(line.boundingBox().yMin).toBeCloseTo(102);
20
73
  expect(line.boundingBox().yMax).toBeCloseTo(202);
21
74
 
22
- line = new Line({points: [new Point(101, 102), new Point(-201, 202)]});
75
+ line = new Line({ points: [new Point(101, 102), new Point(-201, 202)] });
23
76
  expect(line.boundingBox().xMin).toBeCloseTo(-201);
24
77
  expect(line.boundingBox().xMax).toBeCloseTo(101);
25
78
  expect(line.boundingBox().yMin).toBeCloseTo(102);
26
79
  expect(line.boundingBox().yMax).toBeCloseTo(202);
27
80
  });
81
+
82
+ test('Test Line.dxf', () => {
83
+ const line = new Line({ handle: '1', points: [new Point(101, 102), new Point(201, 202)] });
84
+ let file = new File();
85
+ line.dxf(file);
86
+ // console.log(file.contents);
87
+
88
+ const dxfString = `0
89
+ LINE
90
+ 5
91
+ 1
92
+ 100
93
+ AcDbEntity
94
+ 100
95
+ AcDbLine
96
+ 8
97
+ 0
98
+ 6
99
+ ByLayer
100
+ 10
101
+ 101
102
+ 20
103
+ 102
104
+ 30
105
+ 0.0
106
+ 11
107
+ 201
108
+ 21
109
+ 202
110
+ 31
111
+ 0.0
112
+ 39
113
+ 2
114
+ `;
115
+
116
+ expect(file.contents).toEqual(dxfString);
117
+
118
+ // create new entity from entity data to ensure all props are loaded
119
+ const newLine = new Line(line);
120
+ file = new File();
121
+ newLine.dxf(file);
122
+ expect(file.contents).toEqual(dxfString);
123
+ });
124
+
125
+ test('Test Line.toPolylinePoints', () => {
126
+ const line = new Line({ points: [new Point(101, 102), new Point(201, 202)] });
127
+ const linePoints = line.toPolylinePoints();
128
+ expect(linePoints[0].x).toBe(101);
129
+ expect(linePoints[0].y).toBe(102);
130
+ expect(linePoints[0].bulge).toBe(0);
131
+
132
+ expect(linePoints[1].x).toBe(201);
133
+ expect(linePoints[1].y).toBe(202);
134
+ expect(linePoints[1].bulge).toBe(0);
135
+ });
136
+
137
+
138
+ test('Test Line.trim returns remove and add states', () => {
139
+ const line = new Line({ points: [new Point(0, 0), new Point(100, 0)], handle: 'A1' });
140
+
141
+ // intersections along the line
142
+ const i1 = new Point(30, 0);
143
+ const i2 = new Point(60, 0);
144
+
145
+ // place mouse between intersections so trim targets that segment
146
+ DesignCore.Mouse.pointOnScene = () => new Point(45, 0);
147
+
148
+ const changes = line.trim([i1, i2]);
149
+
150
+ expect(Array.isArray(changes)).toBe(true);
151
+ expect(changes.length).toBeGreaterThanOrEqual(2);
152
+ expect(changes[0]).toBeInstanceOf(AddState);
153
+ expect(changes[1]).toBeInstanceOf(AddState);
154
+ expect(changes[2]).toBeInstanceOf(RemoveState);
155
+
156
+ // Verify trimmed lines have unique handles (not the original)
157
+ expect(changes[0].entity.handle).toBeUndefined();
158
+ expect(changes[1].entity.handle).toBeUndefined();
159
+ });
160
+
161
+
162
+ test('Test Line.trim returns empty array when provided with empty intersection list', () => {
163
+ const line = new Line({ points: [new Point(0, 0), new Point(100, 0)] });
164
+
165
+ expect(line.trim([])).toEqual([]);
166
+ expect(line.trim()).toEqual([]);
167
+ });
168
+
169
+
170
+ test('Test Line.extend returns empty array when provided with empty intersection list', () => {
171
+ const line = new Line({ points: [new Point(0, 0), new Point(100, 0)] });
172
+
173
+ expect(line.extend([])).toEqual([]);
174
+ expect(line.extend()).toEqual([]);
175
+ });
176
+
177
+ test('Line.execute handles Close option', async () => {
178
+ const pt1 = new Point(0, 0);
179
+ const pt2 = new Point(10, 0);
180
+ const pt3 = new Point(10, 10);
181
+
182
+ await withMockInput(DesignCore.Scene, [pt1, pt2, pt3, 'Close'], async () => {
183
+ const line = new Line({});
184
+ await line.execute();
185
+
186
+ expect(line.points.length).toBe(4);
187
+ expect(line.points[0]).toBe(pt1);
188
+ expect(line.points[1]).toBe(pt2);
189
+ expect(line.points[2]).toBe(pt3);
190
+ expect(line.points[3]).toBe(pt1);
191
+ }, { extraMethods: { actionCommand: () => {} } });
192
+ });
193
+
194
+ test('Line.fromPolylinePoints round-trip preserves points exactly', () => {
195
+ const line = new Line({ points: [new Point(3, 7), new Point(15, -4)] });
196
+ const polyPts = line.toPolylinePoints();
197
+ const rebuilt = new Line({});
198
+ rebuilt.fromPolylinePoints(polyPts);
199
+ expect(rebuilt.points[0].x).toBe(3);
200
+ expect(rebuilt.points[0].y).toBe(7);
201
+ expect(rebuilt.points[1].x).toBe(15);
202
+ expect(rebuilt.points[1].y).toBe(-4);
203
+ });