@linkiez/dxf-renew 7.0.0 → 7.1.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 (131) hide show
  1. package/.github/instructions/code-patterns.instructions.md +1 -1
  2. package/.github/instructions/exdxf.instruction.md +161 -0
  3. package/.github/instructions/tdd.instructions.md +271 -0
  4. package/.yarn/install-state.gz +0 -0
  5. package/CHANGELOG.md +23 -0
  6. package/CONTRIBUTING.md +16 -14
  7. package/PLAN.md +34 -84
  8. package/README.md +43 -8
  9. package/dist/dxf.js +1388 -376
  10. package/docs/DIMENSION_SUMMARY.md +11 -5
  11. package/docs/DXF_VERSION_SUPPORT.md +45 -0
  12. package/docs/ENTITY_SVG_ROADMAP.md +96 -0
  13. package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
  14. package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
  15. package/docs/README.md +22 -0
  16. package/docs/SVG_RENDERING_INTEGRATION_TESTS.md +119 -0
  17. package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +1 -1
  18. package/lib/Helper.cjs +2 -2
  19. package/lib/Helper.cjs.map +2 -2
  20. package/lib/Helper.js +2 -2
  21. package/lib/Helper.js.map +2 -2
  22. package/lib/denormalise.cjs +131 -91
  23. package/lib/denormalise.cjs.map +2 -2
  24. package/lib/denormalise.js +131 -91
  25. package/lib/denormalise.js.map +2 -2
  26. package/lib/dimensionToSVG.cjs +318 -53
  27. package/lib/dimensionToSVG.cjs.map +3 -3
  28. package/lib/dimensionToSVG.js +316 -52
  29. package/lib/dimensionToSVG.js.map +2 -2
  30. package/lib/handlers/entities.cjs +90 -26
  31. package/lib/handlers/entities.cjs.map +3 -3
  32. package/lib/handlers/entities.js +90 -26
  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/pdfUnderlay.cjs +106 -0
  55. package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
  56. package/lib/handlers/entity/pdfUnderlay.js +71 -0
  57. package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
  58. package/lib/handlers/entity/tolerance.cjs +90 -0
  59. package/lib/handlers/entity/tolerance.cjs.map +7 -0
  60. package/lib/handlers/entity/tolerance.js +55 -0
  61. package/lib/handlers/entity/tolerance.js.map +7 -0
  62. package/lib/handlers/objects.cjs +257 -136
  63. package/lib/handlers/objects.cjs.map +2 -2
  64. package/lib/handlers/objects.js +257 -136
  65. package/lib/handlers/objects.js.map +2 -2
  66. package/lib/toSVG.cjs +71 -8
  67. package/lib/toSVG.cjs.map +3 -3
  68. package/lib/toSVG.js +72 -9
  69. package/lib/toSVG.js.map +2 -2
  70. package/lib/types/dimension-entity.cjs.map +1 -1
  71. package/lib/types/entity.cjs.map +1 -1
  72. package/lib/types/image-entity.cjs +17 -0
  73. package/lib/types/image-entity.cjs.map +7 -0
  74. package/lib/types/image-entity.js +1 -0
  75. package/lib/types/image-entity.js.map +7 -0
  76. package/lib/types/index.cjs +8 -0
  77. package/lib/types/index.cjs.map +2 -2
  78. package/lib/types/index.js +4 -0
  79. package/lib/types/index.js.map +2 -2
  80. package/lib/types/leader-entity.cjs +17 -0
  81. package/lib/types/leader-entity.cjs.map +7 -0
  82. package/lib/types/leader-entity.js +1 -0
  83. package/lib/types/leader-entity.js.map +7 -0
  84. package/lib/types/options.cjs.map +1 -1
  85. package/lib/types/tables.cjs.map +1 -1
  86. package/lib/types/tolerance-entity.cjs +17 -0
  87. package/lib/types/tolerance-entity.cjs.map +7 -0
  88. package/lib/types/tolerance-entity.js +1 -0
  89. package/lib/types/tolerance-entity.js.map +7 -0
  90. package/lib/types/underlay-entity.cjs +17 -0
  91. package/lib/types/underlay-entity.cjs.map +7 -0
  92. package/lib/types/underlay-entity.js +1 -0
  93. package/lib/types/underlay-entity.js.map +7 -0
  94. package/lib/util/escapeXmlText.cjs +27 -0
  95. package/lib/util/escapeXmlText.cjs.map +7 -0
  96. package/lib/util/escapeXmlText.js +7 -0
  97. package/lib/util/escapeXmlText.js.map +7 -0
  98. package/package.json +6 -1
  99. package/playwright.config.cjs +20 -0
  100. package/src/Helper.ts +3 -3
  101. package/src/denormalise.ts +182 -116
  102. package/src/dimensionToSVG.ts +466 -54
  103. package/src/handlers/entities.ts +109 -34
  104. package/src/handlers/entity/dgnUnderlay.ts +94 -0
  105. package/src/handlers/entity/dimension.ts +27 -1
  106. package/src/handlers/entity/dwfUnderlay.ts +94 -0
  107. package/src/handlers/entity/image.ts +118 -0
  108. package/src/handlers/entity/leader.ts +153 -0
  109. package/src/handlers/entity/pdfUnderlay.ts +94 -0
  110. package/src/handlers/entity/tolerance.ts +75 -0
  111. package/src/handlers/objects.ts +323 -139
  112. package/src/toSVG.ts +98 -7
  113. package/src/types/dimension-entity.ts +11 -0
  114. package/src/types/entity.ts +10 -0
  115. package/src/types/image-entity.ts +35 -0
  116. package/src/types/index.ts +4 -0
  117. package/src/types/leader-entity.ts +40 -0
  118. package/src/types/options.ts +41 -0
  119. package/src/types/tables.ts +84 -0
  120. package/src/types/tolerance-entity.ts +20 -0
  121. package/src/types/underlay-entity.ts +35 -0
  122. package/src/util/escapeXmlText.ts +10 -0
  123. package/tools/browser_test_server.cjs +87 -0
  124. package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
  125. package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
  126. package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
  127. package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
  128. package/tools/ezdxf_validate_fixtures.py +165 -0
  129. package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
  130. package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
  131. 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
