Files
OneCAD-Draft/INTEGRATION_GAPS.md
T
Hakan SevenandClaude Sonnet 4.6 cda8078905 docs: add acadrust integration gaps audit
Comprehensive backlog of acadrust entity fields, behaviors, and subsystems
not yet integrated into H7CAD rendering, snap, grip, and properties systems.
Covers tessellation gaps, OCS→WCS transform, ByBlock style resolution,
snap/grip point gaps, text rendering, and DXF reader unit bugs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 21:58:22 +03:00

197 lines
8.8 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.
---
## Entity Field Gaps (acadrust fields ignored in tessellation)
### High Impact
| Entity | Ignored Field(s) | Effect |
|---|---|---|
| **INSERT** | `column_count`, `row_count`, `column_spacing`, `row_spacing` | MINSERT array inserts not expanded — only one copy rendered |
| **LWPolyline** | `constant_width`, vertex `start_width` / `end_width` | Polylines always render at zero width; thick/tapered strokes lost |
| **Polyline (legacy)** | `Vertex2D.start_width` / `end_width` | Same as above for old-format polylines |
### Medium Impact
| Entity | Ignored Field(s) | Effect |
|---|---|---|
| **Dimension** | `DIMSCALE`, `DIMASZ`, `DIMEXO`, `DIMEXE` (from dimstyle) | Arrow size hardcoded to `0.12`; extension line offsets fixed regardless of style |
| **Spline** | `weights` (rational NURBS control point weights) | Circles/conics stored as NURBS lose curvature precision; treated as uniform B-spline |
| **Spline** | `flags.closed` / `flags.periodic` | Closed splines may have a gap or C1 discontinuity at the join |
| **Text / MText** | `normal` extrusion XY | Entities on tilted planes render flat in XY (rare in 2D drawings) |
| **Hatch** | `BoundaryEdge::Spline` tessellation | Spline boundary edges plotted point-to-point instead of smooth B-spline curve — boundary appears angular |
| **MultiLeader** | `MultiLeaderPathType::Spline` | Spline-type leader lines rendered as straight segments instead of smooth curves |
| **RasterImage** | `clip_boundary` (polygonal/rectangular) | Clip boundary read but not applied — image renders full rectangle regardless of clip region |
### Low Impact
| 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
| Entity | Status |
|---|---|
| **Face3D** | No tessellation — renders as small cross only; no snap, grip, or properties |
| **OLE2Frame** | Bounding box + X mark only; no interactivity |
### Wire Fallback Only (no full mesh)
| Entity | Missing |
|---|---|
| **Solid3D / Region / Body** | Only ACIS wire fallback; no grip, no properties panel |
### Partial Render
| Entity | Missing |
|---|---|
| **Viewport** (paper space) | Only frame rendered; interior model-space view not composited |
---
## Systemic Gap — OCS→WCS Transform
17 entity types carry a `normal` extrusion vector defining their Object Coordinate System but **none apply the arbitrary-axis OCS→WCS transform** during tessellation. When `normal ≠ (0, 0, 1)` the entity is incorrectly rendered flat in the XY plane.
**Affected entities:** Arc, Circle, Ellipse, Point, Line, Spline, LwPolyline, Polyline, AttributeDefinition, AttributeEntity, Dimension, Hatch, MLine, Leader, Insert, Shape
**Only mitigation today:** `Arc` checks `normal.z < 0` to reverse sweep direction — not a real 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:
```
if |Wx| < 1/64 and |Wy| < 1/64:
Ax = (0,0,1) × N (Y-world cross N)
else:
Ax = (0,1,0) × N (X-world cross N)
Ax = normalize(Ax)
Ay = N × Ax
```
Then transform each OCS point: `WCS = origin + x*Ax + y*Ay + z*N`
---
## Render Style Gaps (color, linetype, lineweight resolution)
### High Impact
| Gap | Effect | Location |
|---|---|---|
| **ByBlock color** not resolved through INSERT chain | ByBlock entities render white instead of inheriting INSERT's color | `render.rs::render_style_for()` |
| **ByBlock linetype** not resolved through INSERT chain | ByBlock entities use default linetype instead of INSERT's linetype | `render.rs::render_style_for()` |
### Medium Impact
| Gap | Effect | Location |
|---|---|---|
| **ByBlock lineweight** resolved from layer instead of INSERT entity | Block children with ByBlock weight don't inherit INSERT's line weight | `render.rs` lines 213-228 |
---
## Text & Style Gaps
### Medium Impact
| Gap | Effect | Location |
|---|---|---|
| **TextStyle `is_backward`** flag ignored | Text with backward flag renders left-to-right instead of mirrored | `src/entities/text_support.rs::resolve_text_style()` |
| **TextStyle `is_upside_down`** flag ignored | Text with upside-down flag renders normally instead of flipped vertically | `src/entities/text_support.rs::resolve_text_style()` |
### Low-Medium Impact
| Gap | Effect | Location |
|---|---|---|
| **Complex linetype text shapes** not rendered | Linetypes with embedded text elements (e.g. GAS_LINE with "GAS" text) show only geometry gaps | `src/scene/complex_lt.rs` |
---
## Polyline3D Vertex Type Gap
acadrust `Vertex3D` carries `VertexFlags` (SPLINE_VERTEX, SPLINE_CONTROL) but `tessellate_polyline3d()` ignores them entirely — all vertices treated as plain points regardless of spline flag.
**Effect:** Polyline3D entities with spline fitting render as straight segments instead of smooth curves.
**Location:** `src/entities/polyline.rs::tessellate_polyline3d()`
**Impact:** Medium.
---
## Snap Point Gaps
### Critical / High
| Entity | Missing Snap | Effect | Location |
|---|---|---|---|
| **INSERT** | `Insertion` snap point entirely absent | Cannot snap to block reference insertion point with OSNAP Insertion | `src/entities/insert.rs` — no `snap_pts` in TruckEntity |
| **INSERT** | Nested entity snap points not traversed | Cannot snap to geometry inside a block without exploding it | `src/snap/mod.rs` — only top-level wire snap_pts checked |
| **Hatch** | All snap points empty | Cannot snap to hatch boundary vertices/arcs with Endpoint or Midpoint | `src/scene/tessellate.rs:558` — returns `snap_pts: vec![]` |
### Medium
| Entity | Missing Snap | Effect | Location |
|---|---|---|---|
| **Dimension** | No snap hints on geometry | Cannot snap to dimension defpoints, line endpoints | `src/scene/tessellate.rs:247` — `snap_pts: vec![]` |
| **Spline** | Fit/control points not in snap_pts | Cannot snap to spline construction points | `src/entities/spline.rs:42` |
| **MultiLeader** | Vertices not in snap_pts | Cannot snap to leader line endpoints | `src/entities/multileader.rs:116` |
| **MLine** | Vertices not in snap_pts | Cannot snap to multiline segment endpoints | `src/entities/mline.rs:97` |
### Low
| Entity | Missing Snap | Effect | Location |
|---|---|---|---|
| **Ellipse** (partial arc) | Endpoints not in pre-baked snap_pts | Arc endpoints emitted only as `Center`; functional via wire tessellation but semantically wrong | `src/entities/ellipse.rs:108` |
| **Hatch** | Elevation Z ignored | Snap Z is always 0 instead of `hatch.elevation` | `src/scene/tessellate.rs:564` — hardcoded `0.0` |
---
## Grip Gaps
| Entity | Missing Grip | Effect | Location |
|---|---|---|---|
| **LWPolyline** | Midpoint grips between vertices (arc segment handles) | Cannot drag a segment midpoint to adjust arc bulge | `src/entities/lwpolyline.rs` |
---
## Text Rendering Gaps
| Gap | Effect | Location |
|---|---|---|
| **TextStyle `is_backward`** flag not applied | Text with backward flag renders left-to-right | `src/entities/text_support.rs::resolve_text_style()` |
| **TextStyle `is_upside_down`** flag not applied | Text with upside-down flag renders normally | `src/entities/text_support.rs::resolve_text_style()` |
| **Unicode characters** not in CXF fonts silently dropped | Non-ASCII characters render as blank gaps with no warning | `src/scene/cxf.rs:174` |
---
## 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`, documented here for reference.
| Entity | Field | DXF Code | Bug | Fix Location |
|---|---|---|---|---|
| **Dimension (Linear)** | `rotation` | 50 | Stored in degrees, used as radians | `io/mod.rs::fix_dxf_dimension_rotations()` |
| **Dimension (all)** | `text_rotation` | 53 | Code 53 never parsed; always 0 | `tessellate.rs::dimension_text_natural_rotation()` |
| **AttributeEntity** | `rotation` | 50 | No `.to_radians()` in reader | Needs fixup (not yet applied) |
| **AttributeDefinition** | `rotation` | 50 | No `.to_radians()` in reader | Needs fixup (not yet applied) |
| **Shape** | `rotation` | 50 | No `.to_radians()` in reader | 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) |