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.

Unreleased¤

Added¤

Changed¤

Removed¤

[0.9.5] 2026-07-22¤

Added¤

  • Added protect_boundary, protect_sharp_edges_angle_deg, and keep_points parameters to compas_cgal.meshing.trimesh_remesh. protect_boundary constrains all boundary edges (no split/collapse/flip) so an open mesh's border curve — including sharp corners — is preserved verbatim instead of being re-sampled to target_edge_length; protect_sharp_edges_angle_deg marks interior edges whose dihedral angle ≥ the threshold as constrained (0.0 disables interior-feature detection); keep_points (an Nx3 array) pins only the mesh vertices coincident with the given points (matched by coordinate within tolerance, via vertex_is_constrained_map), so specific vertices — e.g. the four corners of an open patch — survive while the rest of the boundary is still re-sampled.
  • Reworked docs/examples/example_meshing.py / .md to demonstrate all three boundary modes on the RhinoVault shell side by side (default, protect_boundary=True, and keep_points with the four corners), replacing the example image.
  • Added compas_cgal.straight_skeleton_2.extrude wrapping CGAL's extrude_skeleton, turning a 2D polygon (optionally with holes) into a closed 3D roof mesh, with control over roof pitch via taper angles or straight skeleton weights and an optional maximum_height. Internally coplanar extrusion faces are merged into polygons (via remesh_planar_patches) to recover the true roof planes, and extrude returns a (mesh, lines) tuple: a triangulated, ready-to-display mesh (so non-convex roof faces render correctly) and the roof outline (eaves, hips and ridges) as a list of compas.geometry.Line.
  • Added the extrude_straight_skeleton binding in src/straight_skeleton_2.cpp / .h.
  • Added docs/examples/example_straight_skeleton_2_extrude.py and .md (with image docs/assets/images/example_straight_skeleton_2_extrude.png) demonstrating roof generation for a few corner cases — a footprint without holes, one with a single hole, and one with multiple holes — and wired the example into the Examples nav in mkdocs.yml.
  • Added tests/test_straight_skeleton_2_extrude.py covering the default roof (mesh + outline), angle-driven height, height truncation, single and multiple holes, and the weights/angles exclusivity check.
  • Declared runtime dependencies in pyproject.toml: numpy>=1.24 and compas>=2.15,<3 (previously undeclared, leaving installs to fail at import time on clean environments).
  • Added docs/examples/example_measure.md documenting mesh_area, mesh_volume, and mesh_centroid so the measure example renders alongside the others.
  • Added image reference in docs/examples/example_isolines.md and added Measure: examples/example_measure.md to the Examples nav in mkdocs.yml.
  • Added docs/examples/example_booleans_with_edges.md and example_booleans_with_face_source.md (with their images) covering the corefinement intersection-edge and face-source-tracking variants of the boolean operations; both wired into the Examples nav.
  • Added docs/examples/example_boolean_difference_mesh_meshes.md (CSG drilled rounded cube) and its Examples nav entry.
  • Added data/flat_star_disk_irregular_rim.off — a flat synthetic fixture whose irregular boundary sampling exposes multi-source heat-method normalization errors against a dependency-free euclidean truth (on a flat mesh the euclidean distance to the nearest source is exact in the near band and a hard lower bound everywhere), plus the regression test tests/test_geodesics.py::test_heat_geodesic_multisource_boundary_sources that fails on the previous backend.
  • heat_geodesic_distances, HeatGeodesicSolver, geodesic_isolines, and geodesic_isolines_split now accept a compas.datastructures.Mesh directly, in addition to the (vertices, faces) tuple — both input shapes are declared via @overload and coerced through one internal _as_vertices_faces seam.

