From edc3aa61574594fb26c875bbd082238b871d6292 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 11 Jun 2020 10:52:00 +1000 Subject: [PATCH] Support import whitelists and blacklist filters. Groundwork for #865. --- src/ifcblenderexport/Makefile | 2 +- .../blenderbim/bim/__init__.py | 2 ++ .../blenderbim/bim/import_ifc.py | 33 ++++++++++++++++--- src/ifcblenderexport/blenderbim/bim/prop.py | 14 +++++++- src/ifcblenderexport/blenderbim/bim/ui.py | 16 +++++++++ 5 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/ifcblenderexport/Makefile b/src/ifcblenderexport/Makefile index ba98186669..b2aaecd39f 100644 --- a/src/ifcblenderexport/Makefile +++ b/src/ifcblenderexport/Makefile @@ -25,7 +25,7 @@ endif mkdir -p dist/blenderbim cp -r blenderbim/* dist/blenderbim/ - cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcblender-python-37-v0.6.0-0d93633-$(PLATFORM)64.zip + cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcblender-python-37-v0.6.0-793c1c8-$(PLATFORM)64.zip cd dist/working && unzip ifcblender* cp -r dist/working/io_import_scene_ifc/ifcopenshell dist/blenderbim/libs/site/packages/ # See bug #812 diff --git a/src/ifcblenderexport/blenderbim/bim/__init__.py b/src/ifcblenderexport/blenderbim/bim/__init__.py index 9538a75682..d68222b6e1 100644 --- a/src/ifcblenderexport/blenderbim/bim/__init__.py +++ b/src/ifcblenderexport/blenderbim/bim/__init__.py @@ -169,6 +169,7 @@ if bpy is not None: prop.BoundaryCondition, prop.PsetQto, prop.GlobalId, + prop.RepresentationItem, prop.BIMObjectProperties, prop.BIMMaterialProperties, prop.SweptSolid, @@ -205,6 +206,7 @@ if bpy is not None: ui.BIM_UL_document_references, ui.BIM_UL_topics, ui.BIM_UL_classifications, + ui.BIM_UL_representation_items, ui.BIM_ADDON_preferences, covetool_prop.CoveToolProject, covetool_prop.CoveToolSimpleAnalysis, diff --git a/src/ifcblenderexport/blenderbim/bim/import_ifc.py b/src/ifcblenderexport/blenderbim/bim/import_ifc.py index f78e2fd274..f326681c1c 100644 --- a/src/ifcblenderexport/blenderbim/bim/import_ifc.py +++ b/src/ifcblenderexport/blenderbim/bim/import_ifc.py @@ -1,5 +1,6 @@ import ifcopenshell import ifcopenshell.geom +import ifcopenshell.util.selector import bpy import bmesh import os @@ -229,12 +230,15 @@ class IfcImporter(): self.settings_2d = ifcopenshell.geom.settings() self.settings_2d.set(self.settings_2d.INCLUDE_CURVES, True) self.existing_elements = {} + self.include_elements = [] + self.exclude_elements = [] self.project = None self.classifications = {} self.spatial_structure_elements = {} self.elements = {} self.type_collection = None self.type_products = {} + self.openings = {} self.meshes = {} self.mesh_shapes = {} self.time = 0 @@ -269,8 +273,9 @@ class IfcImporter(): self.create_aggregates() if self.ifc_import_settings.should_import_opening_elements: self.create_openings_collection() + self.process_element_filter() if self.ifc_import_settings.should_import_native: - self.parse_native_products() + self.parse_native_elements() self.filter_ifc() self.patch_ifc() self.create_georeferencing() @@ -331,8 +336,18 @@ class IfcImporter(): or abs(point.Coordinates[1]) > 1000000 \ or abs(point.Coordinates[2]) > 1000000 + def process_element_filter(self): + if not self.ifc_import_settings.ifc_selector: + return + self.include_elements = [] + selector = ifcopenshell.util.selector.Selector() + elements = selector.parse(self.file, self.ifc_import_settings.ifc_selector) + if self.ifc_import_settings.ifc_import_filter == 'WHITELIST': + self.include_elements = elements + elif self.ifc_import_settings.ifc_import_filter == 'BLACKLIST': + self.exclude_elements = elements - def parse_native_products(self): + def parse_native_elements(self): self.parse_native_swept_disk_solid() self.parse_native_extruded_area_solid() @@ -573,12 +588,18 @@ class IfcImporter(): def create_products(self): if self.ifc_import_settings.should_use_cpu_multiprocessing: - iterator = ifcopenshell.geom.iterator(self.settings, self.file, multiprocessing.cpu_count()) + iterator = ifcopenshell.geom.iterator( + self.settings, self.file, multiprocessing.cpu_count(), + include=self.include_elements or None, + exclude=self.exclude_elements or None + ) else: - iterator = ifcopenshell.geom.iterator(self.settings, self.file) + iterator = ifcopenshell.geom.iterator( + self.settings, self.file, + include=self.include_elements or None, + exclude=self.exclude_elements or None) valid_file = iterator.initialize() if not valid_file: - self.create_products_legacy() # Sometimes, this can still work, not 100% sure why yet return False old_progress = -1 while True: @@ -1692,6 +1713,8 @@ class IfcImportSettings: settings.input_file = input_file settings.logger = logger settings.diff_file = scene_bim.diff_json_file + settings.ifc_import_filter = scene_bim.ifc_import_filter + settings.ifc_selector = scene_bim.ifc_selector settings.should_ignore_site_coordinates = scene_bim.import_should_ignore_site_coordinates settings.should_ignore_building_coordinates = scene_bim.import_should_ignore_building_coordinates settings.should_reset_absolute_coordinates = scene_bim.import_should_reset_absolute_coordinates diff --git a/src/ifcblenderexport/blenderbim/bim/prop.py b/src/ifcblenderexport/blenderbim/bim/prop.py index 05d6a48344..3a6b3a690e 100644 --- a/src/ifcblenderexport/blenderbim/bim/prop.py +++ b/src/ifcblenderexport/blenderbim/bim/prop.py @@ -890,7 +890,7 @@ class BIMProperties(PropertyGroup): import_should_ignore_site_coordinates: BoolProperty(name="Import Ignoring Site Coordinates", default=False) import_should_ignore_building_coordinates: BoolProperty(name="Import Ignoring Building Coordinates", default=False) import_should_reset_absolute_coordinates: BoolProperty(name="Import Resetting Absolute Coordinates", default=False) - import_should_import_curves: BoolProperty(name="Import Curves", default=True) + import_should_import_curves: BoolProperty(name="Import Curves", default=False) import_should_import_opening_elements: BoolProperty(name="Import Opening Elements", default=False) import_should_import_spaces: BoolProperty(name="Import Spaces", default=False) import_should_auto_set_workarounds: BoolProperty(name="Automatically Set Vendor Workarounds", default=True) @@ -942,6 +942,11 @@ class BIMProperties(PropertyGroup): property_templates: CollectionProperty(name='Property Templates', type=PropertyTemplate) should_section_selected_objects: BoolProperty(name="Section Selected Objects", default=False) section_plane_colour: FloatVectorProperty(name='Temporary Section Cutaway Colour', subtype='COLOR', default=(1, 0, 0), min=0.0, max=1.0) + ifc_import_filter: EnumProperty(items=[ + ('NONE', 'None', ''), + ('WHITELIST', 'Whitelist', ''), + ('BLACKLIST', 'Blacklist', ''), + ], name='Import Filter') ifc_selector: StringProperty(default='', name='IFC Selector') csv_attributes: CollectionProperty(name='CSV Attributes', type=StrProperty) document_information: CollectionProperty(name='Document Information', type=DocumentInformation) @@ -1069,6 +1074,11 @@ class SweptSolid(PropertyGroup): extrusion: StringProperty(name="Extrusion") +class RepresentationItem(PropertyGroup): + name: StringProperty(name="Name") + vgroup: StringProperty(name="Vertex Group") + + class BIMMeshProperties(PropertyGroup): is_wireframe: BoolProperty(name="Is Wireframe") is_swept_solid: BoolProperty(name="Is Swept Solid") @@ -1076,3 +1086,5 @@ class BIMMeshProperties(PropertyGroup): is_parametric: BoolProperty(name='Is Parametric', default=False) presentation_layer: StringProperty(name="Presentation Layer") geometry_type: StringProperty(name="Geometry Type") + representation_items: CollectionProperty(name="Representation Items", type=RepresentationItem) + active_representation_item_index: IntProperty(name='Active Representation Item Index') diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index acd67e8b70..4fc552327c 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -427,6 +427,8 @@ class BIM_PT_mesh(Panel): row = layout.row() row.prop(props, 'geometry_type') + layout.template_list('BIM_UL_representation_items', '', props, 'representation_items', props, 'active_representation_item_index') + row = layout.row() row.prop(props, 'presentation_layer') @@ -1175,6 +1177,11 @@ class BIM_PT_mvd(Panel): row = layout.row() row.prop(bim_properties, 'export_schema') + row = layout.row() + row.prop(bim_properties, 'ifc_import_filter') + row = layout.row() + row.prop(bim_properties, 'ifc_selector') + layout.label(text='Custom MVD:') row = layout.row() @@ -1298,6 +1305,15 @@ class BIM_UL_classifications(bpy.types.UIList): layout.label(text=itemdata['name']) +class BIM_UL_representation_items(bpy.types.UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname): + ob = data + if item: + layout.prop(item, 'name', text='', emboss=False) + else: + layout.label(text="", translate=False) + + class BIM_ADDON_preferences(bpy.types.AddonPreferences): bl_idname = 'blenderbim'