Allow qtos to be imported

This commit is contained in:
Dion Moult
2020-03-19 16:48:50 +11:00
parent ea71485f3b
commit 7fe067498f
6 changed files with 76 additions and 31 deletions
+2 -1
View File
@@ -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,
+42 -20
View File
@@ -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
@@ -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'
+5 -4
View File
@@ -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)
+6 -6
View File
@@ -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()
+11
View File
@@ -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='')