@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.
- package/.github/instructions/code-patterns.instructions.md +1 -1
- package/.github/instructions/exdxf.instruction.md +161 -0
- package/.github/instructions/tdd.instructions.md +271 -0
- package/.yarn/install-state.gz +0 -0
- package/CHANGELOG.md +23 -0
- package/CONTRIBUTING.md +16 -14
- package/PLAN.md +34 -84
- package/README.md +43 -8
- package/dist/dxf.js +1388 -376
- package/docs/DIMENSION_SUMMARY.md +11 -5
- package/docs/DXF_VERSION_SUPPORT.md +45 -0
- package/docs/ENTITY_SVG_ROADMAP.md +96 -0
- package/docs/EZDXF_REFERENCE_SITEMAP.md +55 -0
- package/docs/FIXTURE_VALIDATION_EZDXF.md +62 -0
- package/docs/README.md +22 -0
- package/docs/SVG_RENDERING_INTEGRATION_TESTS.md +119 -0
- package/docs/TEXT-MTEXT-DIMENSION-SUPPORT.md +1 -1
- package/lib/Helper.cjs +2 -2
- package/lib/Helper.cjs.map +2 -2
- package/lib/Helper.js +2 -2
- package/lib/Helper.js.map +2 -2
- package/lib/denormalise.cjs +131 -91
- package/lib/denormalise.cjs.map +2 -2
- package/lib/denormalise.js +131 -91
- package/lib/denormalise.js.map +2 -2
- package/lib/dimensionToSVG.cjs +318 -53
- package/lib/dimensionToSVG.cjs.map +3 -3
- package/lib/dimensionToSVG.js +316 -52
- package/lib/dimensionToSVG.js.map +2 -2
- package/lib/handlers/entities.cjs +90 -26
- package/lib/handlers/entities.cjs.map +3 -3
- package/lib/handlers/entities.js +90 -26
- package/lib/handlers/entities.js.map +3 -3
- package/lib/handlers/entity/dgnUnderlay.cjs +106 -0
- package/lib/handlers/entity/dgnUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dgnUnderlay.js +71 -0
- package/lib/handlers/entity/dgnUnderlay.js.map +7 -0
- package/lib/handlers/entity/dimension.cjs +24 -0
- package/lib/handlers/entity/dimension.cjs.map +2 -2
- package/lib/handlers/entity/dimension.js +24 -0
- package/lib/handlers/entity/dimension.js.map +2 -2
- package/lib/handlers/entity/dwfUnderlay.cjs +106 -0
- package/lib/handlers/entity/dwfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/dwfUnderlay.js +71 -0
- package/lib/handlers/entity/dwfUnderlay.js.map +7 -0
- package/lib/handlers/entity/image.cjs +123 -0
- package/lib/handlers/entity/image.cjs.map +7 -0
- package/lib/handlers/entity/image.js +88 -0
- package/lib/handlers/entity/image.js.map +7 -0
- package/lib/handlers/entity/leader.cjs +148 -0
- package/lib/handlers/entity/leader.cjs.map +7 -0
- package/lib/handlers/entity/leader.js +113 -0
- package/lib/handlers/entity/leader.js.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.cjs +106 -0
- package/lib/handlers/entity/pdfUnderlay.cjs.map +7 -0
- package/lib/handlers/entity/pdfUnderlay.js +71 -0
- package/lib/handlers/entity/pdfUnderlay.js.map +7 -0
- package/lib/handlers/entity/tolerance.cjs +90 -0
- package/lib/handlers/entity/tolerance.cjs.map +7 -0
- package/lib/handlers/entity/tolerance.js +55 -0
- package/lib/handlers/entity/tolerance.js.map +7 -0
- package/lib/handlers/objects.cjs +257 -136
- package/lib/handlers/objects.cjs.map +2 -2
- package/lib/handlers/objects.js +257 -136
- package/lib/handlers/objects.js.map +2 -2
- package/lib/toSVG.cjs +71 -8
- package/lib/toSVG.cjs.map +3 -3
- package/lib/toSVG.js +72 -9
- package/lib/toSVG.js.map +2 -2
- package/lib/types/dimension-entity.cjs.map +1 -1
- package/lib/types/entity.cjs.map +1 -1
- package/lib/types/image-entity.cjs +17 -0
- package/lib/types/image-entity.cjs.map +7 -0
- package/lib/types/image-entity.js +1 -0
- package/lib/types/image-entity.js.map +7 -0
- package/lib/types/index.cjs +8 -0
- package/lib/types/index.cjs.map +2 -2
- package/lib/types/index.js +4 -0
- package/lib/types/index.js.map +2 -2
- package/lib/types/leader-entity.cjs +17 -0
- package/lib/types/leader-entity.cjs.map +7 -0
- package/lib/types/leader-entity.js +1 -0
- package/lib/types/leader-entity.js.map +7 -0
- package/lib/types/options.cjs.map +1 -1
- package/lib/types/tables.cjs.map +1 -1
- package/lib/types/tolerance-entity.cjs +17 -0
- package/lib/types/tolerance-entity.cjs.map +7 -0
- package/lib/types/tolerance-entity.js +1 -0
- package/lib/types/tolerance-entity.js.map +7 -0
- package/lib/types/underlay-entity.cjs +17 -0
- package/lib/types/underlay-entity.cjs.map +7 -0
- package/lib/types/underlay-entity.js +1 -0
- package/lib/types/underlay-entity.js.map +7 -0
- package/lib/util/escapeXmlText.cjs +27 -0
- package/lib/util/escapeXmlText.cjs.map +7 -0
- package/lib/util/escapeXmlText.js +7 -0
- package/lib/util/escapeXmlText.js.map +7 -0
- package/package.json +6 -1
- package/playwright.config.cjs +20 -0
- package/src/Helper.ts +3 -3
- package/src/denormalise.ts +182 -116
- package/src/dimensionToSVG.ts +466 -54
- package/src/handlers/entities.ts +109 -34
- package/src/handlers/entity/dgnUnderlay.ts +94 -0
- package/src/handlers/entity/dimension.ts +27 -1
- package/src/handlers/entity/dwfUnderlay.ts +94 -0
- package/src/handlers/entity/image.ts +118 -0
- package/src/handlers/entity/leader.ts +153 -0
- package/src/handlers/entity/pdfUnderlay.ts +94 -0
- package/src/handlers/entity/tolerance.ts +75 -0
- package/src/handlers/objects.ts +323 -139
- package/src/toSVG.ts +98 -7
- package/src/types/dimension-entity.ts +11 -0
- package/src/types/entity.ts +10 -0
- package/src/types/image-entity.ts +35 -0
- package/src/types/index.ts +4 -0
- package/src/types/leader-entity.ts +40 -0
- package/src/types/options.ts +41 -0
- package/src/types/tables.ts +84 -0
- package/src/types/tolerance-entity.ts +20 -0
- package/src/types/underlay-entity.ts +35 -0
- package/src/util/escapeXmlText.ts +10 -0
- package/tools/browser_test_server.cjs +87 -0
- package/tools/ezdxf_generate_dimensions_all_types.py +246 -0
- package/tools/ezdxf_generate_dimensions_angular_3p.py +59 -0
- package/tools/ezdxf_generate_dimensions_large_scale.py +87 -0
- package/tools/ezdxf_regenerate_problem_fixtures.py +184 -0
- package/tools/ezdxf_validate_fixtures.py +165 -0
- package/docs/DIMENSION_SUMMARY.pt-BR.md +0 -248
- package/docs/IMPLEMENTED-2D-ENTITIES.pt-BR.md +0 -54
- 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.)
|