From 5a822d5e3949de77b043c6d3a174a19d8308fa4f Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Mon, 7 Jun 2021 11:20:05 +1000 Subject: [PATCH] Slabs with voided profiles are now supported. --- .../blenderbim/bim/module/geometry/operator.py | 2 ++ src/blenderbim/blenderbim/bim/module/model/slab.py | 10 +++++++--- src/blenderbim/blenderbim/bim/module/model/wall.py | 6 +++++- src/blenderbim/blenderbim/bim/module/root/operator.py | 5 ++++- .../ifcopenshell/api/geometry/add_representation.py | 2 ++ 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/geometry/operator.py b/src/blenderbim/blenderbim/bim/module/geometry/operator.py index b5ba6c15b1..d4dcef13fe 100644 --- a/src/blenderbim/blenderbim/bim/module/geometry/operator.py +++ b/src/blenderbim/blenderbim/bim/module/geometry/operator.py @@ -57,6 +57,7 @@ class AddRepresentation(bpy.types.Operator): bl_label = "Add Representation" obj: bpy.props.StringProperty() context_id: bpy.props.IntProperty() + ifc_representation_class: bpy.props.StringProperty() def execute(self, context): obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object @@ -91,6 +92,7 @@ class AddRepresentation(bpy.types.Operator): "total_items": max(1, len(obj.material_slots)), "should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep, "should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation, + "ifc_representation_class": self.ifc_representation_class, } result = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data) diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py index 4cd6dbdc45..70c26e03bc 100644 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ b/src/blenderbim/blenderbim/bim/module/model/slab.py @@ -58,8 +58,7 @@ def ensure_solid(usecase_path, ifc_file, settings): parametric = ifcopenshell.util.element.get_psets(product).get("EPset_Parametric") if not parametric or parametric["Engine"] != "BlenderBIM.DumbSlab": return - # TODO: check if voids are present - settings["ifc_representation_class"] = "IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef" + settings["ifc_representation_class"] = "IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids" class DumbSlabGenerator: @@ -116,7 +115,12 @@ class DumbSlabGenerator: else: obj.location[2] -= self.depth self.collection.objects.link(obj) - bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcSlab", predefined_type="FLOOR") + bpy.ops.bim.assign_class( + obj=obj.name, + ifc_class="IfcSlab", + predefined_type="FLOOR", + ifc_representation_class="IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids", + ) bpy.ops.bim.assign_type(relating_type=self.relating_type.id(), related_object=obj.name) element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index 31bccafb25..019332d2dc 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -701,7 +701,11 @@ class DumbWallGenerator: if self.collection_obj and self.collection_obj.BIMObjectProperties.ifc_definition_id: obj.location[2] = self.collection_obj.location[2] self.collection.objects.link(obj) - bpy.ops.bim.assign_class(obj=obj.name, ifc_class="IfcWall") + bpy.ops.bim.assign_class( + obj=obj.name, + ifc_class="IfcWall", + ifc_representation_class="IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef", + ) bpy.ops.bim.assign_type(relating_type=self.relating_type.id(), related_object=obj.name) element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id) pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric") diff --git a/src/blenderbim/blenderbim/bim/module/root/operator.py b/src/blenderbim/blenderbim/bim/module/root/operator.py index 2d95abb798..6b3fa26db8 100644 --- a/src/blenderbim/blenderbim/bim/module/root/operator.py +++ b/src/blenderbim/blenderbim/bim/module/root/operator.py @@ -83,6 +83,7 @@ class AssignClass(bpy.types.Operator): predefined_type: bpy.props.StringProperty() userdefined_type: bpy.props.StringProperty() context_id: bpy.props.IntProperty() + ifc_representation_class: bpy.props.StringProperty() def execute(self, context): objects = [bpy.data.objects.get(self.obj)] if self.obj else bpy.context.selected_objects @@ -111,7 +112,9 @@ class AssignClass(bpy.types.Operator): obj.name = "{}/{}".format(product.is_a(), obj.name) IfcStore.link_element(product, obj) - bpy.ops.bim.add_representation(obj=obj.name, context_id=self.context_id) + bpy.ops.bim.add_representation( + obj=obj.name, context_id=self.context_id, ifc_representation_class=self.ifc_representation_class + ) if product.is_a("IfcElementType"): self.place_in_types_collection(obj) diff --git a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py index c5986af4aa..99cb892e39 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py +++ b/src/ifcopenshell-python/ifcopenshell/api/geometry/add_representation.py @@ -391,6 +391,8 @@ class Usecase: def create_arbitrary_void_extrusion_representation(self): helper = Helper(self.file) indices = helper.auto_detect_arbitrary_profile_with_voids_extruded_area_solid(self.settings["geometry"]) + if not indices["inner_curves"]: + return self.create_arbitrary_extrusion_representation() profile_def = helper.create_arbitrary_profile_def_with_voids( self.settings["geometry"], indices["profile"], indices["inner_curves"] )