mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-22 02:21:02 +00:00
Slabs with voided profiles are now supported.
This commit is contained in:
@@ -57,6 +57,7 @@ class AddRepresentation(bpy.types.Operator):
|
|||||||
bl_label = "Add Representation"
|
bl_label = "Add Representation"
|
||||||
obj: bpy.props.StringProperty()
|
obj: bpy.props.StringProperty()
|
||||||
context_id: bpy.props.IntProperty()
|
context_id: bpy.props.IntProperty()
|
||||||
|
ifc_representation_class: bpy.props.StringProperty()
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
obj = bpy.data.objects.get(self.obj) if self.obj else bpy.context.active_object
|
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)),
|
"total_items": max(1, len(obj.material_slots)),
|
||||||
"should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep,
|
"should_force_faceted_brep": context.scene.BIMGeometryProperties.should_force_faceted_brep,
|
||||||
"should_force_triangulation": context.scene.BIMGeometryProperties.should_force_triangulation,
|
"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)
|
result = ifcopenshell.api.run("geometry.add_representation", self.file, **representation_data)
|
||||||
|
|||||||
@@ -58,8 +58,7 @@ def ensure_solid(usecase_path, ifc_file, settings):
|
|||||||
parametric = ifcopenshell.util.element.get_psets(product).get("EPset_Parametric")
|
parametric = ifcopenshell.util.element.get_psets(product).get("EPset_Parametric")
|
||||||
if not parametric or parametric["Engine"] != "BlenderBIM.DumbSlab":
|
if not parametric or parametric["Engine"] != "BlenderBIM.DumbSlab":
|
||||||
return
|
return
|
||||||
# TODO: check if voids are present
|
settings["ifc_representation_class"] = "IfcExtrudedAreaSolid/IfcArbitraryProfileDefWithVoids"
|
||||||
settings["ifc_representation_class"] = "IfcExtrudedAreaSolid/IfcArbitraryClosedProfileDef"
|
|
||||||
|
|
||||||
|
|
||||||
class DumbSlabGenerator:
|
class DumbSlabGenerator:
|
||||||
@@ -116,7 +115,12 @@ class DumbSlabGenerator:
|
|||||||
else:
|
else:
|
||||||
obj.location[2] -= self.depth
|
obj.location[2] -= self.depth
|
||||||
self.collection.objects.link(obj)
|
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)
|
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)
|
element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
|
||||||
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
|
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
|
||||||
|
|||||||
@@ -701,7 +701,11 @@ class DumbWallGenerator:
|
|||||||
if self.collection_obj and self.collection_obj.BIMObjectProperties.ifc_definition_id:
|
if self.collection_obj and self.collection_obj.BIMObjectProperties.ifc_definition_id:
|
||||||
obj.location[2] = self.collection_obj.location[2]
|
obj.location[2] = self.collection_obj.location[2]
|
||||||
self.collection.objects.link(obj)
|
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)
|
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)
|
element = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
|
||||||
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
|
pset = ifcopenshell.api.run("pset.add_pset", self.file, product=element, name="EPset_Parametric")
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ class AssignClass(bpy.types.Operator):
|
|||||||
predefined_type: bpy.props.StringProperty()
|
predefined_type: bpy.props.StringProperty()
|
||||||
userdefined_type: bpy.props.StringProperty()
|
userdefined_type: bpy.props.StringProperty()
|
||||||
context_id: bpy.props.IntProperty()
|
context_id: bpy.props.IntProperty()
|
||||||
|
ifc_representation_class: bpy.props.StringProperty()
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
objects = [bpy.data.objects.get(self.obj)] if self.obj else bpy.context.selected_objects
|
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)
|
obj.name = "{}/{}".format(product.is_a(), obj.name)
|
||||||
IfcStore.link_element(product, obj)
|
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"):
|
if product.is_a("IfcElementType"):
|
||||||
self.place_in_types_collection(obj)
|
self.place_in_types_collection(obj)
|
||||||
|
|||||||
@@ -391,6 +391,8 @@ class Usecase:
|
|||||||
def create_arbitrary_void_extrusion_representation(self):
|
def create_arbitrary_void_extrusion_representation(self):
|
||||||
helper = Helper(self.file)
|
helper = Helper(self.file)
|
||||||
indices = helper.auto_detect_arbitrary_profile_with_voids_extruded_area_solid(self.settings["geometry"])
|
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(
|
profile_def = helper.create_arbitrary_profile_def_with_voids(
|
||||||
self.settings["geometry"], indices["profile"], indices["inner_curves"]
|
self.settings["geometry"], indices["profile"], indices["inner_curves"]
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user