From 6bf692b44da80cb76b306243c04c1ab2e08c480b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 29 Jul 2021 16:15:31 +1000 Subject: [PATCH] Fix #1401. Modified custom psets are now immediately available without needing to restart Blender. --- .../blenderbim/bim/module/pset/operator.py | 1 + .../blenderbim/bim/module/pset/prop.py | 24 ++++++++++--------- .../bim/module/pset_template/operator.py | 4 ++++ src/blenderbim/blenderbim/bim/schema.py | 4 ++++ .../ifcopenshell/api/pset/edit_pset.py | 11 +++++---- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/pset/operator.py b/src/blenderbim/blenderbim/bim/module/pset/operator.py index ea490c6617..1ff24e51f0 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset/operator.py @@ -195,6 +195,7 @@ class EditPset(bpy.types.Operator): "pset": self.file.by_id(pset_id), "name": props.active_pset_name, "properties": properties, + "pset_template": blenderbim.bim.schema.ifc.psetqto.get_by_name(props.active_pset_name), }, ) else: diff --git a/src/blenderbim/blenderbim/bim/module/pset/prop.py b/src/blenderbim/blenderbim/bim/module/pset/prop.py index d4dcbb75c9..659ec986e9 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/prop.py +++ b/src/blenderbim/blenderbim/bim/module/pset/prop.py @@ -1,7 +1,8 @@ import bpy +import blenderbim.bim.schema from blenderbim.bim.prop import Attribute from ifcopenshell.api.pset.data import Data -import blenderbim.bim.schema +from blenderbim.bim.ifc import IfcStore from bpy.types import PropertyGroup from bpy.props import ( PointerProperty, @@ -29,16 +30,17 @@ def purge(): def getPsetNames(self, context): global psetnames obj = context.active_object - if "/" in obj.name: - ifc_class = obj.name.split("/")[0] - if ifc_class not in psetnames: - psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True) - psetnames[ifc_class] = [(p.Name, p.Name, "") for p in psets] - assigned_names = [ - Data.psets[p]["Name"] for p in Data.products[obj.BIMObjectProperties.ifc_definition_id]["psets"] - ] - return [p for p in psetnames[ifc_class] if p[0] not in assigned_names] - return [] + if not obj.BIMObjectProperties.ifc_definition_id: + return [] + element = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id) + ifc_class = element.is_a() + if ifc_class not in psetnames: + psets = blenderbim.bim.schema.ifc.psetqto.get_applicable(ifc_class, pset_only=True) + psetnames[ifc_class] = [(p.Name, p.Name, "") for p in psets] + assigned_names = [ + Data.psets[p]["Name"] for p in Data.products[obj.BIMObjectProperties.ifc_definition_id]["psets"] + ] + return [p for p in psetnames[ifc_class] if p[0] not in assigned_names] def getMaterialPsetNames(self, context): diff --git a/src/blenderbim/blenderbim/bim/module/pset_template/operator.py b/src/blenderbim/blenderbim/bim/module/pset_template/operator.py index 13bf59933d..452470240c 100644 --- a/src/blenderbim/blenderbim/bim/module/pset_template/operator.py +++ b/src/blenderbim/blenderbim/bim/module/pset_template/operator.py @@ -1,6 +1,8 @@ import bpy import ifcopenshell import ifcopenshell.api +import blenderbim.bim.schema +import blenderbim.bim.handler from blenderbim.bim.module.pset_template.prop import updatePsetTemplateFiles, updatePsetTemplates from ifcopenshell.api.pset_template.data import Data from blenderbim.bim.ifc import IfcStore @@ -165,6 +167,8 @@ class SavePsetTemplateFile(bpy.types.Operator): def execute(self, context): IfcStore.pset_template_file.write(IfcStore.pset_template_path) + blenderbim.bim.handler.purge_module_data() + blenderbim.bim.schema.reload() return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/schema.py b/src/blenderbim/blenderbim/bim/schema.py index 7fa2789660..6fb784f561 100644 --- a/src/blenderbim/blenderbim/bim/schema.py +++ b/src/blenderbim/blenderbim/bim/schema.py @@ -77,3 +77,7 @@ class IfcSchema: ifc = IfcSchema() + +def reload(): + global ifc + ifc = IfcSchema() diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py index 7507708917..dc4d2f6c35 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py +++ b/src/ifcopenshell-python/ifcopenshell/api/pset/edit_pset.py @@ -5,7 +5,7 @@ import ifcopenshell.util.pset class Usecase: def __init__(self, file, **settings): self.file = file - self.settings = {"pset": None, "name": None, "properties": {}} + self.settings = {"pset": None, "name": None, "properties": {}, "pset_template": None} for key, value in settings.items(): self.settings[key] = value @@ -21,9 +21,12 @@ class Usecase: self.settings["pset"].Name = self.settings["name"] def load_pset_template(self): - # TODO: add IFC2X3 PsetQto template support - self.psetqto = ifcopenshell.util.pset.get_template("IFC4") - self.pset_template = self.psetqto.get_by_name(self.settings["pset"].Name) + if self.settings["pset_template"]: + self.pset_template = self.settings["pset_template"] + else: + # TODO: add IFC2X3 PsetQto template support + self.psetqto = ifcopenshell.util.pset.get_template("IFC4") + self.pset_template = self.psetqto.get_by_name(self.settings["pset"].Name) def update_existing_properties(self): for prop in self.get_properties():