From 0dbe7b9cc17e7ba409504ba24374b7678661dee6 Mon Sep 17 00:00:00 2001 From: Dion Moult Date: Fri, 7 Aug 2020 20:00:45 +1000 Subject: [PATCH] Add perimeter quantity calculation --- src/ifcblenderexport/blenderbim/bim/qto.py | 33 ++++++++++++++++++++++ src/ifcblenderexport/blenderbim/bim/ui.py | 3 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/ifcblenderexport/blenderbim/bim/qto.py b/src/ifcblenderexport/blenderbim/bim/qto.py index 77f27d7a2d..b41eb325ca 100644 --- a/src/ifcblenderexport/blenderbim/bim/qto.py +++ b/src/ifcblenderexport/blenderbim/bim/qto.py @@ -17,6 +17,8 @@ class QtoCalculator(): return self.get_width(obj) elif 'height' in prop_name or 'depth' in prop_name: return self.get_height(obj) + elif 'perimeter' in prop_name: + return self.get_perimeter(obj) elif 'area' in prop_name \ and ('footprint' in prop_name or 'section' in prop_name): return self.get_footprint_area(obj) @@ -59,6 +61,37 @@ class QtoCalculator(): def get_height(self, o): return (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length + def get_perimeter(self, o): + lowest_polygons = [] + lowest_z = None + for polygon in o.data.polygons: + z = round(polygon.center[2], 3) + if lowest_z is None: + lowest_z = z + if z > lowest_z: + continue + elif z == lowest_z: + lowest_polygons.append(polygon) + elif z < lowest_z: + lowest_polygons = [polygon] + lowest_z = z + parsed_edges = [] + shared_edges = [] + perimeter = 0 + for polygon in lowest_polygons: + for edge_key in polygon.edge_keys: + if edge_key in parsed_edges: + shared_edges.append(edge_key) + else: + parsed_edges.append(edge_key) + perimeter += self.get_edge_key_distance(o, edge_key) + for edge_key in shared_edges: + perimeter -= self.get_edge_key_distance(o, edge_key) + return perimeter + + def get_edge_key_distance(self, obj, edge_key): + return (obj.data.vertices[edge_key[1]].co - obj.data.vertices[edge_key[0]].co).length + def get_edge_distance(self, obj, edge): return (obj.data.vertices[edge.vertices[1]].co - obj.data.vertices[edge.vertices[0]].co).length diff --git a/src/ifcblenderexport/blenderbim/bim/ui.py b/src/ifcblenderexport/blenderbim/bim/ui.py index bf610a1308..a149f0e0fb 100644 --- a/src/ifcblenderexport/blenderbim/bim/ui.py +++ b/src/ifcblenderexport/blenderbim/bim/ui.py @@ -106,7 +106,8 @@ class BIM_PT_object(Panel): if 'length' in prop.name.lower() \ or 'width' in prop.name.lower() \ or 'height' in prop.name.lower() \ - or 'depth' in prop.name.lower(): + or 'depth' in prop.name.lower() \ + or 'perimeter' in prop.name.lower(): op = row.operator('bim.guess_quantity', icon='IPO_EASE_IN_OUT', text='') op.qto_index = index op.prop_index = index2