From a1ed78e7555f7e92ff136e4cb9161a835f8069dc Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Wed, 8 Jun 2022 11:53:58 +1000 Subject: [PATCH] #2224 You can now specify element offset / limit ranges when loading models --- src/blenderbim/blenderbim/bim/import_ifc.py | 21 ++++++++++++------- .../blenderbim/bim/module/project/operator.py | 1 + .../blenderbim/bim/module/project/prop.py | 3 +++ .../blenderbim/bim/module/project/ui.py | 8 ++++++- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/import_ifc.py b/src/blenderbim/blenderbim/bim/import_ifc.py index f5023c1587..259915d298 100644 --- a/src/blenderbim/blenderbim/bim/import_ifc.py +++ b/src/blenderbim/blenderbim/bim/import_ifc.py @@ -314,14 +314,19 @@ class IfcImporter: self.settings_2d.set_context_ids(self.plan_contexts) def process_element_filter(self): + offset = self.ifc_import_settings.element_offset + offset_limit = offset + self.ifc_import_settings.element_limit + if self.ifc_import_settings.has_filter: - self.elements = set(self.ifc_import_settings.elements) + self.elements = self.ifc_import_settings.elements # TODO: enable filtering for annotations self.annotations = set(self.file.by_type("IfcAnnotation")) else: - self.elements = set(self.file.by_type("IfcElement")) + self.elements = self.file.by_type("IfcElement") self.annotations = set(self.file.by_type("IfcAnnotation")) + self.elements = set(self.elements[offset:offset_limit]) + if self.ifc_import_settings.has_filter and self.ifc_import_settings.should_filter_spatial_elements: self.spatial_elements = self.get_spatial_elements_filtered_by_elements(self.elements) else: @@ -366,7 +371,7 @@ class IfcImporter: return True if not self.ifc_import_settings.should_use_native_meshes: - return False # Performance improvements only occur on edge cases currently + return False # Performance improvements only occur on edge cases currently # FacetedBreps (without voids) are meshes. See #841. if self.is_native_faceted_brep(representations): @@ -1924,6 +1929,8 @@ class IfcImportSettings: self.angular_tolerance = 0.5 self.distance_limit = 1000 self.false_origin = None + self.element_offset = 0 + self.element_limit = 30000 self.has_filter = None self.should_filter_spatial_elements = True self.elements = set() @@ -1949,11 +1956,9 @@ class IfcImportSettings: settings.deflection_tolerance = props.deflection_tolerance settings.angular_tolerance = props.angular_tolerance settings.distance_limit = props.distance_limit - settings.false_origin = ( - [float(o) for o in props.false_origin.split(",")] - if props.false_origin - else None - ) + settings.false_origin = [float(o) for o in props.false_origin.split(",")] if props.false_origin else None if settings.false_origin == [0, 0, 0]: settings.false_origin = None + settings.element_offset = props.element_offset + settings.element_limit = props.element_limit return settings diff --git a/src/blenderbim/blenderbim/bim/module/project/operator.py b/src/blenderbim/blenderbim/bim/module/project/operator.py index 7e1ab55fad..71160e86e4 100644 --- a/src/blenderbim/blenderbim/bim/module/project/operator.py +++ b/src/blenderbim/blenderbim/bim/module/project/operator.py @@ -495,6 +495,7 @@ class LoadProject(bpy.types.Operator, IFCFileSelector): return {"FINISHED"} context.scene.BIMProperties.ifc_file = self.filepath context.scene.BIMProjectProperties.is_loading = True + context.scene.BIMProjectProperties.total_elements = len(tool.Ifc.get().by_type("IfcElement")) if not self.is_advanced: bpy.ops.bim.load_project_elements() return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/project/prop.py b/src/blenderbim/blenderbim/bim/module/project/prop.py index aa05d759f6..1b7e4740b9 100644 --- a/src/blenderbim/blenderbim/bim/module/project/prop.py +++ b/src/blenderbim/blenderbim/bim/module/project/prop.py @@ -130,6 +130,7 @@ class BIMProjectProperties(PropertyGroup): name="Filter Mode", update=update_filter_mode, ) + total_elements: IntProperty(name="Total Elements", default=0) filter_categories: CollectionProperty(name="Filter Categories", type=FilterCategory) active_filter_category_index: IntProperty(name="Active Filter Category Index") filter_query: StringProperty(name="Filter Query") @@ -144,6 +145,8 @@ class BIMProjectProperties(PropertyGroup): angular_tolerance: FloatProperty(name="Angular Tolerance", default=0.5) distance_limit: FloatProperty(name="Distance Limit", default=1000) false_origin: StringProperty(name="False Origin", default="0,0,0") + element_offset: IntProperty(name="Element Offset", default=0) + element_limit: IntProperty(name="Element Offset", default=30000) links: CollectionProperty(name="Links", type=Link) active_link_index: IntProperty(name="Active Link Index") export_schema: EnumProperty(items=get_export_schema, name="IFC Schema") diff --git a/src/blenderbim/blenderbim/bim/module/project/ui.py b/src/blenderbim/blenderbim/bim/module/project/ui.py index e26daac146..e6017bcd6b 100644 --- a/src/blenderbim/blenderbim/bim/module/project/ui.py +++ b/src/blenderbim/blenderbim/bim/module/project/ui.py @@ -54,7 +54,7 @@ class BIM_PT_project(Panel): row.prop(pprops, "filter_mode") if pprops.filter_mode in ["DECOMPOSITION", "IFC_CLASS", "IFC_TYPE"]: row = self.layout.row(align=True) - row.alignment = "RIGHT" + row.label(text=f"Total: {pprops.total_elements}") row.operator("bim.toggle_filter_categories", text="", icon="CHECKBOX_HLT").should_select = True row.operator("bim.toggle_filter_categories", text="", icon="CHECKBOX_DEHLT").should_select = False self.layout.template_list( @@ -91,6 +91,12 @@ class BIM_PT_project(Panel): row = self.layout.row() row.prop(pprops, "false_origin") + row = self.layout.row() + row.label(text="Element Range") + row = self.layout.row(align=True) + row.prop(pprops, "element_offset", text="") + row.prop(pprops, "element_limit", text="") + row = self.layout.row(align=True) row.operator("bim.load_project_elements") row.operator("bim.unload_project", text="", icon="CANCEL")