From 8fa944d2a864d2f5f8abd1a5bdfbef36b6f0ca7b Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Thu, 20 Oct 2022 19:56:15 +1100 Subject: [PATCH] You can now have sloped slabs, good for doing roof slabs. --- .../blenderbim/bim/module/model/slab.py | 42 ++++++++++++++----- .../blenderbim/bim/module/model/wall.py | 10 +++++ .../blenderbim/bim/module/model/workspace.py | 8 ++++ 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/slab.py b/src/blenderbim/blenderbim/bim/module/model/slab.py index e9a423a51c..e43a2d11f6 100644 --- a/src/blenderbim/blenderbim/bim/module/model/slab.py +++ b/src/blenderbim/blenderbim/bim/module/model/slab.py @@ -143,6 +143,7 @@ class DumbSlabGenerator: tool.Ifc.get(), "Plan", "FootPrint", "SKETCH_VIEW" ) + props = bpy.context.scene.BIMModelProperties self.collection = bpy.context.view_layer.active_layer_collection.collection self.collection_obj = bpy.data.objects.get(self.collection.name) self.depth = sum(thicknesses) * unit_scale @@ -150,6 +151,7 @@ class DumbSlabGenerator: self.length = 3 self.rotation = 0 self.location = Vector((0, 0, 0)) + self.x_angle = 0 if tool.Cad.is_x(props.x_angle, 0, tolerance=0.001) else radians(props.x_angle) return self.derive_from_cursor(link_to_scene=link_to_scene) def derive_from_cursor(self, link_to_scene): @@ -188,7 +190,11 @@ class DumbSlabGenerator: blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj) representation = ifcopenshell.api.run( - "geometry.add_slab_representation", tool.Ifc.get(), context=self.body_context, depth=self.depth + "geometry.add_slab_representation", + tool.Ifc.get(), + context=self.body_context, + depth=self.depth, + x_angle=self.x_angle, ) ifcopenshell.api.run( "geometry.assign_representation", tool.Ifc.get(), product=element, representation=representation @@ -280,24 +286,38 @@ class DumbSlabPlaner: if extrusion: extrusion.Depth = thickness else: + props = bpy.context.scene.BIMModelProperties + x_angle = 0 if tool.Cad.is_x(props.x_angle, 0, tolerance=0.001) else radians(props.x_angle) new_rep = ifcopenshell.api.run( - "geometry.add_slab_representation", tool.Ifc.get(), context=body_context, depth=thickness + "geometry.add_slab_representation", + tool.Ifc.get(), + context=body_context, + depth=thickness, + x_angle=x_angle, ) for inverse in tool.Ifc.get().get_inverse(representation): ifcopenshell.util.element.replace_attribute(inverse, representation, new_rep) blenderbim.core.geometry.switch_representation( - tool.Geometry, - obj=obj, - representation=new_rep, - should_reload=True, - is_global=True, - should_sync_changes_first=False, - ) - blenderbim.core.geometry.remove_representation(tool.Ifc, tool.Geometry, obj=obj, representation=representation) + tool.Geometry, + obj=obj, + representation=new_rep, + should_reload=True, + is_global=True, + should_sync_changes_first=False, + ) + blenderbim.core.geometry.remove_representation( + tool.Ifc, tool.Geometry, obj=obj, representation=representation + ) return else: + props = bpy.context.scene.BIMModelProperties + x_angle = 0 if tool.Cad.is_x(props.x_angle, 0, tolerance=0.001) else radians(props.x_angle) representation = ifcopenshell.api.run( - "geometry.add_slab_representation", tool.Ifc.get(), context=body_context, depth=thickness + "geometry.add_slab_representation", + tool.Ifc.get(), + context=body_context, + depth=thickness, + x_angle=x_angle, ) ifcopenshell.api.run( "geometry.assign_representation", tool.Ifc.get(), product=element, representation=representation diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index d7c71ad6a1..789f00cccb 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -254,6 +254,7 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator): def _execute(self, context): wall_objs = [] + other_objs = [] x_angle = radians(self.x_angle) for obj in context.selected_objects: element = tool.Ifc.get_entity(obj) @@ -268,6 +269,15 @@ class ChangeExtrusionXAngle(bpy.types.Operator, tool.Ifc.Operator): extrusion.ExtrudedDirection.DirectionRatios = (0.0, sin(x_angle), cos(x_angle)) if element.is_a("IfcWall"): wall_objs.append(obj) + else: + blenderbim.core.geometry.switch_representation( + tool.Geometry, + obj=obj, + representation=representation, + should_reload=True, + is_global=True, + should_sync_changes_first=False, + ) if wall_objs: DumbWallRecalculator().recalculate(wall_objs) return {"FINISHED"} diff --git a/src/blenderbim/blenderbim/bim/module/model/workspace.py b/src/blenderbim/blenderbim/bim/module/model/workspace.py index 9d89415253..f2a8b0d52f 100644 --- a/src/blenderbim/blenderbim/bim/module/model/workspace.py +++ b/src/blenderbim/blenderbim/bim/module/model/workspace.py @@ -107,6 +107,9 @@ class BimToolUI: row = cls.layout.row(align=True) row.prop(data=cls.props, property="length", text="Length") + row = cls.layout.row(align=True) + row.prop(data=cls.props, property="x_angle", text="X Angle") + elif cls.props.ifc_class == "IfcSlabType": row = cls.layout.row(align=True) row.prop(data=cls.props, property="x_angle", text="X Angle") elif cls.props.ifc_class in ("IfcColumnType", "IfcBeamType", "IfcMemberType"): @@ -180,6 +183,11 @@ class BimToolUI: row.label(text="", icon="EVENT_SHIFT") row.label(text="", icon="EVENT_E") row.operator("bim.hotkey", text="Edit Profile").hotkey = "S_E" + + row = cls.layout.row(align=True) + row.prop(data=cls.props, property="x_angle", text="X Angle") + op = row.operator("bim.change_extrusion_x_angle", icon="FILE_REFRESH", text="") + op.x_angle = cls.props.x_angle elif AuthoringData.data["active_class"] in ( "IfcColumn", "IfcColumnStandardCase",