@linkiez/dxf-renew 7.0.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/.eslintrc.json +1 -16
  2. package/.github/instructions/code-patterns.instructions.md +1 -1
  3. package/.github/instructions/exdxf.instruction.md +161 -0
  4. package/.github/instructions/tdd.instructions.md +271 -0
  5. package/.yarn/install-state.gz +0 -0
  6. package/ARCHITECTURE.md +163 -0
  7. package/CHANGELOG.md +39 -0
  8. package/CONTRIBUTING.md +16 -14
  9. package/README.md +113 -16
  10. package/{PLAN.md → ROADMAP.md} +244 -102
  11. package/dist/dxf.js +2212 -454
  12. package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
  13. package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
  14. package/lib/Helper.cjs +6 -2
  15. package/lib/Helper.cjs.map +3 -3
  16. package/lib/Helper.js +6 -2
  17. package/lib/Helper.js.map +2 -2
  18. package/lib/denormalise.cjs +131 -91
  19. package/lib/denormalise.cjs.map +2 -2
  20. package/lib/denormalise.js +131 -91
  21. package/lib/denormalise.js.map +2 -2
  22. package/lib/dimensionToSVG.cjs +318 -53
  23. package/lib/dimensionToSVG.cjs.map +3 -3
  24. package/lib/dimensionToSVG.js +316 -52
  25. package/lib/dimensionToSVG.js.map +2 -2
  26. package/lib/entityToPolyline.cjs +95 -0
  27. package/lib/entityToPolyline.cjs.map +3 -3
  28. package/lib/entityToPolyline.js +95 -0
  29. package/lib/entityToPolyline.js.map +2 -2
  30. package/lib/handlers/entities.cjs +111 -27
  31. package/lib/handlers/entities.cjs.map +3 -3
  32. package/lib/handlers/entities.js +111 -27
  33. package/lib/handlers/entities.js.map +3 -3
  34. package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
  35. package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
  36. package/lib/handlers/entity/dgnUnderlay.js +71 -0
  37. package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
  38. package/lib/handlers/entity/dimension.cjs +24 -0
  39. package/lib/handlers/entity/dimension.cjs.map +2 -2
  40. package/lib/handlers/entity/dimension.js +24 -0
  41. package/lib/handlers/entity/dimension.js.map +2 -2
  42. package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
  43. package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
  44. package/lib/handlers/entity/dwfUnderlay.js +71 -0
  45. package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
  46. package/lib/handlers/entity/image.cjs +123 -0
  47. package/lib/handlers/entity/image.cjs.map +7 -0
  48. package/lib/handlers/entity/image.js +88 -0
  49. package/lib/handlers/entity/image.js.map +7 -0
  50. package/lib/handlers/entity/leader.cjs +148 -0
  51. package/lib/handlers/entity/leader.cjs.map +7 -0
  52. package/lib/handlers/entity/leader.js +113 -0
  53. package/lib/handlers/entity/leader.js.map +7 -0
  54. package/lib/handlers/entity/mleader.cjs +69 -0
  55. package/lib/handlers/entity/mleader.cjs.map +7 -0
  56. package/lib/handlers/entity/mleader.js +34 -0
  57. package/lib/handlers/entity/mleader.js.map +7 -0
  58. package/lib/handlers/entity/mline.cjs +91 -0
  59. package/lib/handlers/entity/mline.cjs.map +7 -0
  60. package/lib/handlers/entity/mline.js +56 -0
  61. package/lib/handlers/entity/mline.js.map +7 -0
  62. package/lib/handlers/entity/oleframe.cjs +98 -0
  63. package/lib/handlers/entity/oleframe.cjs.map +7 -0
  64. package/lib/handlers/entity/oleframe.js +63 -0
  65. package/lib/handlers/entity/oleframe.js.map +7 -0
  66. package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
  67. package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
  68. package/lib/handlers/entity/pdfUnderlay.js +71 -0
  69. package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
  70. package/lib/handlers/entity/ray.cjs +81 -0
  71. package/lib/handlers/entity/ray.cjs.map +7 -0
  72. package/lib/handlers/entity/ray.js +46 -0
  73. package/lib/handlers/entity/ray.js.map +7 -0
  74. package/lib/handlers/entity/region.cjs +67 -0
  75. package/lib/handlers/entity/region.cjs.map +7 -0
  76. package/lib/handlers/entity/region.js +32 -0
  77. package/lib/handlers/entity/region.js.map +7 -0
  78. package/lib/handlers/entity/shape.cjs +95 -0
  79. package/lib/handlers/entity/shape.cjs.map +7 -0
  80. package/lib/handlers/entity/shape.js +60 -0
  81. package/lib/handlers/entity/shape.js.map +7 -0
  82. package/lib/handlers/entity/table.cjs +71 -0
  83. package/lib/handlers/entity/table.cjs.map +7 -0
  84. package/lib/handlers/entity/table.js +36 -0
  85. package/lib/handlers/entity/table.js.map +7 -0
  86. package/lib/handlers/entity/tolerance.cjs +90 -0
  87. package/lib/handlers/entity/tolerance.cjs.map +7 -0
  88. package/lib/handlers/entity/tolerance.js +55 -0
  89. package/lib/handlers/entity/tolerance.js.map +7 -0
  90. package/lib/handlers/entity/trace.cjs +101 -0
  91. package/lib/handlers/entity/trace.cjs.map +7 -0
  92. package/lib/handlers/entity/trace.js +66 -0
  93. package/lib/handlers/entity/trace.js.map +7 -0
  94. package/lib/handlers/entity/wipeout.cjs +122 -0
  95. package/lib/handlers/entity/wipeout.cjs.map +7 -0
  96. package/lib/handlers/entity/wipeout.js +87 -0
  97. package/lib/handlers/entity/wipeout.js.map +7 -0
  98. package/lib/handlers/entity/xline.cjs +81 -0
  99. package/lib/handlers/entity/xline.cjs.map +7 -0
  100. package/lib/handlers/entity/xline.js +46 -0
  101. package/lib/handlers/entity/xline.js.map +7 -0
  102. package/lib/handlers/objects.cjs +299 -136
  103. package/lib/handlers/objects.cjs.map +2 -2
  104. package/lib/handlers/objects.js +299 -136
  105. package/lib/handlers/objects.js.map +2 -2
  106. package/lib/handlers/tables.cjs +96 -17
  107. package/lib/handlers/tables.cjs.map +2 -2
  108. package/lib/handlers/tables.js +96 -17
  109. package/lib/handlers/tables.js.map +2 -2
  110. package/lib/index.cjs +5 -2
  111. package/lib/index.cjs.map +3 -3
  112. package/lib/index.js +18 -16
  113. package/lib/index.js.map +3 -3
  114. package/lib/toJson.cjs +29 -0
  115. package/lib/toJson.cjs.map +7 -0
  116. package/lib/toJson.js +9 -0
  117. package/lib/toJson.js.map +7 -0
  118. package/lib/toSVG.cjs +105 -11
  119. package/lib/toSVG.cjs.map +3 -3
  120. package/lib/toSVG.js +106 -12
  121. package/lib/toSVG.js.map +2 -2
  122. package/lib/types/dimension-entity.cjs.map +1 -1
  123. package/lib/types/entity.cjs.map +1 -1
  124. package/lib/types/helper.cjs.map +1 -1
  125. package/lib/types/image-entity.cjs +17 -0
  126. package/lib/types/image-entity.cjs.map +7 -0
  127. package/lib/types/image-entity.js +1 -0
  128. package/lib/types/image-entity.js.map +7 -0
  129. package/lib/types/index.cjs +28 -0
  130. package/lib/types/index.cjs.map +2 -2
  131. package/lib/types/index.js +14 -0
  132. package/lib/types/index.js.map +2 -2
  133. package/lib/types/leader-entity.cjs +17 -0
  134. package/lib/types/leader-entity.cjs.map +7 -0
  135. package/lib/types/leader-entity.js +1 -0
  136. package/lib/types/leader-entity.js.map +7 -0
  137. package/lib/types/mleader-entity.cjs +17 -0
  138. package/lib/types/mleader-entity.cjs.map +7 -0
  139. package/lib/types/mleader-entity.js +1 -0
  140. package/lib/types/mleader-entity.js.map +7 -0
  141. package/lib/types/mline-entity.cjs +17 -0
  142. package/lib/types/mline-entity.cjs.map +7 -0
  143. package/lib/types/mline-entity.js +1 -0
  144. package/lib/types/mline-entity.js.map +7 -0
  145. package/lib/types/oleframe-entity.cjs +17 -0
  146. package/lib/types/oleframe-entity.cjs.map +7 -0
  147. package/lib/types/oleframe-entity.js +1 -0
  148. package/lib/types/oleframe-entity.js.map +7 -0
  149. package/lib/types/options.cjs.map +1 -1
  150. package/lib/types/ray-entity.cjs +17 -0
  151. package/lib/types/ray-entity.cjs.map +7 -0
  152. package/lib/types/ray-entity.js +1 -0
  153. package/lib/types/ray-entity.js.map +7 -0
  154. package/lib/types/region-entity.cjs +17 -0
  155. package/lib/types/region-entity.cjs.map +7 -0
  156. package/lib/types/region-entity.js +1 -0
  157. package/lib/types/region-entity.js.map +7 -0
  158. package/lib/types/shape-entity.cjs +17 -0
  159. package/lib/types/shape-entity.cjs.map +7 -0
  160. package/lib/types/shape-entity.js +1 -0
  161. package/lib/types/shape-entity.js.map +7 -0
  162. package/lib/types/table-entity.cjs +17 -0
  163. package/lib/types/table-entity.cjs.map +7 -0
  164. package/lib/types/table-entity.js +1 -0
  165. package/lib/types/table-entity.js.map +7 -0
  166. package/lib/types/tables.cjs.map +1 -1
  167. package/lib/types/tolerance-entity.cjs +17 -0
  168. package/lib/types/tolerance-entity.cjs.map +7 -0
  169. package/lib/types/tolerance-entity.js +1 -0
  170. package/lib/types/tolerance-entity.js.map +7 -0
  171. package/lib/types/trace-entity.cjs +17 -0
  172. package/lib/types/trace-entity.cjs.map +7 -0
  173. package/lib/types/trace-entity.js +1 -0
  174. package/lib/types/trace-entity.js.map +7 -0
  175. package/lib/types/underlay-entity.cjs +17 -0
  176. package/lib/types/underlay-entity.cjs.map +7 -0
  177. package/lib/types/underlay-entity.js +1 -0
  178. package/lib/types/underlay-entity.js.map +7 -0
  179. package/lib/types/wipeout-entity.cjs +17 -0
  180. package/lib/types/wipeout-entity.cjs.map +7 -0
  181. package/lib/types/wipeout-entity.js +1 -0
  182. package/lib/types/wipeout-entity.js.map +7 -0
  183. package/lib/types/xline-entity.cjs +17 -0
  184. package/lib/types/xline-entity.cjs.map +7 -0
  185. package/lib/types/xline-entity.js +1 -0
  186. package/lib/types/xline-entity.js.map +7 -0
  187. package/lib/util/escapeXmlText.cjs +27 -0
  188. package/lib/util/escapeXmlText.cjs.map +7 -0
  189. package/lib/util/escapeXmlText.js +7 -0
  190. package/lib/util/escapeXmlText.js.map +7 -0
  191. package/package.json +9 -18
  192. package/playwright.config.cjs +20 -0
  193. package/src/Helper.ts +8 -3
  194. package/src/denormalise.ts +182 -116
  195. package/src/dimensionToSVG.ts +466 -54
  196. package/src/entityToPolyline.ts +124 -2
  197. package/src/handlers/entities.ts +129 -34
  198. package/src/handlers/entity/dgnUnderlay.ts +94 -0
  199. package/src/handlers/entity/dimension.ts +27 -1
  200. package/src/handlers/entity/dwfUnderlay.ts +94 -0
  201. package/src/handlers/entity/image.ts +118 -0
  202. package/src/handlers/entity/leader.ts +153 -0
  203. package/src/handlers/entity/mleader.ts +46 -0
  204. package/src/handlers/entity/mline.ts +74 -0
  205. package/src/handlers/entity/oleframe.ts +62 -0
  206. package/src/handlers/entity/pdfUnderlay.ts +94 -0
  207. package/src/handlers/entity/ray.ts +52 -0
  208. package/src/handlers/entity/region.ts +42 -0
  209. package/src/handlers/entity/shape.ts +73 -0
  210. package/src/handlers/entity/table.ts +49 -0
  211. package/src/handlers/entity/tolerance.ts +75 -0
  212. package/src/handlers/entity/trace.ts +72 -0
  213. package/src/handlers/entity/wipeout.ts +114 -0
  214. package/src/handlers/entity/xline.ts +52 -0
  215. package/src/handlers/objects.ts +379 -139
  216. package/src/handlers/tables.ts +134 -21
  217. package/src/index.ts +9 -18
  218. package/src/toJson.ts +8 -0
  219. package/src/toSVG.ts +143 -10
  220. package/src/types/dimension-entity.ts +11 -0
  221. package/src/types/entity.ts +30 -0
  222. package/src/types/helper.ts +2 -1
  223. package/src/types/image-entity.ts +35 -0
  224. package/src/types/index.ts +14 -0
  225. package/src/types/leader-entity.ts +40 -0
  226. package/src/types/mleader-entity.ts +8 -0
  227. package/src/types/mline-entity.ts +12 -0
  228. package/src/types/oleframe-entity.ts +40 -0
  229. package/src/types/options.ts +48 -0
  230. package/src/types/ray-entity.ts +12 -0
  231. package/src/types/region-entity.ts +11 -0
  232. package/src/types/shape-entity.ts +19 -0
  233. package/src/types/table-entity.ts +14 -0
  234. package/src/types/tables.ts +160 -0
  235. package/src/types/tolerance-entity.ts +20 -0
  236. package/src/types/trace-entity.ts +14 -0
  237. package/src/types/underlay-entity.ts +35 -0
  238. package/src/types/wipeout-entity.ts +20 -0
  239. package/src/types/xline-entity.ts +12 -0
  240. package/src/util/escapeXmlText.ts +10 -0
  241. package/tools/browser_test_server.cjs +87 -0
  242. package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
  243. package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
  244. package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
  245. package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
  246. package/tools/ezdxf_validate_fixtures.py +165 -0
  247. package/docs/DIMENSION_SUMMARY.md +0 -248
  248. package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
  249. package/docs/IMPLEMENTED-2D-ENTITIES.md +0 -54
  250. package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
  251. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +0 -241
  252. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.pt-BR.md +0 -169
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env python3
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import json
7
+ import os
8
+ from dataclasses import asdict, dataclass
9
+ from pathlib import Path
10
+ from typing import Any
11
+
12
+
13
+ @dataclass
14
+ class FixtureResult:
15
+ file: str
16
+ acadver: str | None
17
+ entities_total: int
18
+ entity_types: dict[str, int]
19
+ audit_errors: int
20
+ audit_fixes: int
21
+ audit_warnings: int
22
+ audit_has_fatal_error: bool
23
+
24
+
25
+ def _get_acadver(doc: Any) -> str | None:
26
+ try:
27
+ return str(doc.header.get("$ACADVER"))
28
+ except Exception:
29
+ return None
30
+
31
+
32
+ def _count_entity_types(doc: Any) -> tuple[int, dict[str, int]]:
33
+ counts: dict[str, int] = {}
34
+ total = 0
35
+
36
+ try:
37
+ msp = doc.modelspace()
38
+ except Exception:
39
+ return 0, {}
40
+
41
+ for e in msp:
42
+ total += 1
43
+ t = getattr(e, "dxftype", None)
44
+ if callable(t):
45
+ t = t()
46
+ t = str(t) if t is not None else "UNKNOWN"
47
+ counts[t] = counts.get(t, 0) + 1
48
+
49
+ return total, dict(sorted(counts.items(), key=lambda kv: kv[0]))
50
+
51
+
52
+ def _audit(doc: Any) -> tuple[int, int, int, bool]:
53
+ # ezdxf audit returns an auditor object with attributes.
54
+ auditor = doc.audit()
55
+
56
+ errors = len(getattr(auditor, "errors", []) or [])
57
+ fixes = len(getattr(auditor, "fixes", []) or [])
58
+ warnings = len(getattr(auditor, "warnings", []) or [])
59
+
60
+ has_fatal = False
61
+ # Some ezdxf versions expose fatal_error as bool/str.
62
+ fatal_error = getattr(auditor, "fatal_error", None)
63
+ if fatal_error:
64
+ has_fatal = True
65
+
66
+ return errors, fixes, warnings, has_fatal
67
+
68
+
69
+ def validate_fixture(path: Path) -> FixtureResult:
70
+ import ezdxf # type: ignore
71
+
72
+ doc = ezdxf.readfile(str(path))
73
+
74
+ acadver = _get_acadver(doc)
75
+ entities_total, entity_types = _count_entity_types(doc)
76
+ audit_errors, audit_fixes, audit_warnings, audit_has_fatal_error = _audit(doc)
77
+
78
+ return FixtureResult(
79
+ file=str(path),
80
+ acadver=acadver,
81
+ entities_total=entities_total,
82
+ entity_types=entity_types,
83
+ audit_errors=audit_errors,
84
+ audit_fixes=audit_fixes,
85
+ audit_warnings=audit_warnings,
86
+ audit_has_fatal_error=audit_has_fatal_error,
87
+ )
88
+
89
+
90
+ def main() -> int:
91
+ parser = argparse.ArgumentParser(
92
+ description="Validate DXF fixtures in test/resources using ezdxf"
93
+ )
94
+ parser.add_argument(
95
+ "--resources",
96
+ default=str(Path(__file__).resolve().parents[1] / "test" / "resources"),
97
+ help="Path to test/resources directory",
98
+ )
99
+ parser.add_argument(
100
+ "--json",
101
+ action="store_true",
102
+ help="Output machine-readable JSON",
103
+ )
104
+ parser.add_argument(
105
+ "--fail-on-audit-errors",
106
+ action="store_true",
107
+ help="Exit non-zero if ezdxf audit reports errors or fatal errors",
108
+ )
109
+
110
+ args = parser.parse_args()
111
+
112
+ resources_dir = Path(args.resources)
113
+ if not resources_dir.exists() or not resources_dir.is_dir():
114
+ raise SystemExit(f"resources dir not found: {resources_dir}")
115
+
116
+ dxf_files = sorted(resources_dir.glob("*.dxf"))
117
+
118
+ results: list[FixtureResult] = []
119
+ failures: list[str] = []
120
+
121
+ for f in dxf_files:
122
+ try:
123
+ results.append(validate_fixture(f))
124
+ except Exception as e:
125
+ failures.append(f"{f.name}: {e}")
126
+
127
+ if args.json:
128
+ payload = {
129
+ "resources": str(resources_dir),
130
+ "count": len(results),
131
+ "results": [asdict(r) for r in results],
132
+ "read_failures": failures,
133
+ }
134
+ print(json.dumps(payload, indent=2, sort_keys=True))
135
+ else:
136
+ print(f"Validated {len(results)} fixture(s) from {resources_dir}")
137
+ if failures:
138
+ print("\nRead failures:")
139
+ for msg in failures:
140
+ print(f"- {msg}")
141
+
142
+ # Print a compact per-file summary, sorted by filename.
143
+ for r in sorted(results, key=lambda x: os.path.basename(x.file)):
144
+ base = os.path.basename(r.file)
145
+ print(
146
+ f"{base}: acadver={r.acadver} entities={r.entities_total} "
147
+ f"audit(errors={r.audit_errors}, fixes={r.audit_fixes}, warnings={r.audit_warnings}, fatal={r.audit_has_fatal_error})"
148
+ )
149
+
150
+ # Failure policy:
151
+ # - Always fail if any file cannot be read by ezdxf.
152
+ # - Optionally fail on audit errors/fatal errors.
153
+ if failures:
154
+ return 2
155
+
156
+ if args.fail_on_audit_errors:
157
+ for r in results:
158
+ if r.audit_has_fatal_error or r.audit_errors > 0:
159
+ return 3
160
+
161
+ return 0
162
+
163
+
164
+ if __name__ == "__main__":
165
+ raise SystemExit(main())
@@ -1,248 +0,0 @@
1
- # DIMENSION Implementation Summary
2
-
3
- ## Overview
4
-
5
- The `DIMENSION` entity has been fully implemented with complete support for the `DIMSTYLE` system, including parsing, storage, and SVG rendering of all 6 DXF dimension types.
6
-
7
- ## Implementation Status
8
-
9
- ### ✅ Phase 1: DIMSTYLE Parsing and Storage (100%)
10
-
11
- * **DIMSTYLE Handler**: `src/handlers/tables.ts`
12
- * 68+ properties parsed via group codes
13
- * Main properties: DIMASZ (41), DIMTXT (140), DIMEXO (176), DIMEXE (177)
14
- * Colors: DIMCLRD (176), DIMCLRE (177), DIMCLRT (178)
15
- * Line weights: DIMLWD (371), DIMLWE (372)
16
- * Arrow blocks: DIMBLK (342), DIMBLK1 (343), DIMBLK2 (344)
17
- * Tolerances: DIMTOL (71), DIMTOLJ (283)
18
- * Alternate units: DIMALT (170), DIMALTF (143), DIMALTD (171)
19
-
20
- * **TypeScript Interfaces**:
21
- * `DimStyleInternal` in `src/types/tables.ts` (internal storage)
22
- * `DimStyleTable` in `src/types/dxf.ts` (public API)
23
-
24
- * **Integration**:
25
- * DIMSTYLE stored in `parsed.tables.dimStyles`
26
- * DIMENSION entity linked to style via `styleName`
27
-
28
- ### ✅ Phase 2: Modular Architecture (100%)
29
-
30
- * **Dedicated Module**: `src/dimensionToSVG.ts` (428 lines)
31
- * Dispatcher based on `entity.dimensionType`
32
- * 6 specialized rendering functions
33
- * SVG marker system for arrows
34
- * Helper functions for colors and geometry
35
-
36
- * **Main Functions**:
37
- * `dimensionToSVG()`: Main dispatcher
38
- * `createArrowMarker()`: SVG marker creation with unique IDs
39
- * `colorNumberToSVG()`: DXF color conversion (0-255) to RGB
40
- * `getDimensionColors()`: Color extraction from DIMSTYLE
41
-
42
- * **Integration with toSVG.ts**:
43
- * `dimension()` calls `dimensionToSVG()` with correct DIMSTYLE
44
- * Apply transforms to dimensions
45
-
46
- ### ✅ Phase 3: Advanced Rendering (100%)
47
-
48
- All 6 dimension types implemented with precise geometry:
49
-
50
- #### 1. Linear Dimension (types 0 and 1)
51
-
52
- * Extension lines with offset (DIMEXO) and extension (DIMEXE)
53
- * Perpendicular geometry calculation (angle + π/2)
54
- * Dimension line with arrows at ends
55
- * Rotated text aligned to dimension
56
- * File: `renderLinearDimension()`
57
-
58
- #### 2. Angular Dimension (type 2)
59
-
60
- * Radial extension lines from center
61
- * Dimension line as SVG arc
62
- * Large-arc flag calculation for arcs > 180°
63
- * Arrows at arc ends
64
- * Text rotated at mid-angle
65
- * File: `renderAngularDimension()`
66
-
67
- #### 3. Diameter Dimension (type 3)
68
-
69
- * Line through circle
70
- * Symbol ⌀ (Unicode U+2300) in text
71
- * Single arrow at end
72
- * File: `renderDiameterDimension()`
73
-
74
- #### 4. Radius Dimension (type 4)
75
-
76
- * Line from center to circumference
77
- * Prefix "R" in text
78
- * Single arrow at end
79
- * File: `renderRadialDimension()`
80
-
81
- #### 5. Ordinate Dimension (type 6)
82
-
83
- * Simple leader line
84
- * No arrows (per DXF specification)
85
- * Text with X or Y coordinate
86
- * File: `renderOrdinateDimension()`
87
-
88
- #### 6. Fallback
89
-
90
- * Minimal rendering for unsupported types
91
- * Text only at textMidpoint position
92
- * File: `renderFallbackDimension()`
93
-
94
- ### ✅ Phase 4: Colors and Refinements (100%)
95
-
96
- #### DIMSTYLE Colors (100%)
97
-
98
- * **DIMCLRD**: Dimension line color
99
- * **DIMCLRE**: Extension line color
100
- * **DIMCLRT**: Text color
101
- * **DIMLWD**: Dimension line weight
102
- * **DIMLWE**: Extension line weight
103
-
104
- Implementation:
105
-
106
- * DXF color table: `src/util/colors.ts` (267 colors)
107
- * DXF → RGB conversion: `colorNumberToSVG()`
108
- * Special cases: 0 (ByBlock), 256 (ByLayer), 7 (white/black) → currentColor
109
- * Applied in all rendering functions
110
- * Arrow markers inherit dimension line color
111
-
112
- #### Optional Features (Not Implemented)
113
-
114
- **Custom Arrow Blocks (⏸️ Low Priority)**
115
-
116
- * DIMBLK, DIMBLK1, DIMBLK2 parsed and available
117
- * Requires complex integration with INSERT renderer
118
- * Fallback to standard triangular arrows works in most cases
119
-
120
- **Tolerances and Alternate Units (⏸️ Low Priority)**
121
-
122
- * DIMTOL, DIMALT and related properties parsed
123
- * Requires complex multi-line text formatting
124
- * Simple text sufficient for most cases
125
-
126
- **XDATA Overrides (⏸️ Rare Edge Case)**
127
-
128
- * Per-entity DIMSTYLE property overrides via XDATA
129
- * Not implemented
130
- * Default DIMSTYLE works in most cases
131
-
132
- ## Modified Files
133
-
134
- ### Created
135
-
136
- * `src/dimensionToSVG.ts`: Complete rendering module (428 lines)
137
- * `docs/DIMENSION_IMPLEMENTATION_PLAN.md`: Detailed implementation plan
138
- * `docs/DIMENSION_SUMMARY.md`: This file
139
-
140
- ### Modified
141
-
142
- * `src/handlers/entity/dimension.ts`: Added text (1) and styleName (3) parsing
143
- * `src/types/dimension-entity.ts`: Added text and styleName properties
144
- * `src/handlers/tables.ts`: Complete DIMSTYLE handler (68 properties)
145
- * `src/types/tables.ts`: DimStyleInternal interface
146
- * `src/types/dxf.ts`: DimStyleTable interface (public API)
147
- * `src/toSVG.ts`: Integration with dimensionToSVG, pass dimStyles
148
- * `docs/IMPLEMENTED-2D-ENTITIES.md`: Updated DIMENSION entry
149
-
150
- ## Commits
151
-
152
- ### Commit 1: Phases 1 and 2
153
-
154
- ```text
155
- feat: add complete DIMSTYLE parsing and modular architecture for DIMENSION
156
-
157
- Phase 1: DIMSTYLE Parsing and Storage
158
- - Create complete DIMSTYLE handler with 68+ properties
159
- - Process group codes: DIMASZ (41), DIMTXT (140), DIMEXO (176), DIMEXE (177), etc.
160
- - Add DimStyleInternal and DimStyleTable interfaces
161
- - Integrate dimStyles into parsed.tables
162
- - Link DIMENSION entities to their DIMSTYLE via styleName
163
-
164
- Phase 2: Modular Rendering Architecture
165
- - Create dedicated module src/dimensionToSVG.ts
166
- - Implement dispatcher based on dimensionType
167
- - Create 6 specialized rendering functions
168
- - Add createArrowMarker for SVG markers
169
- - Integrate dimensionToSVG with toSVG.ts
170
- ```
171
-
172
- 9 files modified, 874 insertions(+), 10 deletions(-)
173
-
174
- ### Commit 2: Phase 3
175
-
176
- ```text
177
- feat: implement advanced dimension rendering with extension lines and arrows
178
-
179
- Phase 3: Advanced Rendering
180
- - Implement extension lines with DIMEXO (offset) and DIMEXE (extension)
181
- - Add perpendicular geometry calculation for extension lines
182
- - Create SVG markers for arrows with unique IDs (timestamp-based)
183
- - Implement text rotation aligned to dimension
184
- - Add angular dimensions with SVG arcs
185
- - Implement ⌀ and R symbols for diameter/radius
186
- - Support ordinate dimensions without arrows
187
- - Apply configurable line weights
188
- ```
189
-
190
- 2 files modified, 145 insertions(+), 30 deletions(-)
191
-
192
- ### Commit 3: Phase 4 (This Commit)
193
-
194
- ```text
195
- feat: add complete DIMSTYLE color support and documentation
196
-
197
- Phase 4: Colors and Refinements
198
- - Add colorNumberToSVG function for DXF → RGB conversion
199
- - Implement getDimensionColors to extract colors from DIMSTYLE
200
- - Apply DIMCLRD (dimension line color) in all renderings
201
- - Apply DIMCLRE (extension line color) in all renderings
202
- - Apply DIMCLRT (text color) in all renderings
203
- - Apply DIMLWD and DIMLWE (line weights) to lines
204
- - Add dimBlk, dimBlk1, dimBlk2 properties to DimStyleTable
205
- - Update implementation plan with complete status
206
- - Update entity documentation with detailed implementation
207
- - Create complete implementation summary
208
- ```
209
-
210
- ## Testing and Validation
211
-
212
- ### Build
213
-
214
- * ✅ ESM Build: 21-24ms
215
- * ✅ CJS Build: 18-19ms
216
- * ✅ 0 TypeScript errors
217
- * ⚠️ 1 warning (import.meta in es2015 - unrelated)
218
-
219
- ### Generated Files
220
-
221
- * `lib/dimensionToSVG.js`: 14.6kb (ESM)
222
- * `lib/dimensionToSVG.cjs`: 16.4kb (CJS)
223
- * `lib/handlers/tables.js`: 15.3kb (ESM)
224
- * `lib/handlers/tables.cjs`: 16.8kb (CJS)
225
-
226
- ### Feature Coverage
227
-
228
- * ✅ Parsing: 100% (68 DIMSTYLE properties)
229
- * ✅ Basic rendering: 100% (6 dimension types)
230
- * ✅ Advanced rendering: 100% (extension lines, arrows, rotation)
231
- * ✅ Colors: 100% (DIMCLRD, DIMCLRE, DIMCLRT)
232
- * ⏸️ Custom arrows: 0% (optional, low priority)
233
- * ⏸️ Tolerances: 0% (optional, low priority)
234
- * ⏸️ XDATA overrides: 0% (optional, edge case)
235
-
236
- ## Next Steps (Optional)
237
-
238
- 1. **Unit tests**: Create tests for each dimension type
239
- 2. **Integration tests**: Validate with real DXF files
240
- 3. **Custom arrow blocks**: Implement if there is demand
241
- 4. **Tolerances**: Implement if there is demand
242
- 5. **Performance**: Profiling and optimization if necessary
243
-
244
- ## Conclusion
245
-
246
- The `DIMENSION` implementation is complete for common use cases (estimate: 95% of DXF files). The optional features not implemented are rare edge cases or too complex for the limited benefit they would provide.
247
-
248
- The modular architecture allows for easy future extension if needed.
@@ -1,248 +0,0 @@
1
- # Resumo da Implementação de DIMENSION
2
-
3
- ## Visão Geral
4
-
5
- A entidade `DIMENSION` foi completamente implementada com suporte total ao sistema de estilos `DIMSTYLE`, incluindo parsing, armazenamento e renderização SVG de todos os 6 tipos de dimensão do DXF.
6
-
7
- ## Status de Implementação
8
-
9
- ### ✅ Fase 1: Parsing e Armazenamento de DIMSTYLE (100%)
10
-
11
- * **Handler de DIMSTYLE**: `src/handlers/tables.ts`
12
- * 68+ propriedades parseadas via group codes
13
- * Propriedades principais: DIMASZ (41), DIMTXT (140), DIMEXO (176), DIMEXE (177)
14
- * Cores: DIMCLRD (176), DIMCLRE (177), DIMCLRT (178)
15
- * Espessuras: DIMLWD (371), DIMLWE (372)
16
- * Blocos de seta: DIMBLK (342), DIMBLK1 (343), DIMBLK2 (344)
17
- * Tolerâncias: DIMTOL (71), DIMTOLJ (283)
18
- * Unidades alternativas: DIMALT (170), DIMALTF (143), DIMALTD (171)
19
-
20
- * **Interfaces TypeScript**:
21
- * `DimStyleInternal` em `src/types/tables.ts` (armazenamento interno)
22
- * `DimStyleTable` em `src/types/dxf.ts` (API pública)
23
-
24
- * **Integração**:
25
- * DIMSTYLE armazenado em `parsed.tables.dimStyles`
26
- * Entidade DIMENSION vinculada ao estilo via `styleName`
27
-
28
- ### ✅ Fase 2: Arquitetura Modular (100%)
29
-
30
- * **Módulo dedicado**: `src/dimensionToSVG.ts` (428 linhas)
31
- * Dispatcher baseado em `entity.dimensionType`
32
- * 6 funções especializadas de renderização
33
- * Sistema de markers SVG para setas
34
- * Funções helper para cores e geometria
35
-
36
- * **Funções principais**:
37
- * `dimensionToSVG()`: Dispatcher principal
38
- * `createArrowMarker()`: Criação de markers SVG com IDs únicos
39
- * `colorNumberToSVG()`: Conversão de cores DXF (0-255) para RGB
40
- * `getDimensionColors()`: Extração de cores do DIMSTYLE
41
-
42
- * **Integração com toSVG.ts**:
43
- * `dimension()` chama `dimensionToSVG()` com DIMSTYLE correto
44
- * Aplicação de transforms às dimensões
45
-
46
- ### ✅ Fase 3: Renderização Avançada (100%)
47
-
48
- Todos os 6 tipos de dimensão implementados com geometria precisa:
49
-
50
- #### 1. Dimensão Linear (tipos 0 e 1)
51
-
52
- * Extension lines com offset (DIMEXO) e extensão (DIMEXE)
53
- * Cálculo de geometria perpendicular (angle + π/2)
54
- * Dimension line com setas nas extremidades
55
- * Texto rotacionado alinhado à dimensão
56
- * Arquivo: `renderLinearDimension()`
57
-
58
- #### 2. Dimensão Angular (tipo 2)
59
-
60
- * Extension lines radiais a partir do centro
61
- * Dimension line como arco SVG
62
- * Cálculo de large-arc flag para arcos > 180°
63
- * Setas nas extremidades do arco
64
- * Texto rotacionado no ângulo médio
65
- * Arquivo: `renderAngularDimension()`
66
-
67
- #### 3. Dimensão de Diâmetro (tipo 3)
68
-
69
- * Linha através do círculo
70
- * Símbolo ⌀ (Unicode U+2300) no texto
71
- * Seta única na extremidade
72
- * Arquivo: `renderDiameterDimension()`
73
-
74
- #### 4. Dimensão de Raio (tipo 4)
75
-
76
- * Linha do centro até a circunferência
77
- * Prefixo "R" no texto
78
- * Seta única na extremidade
79
- * Arquivo: `renderRadialDimension()`
80
-
81
- #### 5. Dimensão Ordenada (tipo 6)
82
-
83
- * Linha de chamada simples
84
- * Sem setas (conforme especificação DXF)
85
- * Texto com coordenada X ou Y
86
- * Arquivo: `renderOrdinateDimension()`
87
-
88
- #### 6. Fallback
89
-
90
- * Renderização mínima para tipos não suportados
91
- * Apenas texto na posição textMidpoint
92
- * Arquivo: `renderFallbackDimension()`
93
-
94
- ### ✅ Fase 4: Cores e Refinamentos (100%)
95
-
96
- #### Cores DIMSTYLE (100%)
97
-
98
- * **DIMCLRD**: Cor das dimension lines
99
- * **DIMCLRE**: Cor das extension lines
100
- * **DIMCLRT**: Cor do texto
101
- * **DIMLWD**: Espessura das dimension lines
102
- * **DIMLWE**: Espessura das extension lines
103
-
104
- Implementação:
105
-
106
- * Tabela de cores DXF: `src/util/colors.ts` (267 cores)
107
- * Conversão DXF → RGB: `colorNumberToSVG()`
108
- * Casos especiais: 0 (ByBlock), 256 (ByLayer), 7 (white/black) → currentColor
109
- * Aplicado em todas as funções de renderização
110
- * Markers de seta herdam cor da dimension line
111
-
112
- #### Funcionalidades Opcionais (Não Implementadas)
113
-
114
- **Custom Arrow Blocks (⏸️ Baixa Prioridade)**
115
-
116
- * DIMBLK, DIMBLK1, DIMBLK2 parseados e disponíveis
117
- * Requer integração complexa com renderizador de INSERT
118
- * Fallback para setas triangulares padrão funciona na maioria dos casos
119
-
120
- **Tolerâncias e Unidades Alternativas (⏸️ Baixa Prioridade)**
121
-
122
- * DIMTOL, DIMALT e propriedades relacionadas parseadas
123
- * Requer formatação complexa de texto com múltiplas linhas
124
- * Texto simples suficiente para maioria dos casos
125
-
126
- **XDATA Overrides (⏸️ Edge Case Raro)**
127
-
128
- * Overrides de propriedades DIMSTYLE por entidade via XDATA
129
- * Não implementado
130
- * DIMSTYLE padrão funciona na maioria dos casos
131
-
132
- ## Arquivos Modificados
133
-
134
- ### Criados
135
-
136
- * `src/dimensionToSVG.ts`: Módulo completo de renderização (428 linhas)
137
- * `docs/DIMENSION_IMPLEMENTATION_PLAN.md`: Plano detalhado de implementação
138
- * `docs/DIMENSION_SUMMARY.md`: Este arquivo
139
-
140
- ### Modificados
141
-
142
- * `src/handlers/entity/dimension.ts`: Adicionado parsing de text (1) e styleName (3)
143
- * `src/types/dimension-entity.ts`: Adicionadas propriedades text e styleName
144
- * `src/handlers/tables.ts`: Handler completo de DIMSTYLE (68 propriedades)
145
- * `src/types/tables.ts`: Interface DimStyleInternal
146
- * `src/types/dxf.ts`: Interface DimStyleTable (API pública)
147
- * `src/toSVG.ts`: Integração com dimensionToSVG, passa dimStyles
148
- * `docs/ENTIDADES-2D-IMPLEMENTADAS.md`: Atualizada entrada de DIMENSION
149
-
150
- ## Commits
151
-
152
- ### Commit 1: Phases 1 & 2
153
-
154
- ```text
155
- feat: adicionar parsing completo de DIMSTYLE e arquitetura modular para DIMENSION
156
-
157
- Fase 1: Parsing e Armazenamento de DIMSTYLE
158
- - Criar handler completo de DIMSTYLE com 68+ propriedades
159
- - Processar group codes: DIMASZ (41), DIMTXT (140), DIMEXO (176), DIMEXE (177), etc.
160
- - Adicionar interfaces DimStyleInternal e DimStyleTable
161
- - Integrar dimStyles no parsed.tables
162
- - Vincular DIMENSION entities ao seu DIMSTYLE via styleName
163
-
164
- Fase 2: Arquitetura Modular de Renderização
165
- - Criar módulo dedicado src/dimensionToSVG.ts
166
- - Implementar dispatcher baseado em dimensionType
167
- - Criar 6 funções especializadas de renderização
168
- - Adicionar createArrowMarker para SVG markers
169
- - Integrar dimensionToSVG com toSVG.ts
170
- ```
171
-
172
- 9 arquivos modificados, 874 inserções(+), 10 deleções(-)
173
-
174
- ### Commit 2: Phase 3
175
-
176
- ```text
177
- feat: implementar renderização avançada de dimensões com extension lines e setas
178
-
179
- Fase 3: Renderização Avançada
180
- - Implementar extension lines com DIMEXO (offset) e DIMEXE (extension)
181
- - Adicionar cálculo de geometria perpendicular para extension lines
182
- - Criar markers SVG para setas com IDs únicos (timestamp-based)
183
- - Implementar rotação de texto alinhada à dimensão
184
- - Adicionar dimensões angulares com arcos SVG
185
- - Implementar símbolos ⌀ e R para diâmetro/raio
186
- - Suportar dimensões de ordenada sem setas
187
- - Aplicar espessuras de linha configuráveis
188
- ```
189
-
190
- 2 arquivos modificados, 145 inserções(+), 30 deleções(-)
191
-
192
- ### Commit 3: Phase 4 (Este Commit)
193
-
194
- ```text
195
- feat: adicionar suporte completo a cores DIMSTYLE e documentação
196
-
197
- Fase 4: Cores e Refinamentos
198
- - Adicionar função colorNumberToSVG para conversão DXF → RGB
199
- - Implementar getDimensionColors para extrair cores do DIMSTYLE
200
- - Aplicar DIMCLRD (cor dimension lines) em todas as renderizações
201
- - Aplicar DIMCLRE (cor extension lines) em todas as renderizações
202
- - Aplicar DIMCLRT (cor texto) em todas as renderizações
203
- - Aplicar DIMLWD e DIMLWE (espessuras) em linhas
204
- - Adicionar propriedades dimBlk, dimBlk1, dimBlk2 no DimStyleTable
205
- - Atualizar plano de implementação com status completo
206
- - Atualizar documentação de entidades com implementação detalhada
207
- - Criar resumo completo da implementação
208
- ```
209
-
210
- ## Testes e Validação
211
-
212
- ### Compilação
213
-
214
- * ✅ Build ESM: 21-24ms
215
- * ✅ Build CJS: 18-19ms
216
- * ✅ 0 erros TypeScript
217
- * ⚠️ 1 warning (import.meta em es2015 - não relacionado)
218
-
219
- ### Arquivos Gerados
220
-
221
- * `lib/dimensionToSVG.js`: 14.6kb (ESM)
222
- * `lib/dimensionToSVG.cjs`: 16.4kb (CJS)
223
- * `lib/handlers/tables.js`: 15.3kb (ESM)
224
- * `lib/handlers/tables.cjs`: 16.8kb (CJS)
225
-
226
- ### Cobertura de Funcionalidades
227
-
228
- * ✅ Parsing: 100% (68 propriedades DIMSTYLE)
229
- * ✅ Renderização básica: 100% (6 tipos de dimensão)
230
- * ✅ Renderização avançada: 100% (extension lines, setas, rotação)
231
- * ✅ Cores: 100% (DIMCLRD, DIMCLRE, DIMCLRT)
232
- * ⏸️ Custom arrows: 0% (opcional, baixa prioridade)
233
- * ⏸️ Tolerâncias: 0% (opcional, baixa prioridade)
234
- * ⏸️ XDATA overrides: 0% (opcional, edge case)
235
-
236
- ## Próximos Passos (Opcionais)
237
-
238
- 1. **Testes unitários**: Criar testes para cada tipo de dimensão
239
- 2. **Testes de integração**: Validar com arquivos DXF reais
240
- 3. **Custom arrow blocks**: Implementar se houver demanda
241
- 4. **Tolerâncias**: Implementar se houver demanda
242
- 5. **Performance**: Profiling e otimização se necessário
243
-
244
- ## Conclusão
245
-
246
- A implementação de `DIMENSION` está completa para casos de uso comuns (estimativa: 95% dos arquivos DXF). As funcionalidades opcionais não implementadas são edge cases raros ou complexos demais para o benefício limitado que trariam.
247
-
248
- A arquitetura modular permite fácil extensão futura se necessário.