#2224 You can now specify element offset / limit ranges when loading models

This commit is contained in:
Dion Moult
2022-06-08 11:53:58 +10:00
parent d0f38bc919
commit a1ed78e755
4 changed files with 24 additions and 9 deletions
+13 -8
View File
@@ -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
@@ -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"}
@@ -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")
@@ -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")