Add perimeter quantity calculation

This commit is contained in:
Dion Moult
2020-08-07 20:00:45 +10:00
parent 1d2677543d
commit 0dbe7b9cc1
2 changed files with 35 additions and 1 deletions
@@ -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
+2 -1
View File
@@ -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