Hakan SevenandClaude Opus 4.7 172c538159 fix(scene): hatch boundary + pattern precision for large-WCS drawings
Two precision problems were producing visibly wrong hatches on UTM-scale
(and similarly-offset) drawings even after world_offset was correct:

1. **Boundary tessellation** — `hatch_model_from_dxf`'s polyline-bulge
   arc tessellation ran the whole arc-center computation in f32. With
   vertices at WCS magnitude ~1e5 the f32 ULP is ~1 cm, which propagated
   into the sampled arc points and showed up as visibly wavy / jagged
   hatch boundaries on edges that crossed the long axis of the drawing.
   Re-run the full bulge → arc math in f64; only cast at the to_xy
   call that feeds the (also f64) boundary buffer.

2. **Pattern phase** — the per-fragment `perp / perp_step` modulo blew
   precision when `xz` was at offset-rel WCS magnitude and perp_step
   was sub-cm. Move the precision-critical bits out of f32 by keeping
   each hatch's anchor in f64 on the model side: `HatchModel` now
   carries a `world_origin: [f64; 2]` and the `boundary: [f32; 2]`
   vertices are stored as small offsets from it. The GPU vertex shader
   adds `origin` back inside the view_proj multiply for clip position
   (sub-pixel-lossy at large hatches but invisible); the `xz` varying
   that the fragment shader uses for in_polygon + pattern math stays
   in hatch-local space at full f32 precision.

   For pattern alignment across adjacent hatches with the same family,
   the GPU pipeline snaps the anchor to the family's perp/along grid
   in f64 before sending it down. Snap uses the same QCAD-PAT
   convention (`fam.dy = perp_step`, `fam.dx = along_step`) the
   shader's check_family uses — an earlier attempt used the world-frame
   `(-dx*sin + dy*cos)` formula, which produced a meaningless grid and
   no alignment.

   Trade-off: pattern phase is "global modulo per-family-grid" rather
   than tied to WCS (0,0). Same hatches still align with each other;
   the absolute phase relative to the WCS origin may differ from the
   pre-fix behaviour on small drawings.

Consumers that read `model.boundary` directly (hit_test, paper_canvas,
add_hatch round-trip) reconstruct WCS via `boundary[i] + world_origin`.
The hatch wgsl bind-group entry for binding 0 was bumped to
`VERTEX | FRAGMENT` because the vertex shader now reads `h.origin`.

The fragment-shader hatch LOD substitute + sub-pixel skip from e7675be
and the scissor plumbing from fbbac42 still work — those touched
different fields of the same struct.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
2026-05-16 08:41:23 +03:00
2026-05-15 23:39:19 +03:00
2026-05-15 23:39:19 +03:00
2026-05-15 23:39:19 +03:00
2026-03-22 14:53:51 +03:00
2026-05-12 22:26:34 +03:00

H7CAD

resim

A CAD application for 2D drafting and 3D modeling, built with Rust. Reads and writes DWG and DXF files natively.

Features

File Formats

  • DWG read/write (R13 through R2018)
  • DXF read/write (R13 through R2018)
  • STL export (STLOUT / EXPORTSTL)
  • STEP AP203 export (STEPOUT)
  • OBJ import (IMPORTOBJ)
  • PDF export (plot layouts to PDF)
  • WBLOCK — write selected entities or a block to an external file
  • XREF — attach, reload, and auto-resolve external references

2D Drafting

Command Description
LINE, PLINE, RECTANG, POLYGON Basic geometry
CIRCLE, ARC, ELLIPSE, SPLINE Curves
HATCH, HATCHEDIT Hatch fills with pattern, scale, angle editing
OFFSET, TRIM, EXTEND, FILLET Modify geometry (supports lines, arcs, ellipses, polylines, splines)
BREAK, STRETCH, LENGTHEN Shape editing
ARRAY, MIRROR, MOVE, COPY, ROTATE, SCALE Transformations
EXPLODE Explode blocks, dimensions, polylines, mlines
DDEDIT Double-click text editing
MASSPROP Area, perimeter, centroid of selected entities

3D Modeling

Command Description
BOX, SPHERE, CYLINDER Solid primitives
EXTRUDE, REVOLVE Profile-based solids
LOFT Ruled-surface loft through cross-sections
SWEEP Sweep a profile along a path
ARRAY3D 3D array
ACIS tessellation Renders 3DSOLID, REGION, and BODY entities

