Skip to content

Commit

Permalink
fix(model): Ensure completely degenerate meshes are removed
Browse files Browse the repository at this point in the history
  • Loading branch information
chriswmackey committed Oct 2, 2024
1 parent 3e417bc commit 86cf3e4
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 2 deletions.
11 changes: 9 additions & 2 deletions honeybee/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -1934,8 +1934,15 @@ def remove_degenerate_geometry(self, tolerance=None):
self._remove_degenerate_faces(self._orphaned_apertures, tolerance)
self._remove_degenerate_faces(self._orphaned_doors, tolerance)
self._remove_degenerate_faces(self._orphaned_shades, tolerance)
for sm in self._shade_meshes:
sm.triangulate_and_remove_degenerate_faces(tolerance)
sm_to_remove = []
for i, sm in enumerate(self._shade_meshes):
try:
sm.triangulate_and_remove_degenerate_faces(tolerance)
except AssertionError: # completely degenerate Shade Mesh
sm_to_remove.append(i)
if len(sm_to_remove) != 0:
for ri in reversed(sm_to_remove):
self._shade_meshes.pop(ri)

def triangulate_non_planar_quads(self, tolerance=None):
"""Triangulate any non-planar orphaned geometry in the model.
Expand Down
25 changes: 25 additions & 0 deletions tests/model_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,31 @@ def test_convert_to_units():
assert model.units == 'Meters'


def test_remove_degenerate_geometry():
"""Test the Model remove_degenerate_geometry method."""
first_floor = Room.from_box('First_Floor', 10, 10, 3, origin=Point3D(10, 10, 0))
second_floor = Room.from_box('Second_Floor', 10, 10, 3, origin=Point3D(10, 10, 3))
for face in first_floor[1:5]:
face.apertures_by_ratio(0.2, 0.01)
for face in second_floor[1:5]:
face.apertures_by_ratio(0.2, 0.01)
Room.solve_adjacency([first_floor, second_floor], 0.01)
pts1 = (Point3D(0, 0, 4), Point3D(0, 2, 4), Point3D(2, 2, 4),
Point3D(2, 0, 4), Point3D(4, 0, 4))
mesh1 = Mesh3D(pts1, [(0, 1, 2, 3), (2, 3, 4)])
shade1 = ShadeMesh('Awning_1', mesh1)
pts2 = (Point3D(0, 0, 4), Point3D(0.0001, 0, 4), Point3D(2, 2, 4))
mesh2 = Mesh3D(pts2, [(0, 1, 2)])
shade2 = ShadeMesh('Awning_2', mesh2)

model = Model('MultiZoneSingleFamilyHouse',
[first_floor, second_floor], shade_meshes=[shade1, shade2])

assert len(model.shade_meshes) == 2
model.remove_degenerate_geometry()
assert len(model.shade_meshes) == 1


def test_assign_stories_by_floor_height():
"""Test the Model assign_stories_by_floor_height method."""
first_floor = Room.from_box('First_Floor', 10, 10, 3, origin=Point3D(0, 0, 0))
Expand Down

0 comments on commit 86cf3e4

Please sign in to comment.