Example #1
0
    def closest_point_on_boundaries(self, xyz):
        """Return the XYZ coordinates of the closest point on the boundaries of the surface from input XYZ-coordinates.
    
        Parameters
        ----------
        xyz : list
            XYZ coordinates.

        Returns
        -------
        list
            The XYZ coordinates of the closest point on the boundaries of the surface.

        """
        borders = self.borders(type=0)
        proj_dist = {tuple(proj_xyz): distance_point_point(xyz, proj_xyz) for proj_xyz in [RhinoCurve(border).closest_point(xyz) for border in borders]}
        delete_objects(borders)
        return min(proj_dist, key=proj_dist.get)
Example #2
0
 def draw(self,
          name=None,
          layer=None,
          clear=True,
          redraw=True,
          show_faces=True,
          show_vertices=True,
          show_edges=True,
          vertex_color=None,
          edge_color=None,
          face_color=None,
          show_faces_mesh=False):
     """"""
     # set default options
     if not isinstance(vertex_color, dict):
         vertex_color = {}
     if not isinstance(edge_color, dict):
         edge_color = {}
     if not isinstance(face_color, dict):
         face_color = {}
     self.name = name or self.name
     self.layer = layer or self.layer
     # delete all relevant objects by name
     objects = rhino.get_objects(name='{0}.mesh'.format(self.name))
     objects += rhino.get_objects(name='{0}.vertex.*'.format(self.name))
     objects += rhino.get_objects(name='{0}.edge.*'.format(self.name))
     rhino.delete_objects(objects)
     # draw the requested components
     if show_faces:
         faces = []
         color = self.color['face']
         polylines = []
         for fkey in self.face:
             face = self.face_coordinates(fkey, ordered=True)
             face_vertices = self.face_vertices(fkey, ordered=True)
             v = len(face)
             if v < 3:
                 print 'Degenerate face: {0} => {1}'.format(fkey, face)
                 continue
             else:
                 #indices = str(face_vertices).replace(',','-').replace('\'','').replace(' ','').replace('[','').replace(']','')
                 polylines.append({
                     'points':
                     face + [face[0]],
                     'name':
                     '{0}.face.{1}'.format(self.name, fkey),
                     'layer':
                     layer
                 })
         rhino.xdraw_polylines(
             polylines,
             layer=self.layer,
             clear=clear,
             redraw=(True if redraw and not (show_edges or show_vertices)
                     else False))
     if show_faces_mesh:
         key_index = dict(
             (key, index) for index, key in self.vertices_enum())
         xyz = [
             self.vertex_coordinates(key) for key in self.vertices_iter()
         ]
         faces = []
         color = self.color['face']
         for fkey in self.face:
             face = self.face_vertices(fkey, ordered=True)
             v = len(face)
             if v < 3:
                 print 'Degenerate face: {0} => {1}'.format(fkey, face)
                 continue
             if v == 3:
                 faces.append([key_index[k] for k in face + [face[-1]]])
             elif v == 4:
                 faces.append([key_index[k] for k in face])
             else:
                 c = len(xyz)
                 xyz.append(self.face_center(fkey))
                 for i in range(-1, len(face) - 1):
                     key = face[i]
                     nbr = face[i + 1]
                     vertices = [
                         c, key_index[key], key_index[nbr], key_index[nbr]
                     ]
                     faces.append(vertices)
         rhino.xdraw_mesh(
             xyz,
             faces,
             color,
             self.name,
             layer=self.layer,
             clear=clear,
             redraw=(True if redraw and not (show_edges or show_vertices)
                     else False))
     if show_edges:
         lines = []
         color = self.color['edge']
         for u, v in self.edges_iter():
             lines.append({
                 'start': self.vertex_coordinates(u),
                 'end': self.vertex_coordinates(v),
                 'name': '{0}.edge.{1}-{2}'.format(self.name, u, v),
                 'color': edge_color.get((u, v), color),
             })
         rhino.xdraw_lines(
             lines,
             layer=self.layer,
             clear=(True if clear and not show_faces else False),
             redraw=redraw
         )  #(True if redraw and not show_vertices else False))
     if show_vertices:
         points = []
         color = self.color['vertex']
         for key in self.vertices_iter():
             points.append({
                 'pos': self.vertex_coordinates(key),
                 'name': '{0}.vertex.{1}'.format(self.name, key),
                 'color': vertex_color.get(key, color),
             })
         rhino.xdraw_points(
             points,
             layer=self.layer,
             clear=(True
                    if clear and not (show_faces or show_edges) else False),
             redraw=redraw)
Example #3
0
from __future__ import absolute_import