mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-17 22:11:36 +00:00
Full classification HasReferences hierarchy is now exported
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user