diff --git a/paths.scad b/paths.scad index 74f999e3..e178e74f 100644 --- a/paths.scad +++ b/paths.scad @@ -380,7 +380,7 @@ function path_normals(path, tangents, closed=false) = dim == 2 ? [tangents[i].y,-tangents[i].x] : let(v=cross(cross(pts[1]-pts[0], pts[2]-pts[0]),tangents[i])) assert(norm(v)>EPSILON, "3D path contains collinear points") - v + unit(v) ]; diff --git a/skin.scad b/skin.scad index cf75796f..446a938d 100644 --- a/skin.scad +++ b/skin.scad @@ -13,9 +13,9 @@ // Function&Module: skin() // Usage: As module: -// skin(profiles, slices, , , , , , , , ,,,,) ; +// skin(profiles, slices, , , , , , , , , ,,,,) ; // Usage: As function: -// vnf = skin(profiles, slices, , , , , , ); +// vnf = skin(profiles, slices, , , , , , , ); // Description: // Given a list of two or more path `profiles` in 3d space, produces faces to skin a surface between // the profiles. Optionally the first and last profiles can have endcaps, or the first and last profiles @@ -152,6 +152,7 @@ // orient = Vector to rotate top towards after spin (module only) // extent = use extent method for computing anchors. (module only) Default: false // cp = set centerpoint for anchor computation. (module only) Default: object centroid +// style = vnf_vertex_array style. Default: "min_edge" // Example: // skin([octagon(4), circle($fn=70,r=2)], z=[0,3], slices=10); // Example: Rotating the pentagon place the zero index at different locations, giving a twist @@ -376,10 +377,10 @@ // stroke(zrot(30, p=yscale(0.5, p=circle(d=120))),width=10,closed=true); // } // } -module skin(profiles, slices, refine=1, method="direct", sampling, caps, closed=false, z, convexity=10, +module skin(profiles, slices, refine=1, method="direct", sampling, caps, closed=false, z, style="min_edge", convexity=10, anchor="origin",cp,spin=0, orient=UP, extent=false) { - vnf = skin(profiles, slices, refine, method, sampling, caps, closed, z); + vnf = skin(profiles, slices, refine, method, sampling, caps, closed, z, style); attachable(anchor=anchor, spin=spin, orient=orient, vnf=vnf, extent=extent, cp=is_def(cp) ? cp : vnf_centroid(vnf)) { vnf_polyhedron(vnf,convexity=convexity); @@ -388,7 +389,7 @@ module skin(profiles, slices, refine=1, method="direct", sampling, caps, closed= } -function skin(profiles, slices, refine=1, method="direct", sampling, caps, closed=false, z) = +function skin(profiles, slices, refine=1, method="direct", sampling, caps, closed=false, z, style="min_edge") = assert(is_def(slices),"The slices argument must be specified.") assert(is_list(profiles) && len(profiles)>1, "Must provide at least two profiles") let( bad = [for(i=idx(profiles)) if (!(is_path(profiles[i]) && len(profiles[i])>2)) i]) @@ -483,61 +484,7 @@ function skin(profiles, slices, refine=1, method="direct", sampling, caps, close ) each subdivide_and_slice(pair,slices[i], nsamples, method=sampling)] ) - _skin_core(full_list, caps=fullcaps); - - - -function _skin_core(profiles, caps) = - let( - vertices = [for (prof=profiles) each prof], - plens = [for (prof=profiles) len(prof)], - sidefaces = [ - for(pidx=idx(profiles,e=-2)) - let( - prof1 = profiles[pidx%len(profiles)], - prof2 = profiles[(pidx+1)%len(profiles)], - voff = default(sum([for (i=[0:1:pidx-1]) plens[i]]),0), - faces = [ - for( - first = true, - finishing = false, - finished = false, - plen1 = len(prof1), - plen2 = len(prof2), - i=0, j=0, side=0; - - !finished; - - side = - let( - p1a = prof1[(i+0)%plen1], - p1b = prof1[(i+1)%plen1], - p2a = prof2[(j+0)%plen2], - p2b = prof2[(j+1)%plen2], - dist1 = norm(p1a-p2b), - dist2 = norm(p1b-p2a) - ) (i==j) ? (dist1>dist2? 1 : 0) : (i=plen1 && j>=plen2 - ) if (!first) face - ] - ) each faces - ], - firstcap = !caps[0] ? [] : let( - prof1 = profiles[0] - ) [[for (i=idx(prof1)) plens[0]-1-i]], - secondcap = !caps[1] ? [] : let( - prof2 = last(profiles), - eoff = sum(list_head(plens)) - ) [[for (i=idx(prof2)) eoff+i]] - ) [vertices, concat(sidefaces,firstcap,secondcap)]; + vnf_vertex_array(full_list, caps=fullcaps, col_wrap=true, style=style); @@ -903,9 +850,9 @@ function associate_vertices(polygons, split, curpoly=0) = // Function&Module: sweep() // Usage: As Module -// sweep(shape, transforms, , , , , , , ) ; +// sweep(shape, transforms, , ,