diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index 752f8da2a2..b0fa948091 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -198,6 +198,7 @@ if bpy is not None: operator.GetNorthOffset, operator.AddDrawingStyleAttribute, operator.RemoveDrawingStyleAttribute, + operator.CopyPropertyToSelection, prop.StrProperty, prop.Variable, prop.Role, diff --git a/src/ifcblenderexport/blenderbim/bim/operator.py b/src/ifcblenderexport/blenderbim/bim/operator.py index df97bbf790..fd6970b31d 100644 --- a/src/ifcblenderexport/blenderbim/bim/operator.py +++ b/src/ifcblenderexport/blenderbim/bim/operator.py @@ -2571,6 +2571,46 @@ class BIM_OT_CopyAttributesToSelection(bpy.types.Operator): except: pass +class CopyPropertyToSelection(bpy.types.Operator): + bl_idname = 'bim.copy_property_to_selection' + bl_label = 'Copy Property To Selection' + pset_name: bpy.props.StringProperty() + prop_name: bpy.props.StringProperty() + prop_value: bpy.props.StringProperty() + + def execute(self, context): + self.applicable_psets_cache = {} + self.empty = ifcopenshell.file() + for obj in bpy.context.selected_objects: + if '/' not in obj.name: + continue + pset = obj.BIMObjectProperties.psets.get(self.pset_name) + if not pset: + applicable_psets = self.get_applicable_psets(obj.name.split('/')[0]) + if self.pset_name not in applicable_psets: + continue + pset = obj.BIMObjectProperties.psets.add() + pset.name = self.pset_name + for template_prop_name in schema.ifc.psets[self.pset_name]['HasPropertyTemplates'].keys(): + prop = pset.properties.add() + prop.name = template_prop_name + prop = pset.properties.get(self.prop_name) + if prop: + prop.string_value = self.prop_value + return {'FINISHED'} + + # TODO: move into util module. See bug #971 + def get_applicable_psets(self, element_class): + if element_class not in self.applicable_psets_cache: + element = self.empty.create_entity(element_class) + applicable_psets = [] + for ifc_class, pset_names in schema.ifc.applicable_psets.items(): + if element.is_a(ifc_class): + applicable_psets.extend(pset_names) + self.applicable_psets_cache[element_class] = applicable_psets + return self.applicable_psets_cache[element_class] + + class BIM_OT_ChangeClassificationLevel(bpy.types.Operator): bl_idname = "bim.change_classification_level" bl_label = "Change Classification Level" diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 0a9360f3f2..619244a098 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -372,6 +372,7 @@ def refreshReferences(self, context): context.scene.BIMProperties.classification_references.root = '' +# TODO: move into util module. See bug #971 def getPsetNames(self, context): global psetnames_enum psetnames_enum.clear() @@ -385,6 +386,7 @@ def getPsetNames(self, context): return psetnames_enum +# TODO: move into util module. See bug #971 def getQtoNames(self, context): global qtonames_enum qtonames_enum.clear() diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index b8dc9bd742..01a5e264bf 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -101,10 +101,10 @@ class BIM_PT_object_psets(Panel): row = layout.row(align=True) row.prop(prop, 'name', text='') row.prop(prop, 'string_value', text='') - op = row.operator('bim.copy_attributes_to_selection', icon='COPYDOWN', text='') - op.prop_base = 'BIMObjectProperties.psets[\'{}\'].properties'.format(pset.name) + op = row.operator('bim.copy_property_to_selection', icon='COPYDOWN', text='') + op.pset_name = pset.name op.prop_name = prop.name - op.collection_element = True + op.prop_value = prop.string_value class BIM_PT_object_qto(Panel): bl_label = 'IFC Object Quantity Sets'