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, andkeep_pointsparameters tocompas_cgal.meshing.trimesh_remesh.protect_boundaryconstrains 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 totarget_edge_length;protect_sharp_edges_angle_degmarks interior edges whose dihedral angle ≥ the threshold as constrained (0.0disables interior-feature detection);keep_points(an Nx3 array) pins only the mesh vertices coincident with the given points (matched by coordinate within tolerance, viavertex_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/.mdto demonstrate all three boundary modes on the RhinoVault shell side by side (default,protect_boundary=True, andkeep_pointswith the four corners), replacing the example image. - Added
compas_cgal.straight_skeleton_2.extrudewrapping CGAL'sextrude_skeleton, turning a 2D polygon (optionally with holes) into a closed 3D roof mesh, with control over roof pitch via taperanglesor straight skeletonweightsand an optionalmaximum_height. Internally coplanar extrusion faces are merged into polygons (viaremesh_planar_patches) to recover the true roof planes, andextrudereturns 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 ofcompas.geometry.Line. - Added the
extrude_straight_skeletonbinding insrc/straight_skeleton_2.cpp/.h. - Added
docs/examples/example_straight_skeleton_2_extrude.pyand.md(with imagedocs/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 inmkdocs.yml. - Added
tests/test_straight_skeleton_2_extrude.pycovering 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.24andcompas>=2.15,<3(previously undeclared, leaving installs to fail at import time on clean environments). - Added
docs/examples/example_measure.mddocumentingmesh_area,mesh_volume, andmesh_centroidso the measure example renders alongside the others. - Added image reference in
docs/examples/example_isolines.mdand addedMeasure: examples/example_measure.mdto the Examples nav inmkdocs.yml. - Added
docs/examples/example_booleans_with_edges.mdandexample_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 testtests/test_geodesics.py::test_heat_geodesic_multisource_boundary_sourcesthat fails on the previous backend. heat_geodesic_distances,HeatGeodesicSolver,geodesic_isolines, andgeodesic_isolines_splitnow accept acompas.datastructures.Meshdirectly, in addition to the(vertices, faces)tuple — both input shapes are declared via@overloadand coerced through one internal_as_vertices_facesseam.
Fixed¤
- Fixed
docs/examples/example_projection.pyimports:project_mesh_on_mesh,project_points_on_mesh,pull_mesh_on_mesh, andpull_points_on_meshwere incorrectly imported fromcompas_cgal.meshinginstead ofcompas_cgal.projection, causingImportErrorfor anyone running the example. - Fixed multi-source geodesic distances collapsing near the source set:
heat_geodesic_distances,HeatGeodesicSolver,geodesic_isolines, andgeodesic_isolines_splitnow use an own Eigen implementation of the heat method (Crane et al. 2017) with a Dirichlet-constrained Poisson step instead of CGAL'sHeat_method_3, whosevalue_at_source_setnormalizes the Poisson potential throughmin_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 raiseValueErrorand meshes with a connected component containing no source raiseRuntimeError(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
nanobindbuild-system requirement from>=1.3.2to>=2.12to fixrefined_delaunay_mesh(and otherEigen::Refoverloads) raisingTypeError: incompatible function argumentswhen called withnumpy>=2.4.0. - Extended
[tool.cibuildwheel] test-requirestonumpy>=2.4andcompas>=2.15,<3so the wheel test job exercises the post-2.4 ndarray ABI on every build. - Applied
ruff formattodocs/examples/example_booleans_with_face_source.py,docs/examples/example_isolines.py,tasks.py, andtests/test_booleans.pyso the working tree is clean for the nextinvoke releaserun.
Removed¤
[0.9.3] 2026-04-27¤
Added¤
- Added
compas_cgal.isolines.isolinesfor extracting isoline polylines from vertex scalar fields. - Added
compas_cgal.skeletonization.mesh_skeleton_with_mapping HeatGeodesicSolverclass with precomputation for repeated queries-
heat_geodesic_distancesfunction for single-shot usage- uses CGAL Heat_method_3 with intrinsic Delaunay triangulation
- ~30% faster than
libiglheat incompas_slicerworkflow
-
Added
simplify_polylineandsimplify_polylinesfunctions for polyline simplification using Douglas-Peucker algorithm - Added
closest_points_on_polylinefunction for batch closest point queries on polylines
Changed¤
- Added optional surface meshing parameters (
sm_angle,sm_radius,sm_distance) tocompas_cgal.reconstruction.poisson_surface_reconstructionfor controlling mesh quality and density. -
Upgraded cibuildwheel manylinux image from
manylinux2014tomanylinux_2_28for 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_remeshtocompas_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_extto_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.hmodule specific headers to the individual source files.
Removed¤
- Remove unnecessary headers from
compas_cgal.h. - Remove
reconstruction.handreconstruction.cpp. - Remove
straight_skeleton_2.handstraight_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
scipto 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_skeletontointerior_straight_skeleton - Changed name of
compas_cgal.straight_skeleton_2.create_interior_straight_skeleton_with_holestointerior_straight_skeleton_with_holes - Changed name of
compas_cgal.straight_skeleton_2.create_offset_polygons_2tooffset_polygon - Changed name of
compas_cgal.straight_skeleton_2.create_weighted_offset_polygons_2toweighted_offset_polygon - Changed version to
scip=9.0.0for 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_skeletonandcompas_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,Polylineand etc. to thecompasnamespace.
Removed¤
[0.5.0] 2022-10-07¤
Added¤
- Support to python 3.10.
- Added Changelog check in PRs.
- Exposing mesh
compas_cgal.booleans.splitfunction.
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.