Three user-facing fixes for the MEP-system gizmo surface:
1. MEP pair-disconnect no longer crashes Blender. The
MEPSystemPathDecorator cached entity_instance references in
_cached_walk; deleting a bridging fitting via the gizmo left a freed
SWIG handle in the list, and the next _build_geometry pass segfaulted
on .is_a. The cache now stores STEP integer ids and re-resolves via
ifc_file.by_id on each draw, plus folds tool.Parametric.get_geom_generation
into the cache key — ifcopenshell.api mutations invalidate before the
next frame regardless of how the deletion was routed.
2. Bend re-edit pen icon stays reachable. The bend creation path
tessellates the swept-disk body (upstream geometry-kernel workaround),
so tool.System.has_parametric_body correctly returns False for a
freshly-committed bend. _active_is_bend_fitting and
GizmoMEPActions.is_eligible_object now fall back to the type's
BBIM_Fitting pset — the same source bim.enable_bend_preview_from_bend
reads parameters from — keeping the pen icon eligible.
3. MEP pair / per-port unjoin icons unified through bim.disconnect_elements.
The MEP gizmo group's three unjoin icons (pair, start, end) now share
the wall-disconnect surface: same VIEW3D_GT_wall_link_toggle icon, same
bim.disconnect_elements operator. tool.Connection.find_rels learned a
new "mep-pair-fitting" kind that returns the bridging fitting as the
disconnect target; core.connection.disconnect_rel grew the matching
dispatch arm. The old MEPUnjoinAtPort and MEPUnjoinPair operators are
removed.
Also registered wall.GizmoPairDisconnect (previously declared but never
in the classes tuple, so dead code) for the wall+slab pair-disconnect
surface, and extracted MEP port-topology helpers (find_bridging_fitting,
is_disconnectable_fitting, neighbours_at_ports) onto tool.System so the
canonical walk has a single home.
Generated with the assistance of an AI coding tool.
Deleting a slab that was connected to a wall via IfcRelConnectsElements(TOP)
left the wall holding orphan IfcBooleanResult items + a stale BBIM_Boolean
pset. The disconnect operator already runs the right cleanup; element delete
just never invoked it.
Extract the per-kind cleanup into core.connection.disconnect_rel so the
operator (bim.disconnect_elements) and a new cascade in
tool.Geometry.delete_ifc_object share one dispatch table. Adding a future
rel kind to tool.Connection.find_rels now flows into both call sites
automatically; an AST forward-compat guard enforces coverage.
Other adjustments:
- regenerate_wall_to_underside zero-slab branch now removes stale clip
booleans instead of silently skipping, so disconnecting the last TOP
slab also reverts the wall correctly.
- duplicate_ifc_objects (Shift+D) calls strip_underside_booleans on copied
walls so the duplicate doesn't carry over the source's slab trim, then
reloads the body representation when something was stripped so the
viewport reflects the change without waiting on Shift+G.
- batch_being_deleted_ids threads through OverrideDelete so the cascade
can suppress partner-side regenerate when both endpoints are queued for
deletion in the same batch.
This file was generated with the assistance of an AI coding tool.