New feature to merge import geometry by class, which is useful for artists who don't care too much about the data

This commit is contained in:
Dion Moult
2020-03-10 09:56:34 +11:00
parent 4df2feabe2
commit c6e10abc51
4 changed files with 23 additions and 0 deletions
@@ -138,6 +138,7 @@ class IfcImporter():
self.mesh_shapes = {}
self.time = 0
self.unit_scale = 1
self.added_objects = []
self.material_creator = MaterialCreator(ifc_import_settings)
@@ -162,6 +163,8 @@ class IfcImporter():
self.create_products_legacy()
else:
self.create_products()
if self.ifc_import_settings.should_merge_by_class:
self.merge_by_class()
def auto_set_workarounds(self):
applications = self.file.by_type('IfcApplication')
@@ -335,6 +338,18 @@ class IfcImporter():
self.add_defines_by_type_relation(element, obj)
self.place_object_in_spatial_tree(element, obj)
self.add_product_psets(element, obj)
self.added_objects.append(obj)
def merge_by_class(self):
merge_set = {}
for obj in self.added_objects:
if '/' in obj.name:
merge_set.setdefault(obj.name.split('/')[0], []).append(obj)
for ifc_class, objs in merge_set.items():
context_override = {}
context_override['object'] = context_override['active_object'] = objs[0]
context_override['selected_objects'] = context_override['selected_editable_objects'] = objs
bpy.ops.object.join(context_override)
def add_product_psets(self, element, obj):
if not hasattr(element, 'IsDefinedBy') or not element.IsDefinedBy:
@@ -686,4 +701,5 @@ class IfcImportSettings:
self.should_treat_styled_item_as_material = False
self.should_use_cpu_multiprocessing = False
self.should_use_legacy = False
self.should_merge_by_class = False
self.diff_file = None
@@ -101,6 +101,7 @@ class ImportIFC(bpy.types.Operator, ImportHelper):
ifc_import_settings.should_treat_styled_item_as_material = bpy.context.scene.BIMProperties.import_should_treat_styled_item_as_material
ifc_import_settings.should_use_cpu_multiprocessing = bpy.context.scene.BIMProperties.import_should_use_cpu_multiprocessing
ifc_import_settings.should_use_legacy = bpy.context.scene.BIMProperties.import_should_use_legacy
ifc_import_settings.should_merge_by_class = bpy.context.scene.BIMProperties.import_should_merge_by_class
ifc_importer = import_ifc.IfcImporter(ifc_import_settings)
ifc_importer.execute()
ifc_import_settings.logger.info('Import finished in {:.2f} seconds'.format(time.time() - start))
+1
View File
@@ -382,6 +382,7 @@ class BIMProperties(PropertyGroup):
import_should_treat_styled_item_as_material: BoolProperty(name="Import Treating Styled Item as Material", default=False)
import_should_use_legacy: BoolProperty(name="Import with Legacy Importer", default=False)
import_should_use_cpu_multiprocessing: BoolProperty(name="Import with CPU Multiprocessing", default=False)
import_should_merge_by_class: BoolProperty(name="Import and Merge by Class", default=False)
qa_reject_element_reason: StringProperty(name="Element Rejection Reason")
person: EnumProperty(items=getPersons, name="Person")
organisation: EnumProperty(items=getOrganisations, name="Organisation")
+5
View File
@@ -643,6 +643,11 @@ class BIM_PT_mvd(Panel):
row = layout.row()
row.prop(bim_properties, 'import_should_use_cpu_multiprocessing')
layout.label(text='Simplifications:')
row = layout.row()
row.prop(bim_properties, 'import_should_merge_by_class')
layout.label(text='Vendor Workarounds:')
row = layout.row()