From e5b26067ab9a7b851998636f5ba10e0e257a434e Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Tue, 11 Nov 2025 13:13:46 +0500 Subject: [PATCH] typing --- .../bonsai/bim/module/drawing/operator.py | 2 +- .../bonsai/bim/module/geometry/operator.py | 21 +++++++++++-------- src/bonsai/test/bim/test_feature.py | 18 ++++++++++------ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/drawing/operator.py b/src/bonsai/bonsai/bim/module/drawing/operator.py index 6c98169c06..a76e187566 100644 --- a/src/bonsai/bonsai/bim/module/drawing/operator.py +++ b/src/bonsai/bonsai/bim/module/drawing/operator.py @@ -2701,7 +2701,7 @@ class ActivateDrawingStyle(bpy.types.Operator, tool.Ifc.Operator): def set_raster_style(self, context: bpy.types.Context) -> None: scene = context.scene # Do not remove. It is used in exec later assert (space := tool.Blender.get_view3d_space()) # Do not remove. It is used in exec later - style = json.loads(self.drawing_style.raster_style) + style: dict[str, Any] = json.loads(self.drawing_style.raster_style) def preprocess(path: str, value: Any) -> tuple[str, Any, bool, bool]: warning = False diff --git a/src/bonsai/bonsai/bim/module/geometry/operator.py b/src/bonsai/bonsai/bim/module/geometry/operator.py index d7d3bd720c..dd8b51a2e2 100644 --- a/src/bonsai/bonsai/bim/module/geometry/operator.py +++ b/src/bonsai/bonsai/bim/module/geometry/operator.py @@ -1169,7 +1169,7 @@ class OverrideDuplicateMove(bpy.types.Operator): @staticmethod def execute_ifc_duplicate_operator(operator: bpy.types.Operator, context: bpy.types.Context, linked: bool = False): - objects_to_remove = set() + objects_to_remove: set[bpy.types.Object] = set() for obj in context.selected_objects: element = tool.Ifc.get_entity(obj) @@ -1227,6 +1227,9 @@ class DuplicateMoveLinkedAggregateMacro(bpy.types.Macro): bl_options = {"REGISTER", "UNDO"} +OldToNewType = dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]] + + class DuplicateMoveLinkedAggregate(bpy.types.Operator): bl_idname = "bim.object_duplicate_move_linked_aggregate" bl_label = "IFC Duplicate and Move Linked Aggregate" @@ -1251,7 +1254,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): self.pset_name = "BBIM_Linked_Aggregate" all_old_to_new = {} # Track all duplicates created - def select_objects_and_add_data(element): + def select_objects_and_add_data(element: ifcopenshell.entity_instance) -> None: add_linked_aggregate_group(element) obj = tool.Ifc.get_object(element) obj.select_set(True) @@ -1285,7 +1288,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): index += 1 return index - def add_linked_aggregate_group(element): + def add_linked_aggregate_group(element: ifcopenshell.entity_instance) -> None: linked_aggregate_group = None product_groups_name = [ r.RelatingGroup.Name @@ -1298,7 +1301,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator): linked_aggregate_group = ifcopenshell.api.group.add_group(ifc_file, name=self.group_name) ifcopenshell.api.group.assign_group(ifc_file, products=[element], group=linked_aggregate_group) - def custom_incremental_naming_for_element_assembly(old_to_new): + def custom_incremental_naming_for_element_assembly(old_to_new: OldToNewType) -> None: for new in old_to_new.values(): if new[0].is_a("IfcElementAssembly"): group_elements = next( @@ -1475,7 +1478,7 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator): self.pset_name = "BBIM_Linked_Aggregate" refresh_start_time = time() old_to_new = {} - original_data: dict[int, dict[int, str]] = {} + original_data: dict[int, dict[int, dict[str, Any]]] = {} def delete_objects(element: ifcopenshell.entity_instance) -> None: """Remove IfcElementAssembly and it's parts.""" @@ -1521,8 +1524,8 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator): ) tool.Blender.update_viewport() - def get_original_data(element: ifcopenshell.entity_instance) -> dict[int, dict[int, str]]: - group = next( + def get_original_data(element: ifcopenshell.entity_instance) -> dict[int, dict[int, dict[str, Any]]]: + group: int = next( r.RelatingGroup for r in getattr(element, "HasAssignments", []) or [] if r.is_a("IfcRelAssignsToGroup") @@ -1530,8 +1533,8 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator): ).id() original_data[group] = {} - pset = ifcopenshell.util.element.get_pset(element, self.pset_name) - index = pset["Index"] + pset: dict[str, Any] = ifcopenshell.util.element.get_pset(element, self.pset_name) + index: int = pset["Index"] annotations = get_assignments(element) container = ifcopenshell.util.element.get_container(element) original_data[group][index] = { diff --git a/src/bonsai/test/bim/test_feature.py b/src/bonsai/test/bim/test_feature.py index c8c0e701c4..b646ac6ed9 100644 --- a/src/bonsai/test/bim/test_feature.py +++ b/src/bonsai/test/bim/test_feature.py @@ -189,14 +189,16 @@ class OperatorSpy: class TemplateListSpy(PanelSpy): + items: bpy.types.bpy_prop_collection_idprop[bpy.types.PropertyGroup] + active_index: int + active_item: bpy.types.PropertyGroup | None + blender_panel: type[bpy.types.UIList] + def __init__(self, template_list: type[bpy.types.UIList], spied_data: dict[str, Any]): self.spied_data = spied_data self.items = getattr(self.spied_data["dataptr"], self.spied_data["propname"]) self.active_index = getattr(self.spied_data["active_dataptr"], self.spied_data["active_propname"]) - try: - self.active_item = self.items[self.active_index] - except: - self.active_item = None + self.active_item = tool.Blender.get_active_uilist_element(self.items, self.active_index) self.blender_panel = template_list self.rows: list[TemplateListItemSpy] = [] @@ -637,12 +639,16 @@ def the_name_list_has_total_items(name, total): @given(parsers.parse('I select the "{item_name}" item in the "{list_name}" list')) @when(parsers.parse('I select the "{item_name}" item in the "{list_name}" list')) @then(parsers.parse('I can select the "{item_name}" item in the "{list_name}" list')) -def i_select_the_item_name_item_in_the_list_name_list(item_name, list_name): +def i_select_the_item_name_item_in_the_list_name_list(item_name: str, list_name: str) -> None: + """ + :param item_name: The ``.name`` of the item to select. + :param list_name: List type name, e.g. ``BIM_UL_containers_manager``. + """ assert panel_spy panel_spy.refresh_spy() for template_list in panel_spy.spied_lists: if list_name == template_list.spied_data["listtype_name"]: - item_names = [] + item_names: list[str] = [] for i, item in enumerate(template_list.items): item_names.append(item.name) if item.name == item_name: