Full classification HasReferences hierarchy is now exported

This commit is contained in:
Dion Moult
2020-05-02 13:57:11 +10:00
parent 70f298baae
commit 741ae2575d
5 changed files with 34 additions and 46 deletions
@@ -140,6 +140,7 @@ class IfcParser():
self.document_information = self.get_document_information() self.document_information = self.get_document_information()
self.document_references = self.get_document_references() self.document_references = self.get_document_references()
self.classifications = self.get_classifications() self.classifications = self.get_classifications()
self.classification_reference_maps = self.get_classification_reference_maps()
self.classification_references = self.get_classification_references() self.classification_references = self.get_classification_references()
self.objectives = self.get_objectives() self.objectives = self.get_objectives()
self.load_representations() self.load_representations()
@@ -615,25 +616,22 @@ class IfcParser():
return results return results
def get_classifications(self): def get_classifications(self):
classifications = bpy.context.scene.BIMProperties.classifications
results = {} results = {}
for classification in classifications: for classification in bpy.context.scene.BIMProperties.classifications:
results[classification.name] = { schema.ifc.load_classification(classification.filename)
results[classification.filename] = {
'ifc': None, 'ifc': None,
'raw': classification, 'raw': classification,
'attributes': { 'raw_element': schema.ifc.classification_files[classification.filename].by_type('IfcClassification')[0]
'Name': classification.name,
'Source': classification.source,
'Edition': classification.edition,
'EditionDate': classification.edition_date,
'Description': classification.description,
'Location': classification.location,
'ReferenceTokens': json.loads(
'[{}]'.format(classification.reference_tokens[1:-1].replace('\'', '"').strip(',')))
}
} }
return results return results
def get_classification_reference_maps(self):
results = {}
for filename, classification in self.classifications.items():
results[filename] = { e.Identification: e for e in schema.ifc.classification_files[filename].by_type('IfcClassificationReference')}
return results
def get_classification_references(self): def get_classification_references(self):
results = {} results = {}
for product in self.selected_products: for product in self.selected_products:
@@ -641,13 +639,8 @@ class IfcParser():
results[reference.name] = { results[reference.name] = {
'ifc': None, 'ifc': None,
'raw': reference, 'raw': reference,
'referenced_source': reference.referenced_source, 'raw_element': self.classification_reference_maps[reference.referenced_source][reference.name]
'attributes': {
'Location': reference.location,
'Identification': reference.name,
'Name': reference.human_name,
'Description': reference.description
}
} }
return results return results
@@ -1359,20 +1352,14 @@ class IfcExporter():
def create_classifications(self): def create_classifications(self):
for classification in self.ifc_parser.classifications.values(): for classification in self.ifc_parser.classifications.values():
classification['ifc'] = self.file.create_entity( classification['ifc'] = self.file.add(classification['raw_element'])
'IfcClassification',
**classification['attributes']
)
self.file.createIfcRelAssociatesClassification( self.file.createIfcRelAssociatesClassification(
ifcopenshell.guid.new(), None, None, None, ifcopenshell.guid.new(), None, None, None,
[self.ifc_parser.project['ifc']], classification['ifc']) [self.ifc_parser.project['ifc']], classification['ifc'])
def create_classification_references(self): def create_classification_references(self):
for reference in self.ifc_parser.classification_references.values(): for reference in self.ifc_parser.classification_references.values():
reference['attributes']['ReferencedSource'] = \ reference['ifc'] = self.file.add(reference['raw_element'])
self.ifc_parser.classifications[reference['referenced_source']]['ifc']
reference['ifc'] = self.file.create_entity(
'IfcClassificationReference', **reference['attributes'])
def create_objectives(self): def create_objectives(self):
for objective in self.ifc_parser.objectives.values(): for objective in self.ifc_parser.objectives.values():
@@ -741,9 +741,7 @@ class IfcImporter():
Path(os.path.basename(self.ifc_import_settings.input_file)).stem, classification.Name) Path(os.path.basename(self.ifc_import_settings.input_file)).stem, classification.Name)
classification_file.write(os.path.join( classification_file.write(os.path.join(
bpy.context.scene.BIMProperties.schema_dir, 'classifications', classification_filename)) bpy.context.scene.BIMProperties.schema_dir, 'classifications', classification_filename))
data.filename = classification_filename
destination = os.path.join(bpy.context.scene.BIMProperties.schema_dir,
'classifications', '{}-{}.ifc')
def get_classification_references(self, references): def get_classification_references(self, references):
results = [] results = []
@@ -970,7 +968,7 @@ class IfcImporter():
for key, value in data_map.items(): for key, value in data_map.items():
if hasattr(data, value) and getattr(data, value): if hasattr(data, value) and getattr(data, value):
setattr(reference, key, getattr(data, value)) setattr(reference, key, getattr(data, value))
if data.ReferencedSource: if hasattr(data, 'ReferencedSource') and data.ReferencedSource:
reference.referenced_source = self.get_referenced_source_name(data.ReferencedSource) reference.referenced_source = self.get_referenced_source_name(data.ReferencedSource)
def get_referenced_source_name(self, element): def get_referenced_source_name(self, element):
+15 -14
View File
@@ -1342,18 +1342,20 @@ class AddClassification(bpy.types.Operator):
bl_label = 'Add Classification' bl_label = 'Add Classification'
def execute(self, context): def execute(self, context):
if context.scene.BIMProperties.classification in schema.ifc.classifications: if context.scene.BIMProperties.classification not in schema.ifc.classifications:
data = schema.ifc.classifications[context.scene.BIMProperties.classification] return {'FINISHED'}
classification = context.scene.BIMProperties.classifications.add() data = schema.ifc.classifications[context.scene.BIMProperties.classification]
data_map = { classification = context.scene.BIMProperties.classifications.add()
'name': 'Name', 'source': 'Source', data_map = {
'edition': 'Edition', 'edition_date': 'EditionDate', 'name': 'Name', 'source': 'Source',
'description': 'Description', 'location': 'Location', 'edition': 'Edition', 'edition_date': 'EditionDate',
'reference_tokens': 'ReferenceTokens' 'description': 'Description', 'location': 'Location',
} 'reference_tokens': 'ReferenceTokens'
for key, value in data_map.items(): }
if getattr(data, value): for key, value in data_map.items():
setattr(classification, key, str(getattr(data, value))) if getattr(data, value):
setattr(classification, key, str(getattr(data, value)))
classification.filename = context.scene.BIMProperties.classification
return {'FINISHED'} return {'FINISHED'}
@@ -1372,7 +1374,6 @@ class AssignClassification(bpy.types.Operator):
bl_label = 'Assign Classification' bl_label = 'Assign Classification'
def execute(self, context): def execute(self, context):
referenced_source = schema.ifc.classifications[bpy.context.scene.BIMProperties.classification].Name
for obj in bpy.context.selected_objects: for obj in bpy.context.selected_objects:
classification = obj.BIMObjectProperties.classifications.add() classification = obj.BIMObjectProperties.classifications.add()
refs = bpy.context.scene.BIMProperties.classification_references refs = bpy.context.scene.BIMProperties.classification_references
@@ -1384,7 +1385,7 @@ class AssignClassification(bpy.types.Operator):
for key in ['location', 'description']: for key in ['location', 'description']:
if data[key]: if data[key]:
setattr(classification, key, data[key]) setattr(classification, key, data[key])
classification.referenced_source = referenced_source classification.referenced_source = bpy.context.scene.BIMProperties.classification
return {'FINISHED'} return {'FINISHED'}
@@ -753,6 +753,7 @@ class Classification(PropertyGroup):
description: StringProperty(name="Description") description: StringProperty(name="Description")
location: StringProperty(name="Location") location: StringProperty(name="Location")
reference_tokens: StringProperty(name="Reference Tokens") reference_tokens: StringProperty(name="Reference Tokens")
filename: StringProperty(name="Filename")
class ClassificationReference(PropertyGroup): class ClassificationReference(PropertyGroup):
@@ -231,6 +231,7 @@ class BIM_PT_classification_references(Panel):
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
layout.use_property_split = True
props = context.active_object.BIMObjectProperties props = context.active_object.BIMObjectProperties
if not props.classifications: if not props.classifications: