Changing task scheduled dates now auto updates its related quantity take off data

This commit is contained in:
Dion Moult
2021-08-12 10:32:42 +10:00
parent 5af0d65306
commit acb446bfc2
2 changed files with 37 additions and 4 deletions
@@ -1,7 +1,7 @@
import bpy import bpy
import ifcopenshell import ifcopenshell
import ifcopenshell.api 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 blenderbim.bim.ifc import IfcStore
from bpy.app.handlers import persistent from bpy.app.handlers import persistent
@@ -15,6 +15,11 @@ def load_post(*args):
ifcopenshell.api.add_post_listener( ifcopenshell.api.add_post_listener(
"geometry.add_representation", "BlenderBIM.Product.GenerateBox", product.generate_box "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( ifcopenshell.api.add_post_listener(
"material.edit_profile_usage", "material.edit_profile_usage",
"BlenderBIM.Product.RegenerateProfileUsage", "BlenderBIM.Product.RegenerateProfileUsage",
@@ -22,8 +27,10 @@ def load_post(*args):
) )
IfcStore.add_element_listener(opening.element_listener) IfcStore.add_element_listener(opening.element_listener)
IfcStore.add_element_listener(wall.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( ifcopenshell.api.add_pre_listener(
"geometry.add_representation", "BlenderBIM.DumbWall.EnsureSolid", wall.ensure_solid "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 "type.assign_type", "BlenderBIM.DumbWall.RegenerateFromType", wall.DumbWallPlaner().regenerate_from_type
) )
IfcStore.add_element_listener(slab.element_listener)
ifcopenshell.api.add_pre_listener( ifcopenshell.api.add_pre_listener(
"geometry.add_representation", "BlenderBIM.DumbSlab.EnsureSolid", slab.ensure_solid "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 "type.assign_type", "BlenderBIM.DumbSlab.RegenerateFromType", slab.DumbSlabPlaner().regenerate_from_type
) )
IfcStore.add_element_listener(profile.element_listener)
ifcopenshell.api.add_pre_listener( ifcopenshell.api.add_pre_listener(
"geometry.add_representation", "BlenderBIM.DumbProfile.EnsureSolid", profile.ensure_solid "geometry.add_representation", "BlenderBIM.DumbProfile.EnsureSolid", profile.ensure_solid
) )
@@ -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())