This commit is contained in:
Andrej730
2025-11-11 13:13:46 +05:00
parent a4fae94be8
commit e5b26067ab
3 changed files with 25 additions and 16 deletions
@@ -2701,7 +2701,7 @@ class ActivateDrawingStyle(bpy.types.Operator, tool.Ifc.Operator):
def set_raster_style(self, context: bpy.types.Context) -> None: def set_raster_style(self, context: bpy.types.Context) -> None:
scene = context.scene # Do not remove. It is used in exec later 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 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]: def preprocess(path: str, value: Any) -> tuple[str, Any, bool, bool]:
warning = False warning = False
@@ -1169,7 +1169,7 @@ class OverrideDuplicateMove(bpy.types.Operator):
@staticmethod @staticmethod
def execute_ifc_duplicate_operator(operator: bpy.types.Operator, context: bpy.types.Context, linked: bool = False): 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: for obj in context.selected_objects:
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
@@ -1227,6 +1227,9 @@ class DuplicateMoveLinkedAggregateMacro(bpy.types.Macro):
bl_options = {"REGISTER", "UNDO"} bl_options = {"REGISTER", "UNDO"}
OldToNewType = dict[ifcopenshell.entity_instance, list[ifcopenshell.entity_instance]]
class DuplicateMoveLinkedAggregate(bpy.types.Operator): class DuplicateMoveLinkedAggregate(bpy.types.Operator):
bl_idname = "bim.object_duplicate_move_linked_aggregate" bl_idname = "bim.object_duplicate_move_linked_aggregate"
bl_label = "IFC Duplicate and 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" self.pset_name = "BBIM_Linked_Aggregate"
all_old_to_new = {} # Track all duplicates created 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) add_linked_aggregate_group(element)
obj = tool.Ifc.get_object(element) obj = tool.Ifc.get_object(element)
obj.select_set(True) obj.select_set(True)
@@ -1285,7 +1288,7 @@ class DuplicateMoveLinkedAggregate(bpy.types.Operator):
index += 1 index += 1
return index return index
def add_linked_aggregate_group(element): def add_linked_aggregate_group(element: ifcopenshell.entity_instance) -> None:
linked_aggregate_group = None linked_aggregate_group = None
product_groups_name = [ product_groups_name = [
r.RelatingGroup.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) 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) 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(): for new in old_to_new.values():
if new[0].is_a("IfcElementAssembly"): if new[0].is_a("IfcElementAssembly"):
group_elements = next( group_elements = next(
@@ -1475,7 +1478,7 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator):
self.pset_name = "BBIM_Linked_Aggregate" self.pset_name = "BBIM_Linked_Aggregate"
refresh_start_time = time() refresh_start_time = time()
old_to_new = {} 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: def delete_objects(element: ifcopenshell.entity_instance) -> None:
"""Remove IfcElementAssembly and it's parts.""" """Remove IfcElementAssembly and it's parts."""
@@ -1521,8 +1524,8 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator):
) )
tool.Blender.update_viewport() tool.Blender.update_viewport()
def get_original_data(element: ifcopenshell.entity_instance) -> dict[int, dict[int, str]]: def get_original_data(element: ifcopenshell.entity_instance) -> dict[int, dict[int, dict[str, Any]]]:
group = next( group: int = next(
r.RelatingGroup r.RelatingGroup
for r in getattr(element, "HasAssignments", []) or [] for r in getattr(element, "HasAssignments", []) or []
if r.is_a("IfcRelAssignsToGroup") if r.is_a("IfcRelAssignsToGroup")
@@ -1530,8 +1533,8 @@ class RefreshLinkedAggregate(bpy.types.Operator, tool.Ifc.Operator):
).id() ).id()
original_data[group] = {} original_data[group] = {}
pset = ifcopenshell.util.element.get_pset(element, self.pset_name) pset: dict[str, Any] = ifcopenshell.util.element.get_pset(element, self.pset_name)
index = pset["Index"] index: int = pset["Index"]
annotations = get_assignments(element) annotations = get_assignments(element)
container = ifcopenshell.util.element.get_container(element) container = ifcopenshell.util.element.get_container(element)
original_data[group][index] = { original_data[group][index] = {
+12 -6
View File
@@ -189,14 +189,16 @@ class OperatorSpy:
class TemplateListSpy(PanelSpy): 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]): def __init__(self, template_list: type[bpy.types.UIList], spied_data: dict[str, Any]):
self.spied_data = spied_data self.spied_data = spied_data
self.items = getattr(self.spied_data["dataptr"], self.spied_data["propname"]) 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"]) self.active_index = getattr(self.spied_data["active_dataptr"], self.spied_data["active_propname"])
try: self.active_item = tool.Blender.get_active_uilist_element(self.items, self.active_index)
self.active_item = self.items[self.active_index]
except:
self.active_item = None
self.blender_panel = template_list self.blender_panel = template_list
self.rows: list[TemplateListItemSpy] = [] 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')) @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')) @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')) @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 assert panel_spy
panel_spy.refresh_spy() panel_spy.refresh_spy()
for template_list in panel_spy.spied_lists: for template_list in panel_spy.spied_lists:
if list_name == template_list.spied_data["listtype_name"]: if list_name == template_list.spied_data["listtype_name"]:
item_names = [] item_names: list[str] = []
for i, item in enumerate(template_list.items): for i, item in enumerate(template_list.items):
item_names.append(item.name) item_names.append(item.name)
if item.name == item_name: if item.name == item_name: