From acb446bfc2cfd21229c7649f1643b5add3985645 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 12 Aug 2021 10:32:42 +1000 Subject: [PATCH] Changing task scheduled dates now auto updates its related quantity take off data --- .../blenderbim/bim/module/model/handler.py | 13 ++++++--- .../blenderbim/bim/module/model/task.py | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 src/blenderbim/blenderbim/bim/module/model/task.py diff --git a/src/blenderbim/blenderbim/bim/module/model/handler.py b/src/blenderbim/blenderbim/bim/module/model/handler.py index 559a5ad169..49a8100f5c 100644 --- a/src/blenderbim/blenderbim/bim/module/model/handler.py +++ b/src/blenderbim/blenderbim/bim/module/model/handler.py @@ -1,7 +1,7 @@ import bpy import ifcopenshell import ifcopenshell.api -from blenderbim.bim.module.model import root, product, wall, slab, profile, opening +from blenderbim.bim.module.model import root, product, wall, slab, profile, opening, task from blenderbim.bim.ifc import IfcStore from bpy.app.handlers import persistent @@ -15,6 +15,11 @@ def load_post(*args): ifcopenshell.api.add_post_listener( "geometry.add_representation", "BlenderBIM.Product.GenerateBox", product.generate_box ) + + ifcopenshell.api.add_post_listener( + "sequence.edit_task_time", "BlenderBIM.Task.CalculateQuantities", task.calculate_quantities + ) + ifcopenshell.api.add_post_listener( "material.edit_profile_usage", "BlenderBIM.Product.RegenerateProfileUsage", @@ -22,8 +27,10 @@ def load_post(*args): ) IfcStore.add_element_listener(opening.element_listener) - IfcStore.add_element_listener(wall.element_listener) + IfcStore.add_element_listener(slab.element_listener) + IfcStore.add_element_listener(profile.element_listener) + ifcopenshell.api.add_pre_listener( "geometry.add_representation", "BlenderBIM.DumbWall.EnsureSolid", wall.ensure_solid ) @@ -40,7 +47,6 @@ def load_post(*args): "type.assign_type", "BlenderBIM.DumbWall.RegenerateFromType", wall.DumbWallPlaner().regenerate_from_type ) - IfcStore.add_element_listener(slab.element_listener) ifcopenshell.api.add_pre_listener( "geometry.add_representation", "BlenderBIM.DumbSlab.EnsureSolid", slab.ensure_solid ) @@ -57,7 +63,6 @@ def load_post(*args): "type.assign_type", "BlenderBIM.DumbSlab.RegenerateFromType", slab.DumbSlabPlaner().regenerate_from_type ) - IfcStore.add_element_listener(profile.element_listener) ifcopenshell.api.add_pre_listener( "geometry.add_representation", "BlenderBIM.DumbProfile.EnsureSolid", profile.ensure_solid ) diff --git a/src/blenderbim/blenderbim/bim/module/model/task.py b/src/blenderbim/blenderbim/bim/module/model/task.py new file mode 100644 index 0000000000..2b3dd9a038 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/model/task.py @@ -0,0 +1,28 @@ +import ifcopenshell +import ifcopenshell.api +import ifcopenshell.util.date +from ifcopenshell.api.pset.data import Data as PsetData + + +def calculate_quantities(usecase_path, ifc_file, settings): + if not set(["ScheduleStart", "ScheduleFinish", "ScheduleDuration"]).intersection( + set(settings["attributes"].keys()) + ): + return + element = settings["task_time"] + if not element.ScheduleDuration: + return + task = [e for e in ifc_file.get_inverse(element) if e.is_a("IfcTask")][0] + qto = ifcopenshell.api.run( + "pset.add_qto", ifc_file, should_run_listeners=False, product=task, name="Qto_TaskBaseQuantities" + ) + ifcopenshell.api.run( + "pset.edit_qto", + ifc_file, + should_run_listeners=False, + qto=qto, + properties={ + "StandardWork": ifcopenshell.util.date.ifc2datetime(element.ScheduleDuration).days, + }, + ) + PsetData.load(ifc_file, task.id())