diff --git a/src/bonsai/bonsai/bim/import_ifc.py b/src/bonsai/bonsai/bim/import_ifc.py index eb7024b30e..ed73581236 100644 --- a/src/bonsai/bonsai/bim/import_ifc.py +++ b/src/bonsai/bonsai/bim/import_ifc.py @@ -1215,8 +1215,8 @@ class IfcImporter: if element not in elements_to_import: continue for i in range(len(data)): - tool.Blender.Modifier.Array.set_children_lock_state(element, i, True) - tool.Blender.Modifier.Array.constrain_children_to_parent(element) + tool.Array.set_children_lock_state(element, i, True) + tool.Array.constrain_children_to_parent(element) def update_linked_aggregates(self): # TODO Remove this after a while. See commit 17d6b8a diff --git a/src/bonsai/bonsai/bim/module/geometry/data.py b/src/bonsai/bonsai/bim/module/geometry/data.py index 481426d25b..f88eb967ec 100644 --- a/src/bonsai/bonsai/bim/module/geometry/data.py +++ b/src/bonsai/bonsai/bim/module/geometry/data.py @@ -80,9 +80,9 @@ class ViewportData: modes.append(edit_mode) elif element.is_a("IfcGridAxis"): modes.append(edit_mode) - elif tool.Blender.Modifier.is_roof(element): + elif tool.Parametric.is_roof(element): modes.append(edit_mode) - elif tool.Blender.Modifier.is_railing(element): + elif tool.Parametric.is_railing(element): modes.append(edit_mode) elif item_mode not in modes: modes.append(item_mode) diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index 7c5ad5a039..2caa968c45 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -1024,10 +1024,10 @@ class OverrideDelete(bpy.types.Operator): for array_parent in array_parents: array_parent_obj = tool.Ifc.get_object(array_parent) - data = [(i, data) for i, data in enumerate(tool.Blender.Modifier.Array.get_modifiers_data(array_parent))] + data = [(i, data) for i, data in enumerate(tool.Array.get_modifiers_data(array_parent))] # NOTE: there is a way to remove arrays more precisely but it's more complex for i, modifier_data in reversed(data): - children = set(tool.Blender.Modifier.Array.get_children_objects(modifier_data)) + children = set(tool.Array.get_children_objects(modifier_data)) if children.issubset(selected_objects): with context.temp_override(active_object=array_parent_obj): bpy.ops.bim.remove_array(item=i) @@ -2494,9 +2494,9 @@ class OverrideModeSetObject(bpy.types.Operator, tool.Ifc.Operator): profile = tool.Ifc.get().by_id(profile_id) if tool.Ifc.get_object(profile): # We are editing an arbitrary profile bpy.ops.bim.edit_arbitrary_profile() - elif tool.Blender.Modifier.is_railing(element): + elif tool.Parametric.is_railing(element): bpy.ops.bim.finish_editing_railing_path() - elif tool.Blender.Modifier.is_roof(element): + elif tool.Parametric.is_roof(element): bpy.ops.bim.finish_editing_roof_path() elif tool.Model.get_usage_type(element) == "PROFILE": bpy.ops.bim.edit_extrusion_axis() diff --git a/src/bonsai/bonsai/bim/module/model/door.py b/src/bonsai/bonsai/bim/module/model/door.py index e75bce15e1..433d436b4c 100644 --- a/src/bonsai/bonsai/bim/module/model/door.py +++ b/src/bonsai/bonsai/bim/module/model/door.py @@ -580,7 +580,7 @@ class _DoorEditMixin(FeatureModifierEditMixin): @classmethod def _is_element_type(cls, element): - return tool.Blender.Modifier.is_door(element) + return tool.Parametric.is_door(element) @classmethod def _get_props(cls, obj: bpy.types.Object): @@ -629,7 +629,7 @@ class RemoveDoor(bpy.types.Operator, tool.Ifc.Operator): def remove_door_on_object(self, obj: bpy.types.Object) -> None: element = tool.Ifc.get_entity(obj) assert element - if not tool.Blender.Modifier.is_door(element): + if not tool.Parametric.is_door(element): return props = tool.Model.get_door_props(obj) props.is_editing = False @@ -691,7 +691,7 @@ class ToggleDoorSwing(bpy.types.Operator, tool.Ifc.Operator): if not element: return {"CANCELLED"} - is_door = tool.Blender.Modifier.is_door(element) + is_door = tool.Parametric.is_door(element) if self.flip_geometry: tool.Geometry.flip_object(obj, self.flip_local_axes) @@ -874,7 +874,7 @@ class GizmoDoorEdition(bpy.types.GizmoGroup, gizmo.BaseParametricGizmoGroup): @classmethod def is_element_type(cls, element: ifcopenshell.entity_instance) -> bool: - return tool.Blender.Modifier.is_door(element) + return tool.Parametric.is_door(element) def get_icon_y_extent(self, props: "BIMDoorProperties") -> tuple[float, float]: """Get Y extents for door icon positioning. diff --git a/src/bonsai/bonsai/bim/module/model/railing.py b/src/bonsai/bonsai/bim/module/model/railing.py index 0048a57fa4..6f3697d51d 100644 --- a/src/bonsai/bonsai/bim/module/model/railing.py +++ b/src/bonsai/bonsai/bim/module/model/railing.py @@ -415,7 +415,7 @@ class _RailingEditMixin(PathPreservingEditMixin): @classmethod def _is_element_type(cls, element): - return tool.Blender.Modifier.is_railing(element) + return tool.Parametric.is_railing(element) @classmethod def _get_props(cls, obj: bpy.types.Object): diff --git a/src/bonsai/bonsai/bim/module/model/roof.py b/src/bonsai/bonsai/bim/module/model/roof.py index ec3d821248..0e34727ceb 100644 --- a/src/bonsai/bonsai/bim/module/model/roof.py +++ b/src/bonsai/bonsai/bim/module/model/roof.py @@ -631,7 +631,7 @@ class _RoofEditMixin(PathPreservingEditMixin): @classmethod def _is_element_type(cls, element): - return tool.Blender.Modifier.is_roof(element) + return tool.Parametric.is_roof(element) @classmethod def _get_props(cls, obj: bpy.types.Object): diff --git a/src/bonsai/bonsai/bim/module/model/stair.py b/src/bonsai/bonsai/bim/module/model/stair.py index 3785da87fc..a7972e9630 100644 --- a/src/bonsai/bonsai/bim/module/model/stair.py +++ b/src/bonsai/bonsai/bim/module/model/stair.py @@ -632,7 +632,7 @@ class GizmoStairEdition(bpy.types.GizmoGroup, gizmo.BaseParametricGizmoGroup): @classmethod def is_element_type(cls, element: ifcopenshell.entity_instance) -> bool: - return tool.Blender.Modifier.is_stair(element) + return tool.Parametric.is_stair(element) def setup_element_specific_gizmos(self, context: bpy.types.Context) -> None: """Create the total-length lock as an open/closed pair plus the diff --git a/src/bonsai/bonsai/bim/module/model/ui.py b/src/bonsai/bonsai/bim/module/model/ui.py index dafee6fa1e..e2b73dfe3d 100644 --- a/src/bonsai/bonsai/bim/module/model/ui.py +++ b/src/bonsai/bonsai/bim/module/model/ui.py @@ -365,7 +365,7 @@ class BIM_PT_wall(bpy.types.Panel): if not obj: return False element = tool.Ifc.get_entity(obj) - return bool(element) and tool.Blender.Modifier.is_wall(element) + return bool(element) and tool.Parametric.is_wall(element) def draw(self, context): obj = context.active_object diff --git a/src/bonsai/bonsai/bim/module/model/wall.py b/src/bonsai/bonsai/bim/module/model/wall.py index bfa056605b..a08b016a76 100644 --- a/src/bonsai/bonsai/bim/module/model/wall.py +++ b/src/bonsai/bonsai/bim/module/model/wall.py @@ -1939,7 +1939,7 @@ class GizmoWallEdition(bpy.types.GizmoGroup, gizmo.BaseParametricGizmoGroup): @classmethod def is_element_type(cls, element: ifcopenshell.entity_instance) -> bool: - return tool.Blender.Modifier.is_wall(element) + return tool.Parametric.is_wall(element) def get_icon_y_extent(self, props: "BIMWallProperties") -> tuple[float, float]: far = props.offset + props.thickness + 2 * self.GIZMO_OFFSET @@ -3416,7 +3416,7 @@ class GizmoWallJoinIntersection(bpy.types.GizmoGroup, _WallGeomCachedBillboardin return False for o in selected: element = tool.Ifc.get_entity(o) - if not element or not tool.Blender.Modifier.is_wall(element): + if not element or not tool.Parametric.is_wall(element): return False return True diff --git a/src/bonsai/bonsai/bim/module/model/window.py b/src/bonsai/bonsai/bim/module/model/window.py index a14f3322c4..4d34b3f555 100644 --- a/src/bonsai/bonsai/bim/module/model/window.py +++ b/src/bonsai/bonsai/bim/module/model/window.py @@ -491,7 +491,7 @@ class _WindowEditMixin(FeatureModifierEditMixin): @classmethod def _is_element_type(cls, element): - return tool.Blender.Modifier.is_window(element) + return tool.Parametric.is_window(element) @classmethod def _get_props(cls, obj: bpy.types.Object): @@ -750,7 +750,7 @@ class GizmoWindowEdition(bpy.types.GizmoGroup, gizmo.BaseParametricGizmoGroup): @classmethod def is_element_type(cls, element: ifcopenshell.entity_instance) -> bool: - return tool.Blender.Modifier.is_window(element) + return tool.Parametric.is_window(element) def get_icon_y_extent(self, props: "BIMWindowProperties") -> tuple[float, float]: """Get Y extents for window icon positioning. diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 75afc55f7b..616f87efaa 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -1332,78 +1332,6 @@ class Blender(bonsai.core.tool.Blender): return True class Modifier: - # ---------------------------------------------------------------------- - # FIXME(PR5): backward-compat shims for callers still using the - # pre-refactor API. The is_ predicates now live on tool.Parametric; - # the Array helper bag now lives on tool.Array. PR4 migrates each caller; - # this whole shim block is removed in PR5's cleanup. - # ---------------------------------------------------------------------- - - @classmethod - def is_door(cls, element: entity_instance) -> bool: - return tool.Parametric.is_door(element) - - @classmethod - def is_railing(cls, element: entity_instance) -> bool: - return tool.Parametric.is_railing(element) - - @classmethod - def is_roof(cls, element: entity_instance) -> bool: - return tool.Parametric.is_roof(element) - - @classmethod - def is_stair(cls, element: entity_instance) -> bool: - return tool.Parametric.is_stair(element) - - @classmethod - def is_wall(cls, element: entity_instance) -> bool: - return tool.Parametric.is_wall(element) - - @classmethod - def is_window(cls, element: entity_instance) -> bool: - return tool.Parametric.is_window(element) - - @classmethod - def is_array(cls, element: entity_instance) -> bool: - return tool.Parametric.is_array(element) - - class Array: - @classmethod - def bake_children_transform(cls, parent_element: ifcopenshell.entity_instance, item: int) -> None: - tool.Array.bake_children_transform(parent_element, item) - - @classmethod - def constrain_children_to_parent(cls, parent_element: ifcopenshell.entity_instance) -> None: - tool.Array.constrain_children_to_parent(parent_element) - - @classmethod - def get_all_children_objects(cls, parent_element: ifcopenshell.entity_instance) -> list: - return tool.Array.get_all_children_objects(parent_element) - - @classmethod - def get_all_objects(cls, parent_element: ifcopenshell.entity_instance) -> list: - return tool.Array.get_all_objects(parent_element) - - @classmethod - def get_children_objects(cls, modifier_data: dict) -> list: - return tool.Array.get_children_objects(modifier_data) - - @classmethod - def get_modifiers_data(cls, parent_element: ifcopenshell.entity_instance): - return tool.Array.get_modifiers_data(parent_element) - - @classmethod - def remove_constraints(cls, parent_element: ifcopenshell.entity_instance) -> None: - tool.Array.remove_constraints(parent_element) - - @classmethod - def set_children_lock_state( - cls, parent_element: ifcopenshell.entity_instance, item: int, lock: bool - ) -> None: - tool.Array.set_children_lock_state(parent_element, item, lock) - - # ---------------------------------------------------------------------- - @classmethod def try_applying_edit_mode(cls, obj: bpy.types.Object, element: entity_instance) -> bool: """Tries to validate the current BIM modifier parameters for the active object diff --git a/src/bonsai/bonsai/tool/root.py b/src/bonsai/bonsai/tool/root.py index 524f590a81..d7b7e0596f 100644 --- a/src/bonsai/bonsai/tool/root.py +++ b/src/bonsai/bonsai/tool/root.py @@ -393,7 +393,7 @@ class Root(bonsai.core.tool.Root): # Make sure that the array children also get reassigned to the correct aggregate pset = ifcopenshell.util.element.get_pset(new[0], "BBIM_Array") if pset: - array_children = tool.Blender.Modifier.Array.get_all_children_objects(new[0]) + array_children = tool.Array.get_all_children_objects(new[0]) for obj in array_children: bonsai.core.aggregate.assign_object( tool.Ifc, diff --git a/src/bonsai/test/bim/test_parametric_registry.py b/src/bonsai/test/bim/test_parametric_registry.py index 4df71438ca..1c1e3ec3f7 100644 --- a/src/bonsai/test/bim/test_parametric_registry.py +++ b/src/bonsai/test/bim/test_parametric_registry.py @@ -30,7 +30,7 @@ will ship. These tests pin the registry-to-runtime contract: for every entry the operator ``bl_idname``s resolve to registered ``bpy.ops.bim.*`` callables, the ``PropertyGroup`` class is attached to ``bpy.types.Object``, and the per-type -predicate exists on `tool.Blender.Modifier`.""" +predicate exists on `tool.Parametric`.""" import types @@ -82,11 +82,11 @@ def test_every_entry_has_property_group_attached(registry): ) -def test_every_entry_has_modifier_predicate(registry): +def test_every_entry_has_parametric_predicate(registry): from bonsai import tool - missing = [e.name for e in registry if getattr(tool.Blender.Modifier, f"is_{e.name}", None) is None] - assert not missing, f"tool.Blender.Modifier missing is_ predicates: {missing}" + missing = [e.name for e in registry if getattr(tool.Parametric, f"is_{e.name}", None) is None] + assert not missing, f"tool.Parametric missing is_ predicates: {missing}" def test_every_predicate_does_not_raise_on_non_matching_element(registry): @@ -109,7 +109,7 @@ def test_every_predicate_does_not_raise_on_non_matching_element(registry): raised = [] for feature in registry: - predicate = getattr(tool.Blender.Modifier, f"is_{feature.name}", None) + predicate = getattr(tool.Parametric, f"is_{feature.name}", None) if predicate is None: continue try: