From 5adc29b0b3963bb3831bfe17d34c6870a92d3c2a Mon Sep 17 00:00:00 2001 From: "Sigma Dimensions (Yass)" <79010126+myoualid@users.noreply.github.com> Date: Wed, 23 Aug 2023 21:21:03 +0100 Subject: [PATCH] Feature to calculate required resources --- .../bim/module/resource/__init__.py | 1 + .../blenderbim/bim/module/resource/data.py | 4 ++-- .../bim/module/resource/operator.py | 20 +++++++++++++++++++ .../blenderbim/bim/module/resource/prop.py | 5 ++--- .../blenderbim/bim/module/resource/ui.py | 2 +- src/blenderbim/blenderbim/core/resource.py | 5 +++++ src/blenderbim/blenderbim/tool/resource.py | 9 +++++++++ src/blenderbim/blenderbim/tool/sequence.py | 6 ++++++ 8 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/resource/__init__.py b/src/blenderbim/blenderbim/bim/module/resource/__init__.py index 8f1a8fd2cd..a1a840b172 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/resource/__init__.py @@ -41,6 +41,7 @@ classes = ( operator.EnableEditingResourceBaseQuantity, operator.EnableEditingResourceCosts, operator.EnableEditingResourceCostValue, + operator.CalculateResourceUsage, operator.EnableEditingResourceCostValueFormula, operator.EnableEditingResourceQuantity, operator.EnableEditingResourceTime, diff --git a/src/blenderbim/blenderbim/bim/module/resource/data.py b/src/blenderbim/blenderbim/bim/module/resource/data.py index 269535125a..18262ba5d1 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/data.py +++ b/src/blenderbim/blenderbim/bim/module/resource/data.py @@ -80,10 +80,10 @@ class ResourceData: results[resource.id()]["ScheduleWork"] = ( ifcopenshell.util.date.readable_ifc_duration(resource.Usage.ScheduleWork) if resource.Usage.ScheduleWork - else "Calculate", + else None ) results[resource.id()]["ScheduleUsage"] = ( - resource.Usage.ScheduleUsage if resource.Usage.ScheduleUsage else "" + resource.Usage.ScheduleUsage if resource.Usage.ScheduleUsage else None ) return results diff --git a/src/blenderbim/blenderbim/bim/module/resource/operator.py b/src/blenderbim/blenderbim/bim/module/resource/operator.py index 40cb07c444..702e172067 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/operator.py +++ b/src/blenderbim/blenderbim/bim/module/resource/operator.py @@ -401,3 +401,23 @@ class GoToResource(bpy.types.Operator): def execute(self, context): core.go_to_resource(tool.Resource, resource=tool.Ifc.get().by_id(self.resource)) return {"FINISHED"} + + +class CalculateResourceUsage(bpy.types.Operator, tool.Ifc.Operator): + bl_idname = "bim.calculate_resource_usage" + bl_label = "Calculate Resource Usage" + bl_options = {"REGISTER", "UNDO"} + resource: bpy.props.IntProperty() + + @classmethod + def poll(cls, context): + active_resource = tool.Resource.get_highlighted_resource() + if active_resource: + if active_resource.Usage and active_resource.Usage.ScheduleWork: + task = tool.Resource.get_task_assignments(active_resource) + if task and tool.Sequence.has_duration(task): + return True + return False + + def _execute(self, context): + core.calculate_resource_usage(tool.Ifc, tool.Resource, resource=tool.Ifc.get().by_id(self.resource)) diff --git a/src/blenderbim/blenderbim/bim/module/resource/prop.py b/src/blenderbim/blenderbim/bim/module/resource/prop.py index 1d3491a3c2..615e1e8b60 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/prop.py +++ b/src/blenderbim/blenderbim/bim/module/resource/prop.py @@ -88,9 +88,7 @@ def updateResourceUsage(self, context): if self.schedule_usage == "": return resource = tool.Ifc.get().by_id(self.ifc_definition_id) - tool.Resource.run_edit_resource_time(resource, attributes={ - "ScheduleUsage": self.schedule_usage - }) + tool.Resource.run_edit_resource_time(resource, attributes={"ScheduleUsage": self.schedule_usage}) tool.Resource.load_resource_properties() tool.Sequence.load_task_properties() blenderbim.bim.module.resource.data.refresh() @@ -98,6 +96,7 @@ def updateResourceUsage(self, context): tool.Sequence.refresh_task_resources() blenderbim.bim.module.pset.data.refresh() + class ISODuration(PropertyGroup): name: StringProperty(name="Name") years: IntProperty(name="Years", default=0) diff --git a/src/blenderbim/blenderbim/bim/module/resource/ui.py b/src/blenderbim/blenderbim/bim/module/resource/ui.py index 92374d782a..55293cc196 100644 --- a/src/blenderbim/blenderbim/bim/module/resource/ui.py +++ b/src/blenderbim/blenderbim/bim/module/resource/ui.py @@ -77,7 +77,6 @@ class BIM_PT_resources(Panel): self.draw_editable_resource_time_attributes_ui() def draw_productivity_ui(self, context): - row = self.layout.row(align=True) row.alignment = "RIGHT" row.prop(self.props, "should_show_resource_tools", text="Resource Tools",icon="RECOVER_LAST") @@ -137,6 +136,7 @@ class BIM_PT_resources(Panel): row2col2 = col2.row() row2col2.prop(self.tprops.resources[self.props.active_resource_index], "schedule_usage", text="") row2col3 = col3.row() + row2col3.operator("bim.calculate_resource_usage", text="", icon="TEMP").resource = ifc_definition_id op = row2col3.operator( "bim.add_usage_constraint" if not is_usage_locked else "bim.remove_usage_constraint", text="", diff --git a/src/blenderbim/blenderbim/core/resource.py b/src/blenderbim/blenderbim/core/resource.py index 4de2bbeb11..b265d9326b 100644 --- a/src/blenderbim/blenderbim/core/resource.py +++ b/src/blenderbim/blenderbim/core/resource.py @@ -217,3 +217,8 @@ def remove_usage_constraint(ifc, resource_tool, resource, reference_path): def go_to_resource(resource_tool, resource): resource_tool.go_to_resource(resource) + +def calculate_resource_usage(ifc, resource_tool, resource): + ifc.run("resource.calculate_resource_usage", resource=resource) + resource_tool.load_resources() + resource_tool.load_resource_properties() \ No newline at end of file diff --git a/src/blenderbim/blenderbim/tool/resource.py b/src/blenderbim/blenderbim/tool/resource.py index 6ee7f1fa77..2b820dcbc3 100644 --- a/src/blenderbim/blenderbim/tool/resource.py +++ b/src/blenderbim/blenderbim/tool/resource.py @@ -435,3 +435,12 @@ class Resource(blenderbim.core.tool.Resource): resource_props = bpy.context.scene.BIMResourceTreeProperties expanded_resources = [item.ifc_definition_id for item in resource_props.resources] bpy.context.scene.BIMResourceProperties.active_resource_index = expanded_resources.index(resource.id()) + + + @classmethod + def run_calculate_resource_usage(cls, resource): + tool.Ifc.run("resource.calculate_resource_usage", resource=resource) + + @classmethod + def get_task_assignments(cls, resource): + return ifcopenshell.util.resource.get_task_assignments(resource) diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index f996917870..2491b245d0 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -1683,3 +1683,9 @@ class Sequence(blenderbim.core.tool.Sequence): if not task: return cls.load_task_resources(cls.get_task_resources(task)) + + @classmethod + def has_duration(cls, task): + if task.TaskTime and task.TaskTime.ScheduleDuration: + return True + return False