From 1e81b28f5cd1158da6d5dbed10d7e7dbf9fbd4ca Mon Sep 17 00:00:00 2001 From: Adrian Mariano Date: Wed, 26 Mar 2025 18:32:31 -0400 Subject: [PATCH 1/2] fix rounded_prism "prismoid" anchor type --- rounding.scad | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/rounding.scad b/rounding.scad index f6730d9e..d69114f1 100644 --- a/rounding.scad +++ b/rounding.scad @@ -2283,7 +2283,17 @@ module rounded_prism(bottom, top, joint_bot=0, joint_top=0, joint_sides=0, k_bot unrounded = vnf_vertex_array([top,bottom],caps=true, col_wrap=true,reverse=true); vnf = result[1]; - geom = atype=="prismoid" ? attach_geom(size=[1,1,1],anchors=result[2], override=result[3]) + geom = atype=="prismoid" ? + let( + botbounds = pointlist_bounds(bottom), + topbounds = pointlist_bounds(top), + allz = column(concat(bottom,top),2), + height = max(allz)-min(allz), + size = [botbounds[1].x-botbounds[0].x, botbounds[1].x-botbounds[0].x, height], + size2 = [topbounds[1].x-topbounds[0].x, topbounds[1].x-topbounds[0].x], + shift = point2d(mean(topbounds)-mean(botbounds)) + ) + attach_geom(size=size, size2=size2, shift=shift,anchors=result[2], override=result[3]) : in_list(atype,["hull","intersect"]) ? attach_geom(vnf=unrounded, extent=atype=="hull", cp=cp, anchors=result[2]) : attach_geom(vnf=vnf, extent=atype=="surf_hull", cp=cp, anchors=result[2]); attachable(anchor=anchor, spin=spin, orient=orient, geom=geom) @@ -2458,6 +2468,7 @@ function rounded_prism(bottom, top, joint_bot=0, joint_top=0, joint_sides=0, k_b debug ? vnf_from_polygons(faces,fast=true) : vnf_triangulate(vnf_from_polygons(faces)) ]), + topnormal = unit(cross(top[0]-top[1],top[2]-top[1])), botnormal = -unit(cross(bottom[0]-bottom[1],bottom[2]-bottom[1])), sidenormal = [for(i=idx(top)) @@ -4119,7 +4130,19 @@ function _prism_fillet_prism(name, basepoly, bot, top, d, k, N, overlap, uniform // let(sweep=parent()) // move([24,-22,20]) sphere(d=10) // prism_connector(circle(r=2.2,$fn=32), sweep, CTR, parent(),CTR, fillet=2); - +// Example: The {{rounded_prism()}} module supplies anchors for its faces and edges that you can use with this module. It also has an `atype="prismoid"` anchor type, which provides a prismoid geometry object. This prismoid geometry is sometimes not accurate enough to find center anchors of rounded prism objects. It will work properly only if your object could be constructed (without rounding) by the {{prismoid()}} module. Here is an example where it works correctly. Note that the top and bottom are rectangular and parallel to the XY plane. +// ellipse = ellipse([2,1.5],$fn=64); +// cuboid([40,40,5]) let(cubeframe=parent()) +// align(TOP,LEFT) +// rounded_prism(top=rect([10,15]), bottom=rect([14,21]), height=13, +// joint_sides=3, joint_top=3, atype="prismoid",anchor=BOT) +// let(first=parent()) +// restore(cubeframe) +// align(TOP,RIGHT+BACK) +// rounded_prism(top=rect([10,15]), bottom=rect([14,21]), height=17, +// joint_sides=3, joint_top=3, atype="prismoid",anchor=BOT) +// let(second=parent()) +// prism_connector(ellipse, first, CTR, parent(), CTR, fillet=2); // Example: Connecting to edges. In this example the triangular prism is aligned with object1, the big cube, so its corner is at the edge. You can't align it with both edges at the same time; that would requires twisting the prism. // $fn=32; // tri = subdivide_path(round_corners([[-3,-2],[0,5],[3,-2]], cut=1), maxlen=1,closed=true); @@ -4223,7 +4246,6 @@ function _prism_fillet_prism(name, basepoly, bot, top, d, k, N, overlap, uniform // desc_copies(arc_copies(rx=85,ry=45,n=12)) // cyl(d=15,h=27,circum=true,rounding=5,$fn=64) // prism_connector(circle(r=3,$fn=32), parent(), CTR, $next(), CTR, fillet=4); - // Example(3D,Med): When using {{desc_copies()}} with a varying shape you have to conditionally show only the correct shape for each index, but still specify all the shapes so you can collect their descriptions. // circ = circle(r=3, $fn=64); // desc_copies(arc_copies(rx=60,ry=80,n=5,sa=-20,ea=200)) From d122fc12c4ba211a3d8dac7b2f861f1ca2deb4bf Mon Sep 17 00:00:00 2001 From: Adrian Mariano Date: Wed, 26 Mar 2025 19:16:24 -0400 Subject: [PATCH 2/2] example fix for stable version --- rounding.scad | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rounding.scad b/rounding.scad index d69114f1..0ed73dd3 100644 --- a/rounding.scad +++ b/rounding.scad @@ -4243,9 +4243,9 @@ function _prism_fillet_prism(name, basepoly, bot, top, d, k, N, overlap, uniform // spheroid(11,circum=true) let(next=$next,prev=$prev) // prism_connector(circ, prev(),BACK+LEFT, next(), FWD+LEFT, fillet=5, debug_pos=false); // Example(3D,Med): Using CENTER anchors can make a construction like this much easier. In this example the anchors need to shift around from the pointy end to the flat end of the ellipse, which would be annoying to calculate by hand. -// desc_copies(arc_copies(rx=85,ry=45,n=12)) -// cyl(d=15,h=27,circum=true,rounding=5,$fn=64) -// prism_connector(circle(r=3,$fn=32), parent(), CTR, $next(), CTR, fillet=4); +// desc_copies(arc_copies(rx=85,ry=45,n=12)) let(next=$next) +// cyl(d=15,h=27,circum=true,rounding=5,$fn=64) +// prism_connector(circle(r=3,$fn=32), parent(), CTR, next(), CTR, fillet=4); // Example(3D,Med): When using {{desc_copies()}} with a varying shape you have to conditionally show only the correct shape for each index, but still specify all the shapes so you can collect their descriptions. // circ = circle(r=3, $fn=64); // desc_copies(arc_copies(rx=60,ry=80,n=5,sa=-20,ea=200))