PanosandClaude Opus 5 d596b5a6be fix(view): zoom cursor per navigation tool, and ZOOM EXTENTS frames everything
Two viewport-navigation defects, both measured against commercial solutions.

The cursor stayed a hand during a zoom. `selection_overlay` took one boolean
for all three interactive navigation tools, so ZOOM Dynamic and ORBIT both
showed PAN's grab hand — which reads as "drag the sheet", the wrong promise
for either. Split it into a `NavCursor` enum: PAN keeps the open/closed hand,
ORBIT gets four-way arrows, and ZOOM Dynamic gets the magnifier carrying the
sign of the zoom actually under way — "+" dragging up, "-" dragging down,
latched with a 2 px dead zone so a hand held still cannot strobe the glyph.
ZOOM Dynamic also reused `box_anchor` to remember where a drag began, so a
selection marquee rubber-banded across the screen while the view zoomed; the
drawing is now suppressed, the state left alone for `reproject_box_anchor`.

ZOOM EXTENTS did not reach the whole drawing, for three separate reasons, now
answered by one shared `Scene::visible_block_bounds`:

  - A quartile filter dropped any wire whose centroid sat outside the
    inter-quartile consensus of the others. It was meant to stop one junk wire
    from a bad parse poisoning the box, but it could not tell parser junk from
    an outlying detail, a survey point, or a block placed away from the rest,
    and silently refused to frame them. Gone; the absolute 1e16 sentinel gate
    the paper path already used is the only filter, and the XLine / Ray display
    segments that motivated the heuristic are handled explicitly.

  - HATCH tessellates to no wires at all, and the model path never read the
    fill models, so a drawing whose outermost geometry is a fill — or which is
    nothing but fills — had nothing to frame. It now folds them in, reusing the
    renderer's own warm cache on the hot path rather than re-exploding every
    INSERT per ZOOM EXTENTS.

  - Inside a floating viewport the fit came from `compute_model_space_extents`,
    which walked only `key_vertices` — empty for every tessellated curve.
    Circles, arcs, ellipses and splines contributed nothing. Fixing it also
    corrects plot Extents, sheet-set framing, viewport auto-fit and SpaceMouse
    model bounds, which all inherited that blind spot.

Bounds stay f64 into the camera: a UTM drawing lost whole metres to the old
f32 round-trip. Drawing extents also no longer read the camera — the result is
cached per geometry epoch, and a floating viewport's camera is derived FROM
the extents, so `camera_for_viewport` recursed into a stack overflow.

`model_space_extents_mixed_entities_accuracy` asserted the curve-blind result;
it now asserts the true bounds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-01 16:27:26 +03:00
2026-03-22 14:53:51 +03:00
2026-08-22 09:33:38 +03:00

English · Български · Português (Brasil) · Čeština · Nederlands · Français · Suomi · Deutsch · Ελληνικά · Magyar · Italiano · 日本語 · 한국어 · Polski · Русский · 简体中文 · Español · 繁體中文 · Türkçe · हिन्दी · العربية

Open CAD Studio logo

Open CAD Studio

Open-source 2D drafting and 3D modeling for desktop and web, built with Rust.

Latest release Release downloads GitHub stars GPL-3.0 license

Launch the web app · Download the desktop app · Join the discussion

Open CAD Studio workspace

Overview

Open CAD Studio is a cross-platform application for technical drawing, layout work, and solid modeling. It reads and writes DWG and DXF drawings natively, with a shared editing core across the desktop and browser versions.

The project is under active development. Keep backups of important production drawings and report reproducible problems through GitHub Issues.

Highlights

  • Native drawing workflow — open, edit, recover, and save DWG and DXF files without a conversion service.
  • Precise 2D drafting — lines, polylines, curves, splines, hatches, object snaps, tracking, layers, blocks, and external references.
  • Documentation tools — text, dimensions, leaders, tolerances, tables, model space, paper space, viewports, and plot styles.
  • Kernel-backed 3D modeling — solid primitives, extrusion, revolution, sweep, loft, Boolean operations, and ACIS entity tessellation.
  • GPU rendering — accelerated 2D and 3D viewports through wgpu, with orthographic and perspective cameras.
  • Extensible workflows — native plugins, command scripts, headless conversion, and a line-based JSON automation API.

3D model in Open CAD Studio

File workflows

Format or workflow Support
DWG Read and write; versioned save targets from R14 through 2018
DXF Read and write; versioned save targets from R14 through 2018
BAK / SV$ Open drawing backups and autosave files
OBJ Import polygon meshes
LandXML Import CgPoint survey points
STL Export 3D mesh data
STEP AP203 Export 3D mesh data
PDF Plot layouts and selected geometry on desktop
CSV Extract entity property data
CTB / STB Load and edit plot style tables

