From 7fe067498fd7538f03a7cd4f2cea972c9b7852cd Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 19 Mar 2020 16:48:50 +1100 Subject: [PATCH] Allow qtos to be imported --- src/ifcblenderexport/blenderbim/__init__.py | 3 +- src/ifcblenderexport/blenderbim/import_ifc.py | 62 +++++++++++++------ src/ifcblenderexport/blenderbim/operator.py | 10 +++ src/ifcblenderexport/blenderbim/prop.py | 9 +-- src/ifcblenderexport/blenderbim/schema.py | 12 ++-- src/ifcblenderexport/blenderbim/ui.py | 11 ++++ 6 files changed, 76 insertions(+), 31 deletions(-) diff --git a/src/ifcblenderexport/blenderbim/__init__.py b/src/ifcblenderexport/blenderbim/__init__.py index 2d101989fb..dd181cc8fd 100644 --- a/src/ifcblenderexport/blenderbim/__init__.py +++ b/src/ifcblenderexport/blenderbim/__init__.py @@ -66,6 +66,7 @@ if bpy is not None: operator.RemovePset, operator.AddOverridePset, operator.RemoveOverridePset, + operator.RemoveQto, operator.AddMaterialPset, operator.RemoveMaterialPset, operator.AddDocument, @@ -107,7 +108,7 @@ if bpy is not None: prop.TargetCRS, prop.Attribute, prop.BoundaryCondition, - prop.Pset, + prop.PsetQto, prop.Document, prop.Classification, prop.GlobalId, diff --git a/src/ifcblenderexport/blenderbim/import_ifc.py b/src/ifcblenderexport/blenderbim/import_ifc.py index ccf8e53d17..9c4d003906 100644 --- a/src/ifcblenderexport/blenderbim/import_ifc.py +++ b/src/ifcblenderexport/blenderbim/import_ifc.py @@ -342,7 +342,7 @@ class IfcImporter(): self.add_element_attributes(element, obj) self.add_element_document_relations(element, obj) self.add_defines_by_type_relation(element, obj) - self.add_product_psets(element, obj) + self.add_product_definitions(element, obj) self.added_data[element.GlobalId] = obj def merge_by_class(self): @@ -379,14 +379,16 @@ class IfcImporter(): bpy.ops.mesh.normals_make_consistent(context_override) bpy.ops.object.editmode_toggle(context_override) - def add_product_psets(self, element, obj): + def add_product_definitions(self, element, obj): if not hasattr(element, 'IsDefinedBy') or not element.IsDefinedBy: return for definition in element.IsDefinedBy: - if not definition.is_a('IfcRelDefinesByProperties') \ - or not definition.RelatingPropertyDefinition.is_a('IfcPropertySet'): + if not definition.is_a('IfcRelDefinesByProperties'): continue - self.add_pset(definition.RelatingPropertyDefinition, obj) + if definition.RelatingPropertyDefinition.is_a('IfcPropertySet'): + self.add_pset(definition.RelatingPropertyDefinition, obj) + elif definition.RelatingPropertyDefinition.is_a('IfcElementQuantity'): + self.add_qto(definition.RelatingPropertyDefinition, obj) def add_type_product_psets(self, element, obj): if not hasattr(element, 'HasPropertySets') or not element.HasPropertySets: @@ -396,21 +398,41 @@ class IfcImporter(): self.add_pset(definition, obj) def add_pset(self, pset, obj): - new_pset = obj.BIMObjectProperties.override_psets.add() - new_pset.name = pset.Name - if new_pset.name in schema.ifc.psets: - for prop_name in schema.ifc.psets[new_pset.name]['HasPropertyTemplates'].keys(): - prop = new_pset.properties.add() - prop.name = prop_name - for prop in pset.HasProperties: - if prop.is_a('IfcPropertySingleValue') and prop.NominalValue: - index = new_pset.properties.find(prop.Name) - if index >= 0: - new_pset.properties[index].string_value = str(prop.NominalValue.wrappedValue) - else: - new_prop = new_pset.properties.add() - new_prop.name = prop.Name - new_prop.string_value = str(prop.NominalValue.wrappedValue) + new_pset = obj.BIMObjectProperties.override_psets.add() + new_pset.name = pset.Name + if new_pset.name in schema.ifc.psets: + for prop_name in schema.ifc.psets[new_pset.name]['HasPropertyTemplates'].keys(): + prop = new_pset.properties.add() + prop.name = prop_name + for prop in pset.HasProperties: + if prop.is_a('IfcPropertySingleValue') and prop.NominalValue: + index = new_pset.properties.find(prop.Name) + if index >= 0: + new_pset.properties[index].string_value = str(prop.NominalValue.wrappedValue) + else: + new_prop = new_pset.properties.add() + new_prop.name = prop.Name + new_prop.string_value = str(prop.NominalValue.wrappedValue) + + def add_qto(self, qto, obj): + new_qto = obj.BIMObjectProperties.qtos.add() + new_qto.name = qto.Name + if new_qto.name in schema.ifc.qtos: + for prop_name in schema.ifc.qtos[new_qto.name]['HasPropertyTemplates'].keys(): + prop = new_qto.properties.add() + prop.name = prop_name + for prop in qto.Quantities: + if prop.is_a('IfcPhysicalSimpleQuantity'): + value = getattr(prop, '{}Value'.format(prop.is_a()[len('IfcQuantity'):])) + if not value: + continue + index = new_qto.properties.find(prop.Name) + if index >= 0: + new_qto.properties[index].string_value = str(value) + else: + new_prop = new_qto.properties.add() + new_prop.name = prop.Name + new_prop.string_value = str(value) def add_defines_by_type_relation(self, element, obj): related_type = None diff --git a/src/ifcblenderexport/blenderbim/operator.py b/src/ifcblenderexport/blenderbim/operator.py index 16368c9dc7..981394ef01 100644 --- a/src/ifcblenderexport/blenderbim/operator.py +++ b/src/ifcblenderexport/blenderbim/operator.py @@ -506,6 +506,16 @@ class RemoveOverridePset(bpy.types.Operator): return {'FINISHED'} +class RemoveQto(bpy.types.Operator): + bl_idname = 'bim.remove_qto' + bl_label = 'Remove Qto' + index: bpy.props.IntProperty() + + def execute(self, context): + bpy.context.active_object.BIMObjectProperties.qtos.remove(self.index) + return {'FINISHED'} + + class AddMaterialPset(bpy.types.Operator): bl_idname = 'bim.add_material_pset' bl_label = 'Add Material Pset' diff --git a/src/ifcblenderexport/blenderbim/prop.py b/src/ifcblenderexport/blenderbim/prop.py index ed2bc2bd11..4b5c96c8a9 100644 --- a/src/ifcblenderexport/blenderbim/prop.py +++ b/src/ifcblenderexport/blenderbim/prop.py @@ -454,7 +454,7 @@ class Attribute(PropertyGroup): int_value: IntProperty(name="Value") float_value: FloatProperty(name="Value") -class Pset(PropertyGroup): +class PsetQto(PropertyGroup): name: StringProperty(name="Name") file: StringProperty(name="File") properties: CollectionProperty(name="Properties", type=Attribute) @@ -481,13 +481,14 @@ class BIMObjectProperties(PropertyGroup): attributes: CollectionProperty(name="Attributes", type=Attribute) relating_type: PointerProperty(name='Type Product', type=bpy.types.Object) relating_structure: PointerProperty(name='Spatial Container', type=bpy.types.Object) - psets: CollectionProperty(name="Psets", type=Pset) + psets: CollectionProperty(name="Psets", type=PsetQto) + qtos: CollectionProperty(name="Qtos", type=PsetQto) applicable_attributes: EnumProperty(items=getApplicableAttributes, name="Attribute Names") documents: CollectionProperty(name="Documents", type=Document) applicable_documents: EnumProperty(items=getApplicableDocuments, name="Available Documents") classifications: CollectionProperty(name="Classifications", type=Classification) material_type: EnumProperty(items=getMaterialTypes, name="Material Type") - override_psets: CollectionProperty(name="Override Psets", type=Pset) + override_psets: CollectionProperty(name="Override Psets", type=PsetQto) override_pset_name: StringProperty(name="Override Pset Name") has_boundary_condition: BoolProperty(name='Has Boundary Condition') boundary_condition: PointerProperty(name='Boundary Condition', type=BoundaryCondition) @@ -500,7 +501,7 @@ class BIMMaterialProperties(PropertyGroup): identification: StringProperty(name="Identification") name: StringProperty(name="Name") available_material_psets: EnumProperty(items=getAvailableMaterialPsets, name="Material Pset") - psets: CollectionProperty(name="Psets", type=Pset) + psets: CollectionProperty(name="Psets", type=PsetQto) attributes: CollectionProperty(name="Attributes", type=Attribute) applicable_attributes: EnumProperty(items=getApplicableMaterialAttributes, name="Attribute Names") profile_def: EnumProperty(items=getProfileDef, name='Parameterized Profile Def', update=refreshProfileAttributes) diff --git a/src/ifcblenderexport/blenderbim/schema.py b/src/ifcblenderexport/blenderbim/schema.py index 3f9637b8f3..307baab91a 100644 --- a/src/ifcblenderexport/blenderbim/schema.py +++ b/src/ifcblenderexport/blenderbim/schema.py @@ -37,12 +37,12 @@ class IfcSchema(): self.type_map = json.load(f) for property_file in self.property_files: - for property in property_file.by_type('IfcPropertySetTemplate'): - if property.Name[0:4] == 'Qto_': - # self.qtos.append({ }) - pass + for prop in property_file.by_type('IfcPropertySetTemplate'): + if prop.Name[0:4] == 'Qto_': + self.qtos[prop.Name] = { + 'HasPropertyTemplates': {p.Name: p for p in prop.HasPropertyTemplates}} else: - self.psets[property.Name] = { - 'HasPropertyTemplates': {p.Name: p for p in property.HasPropertyTemplates}} + self.psets[prop.Name] = { + 'HasPropertyTemplates': {p.Name: p for p in prop.HasPropertyTemplates}} ifc = IfcSchema() diff --git a/src/ifcblenderexport/blenderbim/ui.py b/src/ifcblenderexport/blenderbim/ui.py index 32e74d5f84..4ce1c41d71 100644 --- a/src/ifcblenderexport/blenderbim/ui.py +++ b/src/ifcblenderexport/blenderbim/ui.py @@ -72,6 +72,17 @@ class BIM_PT_object(Panel): row.prop(prop, 'name', text='') row.prop(prop, 'string_value', text='') + layout.label(text="Quantities:") + + for index, qto in enumerate(props.qtos): + row = layout.row(align=True) + row.prop(qto, 'name', text='') + row.operator('bim.remove_qto', icon='X', text='').index = index + for prop in qto.properties: + row = layout.row(align=True) + row.prop(prop, 'name', text='') + row.prop(prop, 'string_value', text='') + layout.label(text="Documents:") row = layout.row(align=True) row.prop(props, 'applicable_documents', text='')