diff --git a/src/blenderbim/blenderbim/bim/module/attribute/ui.py b/src/blenderbim/blenderbim/bim/module/attribute/ui.py
index 1fcb0c13cf..5bdb184576 100644
--- a/src/blenderbim/blenderbim/bim/module/attribute/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/attribute/ui.py
@@ -110,6 +110,8 @@ class BIM_PT_material_attributes(Panel):
@classmethod
def poll(cls, context):
+ if not IfcStore.get_file():
+ return False
try:
return bool(context.active_object.active_material.BIMObjectProperties.ifc_definition_id)
except:
diff --git a/src/blenderbim/blenderbim/bim/module/classification/ui.py b/src/blenderbim/blenderbim/bim/module/classification/ui.py
index b2fc143c85..4cd3d4595c 100644
--- a/src/blenderbim/blenderbim/bim/module/classification/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/classification/ui.py
@@ -17,6 +17,7 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see .
+import blenderbim.bim.module.classification.prop as classification_prop
from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore
from ifcopenshell.api.classification.data import Data
@@ -104,7 +105,7 @@ class BIM_PT_classification_references(Panel):
if self.oprops.ifc_definition_id not in Data.products:
Data.load(IfcStore.get_file(), self.oprops.ifc_definition_id)
- self.draw_add_ui()
+ self.draw_add_ui(context)
reference_ids = Data.products[self.oprops.ifc_definition_id]
if not reference_ids:
@@ -118,8 +119,8 @@ class BIM_PT_classification_references(Panel):
else:
self.draw_ui(reference_id, reference)
- def draw_add_ui(self):
- if not self.sprops.available_classifications:
+ def draw_add_ui(self, context):
+ if not classification_prop.getClassifications(self.sprops, context):
return
name = Data.library_classifications[int(self.sprops.available_classifications)]
diff --git a/src/blenderbim/blenderbim/bim/module/model/pie.py b/src/blenderbim/blenderbim/bim/module/model/pie.py
index 102a1bdb16..5c5480f07f 100644
--- a/src/blenderbim/blenderbim/bim/module/model/pie.py
+++ b/src/blenderbim/blenderbim/bim/module/model/pie.py
@@ -47,8 +47,8 @@ class PieAddOpening(bpy.types.Operator):
elif len(obj.children) == 1 and not obj.children[0].BIMObjectProperties.ifc_definition_id:
opening_name = obj.children[0].name
else:
- opj_name = obj.name
- bpy.ops.bim.add_opening(obj=opj_name, opening=opening_name)
+ obj_name = obj.name
+ bpy.ops.bim.add_opening(obj=obj_name, opening=opening_name)
return {"FINISHED"}
diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py
index c96a795583..8fd33a8906 100644
--- a/src/blenderbim/blenderbim/bim/module/project/operator.py
+++ b/src/blenderbim/blenderbim/bim/module/project/operator.py
@@ -43,6 +43,7 @@ class CreateProject(bpy.types.Operator):
return result
def _execute(self, context):
+ active_object = context.view_layer.objects.active
self.file = IfcStore.get_file()
if self.file:
return {"FINISHED"}
@@ -79,6 +80,7 @@ class CreateProject(bpy.types.Operator):
bpy.ops.bim.assign_object(related_object=building.name, relating_object=site.name)
bpy.ops.bim.assign_object(related_object=building_storey.name, relating_object=building.name)
+ context.view_layer.objects.active = active_object
return {"FINISHED"}
def get_name(self, ifc_class, name):
diff --git a/src/blenderbim/blenderbim/bim/module/pset/ui.py b/src/blenderbim/blenderbim/bim/module/pset/ui.py
index 5a0d78269c..d7fe3aeddb 100644
--- a/src/blenderbim/blenderbim/bim/module/pset/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/pset/ui.py
@@ -207,7 +207,8 @@ class BIM_PT_material_psets(Panel):
props = context.active_object.active_material.BIMObjectProperties
if not props.ifc_definition_id:
return False
- if IfcStore.get_file().schema == "IFC2X3":
+ file = IfcStore.get_file()
+ if not file or file.schema == "IFC2X3":
return False # We don't support material psets in IFC2X3 because they suck
if props.ifc_definition_id not in Data.products:
Data.load(IfcStore.get_file(), props.ifc_definition_id)
diff --git a/src/blenderbim/blenderbim/bim/module/root/prop.py b/src/blenderbim/blenderbim/bim/module/root/prop.py
index 3a003d368e..6a28a40b51 100644
--- a/src/blenderbim/blenderbim/bim/module/root/prop.py
+++ b/src/blenderbim/blenderbim/bim/module/root/prop.py
@@ -72,7 +72,8 @@ def refreshPredefinedTypes(self, context):
global types_enum
types_enum.clear()
enum = getIfcPredefinedTypes(self, context)
- context.scene.BIMRootProperties.ifc_predefined_type = enum[0][0]
+ if enum:
+ context.scene.BIMRootProperties.ifc_predefined_type = enum[0][0]
def getIfcProducts(self, context):
diff --git a/src/blenderbim/blenderbim/bim/module/root/ui.py b/src/blenderbim/blenderbim/bim/module/root/ui.py
index 60e816f496..aa2ea98ec2 100644
--- a/src/blenderbim/blenderbim/bim/module/root/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/root/ui.py
@@ -18,6 +18,7 @@
# along with BlenderBIM Add-on. If not, see .
import bpy
+import blenderbim.bim.module.root.prop as root_prop
from bpy.types import Panel
from ifcopenshell.api.root.data import Data
from blenderbim.bim.ifc import IfcStore
@@ -49,7 +50,9 @@ class BIM_PT_class(Panel):
row = self.layout.row(align=True)
row.operator("bim.reassign_class", icon="CHECKMARK")
row.operator("bim.disable_reassign_class", icon="CANCEL", text="")
- self.draw_class_dropdowns(context)
+ self.draw_class_dropdowns(
+ context,
+ root_prop.getIfcPredefinedTypes(context.scene.BIMRootProperties, context))
else:
data = Data.products[props.ifc_definition_id]
name = data["type"]
@@ -72,23 +75,24 @@ class BIM_PT_class(Panel):
else:
row.operator("bim.unassign_class", icon="X", text="").obj = context.active_object.name
else:
- self.draw_class_dropdowns(context)
+ ifc_predefined_types = root_prop.getIfcPredefinedTypes(context.scene.BIMRootProperties, context)
+ self.draw_class_dropdowns(context, ifc_predefined_types)
row = self.layout.row(align=True)
op = row.operator("bim.assign_class")
op.ifc_class = context.scene.BIMRootProperties.ifc_class
- op.predefined_type = context.scene.BIMRootProperties.ifc_predefined_type
+ op.predefined_type = context.scene.BIMRootProperties.ifc_predefined_type if ifc_predefined_types else ""
op.userdefined_type = context.scene.BIMRootProperties.ifc_userdefined_type
- def draw_class_dropdowns(self, context):
+ def draw_class_dropdowns(self, context, ifc_predefined_types):
props = context.scene.BIMRootProperties
row = self.layout.row()
row.prop(props, "ifc_product")
row = self.layout.row()
row.prop(props, "ifc_class")
- if props.ifc_predefined_type:
+ if ifc_predefined_types:
row = self.layout.row()
row.prop(props, "ifc_predefined_type")
- if props.ifc_predefined_type == "USERDEFINED":
+ if ifc_predefined_types == "USERDEFINED":
row = self.layout.row()
row.prop(props, "ifc_userdefined_type")
row = self.layout.row()
diff --git a/src/blenderbim/blenderbim/bim/module/spatial/operator.py b/src/blenderbim/blenderbim/bim/module/spatial/operator.py
index e10939a59f..7f8fe7b3aa 100644
--- a/src/blenderbim/blenderbim/bim/module/spatial/operator.py
+++ b/src/blenderbim/blenderbim/bim/module/spatial/operator.py
@@ -134,7 +134,7 @@ class RemoveContainer(bpy.types.Operator):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
- obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
+ obj = bpy.data.objects.get(self.obj, context.active_object)
oprops = obj.BIMObjectProperties
self.file = IfcStore.get_file()
ifcopenshell.api.run(
@@ -152,6 +152,7 @@ class RemoveContainer(bpy.types.Operator):
for collection in obj.users_collection:
collection.objects.unlink(obj)
context.scene.collection.objects.link(obj)
+ context.view_layer.objects.active = obj
return {"FINISHED"}
def remove_collection(self, parent, child):
@@ -162,6 +163,11 @@ class RemoveContainer(bpy.types.Operator):
class CopyToContainer(bpy.types.Operator):
+ """
+ Copies selected objects to selected containers
+ Check the mark next to a container in the container list to select it
+ Several containers can be selected at a time
+ """
bl_idname = "bim.copy_to_container"
bl_label = "Copy To Container"
bl_options = {"REGISTER", "UNDO"}
@@ -172,7 +178,7 @@ class CopyToContainer(bpy.types.Operator):
def _execute(self, context):
self.file = IfcStore.get_file()
- objects = [bpy.data.objects.get(self.obj)] if self.obj else context.selected_objects
+ objects = list(bpy.data.objects.get(self.obj, context.selected_objects))
sprops = context.scene.BIMSpatialProperties
container_ids = [c.ifc_definition_id for c in sprops.spatial_elements if c.is_selected]
for obj in objects:
diff --git a/src/blenderbim/blenderbim/bim/module/style/ui.py b/src/blenderbim/blenderbim/bim/module/style/ui.py
index 01273d90bf..a2df554fb5 100644
--- a/src/blenderbim/blenderbim/bim/module/style/ui.py
+++ b/src/blenderbim/blenderbim/bim/module/style/ui.py
@@ -59,6 +59,8 @@ class BIM_PT_style_attributes(Panel):
@classmethod
def poll(cls, context):
+ if not IfcStore.get_file():
+ return False
try:
return bool(context.active_object.active_material.BIMMaterialProperties.ifc_style_id)
except:
diff --git a/src/blenderbim/blenderbim/bim/module/type/operator.py b/src/blenderbim/blenderbim/bim/module/type/operator.py
index 3d54041ebe..d1a889b459 100644
--- a/src/blenderbim/blenderbim/bim/module/type/operator.py
+++ b/src/blenderbim/blenderbim/bim/module/type/operator.py
@@ -136,13 +136,13 @@ class SelectType(bpy.types.Operator):
def execute(self, context):
self.file = IfcStore.get_file()
- related_object = bpy.data.objects.get(self.related_object) if self.related_object else context.active_object
+ related_object = bpy.data.objects.get(self.related_object, context.active_object)
oprops = related_object.BIMObjectProperties
- obj = IfcStore.get_element(
- ifcopenshell.util.element.get_type(self.file.by_id(oprops.ifc_definition_id)).GlobalId
- )
- context.view_layer.objects.active = obj
- obj.select_set(True)
+ element_type = ifcopenshell.util.element.get_type(self.file.by_id(oprops.ifc_definition_id))
+ if element_type is not None:
+ obj = IfcStore.get_element(element_type.GlobalId)
+ context.view_layer.objects.active = obj
+ obj.select_set(True)
return {"FINISHED"}
diff --git a/src/blenderbim/blenderbim/bim/module/void/operator.py b/src/blenderbim/blenderbim/bim/module/void/operator.py
index 4185daa588..c41582adeb 100644
--- a/src/blenderbim/blenderbim/bim/module/void/operator.py
+++ b/src/blenderbim/blenderbim/bim/module/void/operator.py
@@ -35,8 +35,10 @@ class AddOpening(bpy.types.Operator):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
- obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
- opening = bpy.data.objects.get(self.opening)
+ obj = context.scene.objects.get(self.obj, context.active_object)
+ opening = context.scene.objects.get(self.opening)
+ if opening is None:
+ return {"FINISHED"}
opening.display_type = "WIRE"
if not opening.BIMObjectProperties.ifc_definition_id:
body_context_id = None
@@ -118,8 +120,10 @@ class AddFilling(bpy.types.Operator):
return IfcStore.execute_ifc_operator(self, context)
def _execute(self, context):
- obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object
- opening = bpy.data.objects.get(self.opening) if self.opening else context.scene.VoidProperties.desired_opening
+ obj = context.scene.objects.get(self.obj, context.active_object)
+ opening = context.scene.objects.get(self.opening, context.scene.VoidProperties.desired_opening)
+ if opening is None:
+ return {'FINISHED'}
self.file = IfcStore.get_file()
element_id = obj.BIMObjectProperties.ifc_definition_id
ifcopenshell.api.run(
diff --git a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py
index b626740cde..a00b623ea5 100644
--- a/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py
+++ b/src/ifcopenshell-python/ifcopenshell/api/style/assign_material_style.py
@@ -63,7 +63,7 @@ class Usecase:
def get_styled_representation(self, definition_representation):
representations = [
r
- for r in definition_representation.Representations is r.is_a("IfcStyledRepresentation")
+ for r in definition_representation.Representations if r.is_a("IfcStyledRepresentation")
and r.ContextOfItems == self.settings["context"]
]
if representations: