@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,329 @@
1
+ import { ArcAlignedText } from '../../core/entities/arctext.js';
2
+ import { ArcAlignedCharacter } from '../../core/entities/arctext.js';
3
+ import { Arc } from '../../core/entities/arc.js';
4
+ import { Point } from '../../core/entities/point.js';
5
+ import { BoundingBox } from '../../core/lib/boundingBox.js';
6
+ import { DesignCore } from '../../core/designCore.js';
7
+ import { SingleSelection } from '../../core/lib/selectionManager.js';
8
+
9
+ import { File, withMockInput } from '../test-helpers/test-helpers.js';
10
+ import { Core } from '../../core/core/core.js';
11
+
12
+ // initialise core
13
+ new Core();
14
+
15
+ const arcInputScenarios = [
16
+ {
17
+ desc: 'two points and an angle',
18
+ input: [new SingleSelection(0, new Point(5, 0)), 2.5, 'Test Arc'],
19
+ selectedItems: [new Arc({ points: [new Point(), new Point(100, 0), new Point(-100, 0)] })],
20
+ expectedTextHeight: 2.5,
21
+ expectedText: 'Test Arc',
22
+ },
23
+ ];
24
+
25
+ test.each(arcInputScenarios)('ArcText.execute handles $desc', async (scenario) => {
26
+ const { input, selectedItems, expectedTextHeight, expectedText } = scenario;
27
+
28
+ await withMockInput(DesignCore.Scene, input, async () => {
29
+ const arcText = new ArcAlignedText();
30
+ await arcText.execute();
31
+
32
+ expect(arcText.styleName).toBe('STANDARD');
33
+ expect(arcText.height).toBe(expectedTextHeight);
34
+ expect(arcText.string).toBe(expectedText);
35
+
36
+ // arc props
37
+ expect(arcText.radius).toBe(100);
38
+ expect(arcText.startAngle()).toBe(0);
39
+ expect(arcText.endAngle()).toBeCloseTo(3.14159);
40
+ }, { selectedItems });
41
+ });
42
+
43
+ test('ArcAlignedCharacter', () => {
44
+ const point = new Point(10, 20);
45
+ const char = 'T';
46
+ const angle = Math.PI / 2;
47
+
48
+ const ac = new ArcAlignedCharacter(char, point, angle);
49
+
50
+ expect(ac.character).toBe(char);
51
+ expect(ac.position.x).toBe(point.x);
52
+ expect(ac.position.y).toBe(point.y);
53
+ expect(ac.angle).toBeCloseTo(angle);
54
+ expect(ac.baseline.x).toBe(10.5);
55
+ expect(ac.baseline.y).toBe(19.7);
56
+ expect(ac.boundingBox).toBeInstanceOf(BoundingBox);
57
+ });
58
+
59
+
60
+ test('ArcText startAngle', () => {
61
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)] });
62
+ expect(arcText.startAngle()).toBeCloseTo(0);
63
+
64
+ const arcText90 = new ArcAlignedText({ points: [new Point(0, 0)], startAngle: 90 });
65
+ expect(arcText90.startAngle()).toBeCloseTo(Math.PI / 2);
66
+ });
67
+
68
+ test('ArcText endAngle', () => {
69
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)] });
70
+ expect(arcText.endAngle()).toBeCloseTo(Math.PI);
71
+
72
+ const arcText90 = new ArcAlignedText({ points: [new Point(0, 0)], endAngle: 90 });
73
+ expect(arcText90.endAngle()).toBeCloseTo(Math.PI / 2);
74
+ });
75
+
76
+ test('ArcText linearToAngular', () => {
77
+ const arcText = new ArcAlignedText();
78
+
79
+ // linearToAngular(length, radius) - returns angle in radians
80
+ expect(arcText.linearToAngular(0, 100)).toBeCloseTo(0);
81
+ expect(arcText.linearToAngular(10, 100)).toBeCloseTo(0.199337);
82
+ expect(arcText.linearToAngular(-10, 100)).toBeCloseTo(-0.199337);
83
+
84
+ expect(arcText.linearToAngular(0, 0)).toBeCloseTo(0);
85
+ expect(arcText.linearToAngular(10, -101.247222)).toBeCloseTo(0.199337);
86
+ expect(arcText.linearToAngular(-10, -101.247222)).toBeCloseTo(-0.199337);
87
+ });
88
+
89
+ test('ArcText arcMidAngle', () => {
90
+ const arcText = new ArcAlignedText();
91
+ // arcMidAngle(startAngle, endAngle) - returns angle in radians
92
+ expect(arcText.arcMidAngle(0, Math.PI / 2)).toBeCloseTo(Math.PI / 4);
93
+ expect(arcText.arcMidAngle(Math.PI / 2, Math.PI)).toBeCloseTo((3 * Math.PI) / 4);
94
+ expect(arcText.arcMidAngle(Math.PI, (3 * Math.PI) / 2)).toBeCloseTo((5 * Math.PI) / 4);
95
+ expect(arcText.arcMidAngle((3 * Math.PI) / 2, 2 * Math.PI)).toBeCloseTo((7 * Math.PI) / 4);
96
+ expect(arcText.arcMidAngle(0, Math.PI)).toBeCloseTo(Math.PI / 2);
97
+ expect(arcText.arcMidAngle(Math.PI, 0)).toBeCloseTo(Math.PI * 1.5);
98
+ });
99
+
100
+ test('ArcText getArcAlignedCharacters', () => {
101
+ // ArcText properties:
102
+ // startAngle 0 - degrees
103
+ // endAngle 180 - degrees
104
+ // offsetFromRight 0 - mm
105
+ // offsetFromLeft 0 - mm
106
+ // textReversed 0 = forward, 1 = reversed
107
+ // textOrientation 1 = outward, 2 = inward
108
+ // textAlignment 1 = fit to arc, 2 = left align, 3 = right align, 4 = center
109
+ // ArcSide convex = 1, concave = 2
110
+ let chars = [];
111
+
112
+ // Create ArcAlignedText with string 'Test' and radius 100
113
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100 });
114
+ chars = arcText.getArcAlignedCharacters();
115
+ expect(chars.length).toBe(4);
116
+ // First character
117
+ expect(chars[0].character).toBe('T');
118
+ expect(chars[0].position.x).toBeCloseTo(-2.39222);
119
+ expect(chars[0].position.y).toBeCloseTo(101.22173);
120
+ expect(chars[0].angle).toBeCloseTo(0.02362);
121
+ // Fourth character
122
+ expect(chars.at(-1).character).toBe('t');
123
+ expect(chars.at(-1).position.x).toBeCloseTo(2.39222);
124
+ expect(chars.at(-1).position.y).toBeCloseTo(101.22173);
125
+ expect(chars.at(-1).angle).toBeCloseTo(-0.02362);
126
+
127
+
128
+ // //////// Text Alignment Tests //////////
129
+
130
+ // Create ArcAlignedText - right aligned - textAlignment = 3 - Characters should be reversed
131
+ const arcTextAlignRight = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100, textAlignment: 3 });
132
+ chars = arcTextAlignRight.getArcAlignedCharacters();
133
+ expect(chars.length).toBe(4);
134
+ // First character - Reversed!
135
+ expect(chars[0].character).toBe('t');
136
+ expect(chars[0].position.x).toBeCloseTo(101.24722);
137
+ expect(chars[0].position.y).toBeCloseTo(0.74997);
138
+ expect(chars[0].angle).toBeCloseTo(-1.56338);
139
+ // Last character - Reversed!
140
+ expect(chars.at(-1).character).toBe('T');
141
+ expect(chars.at(-1).position.x).toBeCloseTo(101.09875);
142
+ expect(chars.at(-1).position.y).toBeCloseTo(5.53213);
143
+ expect(chars.at(-1).angle).toBeCloseTo(-1.51613);
144
+
145
+ // Create ArcAlignedText - left aligned - textAlignment = 3
146
+ const arcTextAlignLeft = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100, textAlignment: 2 });
147
+ chars = arcTextAlignLeft.getArcAlignedCharacters();
148
+ expect(chars.length).toBe(4);
149
+ // First character
150
+ expect(chars[0].character).toBe('T');
151
+ expect(chars[0].position.x).toBeCloseTo(-101.247222);
152
+ expect(chars[0].position.y).toBeCloseTo(0.749979);
153
+ expect(chars[0].angle).toBeCloseTo(1.56338);
154
+ // Last character
155
+ expect(chars.at(-1).character).toBe('t');
156
+ expect(chars.at(-1).position.x).toBeCloseTo(-101.09875);
157
+ expect(chars.at(-1).position.y).toBeCloseTo(5.53213);
158
+ expect(chars.at(-1).angle).toBeCloseTo(1.51613);
159
+
160
+ // Create ArcAlignedText - fit to arc - textAlignment = 1
161
+ const arcTextFitToArc = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100, textAlignment: 1 });
162
+ chars = arcTextFitToArc.getArcAlignedCharacters();
163
+ expect(chars.length).toBe(4);
164
+ // First character
165
+ expect(chars[0].character).toBe('T');
166
+ expect(chars[0].position.x).toBeCloseTo(-101.247222);
167
+ expect(chars[0].position.y).toBeCloseTo(0.74997);
168
+ expect(chars[0].angle).toBeCloseTo(1.56338);
169
+ // Last character
170
+ expect(chars.at(-1).character).toBe('t');
171
+ expect(chars.at(-1).position.x).toBeCloseTo(101.24722);
172
+ expect(chars.at(-1).position.y).toBeCloseTo(0.74997);
173
+ expect(chars.at(-1).angle).toBeCloseTo(-1.56338);
174
+
175
+ // //////// Arc Side Tests //////////
176
+
177
+ // Create ArcAlignedText with string 'Test' and radius 100
178
+ const arcTextConvex = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100, arcSide: 1 });
179
+ chars = arcTextConvex.getArcAlignedCharacters();
180
+ expect(chars.length).toBe(4);
181
+ // First character
182
+ expect(chars[0].character).toBe('T');
183
+ expect(chars[0].position.x).toBeCloseTo(-2.39222);
184
+ expect(chars[0].position.y).toBeCloseTo(101.22173);
185
+ expect(chars[0].angle).toBeCloseTo(0.02362);
186
+ // Fourth character
187
+ expect(chars.at(-1).character).toBe('t');
188
+ expect(chars.at(-1).position.x).toBeCloseTo(2.39222);
189
+ expect(chars.at(-1).position.y).toBeCloseTo(101.22173);
190
+ expect(chars.at(-1).angle).toBeCloseTo(-0.02362);
191
+
192
+ // Create ArcAlignedText with string 'Test' and radius 100
193
+ const arcTextConcave = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100, arcSide: 2 });
194
+ chars = arcTextConcave.getArcAlignedCharacters();
195
+ expect(chars.length).toBe(4);
196
+ // First character
197
+ expect(chars[0].character).toBe('T');
198
+ expect(chars[0].position.x).toBeCloseTo(-2.39222);
199
+ expect(chars[0].position.y).toBeCloseTo(98.72102);
200
+ expect(chars[0].angle).toBeCloseTo(0.02422);
201
+ // Fourth character
202
+ expect(chars.at(-1).character).toBe('t');
203
+ expect(chars.at(-1).position.x).toBeCloseTo(2.39222);
204
+ expect(chars.at(-1).position.y).toBeCloseTo(98.72102);
205
+ expect(chars.at(-1).angle).toBeCloseTo(-0.02362);
206
+ });
207
+
208
+ test('ArcText.dxf', () => {
209
+ const arctext = new ArcAlignedText({ handle: '1', points: [new Point(100, 100)], string: 'Test', radius: 100 });
210
+ let file = new File();
211
+ arctext.dxf(file);
212
+ // console.log(file.contents);
213
+
214
+ const dxfString = `0
215
+ ARCALIGNEDTEXT
216
+ 5
217
+ 1
218
+ 100
219
+ AcDbEntity
220
+ 8
221
+ 0
222
+ 100
223
+ AcDbArcAlignedText
224
+ 1
225
+ Test
226
+ 2
227
+ Arial
228
+ 3
229
+
230
+ 7
231
+ STANDARD
232
+ 10
233
+ 100
234
+ 20
235
+ 100
236
+ 30
237
+ 0.0
238
+ 40
239
+ 100
240
+ 41
241
+ 1
242
+ 42
243
+ 2.5
244
+ 43
245
+ 0.095
246
+ 44
247
+ 0
248
+ 45
249
+ 0
250
+ 46
251
+ 0
252
+ 50
253
+ 0
254
+ 51
255
+ 180
256
+ 70
257
+ 0
258
+ 71
259
+ 1
260
+ 72
261
+ 4
262
+ 73
263
+ 1
264
+ 74
265
+ 0
266
+ 75
267
+ 0
268
+ 76
269
+ 0
270
+ 77
271
+ 0
272
+ 78
273
+ 34
274
+ 79
275
+ 0
276
+ 90
277
+ 256
278
+ 210
279
+ 0
280
+ 220
281
+ 0
282
+ 230
283
+ 1
284
+ 280
285
+ 1
286
+ 330
287
+
288
+ `;
289
+
290
+ expect(file.contents).toEqual(dxfString);
291
+
292
+ // create new entity from entity data to ensure all props are loaded
293
+ const newArcAlignedText = new ArcAlignedText(arctext);
294
+ file = new File();
295
+ newArcAlignedText.dxf(file);
296
+ expect(file.contents).toEqual(dxfString);
297
+ });
298
+
299
+ test('Test ArcText.snaps', () => {
300
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100 });
301
+ const point = new Point(100, 100);
302
+ const snaps = arcText.snaps(point, 1);
303
+ expect(snaps[0].x).toBeCloseTo(-2.39222);
304
+ expect(snaps[0].y).toBeCloseTo(101.22173);
305
+ });
306
+
307
+ test('Test ArcText.closestPoint', () => {
308
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100 });
309
+ const point = new Point(100, 100);
310
+ const closest = arcText.closestPoint(point);
311
+ expect(closest[0].x).toBeCloseTo(2.39222);
312
+ expect(closest[0].y).toBeCloseTo(101.22173);
313
+ });
314
+
315
+ test('Test ArcText.boundingBox', () => {
316
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100 });
317
+ expect(arcText.boundingBox().xMin).toBeCloseTo(-3.14222);
318
+ expect(arcText.boundingBox().xMax).toBeCloseTo(3.14222);
319
+ expect(arcText.boundingBox().yMin).toBeCloseTo(99.97173);
320
+ expect(arcText.boundingBox().yMax).toBeCloseTo(102.49685);
321
+ });
322
+
323
+ test('Test ArcText.toPolylinePoints - returns correct points array', () => {
324
+ const arcText = new ArcAlignedText({ points: [new Point(0, 0)], string: 'Test', radius: 100 });
325
+ const result = arcText.toPolylinePoints();
326
+ expect(result.length).toBe(4);
327
+ expect(result[0].x).toBeCloseTo(-2.39222);
328
+ expect(result[0].y).toBeCloseTo(101.22173);
329
+ });