Desktop or web

Use the web app for immediate access with no installation. Drawings are selected through the browser and saved as local downloads.

Use the desktop application for native file associations, file-manager thumbnails, system printing, PDF output, external plugins, command scripts, and headless automation. Release builds are available for Windows, Linux, and Apple Silicon macOS.

Install

Download all current packages from the latest release.

Windows

Choose one of these signed x86-64 packages:

  • OpenCADStudio-*-windows-x86_64-installer.msi — recommended installer with Start Menu shortcuts, DWG/DXF file associations, and drawing thumbnails.
  • OpenCADStudio-*-windows-x86_64-portable.exe — standalone application; no installation required.

Linux

Download the x86-64 AppImage, make it executable, and run it:

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

Or install it as a Flatpak from FlatPark, which installs the official AppImage and follows new releases:

flatpak remote-add --if-not-exists flatpark https://dl.flatpark.org/flatpark.flatpakrepo
flatpak install flatpark io.github.HakanSeven12.OpenCadStudio

The Flatpak opens and saves drawings through the file chooser. External references and underlays that point at other files need home access:

flatpak override --user --filesystem=home io.github.HakanSeven12.OpenCadStudio

macOS

The published macOS package supports Apple Silicon:

  1. Download OpenCADStudio-*-macos-arm64.dmg.
  2. Open the image and drag OpenCADStudio.app into Applications.
  3. If Gatekeeper blocks the first launch, approve the app from System Settings → Privacy & Security.

The application is ad-hoc signed but is not currently notarized by Apple.

Languages

Open CAD Studio can follow the system language or use any of these 21 interface languages:

Arabic · Brazilian Portuguese · Bulgarian · Czech · Dutch · English · Finnish · French · German · Greek · Hindi · Hungarian · Italian · Japanese · Korean · Polish · Russian · Simplified Chinese · Spanish · Traditional Chinese · Turkish

Change the language from the application settings. The browser version also uses the browser's preferred locale when System is selected.

Build from source

Desktop

Requirements:

  • Git
  • Current stable Rust toolchain
  • Platform graphics and font development libraries

On Ubuntu or Debian, install the native dependencies with:

sudo apt update
sudo apt install libgl1-mesa-dev libx11-dev libxcursor-dev libxi-dev \
  libxrandr-dev libxkbcommon-dev libwayland-dev libfontconfig1-dev \
  libfreetype6-dev

Then build and run:

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

The resulting binary is written to target/release/OpenCADStudio (OpenCADStudio.exe on Windows).

Web

Install the WebAssembly target and build tools once:

rustup target add wasm32-unknown-unknown
cargo install trunk wasm-bindgen-cli

Start the development server:

trunk serve

Automation

The desktop binary supports one-shot conversion, a persistent headless server, and a client-neutral MCP endpoint for AI applications:

OpenCADStudio --export input.dwg output.dxf
OpenCADStudio --export input-r12.dxf output.dwg --target-version R14
OpenCADStudio --serve
OpenCADStudio --serve --port 4242
OpenCADStudio --mcp

The automation server exchanges one JSON object per line over standard input/output or a local TCP socket. The self-contained MCP endpoint exposes the live desktop editor through the same tools to every compatible client. Its audit and save_verified operations check an explicit DWG/DXF target version, lossy records, raw DXF handle references, reopen the output, compare its semantic manifest, and return a SHA-256 hash. To connect a client, configure it to launch OpenCADStudio --mcp. See the MCP control guide.

Plugins

Desktop plugins run in separate processes and communicate with the host through the versioned plugin API. The browser build does not load native plugins.

Project documentation

Contributing

Bug reports, focused pull requests, translations, documentation improvements, and plugin contributions are welcome.

  • Search existing issues before opening a new report.
  • Use Discussions for questions and ideas.
  • Report vulnerabilities privately by following the security policy.

Application translations live in locales/*/opencadstudio.ftl; source labels map through src/locale_catalog.rs. After editing translations, run python3 scripts/export-locales.py to refresh web and desktop packaging labels. Validate with python3 scripts/test_site.py and cargo test --lib i18n::tests.

Project growth

Stars

Open CAD Studio star history

Release downloads

Open CAD Studio release download history

Support the project

If Open CAD Studio helps your work, support continued development through GitHub Sponsors or Patreon.

License

Open CAD Studio is distributed under the GNU General Public License v3.0.

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%