@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,24 +1,19 @@
1
- import {DXFFile} from './dxfFile.js';
2
- import {DesignCore} from '../../designCore.js';
1
+ import { DXFFile } from './dxfFile.js';
2
+ import { DesignCore } from '../../designCore.js';
3
3
 
4
+ /** DXF Writer Class */
4
5
  export class DXFWriter {
5
- constructor() {
6
- }
6
+ /** Create DXF Writer */
7
+ constructor() { }
7
8
 
8
9
  /**
9
10
  * Write DXF header section
10
11
  * @param {DXFFile} file
11
12
  */
12
13
  writeHeaders(file) {
13
- // write headers
14
14
  file.writeGroupCode('0', 'SECTION');
15
15
  file.writeGroupCode('2', 'HEADER');
16
- file.writeGroupCode('9', '$ACADVER');
17
- file.writeGroupCode('1', file.version);
18
- file.writeGroupCode('9', '$CLAYER');
19
- file.writeGroupCode('8', DesignCore.LayerManager.getCstyle());
20
- file.writeGroupCode('9', '$HANDSEED', DXFFile.Version.R2000);
21
- file.writeGroupCode('5', file.formatHandle(DesignCore.Scene.items.length + 200), DXFFile.Version.R2000); // TODO: This needs to reflect the actual handle values
16
+ DesignCore.Scene.headers.dxf(file);
22
17
  file.writeGroupCode('0', 'ENDSEC');
23
18
  }
24
19
 
@@ -39,59 +34,15 @@ export class DXFWriter {
39
34
  // dimstyle table
40
35
  DesignCore.DimStyleManager.dxf(file);
41
36
  // vport table
42
- DesignCore.Scene.dxf(file);
43
-
44
- // VIEW Table
45
- file.writeGroupCode('0', 'TABLE', DXFFile.Version.R2000);
46
- file.writeGroupCode('2', 'VIEW', DXFFile.Version.R2000);
47
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
48
- file.writeGroupCode('100', 'AcDbSymbolTable', DXFFile.Version.R2000);
49
- file.writeGroupCode('0', 'ENDTAB', DXFFile.Version.R2000);
50
-
51
- // UCS TABLE
52
- file.writeGroupCode('0', 'TABLE', DXFFile.Version.R2000);
53
- file.writeGroupCode('2', 'UCS', DXFFile.Version.R2000);
54
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
55
- file.writeGroupCode('100', 'AcDbSymbolTable', DXFFile.Version.R2000);
56
- file.writeGroupCode('0', 'ENDTAB', DXFFile.Version.R2000);
57
-
58
- // APPID Table
59
- file.writeGroupCode('0', 'TABLE', DXFFile.Version.R2000);
60
- file.writeGroupCode('2', 'APPID', DXFFile.Version.R2000);
61
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
62
- file.writeGroupCode('100', 'AcDbSymbolTable', DXFFile.Version.R2000);
63
- file.writeGroupCode('0', 'APPID', DXFFile.Version.R2000);
64
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
65
- file.writeGroupCode('100', 'AcDbSymbolTableRecord', DXFFile.Version.R2000);
66
- file.writeGroupCode('100', 'AcDbRegAppTableRecord', DXFFile.Version.R2000);
67
- file.writeGroupCode('2', 'ACAD', DXFFile.Version.R2000);
68
- file.writeGroupCode('70', '0', DXFFile.Version.R2000);
69
- file.writeGroupCode('0', 'ENDTAB', DXFFile.Version.R2000);
70
-
71
- // BLOCK_RECORD Table
72
- file.writeGroupCode('0', 'TABLE', DXFFile.Version.R2000);
73
- file.writeGroupCode('2', 'BLOCK_RECORD', DXFFile.Version.R2000);
74
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
75
- file.writeGroupCode('100', 'AcDbSymbolTable', DXFFile.Version.R2000);
76
- file.writeGroupCode('70', '2', DXFFile.Version.R2000);
77
-
78
- // Model Space
79
- file.writeGroupCode('0', 'BLOCK_RECORD', DXFFile.Version.R2000);
80
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
81
- file.writeGroupCode('100', 'AcDbSymbolTableRecord', DXFFile.Version.R2000);
82
- file.writeGroupCode('100', 'AcDbBlockTableRecord', DXFFile.Version.R2000);
83
- file.writeGroupCode('2', '*Model_Space', DXFFile.Version.R2000);
84
- file.writeGroupCode('340', '22', DXFFile.Version.R2000);
85
-
86
- // Paper Space
87
- file.writeGroupCode('0', 'BLOCK_RECORD', DXFFile.Version.R2000);
88
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
89
- file.writeGroupCode('100', 'AcDbSymbolTableRecord', DXFFile.Version.R2000);
90
- file.writeGroupCode('100', 'AcDbBlockTableRecord', DXFFile.Version.R2000);
91
- file.writeGroupCode('2', '*Paper_Space', DXFFile.Version.R2000);
92
- file.writeGroupCode('340', '22', DXFFile.Version.R2000);
93
-
94
- file.writeGroupCode('0', 'ENDTAB', DXFFile.Version.R2000);
37
+ DesignCore.VPortManager.dxf(file);
38
+ // view table
39
+ DesignCore.ViewManager.dxf(file);
40
+ // ucs table
41
+ DesignCore.UCSManager.dxf(file);
42
+ // appid table
43
+ DesignCore.AppIDManager.dxf(file);
44
+ // block record table
45
+ DesignCore.BlockRecordManager.dxf(file);
95
46
 
96
47
  // end tables section
97
48
  file.writeGroupCode('0', 'ENDSEC');
@@ -105,52 +56,10 @@ export class DXFWriter {
105
56
  file.writeGroupCode('0', 'SECTION');
106
57
  file.writeGroupCode('2', 'BLOCKS');
107
58
 
108
- for (let i = 0; i <DesignCore.Scene.items.length; i++) {
109
- if (DesignCore.Scene.items[i].type === 'Block') {
110
- DesignCore.Scene.items[i].dxf(file);
111
- }
59
+ for (let i = 0; i < DesignCore.Scene.blockManager.items.length; i++) {
60
+ DesignCore.Scene.blockManager.items[i].dxf(file);
112
61
  }
113
62
 
114
-
115
- // Three empty definitions always appear in the BLOCKS section.
116
- // They are titled *Model_Space, *Paper_Space and *Paper_Space0.
117
- // Model Space
118
- file.writeGroupCode('0', 'BLOCK', DXFFile.Version.R2000);
119
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
120
- file.writeGroupCode('100', 'AcDbEntity', DXFFile.Version.R2000);
121
- file.writeGroupCode('8', '0', DXFFile.Version.R2000);
122
- file.writeGroupCode('100', 'AcDbBlockBegin', DXFFile.Version.R2000);
123
- file.writeGroupCode('2', '*Model_Space', DXFFile.Version.R2000);
124
- file.writeGroupCode('10', '0.0', DXFFile.Version.R2000);
125
- file.writeGroupCode('20', '0.0', DXFFile.Version.R2000);
126
- file.writeGroupCode('30', '0.0', DXFFile.Version.R2000);
127
- file.writeGroupCode('3', '*Model_Space', DXFFile.Version.R2000);
128
- file.writeGroupCode('1', '', DXFFile.Version.R2000);
129
- file.writeGroupCode('0', 'ENDBLK', DXFFile.Version.R2000);
130
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
131
- file.writeGroupCode('100', 'AcDbEntity', DXFFile.Version.R2000);
132
- file.writeGroupCode('8', '0', DXFFile.Version.R2000);
133
- file.writeGroupCode('100', 'AcDbBlockEnd', DXFFile.Version.R2000);
134
-
135
- // Model Space
136
- file.writeGroupCode('0', 'BLOCK', DXFFile.Version.R2000);
137
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
138
- file.writeGroupCode('100', 'AcDbEntity', DXFFile.Version.R2000);
139
- file.writeGroupCode('8', '0', DXFFile.Version.R2000);
140
- file.writeGroupCode('100', 'AcDbBlockBegin', DXFFile.Version.R2000);
141
- file.writeGroupCode('2', '*Paper_Space', DXFFile.Version.R2000);
142
- file.writeGroupCode('10', '0.0', DXFFile.Version.R2000);
143
- file.writeGroupCode('20', '0.0', DXFFile.Version.R2000);
144
- file.writeGroupCode('30', '0.0', DXFFile.Version.R2000);
145
- file.writeGroupCode('3', '*Paper_Space', DXFFile.Version.R2000);
146
- file.writeGroupCode('1', '', DXFFile.Version.R2000);
147
- file.writeGroupCode('0', 'ENDBLK', DXFFile.Version.R2000);
148
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
149
- file.writeGroupCode('100', 'AcDbEntity', DXFFile.Version.R2000);
150
- file.writeGroupCode('8', '0', DXFFile.Version.R2000);
151
- file.writeGroupCode('100', 'AcDbBlockEnd', DXFFile.Version.R2000);
152
-
153
-
154
63
  file.writeGroupCode('0', 'ENDSEC');
155
64
  }
156
65
 
@@ -162,24 +71,39 @@ export class DXFWriter {
162
71
  file.writeGroupCode('0', 'SECTION');
163
72
  file.writeGroupCode('2', 'ENTITIES');
164
73
 
165
- for (let i = 0; i <DesignCore.Scene.items.length; i++) {
166
- if (DesignCore.Scene.items[i].type !== 'Block') {
167
- DesignCore.Scene.items[i].dxf(file);
168
- }
74
+ for (let i = 0; i < DesignCore.Scene.entities.count(); i++) {
75
+ DesignCore.Scene.entities.get(i).dxf(file);
169
76
  }
170
77
 
171
78
  file.writeGroupCode('0', 'ENDSEC');
172
79
  }
173
80
 
81
+ /**
82
+ * Write Dictionary section
83
+ * @param {DXFFile} file
84
+ */
85
+ writeObjects(file) {
86
+ // Dictionary
87
+ file.writeGroupCode('0', 'SECTION', DXFFile.Version.R2000);
88
+ file.writeGroupCode('2', 'OBJECTS', DXFFile.Version.R2000);
89
+
90
+ DesignCore.DictionaryManager.dxf(file);
91
+
92
+ file.writeGroupCode('0', 'ENDSEC', DXFFile.Version.R2000);
93
+ }
94
+
95
+
174
96
  /**
175
97
  * Write DXF file
176
- * @returns dxf formatted string formatted
98
+ * @param {string} version
99
+ * @return {string} dxf formatted string formatted
177
100
  */
178
101
  write(version) {
179
102
  if (version === undefined) {
180
- version = DesignCore.Core.dxfVersion;
103
+ version = DesignCore.Scene.headers.dxfVersion;
181
104
  }
182
105
  const file = new DXFFile(version);
106
+
183
107
  // write start of file
184
108
  file.writeGroupCode('999', 'DXF created from Design-Core');
185
109
 
@@ -188,21 +112,7 @@ export class DXFWriter {
188
112
  this.writeTables(file);
189
113
  this.writeBlocks(file);
190
114
  this.writeEntities(file);
191
-
192
- // Dictionary
193
- file.writeGroupCode('0', 'SECTION', DXFFile.Version.R2000);
194
- file.writeGroupCode('2', 'OBJECTS', DXFFile.Version.R2000);
195
- file.writeGroupCode('0', 'DICTIONARY', DXFFile.Version.R2000);
196
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
197
- file.writeGroupCode('100', 'AcDbDictionary', DXFFile.Version.R2000);
198
- file.writeGroupCode('281', '1', DXFFile.Version.R2000);
199
- file.writeGroupCode('3', 'ACAD_GROUP', DXFFile.Version.R2000);
200
- file.writeGroupCode('350', 'D', DXFFile.Version.R2000);
201
- file.writeGroupCode('0', 'DICTIONARY', DXFFile.Version.R2000);
202
- file.writeGroupCode('5', file.nextHandle(), DXFFile.Version.R2000);
203
- file.writeGroupCode('100', 'AcDbDictionary', DXFFile.Version.R2000);
204
- file.writeGroupCode('281', '1', DXFFile.Version.R2000);
205
- file.writeGroupCode('0', 'ENDSEC', DXFFile.Version.R2000);
115
+ this.writeObjects(file);
206
116
 
207
117
  // write end of file
208
118
  file.writeGroupCode('0', 'EOF');
@@ -0,0 +1,97 @@
1
+ import { Logging } from '../logging.js';
2
+
3
+ /** HandleManager Class */
4
+ export class HandleManager {
5
+ /** Create HandleManager */
6
+ constructor() {
7
+ this.counter = 10;
8
+ this.usedHandles = new Set();
9
+ }
10
+
11
+ /** Reset the handle counter */
12
+ reset() {
13
+ this.counter = 10;
14
+ this.usedHandles.clear();
15
+ }
16
+
17
+ /**
18
+ * Returns the next available handle value
19
+ * R12 handles are optional.
20
+ * R13+ handles are mandatory.
21
+ * The header variable $HANDSEED must be greater than the largest handle value
22
+ * @return {string} handle value
23
+ */
24
+ next() {
25
+ const handle = this.format(this.counter);
26
+ this.usedHandles.add(handle);
27
+ this.counter++;
28
+ return handle;
29
+ }
30
+
31
+ /**
32
+ * Get the handseed value
33
+ * The handseed must be greater than the largest handle value
34
+ * @return {string} handseed hex value
35
+ */
36
+ get handseed() {
37
+ return this.format(this.counter);
38
+ }
39
+
40
+ /**
41
+ * Set the handseed value
42
+ * @param {string} value - hex string
43
+ */
44
+ set handseed(value) {
45
+ this.counter = parseInt(value, 16);
46
+ }
47
+
48
+ /**
49
+ * Check the given handle value and ensure the counter is above it.
50
+ * Call this when a handle is loaded from a file to keep the counter valid.
51
+ * @param {string} handle - hex string
52
+ */
53
+ checkHandle(handle) {
54
+ if (handle === undefined || handle === null) {
55
+ return;
56
+ }
57
+
58
+ const normalised = String(handle).toUpperCase();
59
+
60
+ if (!normalised.length || !/^[0-9A-F]+$/.test(normalised)) {
61
+ Logging.instance.warn(`Invalid handle: ${handle}`);
62
+ return;
63
+ }
64
+
65
+ if (this.usedHandles.has(normalised)) {
66
+ Logging.instance.error(`Duplicate handle: ${normalised}`);
67
+ }
68
+
69
+ this.usedHandles.add(normalised);
70
+
71
+ const value = parseInt(normalised, 16);
72
+ if (value >= this.counter) {
73
+ this.counter = value + 1;
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Release a handle back to the pool.
79
+ * Call this when an entity is removed so the handle is no longer
80
+ * considered in-use and can be safely re-registered on undo.
81
+ * @param {string} handle - hex string
82
+ */
83
+ releaseHandle(handle) {
84
+ if (handle === undefined || handle === null) return;
85
+ this.usedHandles.delete(String(handle).toUpperCase());
86
+ }
87
+
88
+ /**
89
+ * Format a handle value
90
+ * A handle is an arbitrary but unique hex value as string up to 16 hexadecimal digits (8 bytes).
91
+ * @param {number} value
92
+ * @return {string} handle hex value
93
+ */
94
+ format(value) {
95
+ return value.toString(16).toUpperCase();
96
+ }
97
+ }
@@ -1,18 +1,32 @@
1
- import {Section} from './section.js';
1
+ import { Section } from './section.js';
2
2
 
3
+ /**
4
+ * Blocks Class
5
+ * @extends Section
6
+ */
3
7
  export class Blocks extends Section {
8
+ /** Create Blocks */
4
9
  constructor() {
5
10
  super();
6
11
 
7
12
  this.blocks = [];
8
13
  }
9
14
 
15
+ /**
16
+ * Add Block
17
+ * @param {Object} block
18
+ */
10
19
  addBlock(block) {
11
20
  if (Object.keys(block).length) {
12
21
  this.blocks.push(block);
13
22
  }
14
23
  }
15
24
 
25
+ /**
26
+ * Read
27
+ * @param {Object} iterator
28
+ * @return {Array}
29
+ */
16
30
  read(iterator) {
17
31
  let currentBlock = {};
18
32
  while (iterator.nextPair().value !== 'ENDSEC') {
@@ -22,7 +36,7 @@ export class Blocks extends Section {
22
36
 
23
37
  if (['BLOCK'].includes(currentPair.value)) {
24
38
  this.addBlock(currentBlock);
25
- currentBlock = {children: []};
39
+ currentBlock = { children: [] };
26
40
  this.parseValue(iterator, currentBlock);
27
41
  break;
28
42
  } else {
@@ -1,14 +1,23 @@
1
- import {Section} from './section.js';
2
- import {DxfIterator} from '../dxfIterator.js';
3
- import {Strings} from '../../strings.js';
1
+ import { Section } from './section.js';
2
+ import { DxfIterator } from '../dxfIterator.js';
3
+ import { Strings } from '../../strings.js';
4
4
 
5
+ /**
6
+ * Entities Class
7
+ * @extends Section
8
+ */
5
9
  export class Entities extends Section {
10
+ /** Create Entities */
6
11
  constructor() {
7
12
  super();
8
13
 
9
14
  this.entities = [];
10
15
  }
11
16
 
17
+ /**
18
+ * Add Entity
19
+ * @param {Object} entity
20
+ */
12
21
  addEntity(entity) {
13
22
  if (Object.keys(entity).length) {
14
23
  if (!entity.hasOwnProperty('points')) {
@@ -19,6 +28,11 @@ export class Entities extends Section {
19
28
  }
20
29
  }
21
30
 
31
+ /**
32
+ * Read
33
+ * @param {Object} iterator
34
+ * @return {Array}
35
+ */
22
36
  read(iterator) {
23
37
  let currentEntity = {};
24
38
  while (iterator.nextPair().value !== 'ENDSEC') {
@@ -1,6 +1,11 @@
1
- import {Section} from './section.js';
1
+ import { Section } from './section.js';
2
2
 
3
+ /**
4
+ * Header Class
5
+ * @extends Section
6
+ */
3
7
  export class Header extends Section {
8
+ /** Create Header */
4
9
  constructor() {
5
10
  super();
6
11
 
@@ -10,6 +15,10 @@ export class Header extends Section {
10
15
  this.$CLAYER = '0';
11
16
  }
12
17
 
18
+ /**
19
+ * Read
20
+ * @param {Object} iterator
21
+ */
13
22
  read(iterator) {
14
23
  let currentVariable;
15
24
  while (iterator.nextPair().value !== 'ENDSEC') {
@@ -0,0 +1,36 @@
1
+ import { Section } from './section.js';
2
+
3
+ /**
4
+ * Objects Class
5
+ * @extends Section
6
+ */
7
+ export class Objects extends Section {
8
+ /** Create Objects */
9
+ constructor() {
10
+ super();
11
+
12
+ this.objects = [];
13
+ }
14
+
15
+ /**
16
+ * Read
17
+ * @param {Object} iterator
18
+ * @return {Array}
19
+ */
20
+ read(iterator) {
21
+ while (iterator.nextPair().value !== 'ENDSEC') {
22
+ const currentPair = iterator.currentPair();
23
+ switch (true) {
24
+ case (currentPair.code === '0'):
25
+ const object = this.parseChild(iterator);
26
+ this.objects.push(object);
27
+ break;
28
+
29
+ default:
30
+ break;
31
+ }
32
+ }
33
+
34
+ return this.objects;
35
+ }
36
+ }
@@ -1,11 +1,19 @@
1
1
 
2
- import {DxfIterator} from '../dxfIterator.js';
3
- import {Strings} from '../../strings.js';
4
- export class Section {
5
- constructor() {
2
+ import { DxfIterator } from '../dxfIterator.js';
3
+ import { Strings } from '../../strings.js';
6
4
 
7
- }
5
+ /**
6
+ * Section Class
7
+ */
8
+ export class Section {
9
+ /** Create Section */
10
+ constructor() { }
8
11
 
12
+ /**
13
+ * Parse value
14
+ * @param {Object} iterator
15
+ * @param {Object} object
16
+ */
9
17
  parseValue(iterator, object) {
10
18
  const currentPair = iterator.currentPair();
11
19
 
@@ -46,6 +54,11 @@ export class Section {
46
54
  object[currentPair.code] = value;
47
55
  }
48
56
 
57
+ /**
58
+ * Parse Child
59
+ * @param {Object} iterator
60
+ * @return {Object}
61
+ */
49
62
  parseChild(iterator) {
50
63
  const child = {};
51
64
 
@@ -71,6 +84,11 @@ export class Section {
71
84
  }
72
85
  }
73
86
 
87
+ /**
88
+ *
89
+ * @param {Object} iterator
90
+ * @return {Point}
91
+ */
74
92
  parsePoint(iterator) {
75
93
  const point = {};
76
94
 
@@ -113,6 +131,11 @@ export class Section {
113
131
  }
114
132
  }
115
133
 
134
+ /**
135
+ * Parse Float
136
+ * @param {string} value
137
+ * @return {number}
138
+ */
116
139
  parseFloat(value) {
117
140
  if (isNaN(value)) {
118
141
  DxfIterator.instance.dxfError(Strings.Error.INVALIDNUMBER);
@@ -122,6 +145,11 @@ export class Section {
122
145
  }
123
146
 
124
147
 
148
+ /**
149
+ * Parse Int
150
+ * @param {string} value
151
+ * @return {number}
152
+ */
125
153
  parseInt(value) {
126
154
  if (isNaN(value)) {
127
155
  DxfIterator.instance.dxfError(Strings.Error.INVALIDNUMBER);
@@ -130,10 +158,20 @@ export class Section {
130
158
  return parseInt(value);
131
159
  }
132
160
 
161
+ /**
162
+ * Parse Bool
163
+ * @param {string} value
164
+ * @return {boolean}
165
+ */
133
166
  parseBoolean(value) {
134
167
  return Boolean(parseInt(value.trim()));
135
168
  }
136
169
 
170
+ /**
171
+ *
172
+ * @param {Object} Pair
173
+ * @return {any}
174
+ */
137
175
  getGroupValue(Pair) {
138
176
  const code = parseInt(Pair.code);
139
177
  const value = Pair.value;
@@ -1,27 +1,41 @@
1
- import {Section} from './section.js';
1
+ import { Section } from './section.js';
2
2
 
3
+ /**
4
+ * Tables Class
5
+ * @extends Section
6
+ */
3
7
  export class Tables extends Section {
8
+ /** Create Tables */
4
9
  constructor() {
5
10
  super();
6
11
 
7
12
  this.tables = [];
8
13
  }
9
14
 
15
+ /**
16
+ * Add Table
17
+ * @param {Object} table
18
+ */
10
19
  addTable(table) {
11
20
  if (Object.keys(table).length) {
12
21
  this.tables.push(table);
13
22
  }
14
23
  }
15
24
 
25
+ /**
26
+ * Read
27
+ * @param {Object} iterator
28
+ * @return {Object}
29
+ */
16
30
  read(iterator) {
17
31
  let currentTable;
18
32
  while (iterator.nextPair().value !== 'ENDSEC') {
19
33
  const currentPair = iterator.currentPair();
20
34
  switch (true) {
21
- case (currentPair.code === '0' ):
35
+ case (currentPair.code === '0'):
22
36
 
23
37
  if (['TABLE'].includes(currentPair.value)) {
24
- currentTable = {children: []};
38
+ currentTable = { children: [] };
25
39
  this.parseValue(iterator, currentTable);
26
40
  break;
27
41
  } else if (['ENDTAB'].includes(currentPair.value)) {