New feature to calculate side formwork, such as for columns.

This commit is contained in:
Dion Moult
2021-10-27 10:09:07 +11:00
parent 341451f59b
commit f64e1dbd7f
5 changed files with 45 additions and 8 deletions
@@ -62,7 +62,7 @@ def calculate_formwork_area(objs, context):
""" """
Formwork is defined as the surface area required to cover all exposed Formwork is defined as the surface area required to cover all exposed
surfaces of one or more objects, excluding top surfaces (i.e. that have a surfaces of one or more objects, excluding top surfaces (i.e. that have a
face normal with a significant Z component). face normal with a significant +Z component).
""" """
copied_objs = [] copied_objs = []
result = 0 result = 0
@@ -105,3 +105,19 @@ def calculate_formwork_area(objs, context):
continue continue
result += polygon.area result += polygon.area
return result return result
def calculate_side_formwork_area(objs, context):
"""
Side formwork is defined as the surface area required to cover all exposed
surfaces of one or more objects, excluding top and bottom surfaces (i.e.
that have a face normal with a significant Z component).
"""
result = 0
for obj in objs:
mesh = obj.evaluated_get(context.evaluated_depsgraph_get()).to_mesh()
for polygon in mesh.polygons:
if abs(polygon.normal.z) > 0.8:
continue
result += polygon.area
return result
@@ -105,6 +105,8 @@ class ExecuteQtoMethod(bpy.types.Operator):
result = helper.calculate_volumes(selected_mesh_objects, context) result = helper.calculate_volumes(selected_mesh_objects, context)
elif props.qto_methods == "FORMWORK": elif props.qto_methods == "FORMWORK":
result = helper.calculate_formwork_area(selected_mesh_objects, context) result = helper.calculate_formwork_area(selected_mesh_objects, context)
elif props.qto_methods == "SIDE_FORMWORK":
result = helper.calculate_side_formwork_area(selected_mesh_objects, context)
props.qto_result = str(round(result, 3)) props.qto_result = str(round(result, 3))
return {"FINISHED"} return {"FINISHED"}
@@ -134,6 +136,8 @@ class QuantifyObjects(bpy.types.Operator):
result = helper.calculate_volumes([obj], context) result = helper.calculate_volumes([obj], context)
elif props.qto_methods == "FORMWORK": elif props.qto_methods == "FORMWORK":
result = helper.calculate_formwork_area([obj], context) result = helper.calculate_formwork_area([obj], context)
elif props.qto_methods == "SIDE_FORMWORK":
result = helper.calculate_side_formwork_area([obj], context)
if not result: if not result:
continue continue
result = round(result, 3) result = round(result, 3)
@@ -37,7 +37,16 @@ class BIMQtoProperties(PropertyGroup):
items=[ items=[
("HEIGHT", "Height", "Calculate the Z height of an object"), ("HEIGHT", "Height", "Calculate the Z height of an object"),
("VOLUME", "Volume", "Calculate the volume of an object"), ("VOLUME", "Volume", "Calculate the volume of an object"),
("FORMWORK", "Formwork", "Calculate the exposed formwork for all bottoms and sides of one or more objects"), (
"FORMWORK",
"Formwork",
"Calculate the exposed formwork for all bottoms and sides (e.g. for beams and slabs) of one or more objects",
),
(
"SIDE_FORMWORK",
"Side Formwork",
"Calculate the exposed formwork for all sides only (e.g. for columns) of one or more objects",
),
], ],
name="Qto Methods", name="Qto Methods",
) )
+9 -1
View File
@@ -29,7 +29,7 @@ Scenario: Calculate object volumes
When I press "bim.calculate_object_volumes" When I press "bim.calculate_object_volumes"
Then "scene.BIMQtoProperties.qto_result" is "8.0" Then "scene.BIMQtoProperties.qto_result" is "8.0"
Scenario: Calculate formwork areas Scenario: Execute qto method - formwork areas
Given an empty Blender session Given an empty Blender session
And I add a cube And I add a cube
And I add a cube of size "1" at "1,0,0" And I add a cube of size "1" at "1,0,0"
@@ -38,3 +38,11 @@ Scenario: Calculate formwork areas
When I set "scene.BIMQtoProperties.qto_methods" to "FORMWORK" When I set "scene.BIMQtoProperties.qto_methods" to "FORMWORK"
And I press "bim.execute_qto_method" And I press "bim.execute_qto_method"
Then "scene.BIMQtoProperties.qto_result" is "21.5" Then "scene.BIMQtoProperties.qto_result" is "21.5"
Scenario: Execute qto method - side formwork areas
Given an empty Blender session
And I add a cube
And the object "Cube" is selected
When I set "scene.BIMQtoProperties.qto_methods" to "SIDE_FORMWORK"
And I press "bim.execute_qto_method"
Then "scene.BIMQtoProperties.qto_result" is "16.0"
+5 -5
View File
@@ -38,7 +38,7 @@ Scenario: Add an opening on an opening
Then the object "IfcOpeningElement/Cube.001" has no boolean difference by "IfcOpeningElement/Cube" Then the object "IfcOpeningElement/Cube.001" has no boolean difference by "IfcOpeningElement/Cube"
And the object "IfcOpeningElement/Cube.001" is not voided by "Cube" And the object "IfcOpeningElement/Cube.001" is not voided by "Cube"
Scenario: Add an opening on a null object Scenario: Add an opening on a null object
Given an empty IFC project Given an empty IFC project
And I add a cube And I add a cube
When the object "Cube" is selected When the object "Cube" is selected
@@ -89,11 +89,11 @@ Scenario: Add an opening to Element B with a void that already voids Element A
And I press "bim.assign_class" And I press "bim.assign_class"
And I press "bim.add_opening(opening='IfcOpeningElement/Cube', obj='IfcWall/Cube.001')" And I press "bim.add_opening(opening='IfcOpeningElement/Cube', obj='IfcWall/Cube.001')"
Then the object "IfcWall/Cube" is not voided Then the object "IfcWall/Cube" is not voided
And the object "IfcWall/Cube" has no boolean difference by "IfcOpeningElement/Cube" And the object "IfcWall/Cube" has no boolean difference by "IfcOpeningElement/Cube"
And the object "IfcWall/Cube.001" is voided by "Cube" And the object "IfcWall/Cube.001" is voided by "Cube"
And the object "IfcWall/Cube.001" has a boolean difference by "IfcOpeningElement/Cube" And the object "IfcWall/Cube.001" has a boolean difference by "IfcOpeningElement/Cube"
Scenario: Remove an opening Scenario: Remove an opening
Given an empty IFC project Given an empty IFC project
And I add a cube And I add a cube
When the object "Cube" is selected When the object "Cube" is selected
@@ -108,7 +108,7 @@ Scenario: Remove an opening
Then the object "IfcWall/Cube" has no boolean difference by "IfcOpeningElement/Cube" Then the object "IfcWall/Cube" has no boolean difference by "IfcOpeningElement/Cube"
And the object "IfcWall/Cube" is not voided by "Cube" And the object "IfcWall/Cube" is not voided by "Cube"
And the object "Cube" is not an IFC element And the object "Cube" is not an IFC element
Scenario: Remove a non dynamic opening manually Scenario: Remove a non dynamic opening manually
Given an empty IFC project Given an empty IFC project
And I add a cube And I add a cube