diff --git a/src/blenderbim/blenderbim/bim/module/boundary/data.py b/src/blenderbim/blenderbim/bim/module/boundary/data.py
index 683d539611..8edbba38a0 100644
--- a/src/blenderbim/blenderbim/bim/module/boundary/data.py
+++ b/src/blenderbim/blenderbim/bim/module/boundary/data.py
@@ -16,10 +16,7 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see .
-import os
import bpy
-import ifcopenshell
-import ifcopenshell.util.schema
import blenderbim.tool as tool
diff --git a/src/blenderbim/blenderbim/bim/module/constraint/data.py b/src/blenderbim/blenderbim/bim/module/constraint/data.py
new file mode 100644
index 0000000000..940df4fb7c
--- /dev/null
+++ b/src/blenderbim/blenderbim/bim/module/constraint/data.py
@@ -0,0 +1,59 @@
+# BlenderBIM Add-on - OpenBIM Blender Add-on
+# Copyright (C) 2023 Dion Moult
+#
+# 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():
+ ConstraintsData.is_loaded = False
+ ObjectConstraintsData.is_loaded = False
+
+
+class ConstraintsData:
+ data = {}
+ is_loaded = False
+
+ @classmethod
+ def load(cls):
+ cls.data = {"total_objectives": cls.total_objectives()}
+ cls.is_loaded = True
+
+ @classmethod
+ def total_objectives(cls):
+ return len(tool.Ifc.get().by_type("IfcObjective"))
+
+
+class ObjectConstraintsData:
+ data = {}
+ is_loaded = False
+
+ @classmethod
+ def load(cls):
+ cls.data = {"constraints": cls.constraints()}
+ cls.is_loaded = True
+
+ @classmethod
+ def constraints(cls):
+ results = []
+ element = tool.Ifc.get_entity(bpy.context.active_object)
+ for rel in element.HasAssociations or []:
+ if rel.is_a("IfcRelAssociatesConstraint"):
+ constraint = rel.RelatingConstraint
+ results.append({"id": constraint.id(), "type": constraint.is_a(), "name": constraint.Name or "Unnamed"})
+ return results
diff --git a/src/blenderbim/blenderbim/bim/module/constraint/operator.py b/src/blenderbim/blenderbim/bim/module/constraint/operator.py
index e7accd3340..6ab81a4695 100644
--- a/src/blenderbim/blenderbim/bim/module/constraint/operator.py
+++ b/src/blenderbim/blenderbim/bim/module/constraint/operator.py
@@ -21,8 +21,8 @@ import json
import ifcopenshell.api
import ifcopenshell.util.attribute
import blenderbim.bim.helper
+import blenderbim.tool as tool
from blenderbim.bim.ifc import IfcStore
-from ifcopenshell.api.constraint.data import Data
class LoadObjectives(bpy.types.Operator):
@@ -33,10 +33,10 @@ class LoadObjectives(bpy.types.Operator):
def execute(self, context):
props = context.scene.BIMConstraintProperties
props.constraints.clear()
- for constraint_id, constraint in Data.objectives.items():
+ for constraint in tool.Ifc.get().by_type("IfcObjective"):
new = props.constraints.add()
- new.name = constraint["Name"] or "Unnamed"
- new.ifc_definition_id = constraint_id
+ new.name = constraint.Name or "Unnamed"
+ new.ifc_definition_id = constraint.id()
props.is_editing = "IfcObjective"
bpy.ops.bim.disable_editing_constraint()
return {"FINISHED"}
@@ -62,11 +62,7 @@ class EnableEditingConstraint(bpy.types.Operator):
def execute(self, context):
props = context.scene.BIMConstraintProperties
props.constraint_attributes.clear()
-
- if props.is_editing == "IfcObjective":
- data = Data.objectives[self.constraint]
-
- blenderbim.bim.helper.import_attributes(props.is_editing, props.constraint_attributes, data)
+ blenderbim.bim.helper.import_attributes2(tool.Ifc.get().by_id(self.constraint), props.constraint_attributes)
props.active_constraint_id = self.constraint
return {"FINISHED"}
@@ -91,7 +87,6 @@ class AddObjective(bpy.types.Operator):
def _execute(self, context):
result = ifcopenshell.api.run("constraint.add_objective", IfcStore.get_file())
- Data.load(IfcStore.get_file())
bpy.ops.bim.load_objectives()
bpy.ops.bim.enable_editing_constraint(constraint=result.id())
return {"FINISHED"}
@@ -121,7 +116,6 @@ class EditObjective(bpy.types.Operator):
self.file,
**{"objective": self.file.by_id(props.active_constraint_id), "attributes": attributes}
)
- Data.load(IfcStore.get_file())
bpy.ops.bim.load_objectives()
return {"FINISHED"}
@@ -141,7 +135,6 @@ class RemoveConstraint(bpy.types.Operator):
ifcopenshell.api.run(
"constraint.remove_constraint", self.file, **{"constraint": self.file.by_id(self.constraint)}
)
- Data.load(IfcStore.get_file())
if props.is_editing == "IfcObjective":
bpy.ops.bim.load_objectives()
return {"FINISHED"}
@@ -200,7 +193,6 @@ class AssignConstraint(bpy.types.Operator):
"constraint": self.file.by_id(self.constraint),
}
)
- Data.load(self.file, obj_id)
return {"FINISHED"}
@@ -229,5 +221,4 @@ class UnassignConstraint(bpy.types.Operator):
"constraint": self.file.by_id(self.constraint),
}
)
- Data.load(self.file, obj_id)
return {"FINISHED"}
diff --git a/src/blenderbim/blenderbim/bim/module/constraint/ui.py b/src/blenderbim/blenderbim/bim/module/constraint/ui.py
index 9f918c31fa..6548d95d66 100644
--- a/src/blenderbim/blenderbim/bim/module/constraint/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/constraint/ui.py
@@ -19,7 +19,7 @@
from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import draw_attributes
-from ifcopenshell.api.constraint.data import Data
+from blenderbim.bim.module.constraint.data import ConstraintsData, ObjectConstraintsData
class BIM_PT_constraints(Panel):
@@ -36,14 +36,14 @@ class BIM_PT_constraints(Panel):
return IfcStore.get_file()
def draw(self, context):
- if not Data.is_loaded:
- Data.load(IfcStore.get_file())
+ if not ConstraintsData.is_loaded:
+ ConstraintsData.load()
self.props = context.scene.BIMConstraintProperties
if not self.props.is_editing or self.props.is_editing == "IfcObjective":
row = self.layout.row(align=True)
- row.label(text="{} Objectives Found".format(len(Data.objectives)), icon="LIGHT")
+ row.label(text=f"{ConstraintsData.data['total_objectives']} Objectives Found", icon="LIGHT")
if self.props.is_editing == "IfcObjective":
row.operator("bim.disable_constraint_editing_ui", text="", icon="CHECKMARK")
row.operator("bim.add_objective", text="", icon="ADD")
@@ -85,33 +85,29 @@ class BIM_PT_object_constraints(Panel):
return bool(context.active_object.BIMObjectProperties.ifc_definition_id)
def draw(self, context):
+ if not ObjectConstraintsData.is_loaded:
+ ObjectConstraintsData.load()
+
obj = context.active_object
self.oprops = obj.BIMObjectProperties
self.sprops = context.scene.BIMConstraintProperties
self.props = obj.BIMObjectConstraintProperties
self.file = IfcStore.get_file()
- if not Data.is_loaded:
- Data.load(IfcStore.get_file())
- if self.oprops.ifc_definition_id not in Data.products:
- Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id)
self.draw_add_ui()
- constraint_ids = Data.products[self.oprops.ifc_definition_id]
-
- if not constraint_ids:
+ if not ObjectConstraintsData.data["constraints"]:
row = self.layout.row(align=True)
row.label(text="No Constraints", icon="LIGHT")
- for constraint_id in constraint_ids:
- try:
- constraint = Data.objectives[constraint_id]
+ for constraint in ObjectConstraintsData.data["constraints"]:
+ if constraint["type"] == "IfcObjective":
icon = "LIGHT"
- except:
- pass # Metric not implemented
+ else:
+ continue # Metric not implemented
row = self.layout.row(align=True)
- row.label(text=constraint.get("Name") or "Unnamed")
- row.operator("bim.unassign_constraint", text="", icon="X").constraint = constraint_id
+ row.label(text=constraint["name"])
+ row.operator("bim.unassign_constraint", text="", icon="X").constraint = constraint["id"]
def draw_add_ui(self):
if self.props.is_adding:
diff --git a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py
index 8c100e830f..93bb120dbe 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/pset_template/remove_pset_template.py
@@ -43,8 +43,6 @@ class Usecase:
"""
self.file = file
self.settings = {"pset_template": pset_template}
- for key, value in settings.items():
- self.settings[key] = value
def execute(self):
ifcopenshell.util.element.remove_deep(self.file, self.settings["pset_template"])