Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(shademesh): Trinagulate and remove degenerate from ShadeMesh #591

Merged
merged 1 commit into from
Nov 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions honeybee/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -1779,6 +1779,8 @@ 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)

def triangulate_non_planar_quads(self, tolerance=None):
"""Triangulate any non-planar orphaned geometry in the model.
Expand Down
27 changes: 26 additions & 1 deletion honeybee/shademesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from __future__ import division
import math

from ladybug_geometry.geometry3d.mesh import Mesh3D
from ladybug_geometry.geometry3d import Mesh3D, Face3D
from ladybug.color import Color

from ._base import _Base
Expand Down Expand Up @@ -218,6 +218,31 @@ def scale(self, factor, origin=None):
self._geometry = self.geometry.scale(factor, origin)
self.properties.scale(factor, origin)

def triangulate_and_remove_degenerate_faces(self, tolerance=0.01):
"""Triangulate all faces in the mesh and remove all degenerate faces from the result.

This is helpful for certain geometry interfaces that require perfectly
planar geometry without duplicate or colinear vertices.

Args:
tolerance: The minimum distance between a vertex and the boundary segments
at which point the vertex is considered colinear. Default: 0.01,
suitable for objects in meters.
"""
new_faces, verts = [], self.geometry.vertices
for shd in self.faces:
shades = (shd,) if len(shd) == 3 else \
((shd[0], shd[1], shd[2]), (shd[2], shd[3], shd[0]))
for shade in enumerate(shades):
shd_verts = [verts[v] for v in shade]
shade_face = Face3D(shd_verts)
try:
shade_face.remove_colinear_vertices(tolerance)
except AssertionError:
continue # degenerate face to remove
new_faces.append(shade)
self._geometry = Mesh3D(verts, new_faces)

def is_geo_equivalent(self, shade_mesh, tolerance=0.01):
"""Get a boolean for whether this object is geometrically equivalent to another.

Expand Down
Loading