From a1a684cd2b03b8a65a8d1b7403b21960759b70ac Mon Sep 17 00:00:00 2001 From: Sigma Dimensions <79010126+myoualid@users.noreply.github.com> Date: Thu, 28 Jul 2022 01:32:08 +0100 Subject: [PATCH 1/2] refactor BBIM Module Workplans (data loading) (Part 2of2) --- .../blenderbim/bim/module/sequence/data.py | 44 +++++++++++++++++ .../blenderbim/bim/module/sequence/ui.py | 11 +++-- src/blenderbim/blenderbim/core/sequence.py | 21 +++----- src/blenderbim/blenderbim/tool/sequence.py | 48 ++++++++++++------- 4 files changed, 88 insertions(+), 36 deletions(-) create mode 100644 src/blenderbim/blenderbim/bim/module/sequence/data.py diff --git a/src/blenderbim/blenderbim/bim/module/sequence/data.py b/src/blenderbim/blenderbim/bim/module/sequence/data.py new file mode 100644 index 0000000000..cc948bbe49 --- /dev/null +++ b/src/blenderbim/blenderbim/bim/module/sequence/data.py @@ -0,0 +1,44 @@ +# BlenderBIM Add-on - OpenBIM Blender Add-on +# Copyright (C) 2021 Dion Moult , 2021-2022 Yassine Oualid +# +# This file is part of BlenderBIM Add-on. +# +# BlenderBIM Add-on is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# BlenderBIM Add-on is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with BlenderBIM Add-on. If not, see . + +import bpy +import blenderbim.tool as tool + + +def refresh(): + SequenceData.is_loaded = False + + +class SequenceData: + is_loaded = False + number_of_work_plans_loaded = 0 + number_of_work_schedules_loaded = 0 + number_of_tasks_loaded = 0 + tasks = {} + + @classmethod + def load(cls): + cls.load_work_plans() + cls.is_loaded = True + + @classmethod + def load_work_plans(cls): + cls.work_plans = {} + cls.number_of_work_plans_loaded = len(tool.Ifc.get().by_type("IfcWorkPlan")) + for work_plan in tool.Ifc.get().by_type("IfcWorkPlan"): + cls.work_plans[work_plan.id()] = {"Name": work_plan.Name} diff --git a/src/blenderbim/blenderbim/bim/module/sequence/ui.py b/src/blenderbim/blenderbim/bim/module/sequence/ui.py index ef2481323e..8a79ce29e5 100644 --- a/src/blenderbim/blenderbim/bim/module/sequence/ui.py +++ b/src/blenderbim/blenderbim/bim/module/sequence/ui.py @@ -24,6 +24,7 @@ from blenderbim.bim.helper import draw_attributes from ifcopenshell.api.sequence.data import Data from ifcopenshell.api.resource.data import Data as ResourceData import blenderbim.bim.module.sequence.helper as helper +from blenderbim.bim.module.sequence.data import SequenceData from datetime import datetime @@ -42,18 +43,18 @@ class BIM_PT_work_plans(Panel): return file and file.schema != "IFC2X3" def draw(self, context): - if not Data.is_loaded: - Data.load(IfcStore.get_file()) + if not SequenceData.is_loaded: + SequenceData.load() self.props = context.scene.BIMWorkPlanProperties row = self.layout.row() row.label( - text="{} Work Plans Found".format(len(Data.work_plans.items())), - icon="MOD_SIMPLIFY", + text="{} Work Plans Found".format(SequenceData.number_of_work_plans_loaded), + icon="TEXT", ) row.operator("bim.add_work_plan", icon="ADD") - for work_plan_id, work_plan in Data.work_plans.items(): + for work_plan_id, work_plan in SequenceData.work_plans.items(): self.draw_work_plan_ui(work_plan_id, work_plan) def draw_work_plan_ui(self, work_plan_id, work_plan): diff --git a/src/blenderbim/blenderbim/core/sequence.py b/src/blenderbim/blenderbim/core/sequence.py index 2303494c4a..3c7458c6df 100644 --- a/src/blenderbim/blenderbim/core/sequence.py +++ b/src/blenderbim/blenderbim/core/sequence.py @@ -17,35 +17,28 @@ # along with BlenderBIM Add-on. If not, see . -# def load_work_plans(ifc, sequence): -# pass - def add_work_plan(ifc, sequence): ifc.run("sequence.add_work_plan") - sequence.load_sequence_data() + sequence.load_work_plans() def remove_work_plan(ifc, sequence, work_plan=None): ifc.run("sequence.remove_work_plan",**{"work_plan": ifc.get().by_id(work_plan)}) - sequence.load_sequence_data() + sequence.load_work_plans() def load_work_plan_attributes(sequence, work_plan=None): - data = sequence.get_work_plan_attributes(work_plan) + data = sequence.get_ifc_work_plan_attributes(work_plan) sequence.load_work_plan_attributes(data) def enable_editing_work_plan(sequence, work_plan=None): load_work_plan_attributes(sequence, work_plan) sequence.enable_editing_work_plan(work_plan) - print("Yassine Is back in the game") def disable_editing_work_plan(sequence): sequence.disable_editing_work_plan() def edit_work_plan(ifc, sequence): - work_plan = sequence.get_current_work_plan() - attributes = sequence.get_current_work_plan_attributes() + work_plan = sequence.get_current_ifc_work_plan() + attributes = sequence.get_work_plan_attributes() ifc.run("sequence.edit_work_plan",**{"work_plan": work_plan, "attributes": attributes}) - disable_editing_work_plan(sequence) - sequence.load_sequence_data() - - - \ No newline at end of file + sequence.disable_editing_work_plan() + sequence.load_work_plans() \ No newline at end of file diff --git a/src/blenderbim/blenderbim/tool/sequence.py b/src/blenderbim/blenderbim/tool/sequence.py index da2e0c8b67..ad68895a56 100644 --- a/src/blenderbim/blenderbim/tool/sequence.py +++ b/src/blenderbim/blenderbim/tool/sequence.py @@ -23,7 +23,6 @@ import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim.helper import blenderbim.bim.module.sequence.helper as helper -from ifcopenshell.api.sequence.data import Data class Sequence(blenderbim.core.tool.Sequence): @@ -35,8 +34,14 @@ class Sequence(blenderbim.core.tool.Sequence): return work_plans @classmethod - def load_sequence_data(cls): - Data.load(tool.Ifc.get()) + def load_work_plans(cls): + work_plans = tool.Sequence.get_work_plans() + props = bpy.context.scene.BIMWorkPlanProperties + props.work_plans.clear() + for ifc_definition_id, work_plan in work_plans.items(): + new = props.work_plans.add() + new.ifc_definition_id = ifc_definition_id + new.name = work_plan["Name"] or "Unnamed" @classmethod def enable_editing_work_plan(cls, work_plan): @@ -49,13 +54,28 @@ class Sequence(blenderbim.core.tool.Sequence): bpy.context.scene.BIMWorkPlanProperties.active_work_plan_id = 0 @classmethod - def get_work_plan_attributes(cls, work_plan): - if Data.is_loaded: - return Data.work_plans[work_plan] - else: - Data.load(tool.Ifc.get()) - return Data.work_plans[work_plan] - + def get_current_ifc_work_plan(cls): + active_work_plan = bpy.context.scene.BIMWorkPlanProperties.active_work_plan_id + ifc_work_plan = tool.Ifc.get().by_id(active_work_plan) + return ifc_work_plan + + @classmethod + def get_ifc_work_plan_attributes(cls, work_plan): + if work_plan: + ifc_work_plan = tool.Ifc.get().by_id(work_plan) + data = ifc_work_plan.get_info() + del data["OwnerHistory"] + if data["Creators"]: + data["Creators"] = [p.id() for p in data["Creators"]] + data["CreationDate"] = ifcopenshell.util.date.ifc2datetime(data["CreationDate"]) + data["StartTime"] = ifcopenshell.util.date.ifc2datetime(data["StartTime"]) + if data["FinishTime"]: + data["FinishTime"] = ifcopenshell.util.date.ifc2datetime(data["FinishTime"]) + data["IsDecomposedBy"] = [] + for rel in ifc_work_plan.IsDecomposedBy: + data["IsDecomposedBy"].extend([o.id() for o in rel.RelatedObjects]) + return data + @classmethod def load_work_plan_attributes(cls, data): props = bpy.context.scene.BIMWorkPlanProperties @@ -68,17 +88,11 @@ class Sequence(blenderbim.core.tool.Sequence): return True @classmethod - def get_current_work_plan_attributes(cls): + def get_work_plan_attributes(cls): props = bpy.context.scene.BIMWorkPlanProperties attributes = blenderbim.bim.helper.export_attributes(props.work_plan_attributes, tool.Sequence.export_attributes) return attributes - @classmethod - def get_current_work_plan(cls): - active_work_plan = bpy.context.scene.BIMWorkPlanProperties.active_work_plan_id - ifc_work_plan = tool.Ifc.get().by_id(active_work_plan) - return ifc_work_plan - def export_attributes(attributes, prop): if "Date" in prop.name or "Time" in prop.name: if prop.is_null: From f86f988d6e56e2404b9019a4fcbab96cf1921bde Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 28 Jul 2022 12:17:23 +1000 Subject: [PATCH 2/2] Fix #2318. Hotfix only. Needs proper code review. --- src/blenderbim/blenderbim/core/tool.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/blenderbim/blenderbim/core/tool.py b/src/blenderbim/blenderbim/core/tool.py index 3fa9c6808b..9e16e593cd 100644 --- a/src/blenderbim/blenderbim/core/tool.py +++ b/src/blenderbim/blenderbim/core/tool.py @@ -421,6 +421,19 @@ class Selector: def set_active(cls, obj): pass +@interface +class Sequence: + def get_work_plans(cls): pass + def load_work_plans(cls): pass + def enable_editing_work_plan(cls, work_plan): pass + def disable_editing_work_plan(cls): pass + def get_current_ifc_work_plan(cls): pass + def get_ifc_work_plan_attributes(cls): pass + def load_work_plan_attributes(cls): pass + def import_attributes(cls): pass + def export_attributes(cls): pass + + @interface class Spatial: def can_contain(cls, structure_obj, element_obj): pass