Files
OneCAD-Draft/INTEGRATION_GAPS.md
T

220 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# acadrust Integration Gaps
Missing or incomplete integrations between acadrust entity definitions and H7CAD rendering/interaction systems. Ordered by priority within each category.
Legend: ✅ Done · ⚠️ Partial · ❌ Not done
---
## Entity Field Gaps (acadrust fields ignored in tessellation)
### High Impact
| Status | Entity | Ignored Field(s) | Effect |
|---|---|---|---|
| ✅ | **INSERT** | `column_count`, `row_count`, `column_spacing`, `row_spacing` | MINSERT handled by `acadrust::explode_from_document()` → `array_transforms()` |
| ✅ | **LWPolyline** | `constant_width`, vertex `start_width` / `end_width` | Implemented in `src/scene/mod.rs:3239` |
| ✅ | **Polyline (legacy)** | `Vertex2D.start_width` / `end_width` | Implemented in `src/scene/mod.rs` |
### Medium Impact
| Status | Entity | Ignored Field(s) | Effect |
|---|---|---|---|
| ✅ | **Dimension** | `DIMSCALE`, `DIMASZ`, `DIMEXO`, `DIMEXE` (from dimstyle) | Implemented in `src/scene/tessellate.rs:263` |
| ✅ | **Spline** | `weights` (rational NURBS control point weights) | NurbsCurve<Vector4> used when weights present — `src/entities/spline.rs` |
| ✅ | **Spline** | `flags.closed` / `flags.periodic` | Implemented in `src/entities/spline.rs:48` |
| ✅ | **Hatch** | `BoundaryEdge::Spline` tessellation | Implemented in `src/scene/mod.rs:1802` |
| ✅ | **MultiLeader** | `MultiLeaderPathType::Spline` | Implemented in `src/entities/multileader.rs:76` |
| ⚠️ | **RasterImage** | `clip_boundary` (polygonal/rectangular) | Boundary read but not applied — Wipeout does apply clip, RasterImage does not |
### Low Impact
| Status | Entity | Ignored Field(s) | Effect |
|---|---|---|---|
| ❌ | **Arc / Circle / Line / Polyline** | `thickness` | No 3D extrusion along Z; invisible in pure 2D views |
| ❌ | **LWPolyline** | `plinegen` flag | Linetype pattern resets at each vertex instead of continuing |
---
## Entity Type Gaps (entire types with missing subsystems)
### Renders Nothing / Placeholder Only
| Status | Entity | Notes |
|---|---|---|
| ✅ | **Face3D** | Full tessellation, grips, properties panel — `src/entities/mesh.rs` |
| ❌ | **OLE2Frame** | Bounding box + X mark only; no interactivity |
### Wire Fallback Only (no full mesh)
| Status | Entity | Missing |
|---|---|---|
| ⚠️ | **Solid3D / Region / Body** | `src/scene/solid3d_tess.rs` exists with MeshModel support; no real mesh from ACIS data |
### Partial Render
| Status | Entity | Missing |
|---|---|---|
| ❌ | **Viewport** (paper space) | Only frame rendered; interior model-space view not composited |
---
## Systemic Gap — OCS→WCS Transform
⚠️ **Partially done.** The DXF arbitrary-axis algorithm is implemented in `src/scene/transform.rs` (`ocs_axes`, `ocs_point_to_wcs`). Applied to:
| Status | Entity | Location |
|---|---|---|
| ✅ | **Arc** | `src/entities/arc.rs` |
| ✅ | **Circle** | `src/entities/circle.rs` |
| ✅ | **Line** | `src/entities/line.rs` |
| ✅ | **Point** | `src/entities/point.rs` |
| ✅ | **Ellipse** | `src/entities/ellipse.rs` |
| ✅ | **LwPolyline** | `src/entities/lwpolyline.rs` |
| ✅ | **Spline** | DXF spec: spline control points are already in WCS (normal field unused) |
| ✅ | **Polyline2D** | `src/entities/polyline.rs` — elevation + normal applied |
| ✅ | **Polyline3D** | Vertices already in WCS per DXF spec (no OCS transform needed) |
| ✅ | **AttributeDefinition / AttributeEntity** | OCS→WCS applied to insertion snap point — `src/entities/attribute.rs` |
| ❌ | **Hatch** | elevation applied but normal not used for OCS→WCS in wire outline |
| ❌ | **MLine / Leader** | no OCS transform |
**Impact:** Low for typical 2D plan files (nearly all normals are `(0,0,1)`); high for 3D DXF files with entities on non-horizontal planes.
The DXF arbitrary-axis algorithm (`src/scene/transform.rs:73`):
```
if |Wx| < 1/64 and |Wy| < 1/64:
Ax = (0,1,0) × N
else:
Ax = (1,0,0) × N
Ax = normalize(Ax)
Ay = N × Ax
```
Then transform each OCS point: `WCS = x*Ax + y*Ay + z*N`
---
## Render Style Gaps (color, linetype, lineweight resolution)
### High Impact
| Status | Gap | Effect | Location |
|---|---|---|---|
| ✅ | **ByBlock color** resolved through INSERT chain | Implemented via `render_style_for_block_sub()` | `src/scene/render.rs:243` |
| ✅ | **ByBlock linetype** resolved through INSERT chain | Implemented | `src/scene/render.rs:260` |
### Medium Impact
| Status | Gap | Effect | Location |
|---|---|---|---|
| ✅ | **ByBlock lineweight** resolved from INSERT entity | Implemented | `src/scene/render.rs:266` |
---
## Text & Style Gaps
### Medium Impact
| Status | Gap | Effect | Location |
|---|---|---|---|
| ✅ | **TextStyle `is_backward`** flag | Negative width_factor applied | `src/entities/text.rs:60` |
| ✅ | **TextStyle `is_upside_down`** flag | Rotation offset by π applied | `src/entities/text.rs:63` |
### Low-Medium Impact
| Status | Gap | Effect | Location |
|---|---|---|---|
| ❌ | **Complex linetype text shapes** not rendered | Linetypes with embedded text elements show only geometry gaps | `src/scene/complex_lt.rs` |
---
## Polyline3D Vertex Type Gap
✅ **Done.** `src/entities/polyline.rs:305` — VertexFlags (SPLINE_VERTEX flag 8, SPLINE_CONTROL flag 16) properly detected and used for wire/snap point selection.
---
## Snap Point Gaps
### Critical / High
| Status | Entity | Missing Snap | Location |
|---|---|---|---|
| ✅ | **INSERT** | `Insertion` snap point | `src/scene/mod.rs` — appended after explode |
| ✅ | **INSERT** | Nested entity snap points | All sub-entity WireModels are flat-mapped into the scene wire list — snap sees them all |
| ✅ | **Hatch** | Snap points for circular arc boundaries | Center snaps added for CircularArc/EllipticArc edges — `src/scene/tessellate.rs` |
### Medium
| Status | Entity | Missing Snap | Location |
|---|---|---|---|
| ✅ | **Dimension** | Node snap hints on defpoints | `src/scene/tessellate.rs` — `dimension_snap_pts()` |
| ✅ | **Spline** | Fit/control points in snap_pts | `src/entities/spline.rs:38` |
| ✅ | **MultiLeader** | Vertices and connection points in snap_pts | `src/entities/multileader.rs` |
| ✅ | **MLine** | Vertices in snap_pts | `src/entities/mline.rs` |
### Low
| Status | Entity | Missing Snap | Location |
|---|---|---|---|
| ⚠️ | **Ellipse** (partial arc) | Endpoints not in pre-baked snap_pts | Arc endpoints emitted only as `Center`; functional via wire tessellation but semantically wrong |
| ✅ | **Hatch** | Elevation Z | Snap Z uses `hatch.elevation - world_offset.z` — `src/scene/tessellate.rs:627` |
---
## Grip Gaps
| Status | Entity | Missing Grip | Location |
|---|---|---|---|
| ✅ | **LWPolyline** | Midpoint grips for arc segments | `src/entities/lwpolyline.rs:162` |
---
## Text Rendering Gaps
| Status | Gap | Effect | Location |
|---|---|---|---|
| ✅ | **TextStyle `is_backward`** flag applied | Negative width_factor | `src/entities/text.rs:61` |
| ✅ | **TextStyle `is_upside_down`** flag applied | Rotation offset | `src/entities/text.rs:64` |
| ⚠️ | **Unicode characters** not in CXF fonts | Glyph lookup implemented; missing characters silently dropped without warning | `src/scene/cxf.rs:74` |
---
## DXF Reader Unit Gaps (acadrust bugs we work around)
These are fixed in our post-load `fix_dxf_dimension_rotations()` in `src/io/mod.rs`.
| Status | Entity | Field | DXF Code | Fix Location |
|---|---|---|---|---|
| ✅ | **Dimension (Linear)** | `rotation` | 50 | `src/io/mod.rs:221` |
| ✅ | **Dimension (all)** | `text_rotation` | 53 | `src/scene/tessellate.rs::dimension_text_natural_rotation()` |
| ✅ | **AttributeEntity** | `rotation` | 50 | `src/io/mod.rs:224` |
| ✅ | **AttributeDefinition** | `rotation` | 50 | `src/io/mod.rs:219` |
| ❌ | **Shape** | `rotation` | 50 | Shape not currently rendered — low priority |
---
## Coverage Summary
| Subsystem | Coverage |
|---|---|
| Tessellation | 34/41 entity types fully, 4 legacy fallback, 3 missing |
| Snap points | 36/41 (Face3D, Solid3D, Region, Body, OLE2Frame missing) |
| Grip points | 36/41 (same 5 missing) |
| Properties panel | 36/41 (same 5 missing) |
| Hit testing | 41/41 (all via fallback) |
## Gap Status Summary
| Status | Count |
|---|---|
| ✅ Done | 39 |
| ⚠️ Partial | 2 |
| ❌ Not done | 2 |
| **Total** | **43** |
### Remaining gaps by priority
**Medium:** OCS→WCS for Hatch wire outline and MLine/Leader · Viewport interior view compositing
**Low:** LWPolyline plinegen (GPU shader change needed) · Complex linetype text shapes · OLE2Frame improvement · Shape rotation