diff --git a/src/blenderbim/blenderbim/bim/module/classification/__init__.py b/src/blenderbim/blenderbim/bim/module/classification/__init__.py index 81dbac442b..db84b2b3a4 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/classification/__init__.py @@ -54,11 +54,11 @@ classes = ( def register(): bpy.types.Scene.BIMClassificationProperties = bpy.props.PointerProperty(type=prop.BIMClassificationProperties) - bpy.types.Object.BIMClassificationReferenceProperties = bpy.props.PointerProperty( + bpy.types.Scene.BIMClassificationReferenceProperties = bpy.props.PointerProperty( type=prop.BIMClassificationReferenceProperties ) def unregister(): del bpy.types.Scene.BIMClassificationProperties - del bpy.types.Object.BIMClassificationReferenceProperties + del bpy.types.Scene.BIMClassificationReferenceProperties diff --git a/src/blenderbim/blenderbim/bim/module/classification/data.py b/src/blenderbim/blenderbim/bim/module/classification/data.py index 46c5c3c591..942ae6809d 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/data.py +++ b/src/blenderbim/blenderbim/bim/module/classification/data.py @@ -88,7 +88,7 @@ class ClassificationReferencesData(ReferencesData): cls.data["references"] = cls.references() cls.data["active_classification_library"] = cls.active_classification_library() cls.data["classifications"] = cls.classifications() - cls.data["object_type"] = "OBJECT" + cls.data["object_type"] = "Object" @classmethod def references(cls): @@ -112,7 +112,7 @@ class MaterialClassificationsData(ReferencesData): cls.data["references"] = cls.references() cls.data["active_classification_library"] = cls.active_classification_library() cls.data["classifications"] = cls.classifications() - cls.data["object_type"] = "MATERIAL" + cls.data["object_type"] = "Material" @classmethod def references(cls): @@ -140,7 +140,7 @@ class CostClassificationsData(ReferencesData): cls.data["references"] = cls.references() cls.data["active_classification_library"] = cls.active_classification_library() cls.data["classifications"] = cls.classifications() - cls.data["object_type"] = "COST" + cls.data["object_type"] = "Cost" @classmethod def references(cls): diff --git a/src/blenderbim/blenderbim/bim/module/classification/operator.py b/src/blenderbim/blenderbim/bim/module/classification/operator.py index 7119edae3f..2536e2865b 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/operator.py +++ b/src/blenderbim/blenderbim/bim/module/classification/operator.py @@ -77,26 +77,37 @@ class AddManualClassificationReference(bpy.types.Operator, tool.Ifc.Operator): bl_idname = "bim.add_manual_classification_reference" bl_label = "Add Manual Classification Reference" bl_options = {"REGISTER", "UNDO"} + obj: bpy.props.StringProperty() obj_type: bpy.props.StringProperty() def _execute(self, context): - obj = context.active_object - props = obj.BIMClassificationReferenceProperties + if self.obj_type == "Object": + if context.selected_objects: + objects = [o.name for o in context.selected_objects] + else: + objects = [context.active_object.name] + else: + objects = [self.obj] + props = context.scene.BIMClassificationReferenceProperties attributes = blenderbim.bim.helper.export_attributes(props.reference_attributes) - product = tool.Ifc.get_entity(obj) - # TODO: refactor and support material and cost item classifications - classification = tool.Ifc.get().by_id(int(props.classifications)) - reference = ifcopenshell.api.run( - "classification.add_reference", - tool.Ifc.get(), - products=[product], - classification=classification, - identification="X", - name="Unnamed", - ) - ifcopenshell.api.run( - "classification.edit_reference", tool.Ifc.get(), reference=reference, attributes=attributes - ) + products = [ + tool.Ifc.get().by_id(ifc_definition_id) + for obj in objects + if (ifc_definition_id := tool.Blender.get_obj_ifc_definition_id(obj, self.obj_type, context)) + ] + if products: + classification = tool.Ifc.get().by_id(int(props.classifications)) + reference = ifcopenshell.api.run( + "classification.add_reference", + tool.Ifc.get(), + products=products, + classification=classification, + identification="X", + name="Unnamed", + ) + ifcopenshell.api.run( + "classification.edit_reference", tool.Ifc.get(), reference=reference, attributes=attributes + ) props.is_adding = False @@ -150,8 +161,7 @@ class EnableAddingManualClassificationReference(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - obj = context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties props.is_adding = True props.reference_attributes.clear() blenderbim.bim.helper.import_attributes2("IfcClassificationReference", props.reference_attributes) @@ -164,8 +174,7 @@ class DisableAddingManualClassificationReference(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - obj = context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties props.is_adding = False return {"FINISHED"} @@ -257,8 +266,7 @@ class EnableEditingClassificationReference(bpy.types.Operator): obj: bpy.props.StringProperty() def execute(self, context): - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties props.reference_attributes.clear() blenderbim.bim.helper.import_attributes2(tool.Ifc.get().by_id(self.reference), props.reference_attributes) props.active_reference_id = self.reference @@ -272,8 +280,7 @@ class DisableEditingClassificationReference(bpy.types.Operator): obj: bpy.props.StringProperty() def execute(self, context): - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object - obj.BIMClassificationReferenceProperties.active_reference_id = 0 + context.scene.BIMClassificationReferenceProperties.active_reference_id = 0 return {"FINISHED"} @@ -326,8 +333,7 @@ class EditClassificationReference(bpy.types.Operator, tool.Ifc.Operator): obj: bpy.props.StringProperty() def _execute(self, context): - obj = bpy.data.objects.get(self.obj) if self.obj else context.active_object - props = obj.BIMClassificationReferenceProperties + props = context.scene.BIMClassificationReferenceProperties attributes = {} for attribute in props.reference_attributes: if attribute.is_null: @@ -368,9 +374,8 @@ class AddClassificationReference(bpy.types.Operator, tool.Ifc.Operator): classification = element break - ifc_file = tool.Ifc.get() products = [ - ifc_file.by_id(ifc_definition_id) + tool.Ifc.get().by_id(ifc_definition_id) for obj in objects if (ifc_definition_id := tool.Blender.get_obj_ifc_definition_id(obj, self.obj_type, context)) ] diff --git a/src/blenderbim/blenderbim/bim/module/classification/ui.py b/src/blenderbim/blenderbim/bim/module/classification/ui.py index 2e165c76c1..cdc2ef3356 100644 --- a/src/blenderbim/blenderbim/bim/module/classification/ui.py +++ b/src/blenderbim/blenderbim/bim/module/classification/ui.py @@ -120,7 +120,7 @@ class ReferenceUI: obj = context.active_object self.sprops = context.scene.BIMClassificationProperties self.bprops = context.scene.BIMBSDDProperties - self.props = obj.BIMClassificationReferenceProperties + self.props = context.scene.BIMClassificationReferenceProperties self.file = IfcStore.get_file() self.draw_add_ui(context) @@ -318,7 +318,7 @@ class BIM_PT_material_classifications(Panel, ReferenceUI): class BIM_PT_cost_classifications(Panel, ReferenceUI): - bl_label = "Cost Classifications" + bl_label = "Cost Item Classifications" bl_idname = "BIM_PT_cost_classifications" bl_options = {"DEFAULT_CLOSED"} bl_space_type = "PROPERTIES" diff --git a/src/blenderbim/blenderbim/bim/module/pset/__init__.py b/src/blenderbim/blenderbim/bim/module/pset/__init__.py index a2c24a02e5..0efe58e73b 100644 --- a/src/blenderbim/blenderbim/bim/module/pset/__init__.py +++ b/src/blenderbim/blenderbim/bim/module/pset/__init__.py @@ -79,7 +79,7 @@ def register(): def unregister(): del bpy.types.Object.PsetProperties - del bpy.types.Object.MaterialPsetProperties + del bpy.types.Scene.MaterialPsetProperties del bpy.types.Object.MaterialSetPsetProperties del bpy.types.Object.MaterialSetItemPsetProperties del bpy.types.Scene.TaskPsetProperties