Fixed¤

  • Fixed docs/examples/example_projection.py imports: project_mesh_on_mesh, project_points_on_mesh, pull_mesh_on_mesh, and pull_points_on_mesh were incorrectly imported from compas_cgal.meshing instead of compas_cgal.projection, causing ImportError for anyone running the example.
  • Fixed multi-source geodesic distances collapsing near the source set: heat_geodesic_distances, HeatGeodesicSolver, geodesic_isolines, and geodesic_isolines_split now use an own Eigen implementation of the heat method (Crane et al. 2017) with a Dirichlet-constrained Poisson step instead of CGAL's Heat_method_3, whose value_at_source_set normalizes the Poisson potential through min_s |phi(i) - phi(s)| — a distance between values that folds every vertex whose potential lands inside the source-value spread (seeding all 508 boundary vertices of the new fixture read 0.54x the true distance in the near band, with 83% of band vertices below the euclidean lower bound). Distances are now exactly 0 at sources, non-negative, and accurate for arbitrary source sets; single-source results are unchanged within discretization error. Empty source sets now raise ValueError and meshes with a connected component containing no source raise RuntimeError (both previously returned meaningless values). The docstring claim that the intrinsic-Delaunay variant was used has been dropped (the binding instantiated the class default, Direct).

Changed¤

  • Bumped nanobind build-system requirement from >=1.3.2 to >=2.12 to fix refined_delaunay_mesh (and other Eigen::Ref overloads) raising TypeError: incompatible function arguments when called with numpy>=2.4.0.
  • Extended [tool.cibuildwheel] test-requires to numpy>=2.4 and compas>=2.15,<3 so the wheel test job exercises the post-2.4 ndarray ABI on every build.
  • Applied ruff format to docs/examples/example_booleans_with_face_source.py, docs/examples/example_isolines.py, tasks.py, and tests/test_booleans.py so the working tree is clean for the next invoke release run.

Removed¤

[0.9.3] 2026-04-27¤

Added¤

  • Added compas_cgal.isolines.isolines for extracting isoline polylines from vertex scalar fields.
  • Added compas_cgal.skeletonization.mesh_skeleton_with_mapping
  • HeatGeodesicSolver class with precomputation for repeated queries
  • heat_geodesic_distances function for single-shot usage

    • uses CGAL Heat_method_3 with intrinsic Delaunay triangulation
    • ~30% faster than libigl heat in compas_slicer workflow
  • Added simplify_polyline and simplify_polylines functions for polyline simplification using Douglas-Peucker algorithm

  • Added closest_points_on_polyline function for batch closest point queries on polylines

Changed¤

  • Added optional surface meshing parameters (sm_angle, sm_radius, sm_distance) to compas_cgal.reconstruction.poisson_surface_reconstruction for controlling mesh quality and density.
  • Upgraded cibuildwheel manylinux image from manylinux2014 to manylinux_2_28 for scipy wheel compatibility.

  • subdivision: pass-by-value → Eigen::Ref (3 functions)

  • straight_skeleton_2: const& → Eigen::Ref (8 functions)
  • triangulation: added const to all Eigen::Ref params (3 functions)
  • meshing: removed extra & and added const (7 functions)

Removed¤

[0.9.1] 2025-06-26¤

Added¤

  • Added compas_cgal.meshing.trimesh_dual.
  • Added compas_cgal.meshing.project_mesh_on_mesh.
  • Added compas_cgal.meshing.project_points_on_mesh.
  • Added compas_cgal.meshing.pull_mesh_on_mesh.

Changed¤

  • Changed compas_cgal.meshing.mesh_remesh to compas_cgal.meshing.trimesh_remesh.

Removed¤

[0.9.0] 2025-04-18¤

Added¤

Changed¤

Removed¤

[0.8.0] 2025-03-24¤

Added¤

  • Tests from 2D straight skeleton module.

Changed¤

  • Added polygon with holes offset test.

Removed¤

  • Profiling dependency and decorators from examples.

[0.7.7] 2025-03-20¤

Added¤

  • Added GitHub release action.

Changed¤

  • Split binding into separate dynamic libraries.
  • The documentation contribution guide has been updated based on the single-file and single dynamic library build process.
  • Example images in the documentation have been updated.
  • The Python/C++ module name has been changed from name_ext to _name.

Removed¤

[0.7.6] 2025-03-19¤

Added¤

Changed¤

  • Temp remove reconstruction and 2D skeleton to fix memory problems during conda build for windows.

Removed¤

[0.7.5] 2025-03-19¤

Added¤

Changed¤

Removed¤

[0.7.4] 2025-03-19¤

Added¤

  • Added build flags for file size reduction in CMakeLists.txt.

Changed¤

  • Precompiled header is optional and set to OFF to reduce deployment built size.
  • Moved compas.h module specific headers to the individual source files.

