stroblme 340315b6e9 parity_venv.sh: swap the environment it claims to swap
The script exported UV_PROJECT_ENVIRONMENT and then reached for `uv pip`, which
does not honour it — it discovers an environment the way pip does, so the
uninstall and install landed in the app's own .venv. The sanity check that
follows could not notice, because `uv run` *does* honour the variable and so
read the untouched parity venv. Net effect: the swap happened in the wrong
place and reported success. Inc 0's parity claim never exercised the parity
venv at all.

Two fixes, since the second only surfaced once the first was in:

- `uv pip` gets --python pointing at the parity venv.
- everything afterwards runs that venv's interpreter directly. `uv run` re-syncs
  the environment against the app's manifest before running, and the manifest
  still asks for cadquery-ocp-novtk, so it reinstalled the stock wheel on top of
  the swap. The usage note at the top said to drive the app's tests that way
  too; it now says to use the venv's python.

Also pins `uv sync --python 3.12`, so the parity venv keeps resembling what the
image ships instead of following whatever interpreter is newest on the box, and
turns the sanity print into an assertion on __occt_version__ — an attribute
only our wheel defines, which makes it a check that the swap landed.

Verified end to end against the published 7.9.3.1.dev2: installs anonymously
from the Gitea index, 31 modules, ocp suite 48 passed, and the app's main venv
is left on stock.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DfriM8XUkn7uYf5Dwe2xo6
2026-08-10 19:59:18 +02:00
2026-08-10 19:52:58 +02:00
2026-08-10 19:52:58 +02:00
2026-08-10 19:52:58 +02:00
2026-08-10 19:52:58 +02:00
up
2026-08-10 17:18:21 +02:00
2026-08-10 19:52:58 +02:00
2026-08-10 19:52:58 +02:00
2026-08-10 19:52:58 +02:00

n3xd-ocp

Hand-written nanobind bindings for the OpenCASCADE (OCCT) geometry kernel, covering exactly the surface the N3XD CAD backend uses — 139 symbols across 48 OCP.* modules, not all of OCCT.

The package installs as a top-level OCP, so it is a drop-in replacement for cadquery-ocp-novtk and the app's 442 import sites stay untouched.

Status: Inc 0 (spike) shipped — build system, OCCT builder image, handle model, and the first module surface (gp, TopAbs, TopoDS, TopExp, TopLoc, TopTools, BRep, BinTools, Poly, Standard), published as 7.9.3.1.dev1. BREP serialisation is byte-identical to the stock wheel, which is the gate that mattered: the pools and the content-addressed derive payloads both depend on it. Coverage is 34 of the 139 symbols the app imports; the rest lands in increments 1-4 (roadmap 10C).

Start with docs/design.md for the decisions, docs/building.md to build one, and docs/adding-symbols.md to extend the surface. The phase plan lives in the app repo at docs-private/reference/roadmap.md (Phase 10).

Why

cadquery-ocp lags OCCT (it wraps 7.9.3; OCCT 8.0 shipped 2026-05), builds Windows and macOS wheels we never use, and until recently forced a 638 MB VTK dependency into the image. Binding call overhead is not a bottleneck — the CAD hotspots live inside the C++ kernel — so this exists for version velocity, footprint, and two defects that a binding we control prevents by construction:

  • OCCT sub-shapes are returned by value, so a wrapper can never alias a TShape whose owner has died (this segfaulted a process-global face memo).
  • Executing constructors (the two-argument BRepAlgoAPI_* forms) are not bound, so the double-execution footgun is unrepresentable.

It also releases the GIL around kernel calls and ships type stubs, neither of which upstream does.

Build

OCCT is compiled once into a builder image and reused; it is never built on the production host (4 cores, and a kernel build is multi-hour). Wheels are built here on a dev box and published to the Gitea package registry.

make image    # once, ~40 min: compiles OCCT 7.9.3 into the builder image
make dev      # inner loop: incremental compile + tests
make wheel    # compile, stubs, auditwheel, self-containment smoke test
make publish  # -> https://git.stroblme.de/api/packages/N3XD/pypi

Credentials go in .secrets (gitignored) as UV_PUBLISH_USERNAME / UV_PUBLISH_PASSWORD. Consumers read anonymously — the package is public:

uv pip install --index-url https://git.stroblme.de/api/packages/N3XD/pypi/simple/ \
    --prerelease=allow n3xd-ocp

Versions are <occt-version>.N, enforced at configure time against the OCCT actually found, so the kernel a wheel wraps is readable from its version alone. The registry refuses to republish a version; iteration builds therefore carry a .devN suffix and are the only ones the registry's cleanup rule collects.

Description
No description provided
Readme 273 KiB
Languages
C++ 59.6%
Python 34.2%
Shell 3.2%
Dockerfile 1.2%
CMake 0.9%
Other 0.9%