Skip to content

Commit f26cfc9

Browse files
committed
Now generate spaces from walls considers also columns in order to create the contours
1 parent 4bbb6cd commit f26cfc9

1 file changed

Lines changed: 27 additions & 2 deletions

File tree

  • src/blenderbim/blenderbim/bim/module/model

src/blenderbim/blenderbim/bim/module/model/space.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import blenderbim.core.type
2727
from math import pi
2828
from mathutils import Vector, Matrix
29-
from shapely import Polygon
29+
from shapely import Polygon, MultiPolygon
3030

3131

3232
class GenerateSpace(bpy.types.Operator, tool.Ifc.Operator):
@@ -231,6 +231,8 @@ def _execute(self, context):
231231

232232
union = shapely.ops.unary_union(polys).buffer(converted_tolerance, cap_style=2, join_style=2)
233233

234+
union = self.get_purged_inner_holes_poly(union_geom = union, min_area = self.get_converted_tolerance(tolerance = 3))
235+
234236
for i, linear_ring in enumerate(union.interiors):
235237
poly = Polygon(linear_ring)
236238
poly = poly.buffer(converted_tolerance, single_sided=True, cap_style=2, join_style=2)
@@ -261,7 +263,7 @@ def get_boundary_elements(self, selected_objects):
261263
boundary_elements = []
262264
for obj in selected_objects:
263265
subelement = tool.Ifc.get_entity(obj)
264-
if subelement.is_a("IfcWall"):
266+
if subelement.is_a("IfcWall") or subelement.is_a("IfcColumn"):
265267
boundary_elements.append(subelement)
266268
return boundary_elements
267269

@@ -304,6 +306,29 @@ def get_converted_tolerance(self, tolerance):
304306
)
305307
return tolerance
306308

309+
def get_purged_inner_holes_poly(self, union_geom, min_area):
310+
interiors_list = []
311+
312+
if union_geom.geom_type == "MultiPolygon":
313+
for poly in union_geom.geoms:
314+
interiors_list = self.get_poly_valid_interior_list(poly = poly, min_area = min_area, interiors_list = interiors_list)
315+
316+
new_poly = Polygon(poly.exterior.coords, holes = interiors_list)
317+
318+
if union_geom.geom_type == "Polygon":
319+
interiors_list = self.get_poly_valid_interior_list(poly = union_geom, min_area = min_area, interiors_list = interiors_list)
320+
new_poly = Polygon(union_geom.exterior.coords, holes = interiors_list)
321+
322+
return new_poly
323+
324+
def get_poly_valid_interior_list(self, poly, min_area, interiors_list):
325+
for interior in poly.interiors:
326+
p = Polygon(interior)
327+
if p.area >= min_area:
328+
interiors_list.append(interior)
329+
return interiors_list
330+
331+
307332
def get_bmesh_from_polygon(self, poly, mat, h):
308333
bm = bmesh.new()
309334
bm.verts.index_update()

0 commit comments

Comments
 (0)