Loading IFCs now prioritise 2D bodies over 3D non-bodies. This helps prevent loading and seeing a bunch of Box / Clearance representations.

This commit is contained in:
Dion Moult
2023-08-24 13:24:08 +10:00
parent f8b3b3a54f
commit c190ae5aea
+26 -25
View File
@@ -227,16 +227,16 @@ class IfcImporter:
self.settings.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance) self.settings.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance)
self.settings.set_angular_tolerance(self.ifc_import_settings.angular_tolerance) self.settings.set_angular_tolerance(self.ifc_import_settings.angular_tolerance)
self.settings.set(self.settings.STRICT_TOLERANCE, True) self.settings.set(self.settings.STRICT_TOLERANCE, True)
self.settings_curve = ifcopenshell.geom.settings() self.settings_body_2d = ifcopenshell.geom.settings()
self.settings_curve.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance) self.settings_body_2d.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance)
self.settings_curve.set_angular_tolerance(self.ifc_import_settings.angular_tolerance) self.settings_body_2d.set_angular_tolerance(self.ifc_import_settings.angular_tolerance)
self.settings_curve.set(self.settings_curve.STRICT_TOLERANCE, True) self.settings_body_2d.set(self.settings_body_2d.STRICT_TOLERANCE, True)
self.settings_curve.set(self.settings_curve.INCLUDE_CURVES, True) self.settings_body_2d.set(self.settings_body_2d.INCLUDE_CURVES, True)
self.settings_native = ifcopenshell.geom.settings() self.settings_native = ifcopenshell.geom.settings()
self.settings_native.set(self.settings_native.INCLUDE_CURVES, True) self.settings_native.set(self.settings_native.INCLUDE_CURVES, True)
self.settings_2d = ifcopenshell.geom.settings() self.settings_plan_2d = ifcopenshell.geom.settings()
self.settings_2d.set(self.settings_2d.INCLUDE_CURVES, True) self.settings_plan_2d.set(self.settings_plan_2d.INCLUDE_CURVES, True)
self.settings_2d.set(self.settings_2d.STRICT_TOLERANCE, True) self.settings_plan_2d.set(self.settings_plan_2d.STRICT_TOLERANCE, True)
self.project = None self.project = None
self.has_existing_project = False self.has_existing_project = False
self.collections = {} self.collections = {}
@@ -348,13 +348,14 @@ class IfcImporter:
if c.ContextIdentifier in ["Body", "Facetation"] if c.ContextIdentifier in ["Body", "Facetation"]
] ]
# Ideally, all representations should be in a subcontext, but some BIM programs don't do this correctly # Ideally, all representations should be in a subcontext, but some BIM programs don't do this correctly
self.body_contexts.extend( if not self.body_contexts:
[ self.body_contexts.extend(
c.id() [
for c in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False) c.id()
if c.ContextType == "Model" for c in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False)
] if c.ContextType == "Model"
) ]
)
if self.body_contexts: if self.body_contexts:
self.settings.set_context_ids(self.body_contexts) self.settings.set_context_ids(self.body_contexts)
# Annotation ContextType is to accommodate broken Revit files # Annotation ContextType is to accommodate broken Revit files
@@ -365,7 +366,7 @@ class IfcImporter:
if c.ContextType in ["Plan", "Annotation"] or c.ContextIdentifier == "Annotation" if c.ContextType in ["Plan", "Annotation"] or c.ContextIdentifier == "Annotation"
] ]
if self.plan_contexts: if self.plan_contexts:
self.settings_2d.set_context_ids(self.plan_contexts) self.settings_plan_2d.set_context_ids(self.plan_contexts)
def process_element_filter(self): def process_element_filter(self):
offset = self.ifc_import_settings.element_offset offset = self.ifc_import_settings.element_offset
@@ -645,7 +646,7 @@ class IfcImporter:
self.ifc_import_settings.logger.error("An invalid grid was found %s", grid) self.ifc_import_settings.logger.error("An invalid grid was found %s", grid)
continue continue
if grid.Representation: if grid.Representation:
shape = ifcopenshell.geom.create_shape(self.settings_2d, grid) shape = ifcopenshell.geom.create_shape(self.settings_plan_2d, grid)
grid_obj = self.create_product(grid, shape) grid_obj = self.create_product(grid, shape)
if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import: if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import:
grid_obj.lock_location = (True, True, True) grid_obj.lock_location = (True, True, True)
@@ -664,7 +665,7 @@ class IfcImporter:
def create_grid_axes(self, axes, grid_collection, grid_obj): def create_grid_axes(self, axes, grid_collection, grid_obj):
for axis in axes: for axis in axes:
shape = ifcopenshell.geom.create_shape(self.settings_2d, axis.AxisCurve) shape = ifcopenshell.geom.create_shape(self.settings_plan_2d, axis.AxisCurve)
mesh = self.create_mesh(axis, shape) mesh = self.create_mesh(axis, shape)
obj = bpy.data.objects.new(f"IfcGridAxis/{axis.AxisTag}", mesh) obj = bpy.data.objects.new(f"IfcGridAxis/{axis.AxisTag}", mesh)
if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import: if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import:
@@ -698,7 +699,7 @@ class IfcImporter:
shape = ifcopenshell.geom.create_shape(self.settings, representation) shape = ifcopenshell.geom.create_shape(self.settings, representation)
except: except:
try: try:
shape = ifcopenshell.geom.create_shape(self.settings_2d, representation) shape = ifcopenshell.geom.create_shape(self.settings_plan_2d, representation)
except: except:
self.ifc_import_settings.logger.error("Failed to generate shape for %s", element) self.ifc_import_settings.logger.error("Failed to generate shape for %s", element)
if shape: if shape:
@@ -764,9 +765,9 @@ class IfcImporter:
if self.ifc_import_settings.should_load_geometry: if self.ifc_import_settings.should_load_geometry:
products = self.create_products(elements) products = self.create_products(elements)
elements -= products elements -= products
products = self.create_products(elements, settings=self.settings_curve) products = self.create_products(elements, settings=self.settings_body_2d)
elements -= products elements -= products
products = self.create_products(elements, settings=self.settings_2d) products = self.create_products(elements, settings=self.settings_plan_2d)
elements -= products elements -= products
products = self.create_pointclouds(elements) products = self.create_pointclouds(elements)
elements -= products elements -= products
@@ -901,10 +902,10 @@ class IfcImporter:
self.structural_collection.children.link(self.structural_connection_collection) self.structural_collection.children.link(self.structural_connection_collection)
self.project["blender"].children.link(self.structural_collection) self.project["blender"].children.link(self.structural_collection)
self.create_products(self.file.by_type("IfcStructuralCurveMember"), settings=self.settings_2d) self.create_products(self.file.by_type("IfcStructuralCurveMember"), settings=self.settings_plan_2d)
self.create_products(self.file.by_type("IfcStructuralCurveConnection"), settings=self.settings_2d) self.create_products(self.file.by_type("IfcStructuralCurveConnection"), settings=self.settings_plan_2d)
self.create_products(self.file.by_type("IfcStructuralSurfaceMember"), settings=self.settings_2d) self.create_products(self.file.by_type("IfcStructuralSurfaceMember"), settings=self.settings_plan_2d)
self.create_products(self.file.by_type("IfcStructuralSurfaceConnection"), settings=self.settings_2d) self.create_products(self.file.by_type("IfcStructuralSurfaceConnection"), settings=self.settings_plan_2d)
self.create_structural_point_connections() self.create_structural_point_connections()
def create_structural_point_connections(self): def create_structural_point_connections(self):