Skip to content

Commit

Permalink
More robust footprint area calculation with support for IfcSpace floo…
Browse files Browse the repository at this point in the history
…r area
  • Loading branch information
Moult committed Aug 15, 2020
1 parent e9e0dba commit a1e5135
Showing 1 changed file with 19 additions and 18 deletions.
37 changes: 19 additions & 18 deletions src/ifcblenderexport/blenderbim/bim/qto.py
Expand Up @@ -20,7 +20,7 @@ def guess_quantity(self, prop_name, alternative_prop_names, 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):
and ('footprint' in prop_name or 'section' in prop_name or 'floor' in prop_name):
return self.get_footprint_area(obj)
elif 'area' in prop_name \
and 'side' in prop_name:
Expand Down Expand Up @@ -62,6 +62,21 @@ def get_height(self, o):
return (Vector(o.bound_box[1]) - Vector(o.bound_box[0])).length

def get_perimeter(self, o):
parsed_edges = []
shared_edges = []
perimeter = 0
for polygon in self.get_lowest_polygons(o):
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_lowest_polygons(self, o):
lowest_polygons = []
lowest_z = None
for polygon in o.data.polygons:
Expand All @@ -75,19 +90,7 @@ def get_perimeter(self, o):
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
return lowest_polygons

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
Expand All @@ -97,10 +100,8 @@ def get_edge_distance(self, obj, edge):

def get_footprint_area(self, o):
area = 0
for polygon in o.data.polygons:
if round(polygon.center[2], 3) == 0.0 \
and round(o.data.vertices[polygon.vertices[0]].co[2], 3) == 0.0:
area += polygon.area
for polygon in self.get_lowest_polygons(o):
area += polygon.area
return area

def get_side_area(self, o):
Expand Down

0 comments on commit a1e5135

Please sign in to comment.