diff --git a/src/ifcblenderexport/blenderbim/import_ifc.py b/src/ifcblenderexport/blenderbim/import_ifc.py index 2a9b52a251..3f34e5fc4f 100644 --- a/src/ifcblenderexport/blenderbim/import_ifc.py +++ b/src/ifcblenderexport/blenderbim/import_ifc.py @@ -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 diff --git a/src/ifcblenderexport/blenderbim/operator.py b/src/ifcblenderexport/blenderbim/operator.py index 5d41b96ae0..be5fe841b9 100644 --- a/src/ifcblenderexport/blenderbim/operator.py +++ b/src/ifcblenderexport/blenderbim/operator.py @@ -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)) diff --git a/src/ifcblenderexport/blenderbim/prop.py b/src/ifcblenderexport/blenderbim/prop.py index 2f8594aa58..36ede999a4 100644 --- a/src/ifcblenderexport/blenderbim/prop.py +++ b/src/ifcblenderexport/blenderbim/prop.py @@ -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") diff --git a/src/ifcblenderexport/blenderbim/ui.py b/src/ifcblenderexport/blenderbim/ui.py index 272b288a54..060db96082 100644 --- a/src/ifcblenderexport/blenderbim/ui.py +++ b/src/ifcblenderexport/blenderbim/ui.py @@ -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()