Annotations & Dimensions

  • Dimensions: Linear, Aligned, Angular, Radial, Diameter, Ordinate — with full DIMSTYLE support (DIMASZ, DIMSCALE, DIMEXO, DIMEXE, and more)
  • Text: MTEXT, TEXT, DTEXT with font browser (STYLE DIALOG)
  • Leaders: MLEADER with straight and spline path types; MLEADERSTYLE manager
  • Tolerances: GD&T feature control frames
  • Tables: TABLE entity render; TABLESTYLE manager
  • MLine: MLINE entity with MLSTYLE manager and EXPLODE support

Paper Space & Layouts

  • Multi-tab layout system with model space and unlimited paper space tabs
  • Viewport projection: Model content correctly projected into paper-space viewport rectangles
  • Camera persistence: View position and zoom saved per layout; restored on file open and tab switch
  • Correct paper size: Physical paper dimensions read from embedded PlotSettings (not drawing limits)
  • Inline MSPACE overlay — enter a viewport with double-click; edit model entities in place
  • VPORTS — preset viewport configurations (single, 2H, 2V, 4-way)
  • LAYOUTMANAGER / LAYOUTPANEL — GUI layout manager
  • PLOTSTYLEPANEL / STYLESMANAGER — plot style table editor (CTB/STB)
  • PRINT — send layout to system printer

Blocks & References

  • INSERT with attribute prompting (ATTREQ)
  • ATTEDIT — edit block attribute values interactively
  • REFEDIT / REFCLOSE — in-place block reference editing
  • XREF — attach, reload, and resolve external DWG/DXF references
  • DATAEXTRACTION — export entity property data to CSV

Snapping & Precision

  • Object snaps: Endpoint, Midpoint, Center, Node, Quadrant, Intersection, Perpendicular, Tangent, Nearest, Insertion, and more
  • Ellipse arc endpoints, LWPolyline arc midpoints, Hatch boundary points
  • Object Snap Tracking (OTRACK / F11)
  • Polar Tracking with configurable angle increment
  • Dynamic Input overlay (DYNMODE / F12)
  • Grid snap with adaptive spacing
  • Command history navigation (↑ / ↓)

Rendering

  • GPU-accelerated via WebGPU (wgpu)
  • 4× MSAA anti-aliasing
  • Orthographic and perspective camera
  • ViewCube with face/edge/corner snapping
  • Wide polylines: LWPolyline and Polyline2D filled strokes
  • Raster images: GPU-textured quad pipeline (IMAGE command)
  • Wipeout: Solid fill masking
  • Complex linetypes: Text and shape elements rendered in linetype patterns
  • White/black entity colors adapt to background luminance
  • Per-viewport background color (BACKGROUND)
  • Visual style selector (Wireframe, Shaded, etc.)
  • X-ray ghost pass for selected wires occluded by geometry

UI

  • Modular ribbon interface — Home, Insert, Annotate, View, Manage, Layout
  • Command line with autocomplete and history
  • Layer Manager with per-viewport freeze columns
  • Properties panel
  • COLORSCHEME — runtime theme switching
  • SHORTCUTS — keyboard shortcuts panel
  • SPLINEDIT — close, open, reverse spline control points
  • UCS icon with 3D foreshortening and axis labels

Installation

Linux (AppImage)

Download H7CAD-*-linux-x86_64.AppImage from the latest release, then:

chmod +x H7CAD-*-linux-x86_64.AppImage
./H7CAD-*-linux-x86_64.AppImage

No installation required — runs directly on any modern Linux distribution.

Windows

Download H7CAD.exe from the latest release and run it directly.

Build from Source

Requirements: Rust 1.75+

git clone https://github.com/HakanSeven12/H7CAD.git
cd H7CAD
cargo build --release --bin H7CAD
./target/release/H7CAD

License

GPL-3.0-only — see LICENSE

S
Description
OneBSpace rebrand of OpenCADStudio -> OneCAD Draft (2D drafting / 3D modeling studio) + native Odoo Documents integration (open/save/write-back). Member of the OneCAD family. Upstream: opencadstudio-upstream. Addon: one_cad_draft.
Readme GPL-3.0
249 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 70.8%
Fluent 27.8%
WGSL 0.5%
Python 0.3%
TypeScript 0.2%
Other 0.2%