def nurbs_to_mesh_ani(srf,trg_len_min,trg_len_max,vis): trg_len = trg_len_max u_div = 30 v_div = 30 u_domain = rs.SurfaceDomain(srf, 0) v_domain = rs.SurfaceDomain(srf, 1) u = (u_domain[1] - u_domain[0]) / (u_div - 1) v = (v_domain[1] - v_domain[0]) / (v_div - 1) gauss = [] for i in xrange(u_div): for j in xrange(v_div): data = rs.SurfaceCurvature (srf, (u_domain[0] + u * i, v_domain[0] + v * j)) gauss.append(abs(data[7])) pt = rs.EvaluateSurface(srf,u_domain[0] + u * i, v_domain[0] + v * j) #rs.AddTextDot(round(abs(data[7]),3),pt) gauss_max = max(gauss) gauss_min = min(gauss) print gauss_max print gauss_min crvs = rs.DuplicateEdgeCurves(srf) if len(crvs)>1: joint = rs.JoinCurves(crvs,True) if joint: if len(joint) > 2: print "hole" else: if rs.IsCurveClosed(crvs[0]): joint = [crvs[0]] print "closed"#e.g. if it is a disk else: print "Surface need to be split"#e.g. if it is a sphere return None #sort curves (this is cheating: the longer curve is not necessarily the outer boundary!) #todo: an inside outside comparison in uv space crvs_len = [rs.CurveLength(crv) for crv in joint] crvs = [x for (_,x) in sorted(zip(crvs_len,joint))] outer_crv = crvs[-1] inner_crvs = crvs[:-1] outer_bound_pts = get_boundary_points(outer_crv,trg_len) if inner_crvs: inner_bounds_pts = [get_boundary_points(crvs,trg_len) for crvs in inner_crvs] all_pts = copy.copy(outer_bound_pts) if inner_crvs: for pts in inner_bounds_pts: all_pts += pts outbound_keys = get_boundary_indecies(outer_bound_pts,all_pts) inbounds_keys = [] if inner_crvs: for inner_bound_pts in inner_bounds_pts: inbounds_keys.append(get_boundary_indecies(inner_bound_pts,all_pts)) rs.DeleteObjects(crvs) all_pts_uv = convert_to_uv_space(srf,all_pts) tris = delaunay(all_pts_uv,outbound_keys,inbounds_keys) mesh = Mesh() for i,pt in enumerate(all_pts): mesh.add_vertex(str(i),{'x' : pt[0], 'y' : pt[1], 'z' : pt[2]}) for tri in tris: mesh.add_face(tri) edge_lengths = [] for u, v in mesh.edges(): edge_lengths.append(mesh.edge_length(u, v)) target_start = max(edge_lengths)/22 rs.EnableRedraw(False) srf_id = rs.coerceguid(srf, True) brep = rs.coercebrep(srf_id, False) tolerance = rs.UnitAbsoluteTolerance() fixed = outbound_keys+[item for sublist in inbounds_keys for item in sublist] user_func = wrapper(brep,tolerance,fixed,vis) remesh_ani(srf,mesh,trg_len_min,trg_len_max,gauss_min,gauss_max, tol=0.1, divergence=0.008, kmax=400, target_start=target_start, kmax_approach=200, verbose=False, allow_boundary=False, ufunc=user_func) for k in xrange(1): mesh_smooth_on_local_plane(mesh,k=1,d=0.2,fixed=fixed) user_func(mesh,k) return draw_light(mesh,temp = False)
def nurbs_to_mesh(srf,trg_len,vis): crvs = rs.DuplicateEdgeCurves(srf) if len(crvs)>1: joint = rs.JoinCurves(crvs,True) if joint: if len(joint) > 2: print "hole" else: if rs.IsCurveClosed(crvs[0]): joint = [crvs[0]] print "closed"#e.g. if it is a disk else: print "Surface need to be split"#e.g. if it is a sphere return None #sort curves (this is cheating: the longer curve is not necessarily the outer boundary!) #todo: an inside outside comparison in uv space crvs_len = [rs.CurveLength(crv) for crv in joint] crvs = [x for (_,x) in sorted(zip(crvs_len,joint))] outer_crv = crvs[-1] inner_crvs = crvs[:-1] outer_bound_pts = get_boundary_points(outer_crv,trg_len) if inner_crvs: inner_bounds_pts = [get_boundary_points(crvs,trg_len) for crvs in inner_crvs] all_pts = copy.copy(outer_bound_pts) if inner_crvs: for pts in inner_bounds_pts: all_pts += pts outbound_keys = get_boundary_indecies(outer_bound_pts,all_pts) inbounds_keys = [] if inner_crvs: for inner_bound_pts in inner_bounds_pts: inbounds_keys.append(get_boundary_indecies(inner_bound_pts,all_pts)) rs.DeleteObjects(crvs) all_pts_uv = convert_to_uv_space(srf,all_pts) tris = delaunay(all_pts_uv,outbound_keys,inbounds_keys) mesh = Mesh() for i,pt in enumerate(all_pts): mesh.add_vertex(str(i),{'x' : pt[0], 'y' : pt[1], 'z' : pt[2]}) for tri in tris: mesh.add_face(tri) edge_lengths = [] for u, v in mesh.edges(): edge_lengths.append(mesh.edge_length(u, v)) target_start = max(edge_lengths)/2 rs.EnableRedraw(False) srf_id = rs.coerceguid(srf, True) brep = rs.coercebrep(srf_id, False) tolerance = rs.UnitAbsoluteTolerance() fixed = outbound_keys+[item for sublist in inbounds_keys for item in sublist] user_func = wrapper(brep,tolerance,fixed,vis) remesh(mesh,trg_len, tol=0.1, divergence=0.01, kmax=300, target_start=target_start, kmax_approach=150, verbose=False, allow_boundary=False, ufunc=user_func) for k in xrange(10): mesh_smooth_centroid(mesh,fixed=fixed,kmax=1) user_func(mesh,k) return draw_light(mesh,temp = False)
def relax_mesh_on_surface(): polylines = rs.ObjectsByLayer("re_02_polys") pts_objs = rs.ObjectsByLayer("re_03_points") vis = 5 kmax = 2000 dis = 0.3 dev_threshold = 0.003 angle_max = 30 pts = get_points_coordinates(pts_objs) mesh = Mesh() for i, pt in enumerate(pts): mesh.add_vertex(str(i), {'x': pt[0], 'y': pt[1], 'z': pt[2]}) polys = get_polyline_points(polylines) tris = get_faces_from_polylines(polys, pts) for tri in tris: mesh.add_face(tri) rs.EnableRedraw(False) pts = [] for key, a in mesh.vertices_iter(True): pt1 = (a['x'], a['y'], a['z']) pts.append(pt1) vec = mesh.vertex_normal(key) vec = scale(normalize(vec), dis) pt2 = add_vectors(pt1, vec) pt2 = add_vectors(pt1, vec) a['x2'] = pt2[0] a['y2'] = pt2[1] a['z2'] = pt2[2] a['normal'] = vec #rs.AddLine(pt1,pt2) faces_1 = draw(mesh, dev_threshold) rs.HideObjects(faces_1) for k in range(kmax): nodes_top_dict = {key: [] for key in mesh.vertices()} polys = [] max_distances = [] for u, v in mesh.edges(): pt1 = mesh.vertex_coordinates(u) pt2 = mesh.vertex_coordinates(v) pt3 = mesh.vertex[u]['x2'], mesh.vertex[u]['y2'], mesh.vertex[u][ 'z2'] pt4 = mesh.vertex[v]['x2'], mesh.vertex[v]['y2'], mesh.vertex[v][ 'z2'] points = [pt1, pt2, pt3, pt4] points = rs.coerce3dpointlist(points, True) rc, plane = Rhino.Geometry.Plane.FitPlaneToPoints(points) pt3, pt4 = [plane.ClosestPoint(pt) for pt in points[2:]] vec = scale(normalize(subtract_vectors(pt3, pt1)), dis) pt3 = add_vectors(pt1, vec) vec = scale(normalize(subtract_vectors(pt4, pt2)), dis) pt4 = add_vectors(pt2, vec) nodes_top_dict[u].append(pt3) nodes_top_dict[v].append(pt4) distances = [ distance(pt1, pt2) for pt1, pt2 in zip(points[2:], [pt3, pt4]) ] max_distances.append(max(distances)) for key, a in mesh.vertices_iter(True): cent = centroid(nodes_top_dict[key]) pt = mesh.vertex_coordinates(key) vec = subtract_vectors(cent, pt) norm = a['normal'] if angle_smallest(vec, norm) < angle_max: a['x2'] = cent[0] a['y2'] = cent[1] a['z2'] = cent[2] if k % vis == 0: rs.Prompt( "Iteration {0} of {1} with with deviation sum {2}".format( k, kmax, round(sum(max_distances), 4))) draw_light(mesh, temp=True) if max(max_distances) < dev_threshold or k == kmax: print "Iteration {0} of {1} with deviation sum {2}".format( k, kmax, round(sum(max_distances), 4)) break dfaces_2 = draw(mesh, dev_threshold) rs.ShowObjects(faces_1) rs.EnableRedraw(True) print max(max_distances)