Fix wrapped data values in COBie extracts

This commit is contained in:
Dion Moult
2020-04-06 17:30:02 +10:00
parent 374d5a5d1d
commit df14ab57bf
+29 -13
View File
@@ -160,7 +160,7 @@ class IfcCobieParser():
'OrganizationCode': (history.OwningUser.TheOrganization.Id or 'n/a') if self.file.schema == 'IFC2X3' else (history.OwningUser.TheOrganization.Identification or 'n/a'), 'OrganizationCode': (history.OwningUser.TheOrganization.Id or 'n/a') if self.file.schema == 'IFC2X3' else (history.OwningUser.TheOrganization.Identification or 'n/a'),
'GivenName': self.get_name_from_person(history.OwningUser.ThePerson, 'GivenName'), 'GivenName': self.get_name_from_person(history.OwningUser.ThePerson, 'GivenName'),
'FamilyName': self.get_name_from_person(history.OwningUser.ThePerson, 'FamilyName'), 'FamilyName': self.get_name_from_person(history.OwningUser.ThePerson, 'FamilyName'),
'Street': self.get_attribute_from_address(postal_address, 'AddressLines'), 'Street': self.get_lines_from_address(postal_address),
'PostalBox': self.get_attribute_from_address(postal_address, 'PostalBox'), 'PostalBox': self.get_attribute_from_address(postal_address, 'PostalBox'),
'Town': self.get_attribute_from_address(postal_address, 'Town'), 'Town': self.get_attribute_from_address(postal_address, 'Town'),
'StateRegion': self.get_attribute_from_address(postal_address, 'Region'), 'StateRegion': self.get_attribute_from_address(postal_address, 'Region'),
@@ -462,11 +462,11 @@ class IfcCobieParser():
'ImpactStage': None, 'ImpactStage': None,
'SheetName': 'Impacts', 'SheetName': 'Impacts',
'RowName': 'n/a', 'RowName': 'n/a',
'Value': self.get_object_attribute(property, 'NominalValue', default='n/a') if property.is_a('IfcPropertySingleValue') else 'n/a', 'Value': self.get_property_value(property),
'Unit': '{}{}'.format(property.Unit.Prefix, property.Unit.Name) if hasattr(property, 'Unit') and property.Unit else 'n/a', 'Unit': '{}{}'.format(property.Unit.Prefix, property.Unit.Name) if hasattr(property, 'Unit') and property.Unit else 'n/a',
'LeadInTime': self.get_object_attribute(property, 'NominalValue', default='n/a') if property.is_a('IfcPropertySingleValue') and property.Name == 'LeadInTime' else 'n/a', 'LeadInTime': self.get_property_value(property, name='LeadInTime'),
'Duration': self.get_object_attribute(property, 'NominalValue', default='n/a') if property.is_a('IfcPropertySingleValue') and property.Name == 'Duration' else 'n/a', 'Duration': self.get_property_value(property, name='Duration'),
'LeadOutTime': self.get_object_attribute(property, 'NominalValue', default='n/a') if property.is_a('IfcPropertySingleValue') and property.Name == 'LeadOutTime' else 'n/a', 'LeadOutTime': self.get_property_value(property, name='LeadOutTime'),
'ExtSystem': self.get_ext_system_from_history(impact.OwnerHistory), 'ExtSystem': self.get_ext_system_from_history(impact.OwnerHistory),
'ExtObject': self.get_ext_object(impact), 'ExtObject': self.get_ext_object(impact),
'ExtIdentifier': impact.GlobalId, 'ExtIdentifier': impact.GlobalId,
@@ -510,7 +510,7 @@ class IfcCobieParser():
'Category': 'n/a', # I am not sure what this mapping is meant to be 'Category': 'n/a', # I am not sure what this mapping is meant to be
'SheetName': 'Attributes', 'SheetName': 'Attributes',
'RowName': 'n/a', # I am not sure what this mapping is meant to be 'RowName': 'n/a', # I am not sure what this mapping is meant to be
'Value': self.get_object_attribute(property, 'NominalValue', default='n/a') if property.is_a('IfcPropertySingleValue') else 'n/a', 'Value': self.get_property_value(property),
'Unit': '{}{}'.format(property.Unit.Prefix if hasattr(property.Unit, 'Prefix') else '', property.Unit.Name if hasattr(property.Unit, 'Name') else 'n/a') if hasattr(property, 'Unit') and property.Unit else 'n/a', 'Unit': '{}{}'.format(property.Unit.Prefix if hasattr(property.Unit, 'Prefix') else '', property.Unit.Name if hasattr(property.Unit, 'Name') else 'n/a') if hasattr(property, 'Unit') and property.Unit else 'n/a',
'ExtSystem': self.get_ext_system_from_history(attribute.OwnerHistory), 'ExtSystem': self.get_ext_system_from_history(attribute.OwnerHistory),
'ExtObject': self.get_ext_object(attribute), 'ExtObject': self.get_ext_object(attribute),
@@ -663,10 +663,10 @@ class IfcCobieParser():
if picklist: if picklist:
self.picklists[picklist].append(default) self.picklists[picklist].append(default)
return default return default
property = self.get_property_from_pset(pset, property_name, default) prop = self.get_property_from_pset(pset, property_name, default)
if picklist: if picklist:
self.picklists[picklist].append(property) self.picklists[picklist].append(prop)
return property return prop
def get_grouped_product_names_from_object(self, object, type): def get_grouped_product_names_from_object(self, object, type):
names = [] names = []
@@ -712,12 +712,22 @@ class IfcCobieParser():
return 'n/a' return 'n/a'
def get_property_from_pset(self, pset, name, default=None): def get_property_from_pset(self, pset, name, default=None):
for property in pset.HasProperties: for prop in pset.HasProperties:
if property.Name == name: if prop.Name == name:
return property.NominalValue return prop.NominalValue.wrappedValue
self.logger.warning('The property {} was not found for {}'.format(name, pset)) self.logger.warning('The property {} was not found for {}'.format(name, pset))
return default return default
def get_property_value(self, prop, name=None):
if not prop.is_a('IfcPropertySingleValue'):
return 'n/a'
if name is not None and prop.Name != name:
return 'n/a'
value = self.get_object_attribute(prop, 'NominalValue', default=None)
if value:
return value.wrappedValue
return 'n/a'
def get_pset_from_object(self, object, name): def get_pset_from_object(self, object, name):
if object.is_a('IfcTypeObject'): if object.is_a('IfcTypeObject'):
if object.HasPropertySets: if object.HasPropertySets:
@@ -862,6 +872,12 @@ class IfcCobieParser():
self.logger.warning('The person\'s {} seems to be badly formatted ("{}") for {}'.format(attribute, name, person)) self.logger.warning('The person\'s {} seems to be badly formatted ("{}") for {}'.format(attribute, name, person))
return name if name else 'n/a' return name if name else 'n/a'
def get_lines_from_address(self, address):
result = self.get_attribute_from_address(address, 'AddressLines')
if isinstance(result, tuple):
return ', '.join(result)
return result
def get_attribute_from_address(self, address, attribute): def get_attribute_from_address(self, address, attribute):
result = getattr(address, attribute) result = getattr(address, attribute)
if not result: if not result:
@@ -1016,7 +1032,7 @@ class CobieCsvWriter():
'Description', 'ExtSystem', 'ExtObject', 'ExtIdentifier', 'Description', 'ExtSystem', 'ExtObject', 'ExtIdentifier',
'SerialNumber', 'InstallationDate', 'WarrantyStartDate', 'SerialNumber', 'InstallationDate', 'WarrantyStartDate',
'TagNumber', 'BarCode', 'AssetIdentifier',]) 'TagNumber', 'BarCode', 'AssetIdentifier',])
self.write_file('System', self.parser.systems, 'Name', self.write_file('System', self.parser.systems, 'Name',
['Name', 'CreatedBy', 'CreatedOn', 'Category', 'ComponentNames', ['Name', 'CreatedBy', 'CreatedOn', 'Category', 'ComponentNames',
'ExtSystem', 'ExtObject', 'ExtIdentifier', 'Description',]) 'ExtSystem', 'ExtObject', 'ExtIdentifier', 'Description',])
self.write_file('Assembly', self.parser.assemblies, 'Name', self.write_file('Assembly', self.parser.assemblies, 'Name',