Removed¤

  • Remove unnecessary headers from compas_cgal.h.
  • Remove reconstruction.h and reconstruction.cpp.
  • Remove straight_skeleton_2.h and straight_skeleton_2.cpp.

[0.7.3] 2025-03-18¤

Added¤

Changed¤

  • Nanobind integration.

Removed¤

  • Files related to pybind11.

[0.7.2] 2024-10-29¤

Added¤

  • Added recipe hasher.
  • Added scip to dev install instructions in README.md
  • Added compas_cgal.straight_skeleton_2.offset_polygon_with_holes.

Changed¤

  • Changed name of compas_cgal.straight_skeleton_2.create_interior_straight_skeleton to interior_straight_skeleton
  • Changed name of compas_cgal.straight_skeleton_2.create_interior_straight_skeleton_with_holes to interior_straight_skeleton_with_holes
  • Changed name of compas_cgal.straight_skeleton_2.create_offset_polygons_2 to offset_polygon
  • Changed name of compas_cgal.straight_skeleton_2.create_weighted_offset_polygons_2 to weighted_offset_polygon
  • Changed version to scip=9.0.0 for windows.

Removed¤

  • Removed optional support for GLPK for polygonal surface reconstruction.

[0.7.1] 2024-09-26¤

Added¤

Changed¤

  • Changed the return values of compas_cgal.straight_skeleton_2.create_interior_straight_skeleton and compas_cgal.straight_skeleton_2.create_interior_straight_skeleton_with_holes.
  • Changed the return values of compas_cgal.create_interior_straight_skeleton.

Removed¤

[0.7.0] 2024-05-14¤

Added¤

  • Added compas_cgal.straight_skeleton_2.create_interior_straight_skeleton.
  • Added compas_cgal.straight_skeleton_2.create_interior_straight_skeleton_with_holes.
  • Added compas_cgal.straight_skeleton_2.create_offset_polygons_2_inner.
  • Added compas_cgal.straight_skeleton_2.create_offset_polygons_2_outer.
  • Added compas_cgal.straight_skeleton_2.create_weighted_offset_polygons_2_inner.
  • Added compas_cgal.straight_skeleton_2.create_weighted_offset_polygons_2_outer.

Changed¤

Removed¤

[0.6.0] 2024-02-01¤

Added¤

  • Added compas_cgal.reconstruction.poission_surface_reconstruction.
  • Added compas_cgal.reconstruction.pointset_outlier_removal.
  • Added compas_cgal.reconstruction.pointset_reduction.
  • Added compas_cgal.reconstruction.pointset_smoothing.
  • Added compas_cgal.reconstruction.pointset_normal_estimation.
  • Added compas_cgal.skeletonization.mesh_skeleton.
  • Added compas_cgal.subdivision.mesh_subdivision_catmull_clark.
  • Added compas_cgal.subdivision.mesh_subdivision_loop.
  • Added compas_cgal.subdivision.mesh_subdivision_sqrt3.
  • Added compas_cgal.triangulation.refined_delaunay_mesh.

Changed¤

  • Moved main include types like Point, Vector, Polyline and etc. to the compas namespace.

Removed¤

[0.5.0] 2022-10-07¤

Added¤

  • Support to python 3.10.
  • Added Changelog check in PRs.
  • Exposing mesh compas_cgal.booleans.split function.

Changed¤

  • Updated github workflow.

Removed¤

[0.4.0] 2022-01-20¤

Added¤

  • Added type annotations.
  • Added dimension checks to trimesh setters.
  • Added compas_cgal.measure.volume.
  • Added compas_cgal.subdivision.catmull_clark.

Changed¤

Removed¤

[0.3.0] 2021-12-14¤

Added¤

  • Added compas_cgal.booleans.boolean_union.
  • Added compas_cgal.booleans.boolean_difference.
  • Added compas_cgal.booleans.boolean_intersection.
  • Added compas_cgal.intersections.intersection_mesh_mesh.
  • Added compas_cgal.meshing.remesh.
  • Added compas_cgal.slicer.slice_mesh.
  • Added compas_cgal.triangulation.delaunay_triangulation.
  • Added compas_cgal.triangulation.constrained_delaunay_triangulation.
  • Added compas_cgal.triangulation.conforming_delaunay_triangulation.

Changed¤

Removed¤