Source code for compas_rhino.conduits.faces


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

try:
    basestring
except NameError:
    basestring = str

from System.Drawing.Color import FromArgb
from Rhino.Geometry import Point3d

from compas.utilities import color_to_rgb
from compas_rhino.conduits.base import BaseConduit


__all__ = ['FacesConduit']


[docs]class FacesConduit(BaseConduit): """A Rhino display conduit for faces. Parameters ---------- vertices : list of list of float The coordinates of the vertices of the faces. faces : list of list of int The faces defined as lists of indices in ``vertices``. color : list of str or 3-tuple, optional The colors of the faces. Default is ``None``, in which case the default color is used for all faces. Attributes ---------- color : list of RGB colors The color specification per face. vertices : list of list of float The coordinates of the vertices of the faces. faces : list of list of int The faces defined as lists of indices in ``vertices``. Examples -------- .. code-block:: python from compas.geometry import Polyhedron from compas_rhino.conduits import FacesConduit polyhedron = Polyhedron.generate(6) faces = polyhedron.faces vertices = polyhedron.vertices polygons = [[vertices[index] for index in face] for face in faces] conduit = FacesConduit(polygons) with conduit.enabled(): conduit.redraw(pause=5.0) """ def __init__(self, vertices, faces, color=None, **kwargs): super(FacesConduit, self).__init__(**kwargs) self._default_color = FromArgb(255, 255, 255) self._color = None self.vertices = vertices or [] self.faces = faces or [] self.color = color @property def color(self): return self._color @color.setter def color(self, color): if not color: return f = len(self.faces) if isinstance(color, (basestring, tuple)): color = [color for _ in range(f)] color = [FromArgb(* color_to_rgb(c)) for c in color] c = len(color) if c < f: color += [self._default_color for _ in range(f - c)] elif c > f: color[:] = color[:f] self._color = color def DrawForeground(self, e): for i, face in enumerate(self.faces): points = [Point3d(* self.vertices[key]) for key in face] if self.color: e.Display.DrawPolygon(points, self.color[i], True) else: e.Display.DrawPolygon(points, self._default_color, True)
# ============================================================================== # Main # ============================================================================== if __name__ == "__main__": pass