From 3143f8c9a5728aa3a209ff6161985b93d5dca412 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 21 Apr 2021 11:11:08 +1000 Subject: [PATCH] Code review for assign product with myoualid --- .../bim/module/sequence/operator.py | 25 ++++---- .../blenderbim/bim/module/sequence/prop.py | 3 +- .../blenderbim/bim/module/sequence/ui.py | 3 - .../api/control/assign_control.py | 27 +++----- .../ifcopenshell/api/nest/assign_object.py | 12 ++-- .../api/sequence/assign_product.py | 61 ++++++++----------- 6 files changed, 52 insertions(+), 79 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/sequence/operator.py b/src/blenderbim/blenderbim/bim/module/sequence/operator.py index 0f7f714e8a..c07d659323 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/operator.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/operator.py @@ -628,7 +628,6 @@ class EnableEditingTask(bpy.types.Operator): if data[attribute.name()]: new.enum_value = data[attribute.name()] props.active_task_id = self.task - props.should_show_times = True return {"FINISHED"} @@ -662,9 +661,7 @@ class EditTask(bpy.types.Operator): attributes[attribute.name] = attribute.enum_value self.file = IfcStore.get_file() ifcopenshell.api.run( - "sequence.edit_task", - self.file, - **{"task": self.file.by_id(props.active_task_id), "attributes": attributes} + "sequence.edit_task", self.file, **{"task": self.file.by_id(props.active_task_id), "attributes": attributes} ) Data.load(IfcStore.get_file()) bpy.ops.bim.disable_editing_task() @@ -748,17 +745,19 @@ class AssignProduct(bpy.types.Operator): bl_idname = "bim.assign_product" bl_label = "Assign Product" task: bpy.props.IntProperty() + related_product: bpy.props.StringProperty() def execute(self, context): - obj = bpy.context.active_object.BIMObjectProperties.ifc_definition_id - props = context.scene.BIMWorkScheduleProperties - self.file = IfcStore.get_file() - ifcopenshell.api.run( - "sequence.assign_product", - self.file, - relating_product = self.file.by_id(obj), - related_process = self.file.by_id(self.task), + related_products = ( + [bpy.data.objects.get(self.related_product)] if self.related_product else bpy.context.selected_objects ) - props.has_assignment = True + for related_product in related_products: + self.file = IfcStore.get_file() + ifcopenshell.api.run( + "sequence.assign_product", + self.file, + relating_product=self.file.by_id(related_product.BIMObjectProperties.ifc_definition_id), + related_object=self.file.by_id(self.task), + ) Data.load(self.file) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/sequence/prop.py b/src/blenderbim/blenderbim/bim/module/sequence/prop.py index e59a744cd8..ea599001c4 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/prop.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/prop.py @@ -107,7 +107,6 @@ class Task(PropertyGroup): identification: StringProperty(name="Identification", update=updateTaskIdentification) ifc_definition_id: IntProperty(name="IFC Definition ID") has_children: BoolProperty(name="Has Children") - has_assignment: BoolProperty(name="Has Assignement") is_expanded: BoolProperty(name="Is Expanded") level_index: IntProperty(name="Level Index") duration: StringProperty(name="Duration") @@ -137,7 +136,7 @@ class BIMWorkScheduleProperties(PropertyGroup): active_task_index: IntProperty(name="Active Task Index") active_task_id: IntProperty(name="Active Task Id") task_attributes: CollectionProperty(name="Task Attributes", type=Attribute) - should_show_times: BoolProperty(name="Should Show Times", default=False) + should_show_times: BoolProperty(name="Should Show Times", default=True) active_task_time_id: IntProperty(name="Active Task Id") task_time_attributes: CollectionProperty(name="Task Time Attributes", type=Attribute) contracted_tasks: StringProperty(name="Contracted Task Items", default="[]") diff --git a/src/blenderbim/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py index 917076dc3b..0831afbf90 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -293,8 +293,5 @@ class BIM_UL_tasks(UIList): row.operator("bim.enable_editing_task", text="", icon="GREASEPENCIL").task = item.ifc_definition_id row.operator("bim.add_task", text="", icon="ADD").task = item.ifc_definition_id row.operator("bim.remove_task", text="", icon="X").task = item.ifc_definition_id - if context.selected_objects: - obj = context.selected_objects[0] - pass row = layout.row(align=True) row.operator("bim.assign_product", text="ADD", icon="OUTLINER_COLLECTION").task = item.ifc_definition_id diff --git a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py index d684f63f44..f45c93e80e 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py +++ b/src/ifcopenshell-python/ifcopenshell/api/control/assign_control.py @@ -13,27 +13,18 @@ class Usecase: self.settings[key] = value def execute(self): - has_assignments = None if self.settings["related_object"].HasAssignments: - for assignement in self.settings["related_object"].HasAssignments: - if assignement.is_a("IfclRelAssignsToControl"): - has_assignments = assignement + for assignment in self.settings["related_object"].HasAssignments: + if ( + assignment.is_a("IfclRelAssignsToControl") + and assignment.RelatingControl == self.settings["relating_control"] + ): + return controls = None - for rel in self.settings["relating_control"].Controls: - if rel.is_a("IfcRelAssignsToControl"): - controls = rel - break - if has_assignments and has_assignments == controls: - return - if has_assignments: - related_objects = list(has_assignments.RelatedObjects) - related_objects.remove(self.settings["related_object"]) - if related_objects: - has_assignments.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": has_assignments}) - else: - self.file.remove(has_assignments) + if self.settings["relating_control"].Controls: + controls = self.settings["relating_control"].Controls[0] + if controls: related_objects = list(controls.RelatedObjects) related_objects.append(self.settings["related_object"]) diff --git a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py index 2c948e3f80..f0d79efaf9 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py +++ b/src/ifcopenshell-python/ifcopenshell/api/nest/assign_object.py @@ -6,7 +6,7 @@ class Usecase: def __init__(self, file, **settings): self.file = file self.settings = { - "object": None, + "related_object": None, "relating_object": None, } for key, value in settings.items(): @@ -14,8 +14,8 @@ class Usecase: def execute(self): nests = None - if self.settings["object"].Nests: - nests = self.settings["object"].Nests[0] + if self.settings["related_object"].Nests: + nests = self.settings["related_object"].Nests[0] is_nested_by = None for rel in self.settings["relating_object"].IsNestedBy: @@ -28,7 +28,7 @@ class Usecase: if nests: related_objects = list(nests.RelatedObjects) - related_objects.remove(self.settings["object"]) + related_objects.remove(self.settings["related_object"]) if related_objects: nests.RelatedObjects = related_objects ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": nests}) @@ -37,7 +37,7 @@ class Usecase: if is_nested_by: related_objects = list(is_nested_by.RelatedObjects) - related_objects.append(self.settings["object"]) + related_objects.append(self.settings["related_object"]) is_nested_by.RelatedObjects = related_objects ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": is_nested_by}) else: @@ -46,7 +46,7 @@ class Usecase: **{ "GlobalId": ifcopenshell.guid.new(), "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatedObjects": [self.settings["object"]], + "RelatedObjects": [self.settings["related_object"]], "RelatingObject": self.settings["relating_object"], } ) diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py index cd4f39176c..afc29f5d64 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/assign_product.py @@ -7,50 +7,37 @@ class Usecase: self.file = file self.settings = { "relating_product": None, - "related_process": None, + "related_object": None, } for key, value in settings.items(): self.settings[key] = value def execute(self): + if self.settings["related_object"].HasAssignments: + for assignment in self.settings["related_object"].HasAssignments: + if ( + assignment.is_a("IfclRelAssignsToProduct") + and assignment.RelatingProduct == self.settings["relating_product"] + ): + return + referenced_by = None - if self.settings["relating_product"].ReferencedBy: - for rel in self.settings["relating_product"].ReferencedBy: - if rel.is_a("IfcRelAssignsToProduct"): - referenced_by = rel - - assignment = None - for rel in self.settings["related_process"].HasAssignments: - if rel.is_a('IfcRelAssignsToProduct'): - assignment = rel - break - if referenced_by and referenced_by == assignment: - return - - if assignment: - related_objects = set(assignment.RelatedObjects) - related_objects.add(self.settings["relating_product"]) - assignment.RelatedObjects = list(related_objects) - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": assignment}) - else: - rel = self.file.create_entity( - "IfcRelAssignsToProduct", - **{ - "GlobalId": ifcopenshell.guid.new(), - "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), - "RelatingProduct": self.settings["relating_product"], - "RelatedObjects": [self.settings["related_process"]], - }) - return rel + referenced_by = self.settings["relating_product"].ReferencedBy[0] if referenced_by: related_objects = list(referenced_by.RelatedObjects) - related_objects.remove(self.settings["relating_product"]) - if related_objects: - referenced_by.RelatedObjects = related_objects - ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": referenced_by}) - else: - self.file.remove(referenced_by) - - return rel + related_objects.append(self.settings["related_object"]) + referenced_by.RelatedObjects = related_objects + ifcopenshell.api.run("owner.update_owner_history", self.file, **{"element": referenced_by}) + else: + referenced_by = self.file.create_entity( + "IfcRelAssignsToProduct", + **{ + "GlobalId": ifcopenshell.guid.new(), + "OwnerHistory": ifcopenshell.api.run("owner.create_owner_history", self.file), + "RelatedObjects": [self.settings["related_object"]], + "RelatingProduct": self.settings["relating_product"], + } + ) + return referenced_by