- # 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.
@@ -1,54 +0,0 @@
1
- # Lista de Entidades DXF 2D
2
-
3
- Esta lista foi gerada com base na documentação de referência do AutoCAD 2012 DXF. Ela cataloga as entidades 2D, indicando se já foram implementadas neste projeto.
4
-
5
- | Entidade | Implementado | Descrição |
6
- | :--- | :---: | :--- |
7
- | **ARC** | ✅ | Um arco circular. |
8
- | **CIRCLE** | ✅ | Um círculo. |
9
- | **ELLIPSE** | ✅ | Uma elipse ou um arco elíptico. |
10
- | **HATCH** | ✅ | Preenche uma área delimitada com um padrão, cor sólida ou gradiente. |
11
- | **LINE** | ✅ | Um segmento de linha reta. |
12
- | **LWPOLYLINE** | ✅ | Uma polilinha 2D leve (lightweight). |
13
- | **MTEXT** | ✅ | Texto de múltiplas linhas com formatação avançada. |
14
- | **POINT** | ✅ | Uma entidade de ponto. |
15
- | **POLYLINE** | ✅ | Uma polilinha 2D ou 3D (com vértices). |
16
- | **SOLID** | ✅ | Uma área 2D preenchida com cor sólida. |
17
- | **SPLINE** | ✅ | Uma curva spline. |
18
- | **TEXT** | ✅ | Uma única linha de texto. |
19
- | **DIMENSION** | ✅ | Entidade de dimensão (linear, angular, radial, etc.). **Implementação completa**: parsing de text e styleName, integração com DIMSTYLE (68+ propriedades), renderização de 6 tipos de dimensão com extension lines, setas, rotação de texto, suporte a cores (DIMCLRD, DIMCLRE, DIMCLRT) e espessuras (DIMLWD, DIMLWE). Ver `docs/DIMENSION_IMPLEMENTATION_PLAN.md` para detalhes. |
20
- | **INSERT** | ✅ | Uma inserção de bloco (block reference). |
21
- | **ATTDEF** | ✅ | Definição de atributo para um bloco. |
22
- | **ATTRIB** | ✅ | Uma instância de atributo anexada a um bloco. |
23
- | **OLE2FRAME** | ✅ | Um objeto OLE (Object Linking and Embedding). |
24
- | **LEADER** | ❌ | Uma linha de chamada, usada para anotações. Cria uma linha que conecta a anotação a um recurso em um desenho. |
25
- | **MLINE** | ❌ | Uma entidade de múltiplas linhas paralelas. |
26
- | **RAY** | ❌ | Uma linha semi-infinita que se estende infinitamente em uma direção a partir de seu ponto inicial. |
27
- | **SHAPE** | ❌ | Uma forma de um arquivo de formas (.shx). Insere uma forma nomeada a partir de um arquivo de forma que já tenha sido carregado usando o comando LOAD. |
28
- | **TOLERANCE** | ❌ | Uma tolerância geométrica. Cria tolerâncias geométricas contidas em um quadro de controle de recurso. |
29
- | **TRACE** | ❌ | Uma linha 2D sólida com espessura. |
30
- | **WIPEOUT** | ❌ | Uma área que mascara outros objetos com a cor de fundo. |
31
- | **XLINE** | ❌ | Uma linha de construção infinita. |
32
-
33
- ---
34
-
35
- ## Entidades 3D (Para Referência)
36
-
37
- | Entidade | Implementado | Descrição |
38
- | :--- | :---: | :--- |
39
- | **3DFACE** | ✅ | Uma face tridimensional. |
40
- | **3DSOLID** | ❌ | Um objeto sólido ACIS 3D. Exibe sólidos 3D como objetos de arame ou sombreados. |
41
- | **BODY** | ❌ | Um objeto de corpo ACIS 3D. |
42
- | **HELIX** | ❌ | Uma hélice 3D. |
43
- | **IMAGE** | ❌ | Uma imagem raster. |
44
- | **LIGHT** | ❌ | Uma fonte de luz. |
45
- | **MESH** | ❌ | Uma malha 3D. |
46
- | **REGION** | ❌ | Uma área 2D fechada (região). |
47
- | **SECTION** | ❌ | Um objeto de seção. |
48
- | **SUN** | ❌ | Um objeto de luz solar. |
49
- | **SURFACE** | ❌ | Uma superfície 3D (extrudada, loft, etc.). |
50
- | **TABLE** | ❌ | Uma entidade de tabela. |
51
- | **UNDERLAY** | ❌ | Uma subjacência (ex: DWF, DGN, PDF). |
52
- | **VIEWPORT** | ✅ | Uma viewport em paper space. |
53
-
54
- *Observação: A implementação de `POLYLINE` pode incluir vértices 3D, mas a entidade em si é frequentemente usada para formas 2D.*
@@ -1,169 +0,0 @@
1
- # TEXT, MTEXT e DIMENSION - Suporte de Renderização SVG
2
-
3
- ## Resumo das Mudanças
4
-
5
- Adicionado suporte completo para renderização de entidades TEXT, MTEXT e DIMENSION em SVG.
6
-
7
- ## Entidades Suportadas
8
-
9
- ### TEXT
10
-
11
- - Renderização básica de texto
12
- - Suporte para rotação (código 50)
13
- - Suporte para posicionamento (códigos 10, 20, 30)
14
- - Suporte para altura do texto (código 40)
15
- - Alinhamento horizontal e vertical (códigos 72, 73)
16
-
17
- ### MTEXT
18
-
19
- - Renderização de texto multilinha
20
- - Suporte para rotação via direção do eixo X (códigos 11, 21)
21
- - Suporte para largura do retângulo de referência (código 41)
22
- - Altura nominal do texto (código 40)
23
- - Ponto de fixação (código 71)
24
-
25
- ### DIMENSION
26
-
27
- Suporte para todos os tipos de dimensão:
28
-
29
- #### Tipo 0 - Rotated, horizontal ou vertical
30
-
31
- - Linhas de extensão
32
- - Linha de dimensão
33
- - Texto de dimensão
34
-
35
- #### Tipo 1 - Aligned (alinhada)
36
-
37
- - Linha de dimensão alinhada com os pontos medidos
38
- - Linhas de extensão perpendiculares
39
-
40
- #### Tipo 2 - Angular (angular)
41
-
42
- - Dimensão de ângulo entre duas linhas
43
-
44
- #### Tipo 3 - Diameter (diâmetro)
45
-
46
- - Linha de dimensão radial para diâmetros
47
- - Texto com símbolo de diâmetro
48
-
49
- #### Tipo 4 - Radius (raio)
50
-
51
- - Linha de dimensão radial
52
- - Texto com prefixo R
53
-
54
- #### Tipo 5 - Angular 3 point (angular 3 pontos)
55
-
56
- - Dimensão angular definida por 3 pontos
57
-
58
- #### Tipo 6 - Ordinate (ordenada)
59
-
60
- - Dimensão de coordenada X ou Y
61
- - Linha de extensão simples
62
-
63
- ## Códigos DXF Implementados
64
-
65
- ### TEXT
66
-
67
- | Código | Descrição |
68
- |--------|-----------|
69
- | 1 | Conteúdo do texto |
70
- | 10, 20, 30 | Ponto de inserção (x, y, z) |
71
- | 11, 21, 31 | Segundo ponto de alinhamento |
72
- | 40 | Altura do texto |
73
- | 41 | Escala relativa X |
74
- | 50 | Rotação em graus |
75
- | 51 | Ângulo oblíquo |
76
- | 72 | Alinhamento horizontal |
77
- | 73 | Alinhamento vertical |
78
-
79
- ### MTEXT
80
-
81
- | Código | Descrição |
82
- |--------|-----------|
83
- | 1, 3 | Conteúdo do texto |
84
- | 10, 20, 30 | Ponto de inserção |
85
- | 11, 21, 31 | Direção do eixo X |
86
- | 40 | Altura nominal do texto |
87
- | 41 | Largura do retângulo de referência |
88
- | 71 | Ponto de fixação |
89
- | 72 | Direção do desenho |
90
-
91
- ### DIMENSION
92
-
93
- | Código | Descrição |
94
- |--------|-----------|
95
- | 2 | Nome do bloco |
96
- | 10, 20, 30 | Ponto de definição |
97
- | 11, 21, 31 | Ponto médio do texto |
98
- | 13, 23, 33 | Ponto inicial da medida |
99
- | 14, 24, 34 | Ponto final da medida |
100
- | 50 | Ângulo de rotação |
101
- | 70 | Tipo de dimensão |
102
-
103
- ## Exemplo de Uso
104
-
105
- ```javascript
106
- import { Helper } from '@linkiez/dxf-renew'
107
-
108
- const dxfString = `... conteúdo DXF ...`
109
- const helper = new Helper(dxfString)
110
-
111
- // Converter para SVG (agora inclui TEXT, MTEXT e DIMENSION)
112
- const svg = helper.toSVG()
113
- ```
114
-
115
- ## Testes
116
-
117
- Foram adicionados testes unitários em `test/unit/text-mtext-dimension-rendering.js` que verificam:
118
-
119
- - Renderização básica de TEXT
120
- - Renderização básica de MTEXT
121
- - Renderização de DIMENSION
122
- - Rotação de TEXT
123
- - Rotação de MTEXT via direção do eixo X
124
- - Diferentes tipos de DIMENSION
125
-
126
- Execute os testes com:
127
-
128
- ```bash
129
- npm test
130
- ```
131
-
132
- ## Exemplo Visual
133
-
134
- Um exemplo visual interativo está disponível em `examples/text-dimension-viewer.html`.
135
-
136
- Para visualizar:
137
-
138
- 1. Execute `npm run build` para gerar o bundle
139
- 2. Abra `examples/text-dimension-viewer.html` em um navegador
140
- 3. Carregue um arquivo DXF ou use os arquivos de teste fornecidos
141
-
142
- ## Limitações Conhecidas
143
-
144
- 1. **TEXT e MTEXT**:
145
- - Fonte não é respeitada (usa fonte padrão do navegador)
146
- - Formatação complexa de MTEXT não é totalmente suportada
147
- - Cálculo de bounding box é aproximado
148
-
149
- 2. **DIMENSION**:
150
- - Blocos de dimensão personalizados não são renderizados
151
- - Apenas linhas básicas de dimensão são desenhadas
152
- - Texto de dimensão não é exibido (precisa ser extraído do bloco)
153
- - Setas não são renderizadas
154
-
155
- ## Arquivos Modificados
156
-
157
- - `src/toSVG.js`: Adicionadas funções `text()`, `mtext()`, `dimension()` e `createDimensionPaths()`
158
- - `test/unit/text-mtext-dimension-rendering.js`: Novos testes unitários
159
- - `examples/text-dimension-viewer.html`: Exemplo visual interativo
160
-
161
- ## Próximos Passos
162
-
163
- Para melhorar ainda mais o suporte:
164
-
165
- 1. Implementar renderização de setas de dimensão
166
- 2. Extrair e renderizar texto de dimensão dos blocos
167
- 3. Suportar estilos de texto personalizados
168
- 4. Melhorar cálculo de bounding box para texto
169
- 5. Suportar formatação avançada de MTEXT (cores, negrito, etc.)