Hakan SevenandClaude Opus 4.8 c10e8dae44 fix(tolerance): draw the feature control frame properly
A tolerance drew one row of ASCII soup — "RUN | ANGtol(M) | ..." — about
a tenth of its proper size. Six defects, each independent.

Rows were split on the two-character string "^J". A DWG stores a raw
newline, and the text-DXF reader rewrites the on-disk ^J to one before we
see it, so that split never fired on either mainstream path and every row
collapsed into the first. It now normalises all four spellings the break
arrives in — including the \P our own DXF writer emits, which made
open-DWG → save-DXF → reopen asymmetric.

Symbols were replaced with ASCII labels from a table that was itself
wrong: it read r as circular runout, n as angularity, p as position. The
font's own encoding says concentricity, diameter, projected tolerance
zone, and the benchmark's pre-exploded reference agrees. That table was
an inversion of acadrust's, which is self-contradictory — it binds n to
two different meanings. Do not re-derive from it.

The frame is a proportion of the character height: a compartment spans
-h..+h about its row's centreline, so it is 2h tall and the margin falls
out of that. It was built as height + 2*DIMGAP instead, which is a
different entity's geometry — DIMGAP sizes the dimension line's break and
the rectangle around a basic dimension, where it genuinely applies twice
per axis. Even fed a self-consistent style that can only ever produce
1.5h, so it was wrong in kind rather than mis-fed.

Height came from the entity's own field, which a DWG never sets — the
reader carries only the style's handle, leaving a small non-zero default
that a "> 0" test happily used. It now resolves the style by handle first
and name second: a DWG records the handle and defaults the name, a DXF
the reverse, so matching on the name alone would have picked the wrong
style for every DWG-read tolerance. An entity may also override single
style variables on itself, and this one halves its character height that
way; ignoring that drew the frame several times too large.

Rows stacked upward, every row inherited the widest row's columns, and
one full-width border boxed them all — none of which showed while the
parse only ever produced a single row. The insertion point sits on the
first row's centreline; anchoring the frame's bottom-left there offset it
by its own height, and by an amount that changed with the row count.

Cell text ran together because the glyph run asked for no letter spacing
while the width measurement assumed the font's own, so the characters
crowded inside correctly-sized boxes. Compartments are also measured by
what they draw now: the pen advance stops one letter-space past the last
glyph, and counting that made every one of them too wide.

Symbols come from a bundled stroke font, restored from this repository's
own history: it shipped QCAD's gdt.cxf until the text engine moved from
CXF to LFF, which removed every .cxf and left nothing in their place —
the ASCII labels date from exactly there. Converted to LFF, keyed by the
letter its \Fgdt;X escape carries, and registered under that name like
any other font, so a switch to it resolves through the ordinary lookup:
an MTEXT carrying the escape, or a text style named gdt.shx, reaches it
too, with no code of their own. The geometry is public domain by explicit
waiver; provenance is in the file's header.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-07-15 22:22:07 +03:00
2026-06-23 00:22:08 +03:00
2026-03-22 14:53:51 +03:00

Open CAD Studio

Release Downloads Stars License

OCS is a CAD application for 2D drafting and 3D modeling, built with Rust. Reads and writes DWG and DXF files natively. Also has a web version now!

OCS Web try it in the browser: https://hakanseven12.github.io/OpenCADStudio/

resim resim2

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 OpenCADStudio-*-linux-x86_64.AppImage from the latest release, then:

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

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

Windows

Download OpenCADStudio-*-windows-x86_64.exe from the latest release and run it directly. Windows SmartScreen may show "Windows protected your PC" because the binary is not yet code-signed — click More info → Run anyway.

macOS (Apple Silicon)

Apple Silicon (M-series) only; Intel macOS isn't built. The app is ad-hoc signed but not Apple-notarised (notarisation requires a paid Apple Developer ID), so macOS Gatekeeper guards the first launch. Pick whichever path is easiest:

Option A — Homebrew (recommended):

brew install --cask --no-quarantine \
  https://raw.githubusercontent.com/HakanSeven12/OpenCADStudio/main/packaging/homebrew/open-cad-studio.rb

--no-quarantine lets Gatekeeper skip the unsigned-app prompt. See packaging/homebrew/ for publishing this as a brew tap.

Option B — manual .dmg:

Download OpenCADStudio-*-macos-arm64.dmg from the latest release, open it, and drag OpenCADStudio.app to /Applications. If the first launch is blocked, clear the quarantine flag once:

xattr -dr com.apple.quarantine /Applications/OpenCADStudio.app

On older macOS you can instead right-click OpenCADStudio.app → Open and confirm; on macOS Ventura and later, approve it via System Settings → Privacy & Security → Open Anyway.

Build from Source

Requirements: Rust 1.75+

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

Star History

Star History Chart

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%