From 403997f0b36c5de0c1a8d8d2f99872948b10a816 Mon Sep 17 00:00:00 2001 From: Petru Conduraru Date: Thu, 16 Jul 2026 13:26:16 +0300 Subject: [PATCH] bonsai: preserve original tessellation edges from the CGAL kernel Fixes #5711. Also relevant to #5862 and #6747. Root cause: tool.Loader.create_settings() builds the geometry settings used for every import without enabling the CGAL kernel's cgal-original-edges option. Bonsai's default geometry library is hybrid-cgal-simple-opencascade, so most elements are triangulated by CGAL, which groups all mutually adjacent coplanar triangles into a single face boundary and only reports edges between non-coplanar components. Any edge between two distinct but coplanar source faces (for example a tessellation deliberately split into two coplanar quads) is therefore never recorded in ios_edges, so Geometry.dissolve_triangulated_edges silently merges those faces into one n-gon the moment the object is edited, even though nothing in the IFC file asked for that simplification. Enabling cgal-original-edges makes the kernel report genuine face boundaries instead of grouping by coplanarity. Verified live in headless Blender 5.2 with a synthetic tessellated wall split into two coplanar quads: before the fix the imported mesh collapsed to a 6-vertex ngon plus a quad (10 edges), after the fix it kept 3 separate quads (11 edges), matching the OpenCASCADE kernel's output. Also verified against a synthetic wall with an opening (the case aothms flagged as risky, since booleans/voids have no meaningful original topology to preserve) using Bonsai's actual default hybrid-cgal-simple-opencascade library end to end: face and edge counts were identical with and without the setting, because that library already falls back to OpenCASCADE for boolean/void geometry, so this change does not touch that path. Note the caveat does still apply if a user explicitly switches Geometry Library to plain CGAL on a model with lots of openings; a synthetic-only check of that specific combination showed more exposed triangulation edges there. Generated with the assistance of an AI coding tool. --- src/bonsai/bonsai/tool/loader.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/bonsai/bonsai/tool/loader.py b/src/bonsai/bonsai/tool/loader.py index 383be821e2..f950f82ff7 100644 --- a/src/bonsai/bonsai/tool/loader.py +++ b/src/bonsai/bonsai/tool/loader.py @@ -727,6 +727,15 @@ class Loader(bonsai.core.tool.Loader): settings.set("layerset-first", True) # Wire intersection checks is prohibitively slow on advanced breps. See bug #5999. settings.set("no-wire-intersection-check", True) + # By default the CGAL kernel groups adjacent coplanar triangles into a + # single face boundary, discarding edges between distinct but coplanar + # source faces (e.g. a tessellation deliberately split into two + # coplanar quads). This makes those edges vanish when entering edit + # mode (see #5711, #5862). Preserve the original face boundaries + # instead. This is a no-op for the OpenCASCADE kernel and, in the + # default hybrid-cgal-simple-opencascade library, booleans/voids are + # resolved via the OpenCASCADE fallback so this does not affect them. + settings.set("cgal-original-edges", True) # settings.set("triangulation-type", ifcopenshell.ifcopenshell_wrapper.POLYHEDRON_WITHOUT_HOLES) if is_gross: settings.set("disable-opening-subtractions", True)