Skip to content

Changelog¤

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[0.1.20] 2026-09-01¤

Added¤

  • OCCBrep.to_curves() converts the edges of a Brep to COMPAS curves -- a Line for a straight edge, a Circle for a circular one, and so on, down to a NurbsCurve for a general B-spline edge. Unlike the edges and curves attributes it reports each edge once: exploring a shape for edges visits every face, so an edge shared by two faces came back twice, and a box handed back 24 curves for its 12 edges. Repeats are filtered by is_same, bucketed by endpoint coordinates first so the pass stays linear on large models instead of quadratic.
  • OCCBrep.to_polylines() converts a Brep whose faces are all flat polygons to one closed polyline per face loop, the outer loop of a face preceding its holes. Such a Brep is fully described by the points of its loops, so nothing is lost; anything else -- a cylinder, a sphere, a planar face with an arc in its boundary -- would silently lose its curvature, so the conversion raises BrepError naming the offending face rather than approximating it. This is the guarantee to_polygons() does not make: that method reduces the outer loop of every face whatever its geometry.
  • OCCBrep.is_polygonal and OCCBrepFace.is_polygon report whether the faces are flat polygons, so the precondition of to_polylines() can be checked up front. A face is a flat polygon when both its surface and every bounding edge carry the corresponding exact geometry -- a plane and straight lines -- which is what makes its vertices a faithful description of it.

Changed¤

Removed¤

[0.1.19] 2026-08-25¤

Added¤

Changed¤

  • Booleans no longer sew or heal their result. An OCCT boolean already returns a valid shape -- normally a COMPOUND holding one solid per connected piece -- and sewing that compound flattened it into loose shells. Because make_solid() only rewraps a shape whose own type is SHELL, the compound was then skipped entirely, so a boolean that split its target came back with .solids == [] and .is_solid == False even though the operation had succeeded. Selecting the real body out of a fragmenting cut (a carved part plus slivers) was therefore impossible, and .volume silently summed every fragment instead of measuring one part. Affects all six entry points: from_boolean_difference / _intersection / _union and the boolean_* methods. A result holding exactly one solid is now unwrapped to that solid, so .is_solid and .volume answer correctly in the common case too.
  • Performance and exactness: quad_to_face and ngon_to_face now build a planar face when their input points are coplanar (within Precision::Confusion()), instead of always fitting a surface -- a ruled surface for quads, a BRepFill_Filling n-sided patch for n-gons. Flat input is the overwhelmingly common case and it has a plane; fitting a surface to it was slow, less exact, and invisible to face.is_plane, so callers lost the cheap planar filters that face comparison and contact detection rely on. Measured on a 145-part timber model, through the public OCCBrep.from_polygons API: face construction 2.95 ms -> 0.105 ms (28x), building all 145 solids 4.43 s -> 0.62 s (7.1x), and the same solids through a boolean cut 34.9 s -> 3.2 s (10.9x), with no change in volume -- all 1190 faces come back planar, and a carved column reproduces its reference volume to 1.4e-13. Genuinely warped input still takes the fitted-surface path. Both functions take an optional tol argument controlling the flatness threshold.

Removed¤

[0.1.18] 2026-06-28¤

Added¤

Changed¤

Removed¤

[0.1.17] 2026-06-27¤

Added¤

Changed¤

  • Performance: OCCBrep.overlap (and therefore overlap_intersection) no longer meshes each shape twice. The BRepMesh_IncrementalMesh constructor already triangulates (it auto-calls Perform), so the extra explicit Perform() calls were redundant -- removing them makes overlap ~1.7x faster end-to-end (the brep_overlap example: 8.5 ms -> 4.9 ms here).
  • Examples: brep_from_extrusion2 no longer uses pythonocc (OCC.Core.ShapeAnalysis); the free-boundary check is now a native edge_faces naked-edge count. There is no pythonocc usage anywhere in the project.

Removed¤

  • Duplicate example brep_from_extrusion3.py (byte-identical to brep_from_extrusion2.py).

[0.1.16] 2026-06-27¤

