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)
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)
from __future__ import absolute_import