Source code for compas_rhino.geometry.mesh


from __future__ import print_function
from __future__ import absolute_import
from __future__ import division

import Rhino

import compas_rhino
from compas.datastructures import Mesh

from ._geometry import BaseRhinoGeometry


__all__ = ['RhinoMesh']


[docs]class RhinoMesh(BaseRhinoGeometry): """Wrapper for Rhino mesh objects. Attributes ---------- vertices (read-only) : list of point The coordinates of the vertices of the mesh. faces (read-only) : list of list of int Faces defined as lists of references into the list of vertices. vertex_color : list The colors of the vertices. Setting this to ``None`` unsets the vertex colors. border (read-only) : list The GUIDs of the border curves. """ def __init__(self): super(RhinoMesh, self).__init__() @property def vertices(self): return [map(float, point) for point in compas_rhino.rs.MeshVertices(self.geometry)] @property def faces(self): return map(list, compas_rhino.rs.MeshFaceVertices(self.geometry)) @property def vertex_colors(self): return map(list, compas_rhino.rs.MeshVertexColors(self.guid)) @vertex_colors.setter def vertex_colors(self, colors): compas_rhino.rs.MeshVertexColors(self.guid, colors) @property def border(self): return compas_rhino.rs.DuplicateMeshBorder(self.guid)
[docs] @classmethod def from_selection(cls): """Construct a mesh wrapper by selecting an existing Rhino mesh object. Parameters ---------- None Returns ------- :class:`compas_rhino.geometry.RhinoMesh` The wrapped line. """ guid = compas_rhino.select_mesh() return cls.from_guid(guid)
[docs] @classmethod def from_geometry(cls, geometry): """Construct a mesh wrapper from an existing Rhino geometry object. Parameters ---------- geometry : :class:`Rhino.Geometry.Mesh` A Rhino mesh geometry. Returns ------- :class:`compas_rhino.geometry.RhinoMesh` The wrapped line. """ mesh = cls() mesh.geometry = geometry return mesh
[docs] def to_compas(self, cls=None): """Convert a Rhino mesh to a COMPAS mesh. Parameters ---------- cls : :class:`compas.datastructures.Mesh`, optional The mesh type. Returns ------- :class:`compas.datastructures.Mesh` The equivalent COMPAS mesh. """ cls = cls or Mesh faces = [] for face in self.faces: if face[0] == face[-1]: faces.append(face[:-1]) elif face[-2] == face[-1]: faces.append(face[:-1]) else: faces.append(face) mesh = cls.from_vertices_and_faces(self.vertices, faces) mesh.name = self.name return mesh
def closest_point(self, point, maxdist=0.0): """Compute the closest point on the mesh to a given point. Parameters ---------- point : point A point location. maxdist : float, optional The maximum distance between the closest point and the mesh. Default is ``0.0``. Returns ------- list The XYZ coordinates of the closest point. """ face, point = self.geometry.ClosestPoint(Rhino.Geometry.Point3d(*point), maxdist) return list(point) def closest_points(self, points, maxdist=None): """Compute the closest points on the mesh to a list of input points. Parameters ---------- points : list of point The input points. maxdist : float, optional The maximum distance between the closest point and the mesh. Default is ``0.0``. Returns ------- list of point The XYZ coordinates of the closest points. """ return [self.closest_point(point, maxdist) for point in points]
# ============================================================================== # Main # ============================================================================== if __name__ == '__main__': pass