Added¤

  • Full compas_occ public API: OCCCurve, OCCCurve2d, OCCNurbsCurve, OCCSurface, OCCNurbsSurface, OCCBrep (+ vertex/edge/loop/face/builder), conversions, and the COMPAS plugin factories.
  • Direct nanobind bindings to OCCT 8.0.0_p1 in a single compas_occt._occt module (one OCCT copy).
  • STEP / IGES / STL / BREP read & write.
  • OCCBrep.to_step_with_attributes / from_step_with_attributes: STEP read & write with a per-shape name and user-defined string/integer/real attributes, stored as general_property entities via the OCCT XDE layer (cf. OCCT PR #634).
  • OCCBrep.overlap_intersection: the common (shared) region of the faces where two Breps overlap (the boolean intersection of the overlapping faces found by overlap).
  • Zero-copy numpy transfer for tessellation, NURBS control points, and curve discretisation.
  • Tests for I/O round-trips (incl. STEP attributes), booleans, and zero-copy transfer.
  • Example pages: Brep Booleans (union/difference/intersection), Merge Coplanar Faces, and STEP File With Attributes, each with a generated screenshot.
  • Tutorial sections for curves, surfaces, breps, and visualisation.

Fixed¤

  • Pass STABLE_ABI to nanobind_add_module so the compiled _occt extension actually targets Python's stable ABI, matching wheel.py-api = "cp312". Previously the wheel was tagged cp312-abi3 but contained a version-specific module, so cibuildwheel's cp313/cp314 test stage failed with ImportError: cannot import name '_occt' from 'compas_occt'.
  • Pin typing-extensions>=4.14.1 in the cibuildwheel test environment to silence the pydantic dependency-conflict warning.

Changed¤

  • Consolidated the per-domain extension modules into a single _occt module so OCCT RTTI/memory is shared across the whole API (this is what makes STEP/IGES round-trip geometry).
  • CMake builds OCCT 8.0.0_p1 with DataExchange enabled and FreeType disabled; links the Win32 system libraries plus TKV3d/TKService (required by the XDE XCAFDoc_VisMaterial path). OCCT is cached under external/occt (like Eigen).
  • Performance: curve point_at/tangent_at/curvature_at/frame_at do the domain bounds-check in C++ (one boundary crossing instead of two, ~16% faster); bulk point-list conversions (points, to_points, to_polyline, control points) build COMPAS points from a single numpy.tolist() (~25-30% faster).

Removed¤

  • Dependency on pythonocc-core.
  • Obsolete proof-of-concept demo modules and the Sphinx docs skeleton (replaced by an mkdocs site mirroring compas_occ).

[0.1.15] 2025-05-21¤

Added¤

Changed¤

Removed¤

[0.1.14] 2025-05-19¤

Added¤

Changed¤

  • CMakeLists.txt is fixed to build OCCT static libraries.

Removed¤

[0.1.13] 2025-05-19¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.12] 2025-05-19¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.12] 2025-05-19¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.11] 2025-05-19¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.10] 2025-05-18¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.9] 2025-05-18¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.8] 2025-05-18¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.7] 2025-05-18¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.6] 2025-05-18¤

Added¤

Changed¤

  • WIP Universal Binary Support for macOS.

Removed¤

[0.1.5] 2025-05-18¤

Added¤

  • Universal Binary Support for macOS.
  • OCCT Configuration Fixed
  • OCCT Configuration Fixed

Changed¤

Removed¤

[0.1.7] 2025-05-18¤

Added¤

Changed¤

  • Ninja generator for windows, disables modules, add clear build status messages.

Removed¤

[0.1.6] 2025-05-18¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.5] 2025-05-18¤

Added¤

Changed¤

  • WIP

Removed¤

[0.1.4] 2025-05-18¤

Added¤

Changed¤

  • Revert back github release action to build 3 OS jobs.

Removed¤

[0.1.3] 2025-05-18¤

Added¤

Changed¤

  • Fix release github action to build 12 jobs.

Removed¤

  • Remove unnecessary bash commands in pyproject.toml.

[0.1.2] 2025-05-18¤

Added¤

Changed¤

  • Split release into multiple python versions.

Removed¤

[0.1.1] 2025-05-16¤

Added¤

  • CMakeLists.txt for building OCCT extensions.

Changed¤

Removed¤

[0.1.0] 2025-05-15¤

Added¤

  • Initial release for CI testing purposes.

Changed¤

Removed¤