X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=wardrobe-hook.scad;h=331121cffc1772c73cefc8d38e703252bbb990eb;hp=e37e1dacb87125407e94454ca907446900adbb7d;hb=3a559f2503f11a583d9da3708f5d08b18a3c428b;hpb=98829f3f7c334d0bd11c1f7db6df149a1de67f15 diff --git a/wardrobe-hook.scad b/wardrobe-hook.scad index e37e1da..331121c 100644 --- a/wardrobe-hook.scad +++ b/wardrobe-hook.scad @@ -1,5 +1,7 @@ // -*- C -*- +include + module FArcSegment_mask(beta) { for (i=[0 : 0.75 : 3]) { rotate(i*beta/4) @@ -13,8 +15,8 @@ module FArcSegment(xc,yc,inrad,outrad,alpha,delta) { translate([xc,yc]) { intersection() { difference() { - circle(r=outrad); - circle(r=inrad); + circle(r=outrad, $fn=70); + circle(r=inrad, $fn=70); } rotate(alpha) scale(outrad*2) { FArcSegment_mask(delta); @@ -23,26 +25,111 @@ module FArcSegment(xc,yc,inrad,outrad,alpha,delta) { } } -tubeheight = 30; -tubewidth = 15; +tubeslop = 0.5; +tubeheight = 30 + tubeslop; +tubewidth = 15 + tubeslop; mainthick = 4; clipthick = 2; -clipang = 120; +clipang = 135; + +stemlen = 40; -bend = 5; +topwidth = 20; + +hookinrad = 7.5; +hookcurl = 60; +hookwidth = 4; tuberad = tubewidth/2; +bend = atan(tuberad/stemlen); mainoutrad = tuberad + mainthick; +hookoutrad = hookinrad + hookwidth; +hookcy = -(stemlen - hookoutrad); -module Plan(){ +eltop = [topwidth/2, -tuberad + tubeheight + mainthick + 0.1]; +elmid = [topwidth/2, -tuberad]; +ellow = tangent_intersect_b([0,hookcy], hookinrad, elmid); +ellowextra = 180 - tangent_intersect_beta([0,hookcy], hookinrad, elmid); + +module ClipPlan(qbend, qstemleny){ dy = tubeheight - tuberad*2; FArcSegment(0, dy, tuberad, mainoutrad, -1, 181); - FArcSegment(0, 0, tuberad, mainoutrad, -bend, bend+1); + FArcSegment(0, 0, tuberad, mainoutrad, -qbend, qbend+1); translate([tuberad, 0]) square(center=false, size=[mainthick,dy]); FArcSegment(0, 0, tuberad, tuberad + clipthick, 360-clipang, clipang+1); + rotate(-qbend) translate([tuberad, 0]) mirror([0,1]) + square(center=false, size=[mainthick, qstemleny/cos(qbend)]); } -Plan(); +module Plan(){ + ClipPlan(bend,stemlen); +} + +module ElevationCore(){ + FArcSegment(0, hookcy, hookinrad, hookoutrad, + 180 - ellowextra, + 90 + hookcurl + ellowextra); + translate([-hookoutrad*sqrt(0.5), + hookcy - hookoutrad*sqrt(0.5) + 0.1]) + mirror([1,0]) + square(center=false, size=[topwidth, stemlen + tubeheight + 20]); + polygon([[-hookoutrad, ellow[1]], + reflect_in_y(eltop), + eltop, + elmid, + ellow]); +} + +// after here is all 3D + +module Primary(){ + intersection(){ + translate([0,0, -(topwidth+10)/2]) + linear_extrude(height=topwidth+10) Plan(); + translate([50,0]) + rotate([0,-90,0]) + linear_extrude(height=100) + ElevationCore(); + } +} + +module PlaneAbove(){ + translate([-100,-100,0]) cube(center=false,size=[200,200,200]); +} + +taperangle = -270 + tangent_intersect_beta([-hookcy, 0], + hookoutrad, + [-eltop[1], -eltop[0]]); +module Hook(){ ////toplevel + difference(){ + rotate([taperangle,0,0]) + translate([0,-eltop[1],0]) + Primary(); + translate([0,0,topwidth/2]) + rotate([taperangle*2,0,0]) + PlaneAbove(); + translate([0,0,-topwidth/2]) + mirror([0,0,1]) PlaneAbove(0); + } +} + +// frontbackly version, everything prefixed with f or F + +fstemleny = -hookcy; +fbend = atan((tuberad - hookinrad) / fstemleny); + +module FPlan(){ + ClipPlan(fbend, fstemleny); +} + +// toplevels etc. + +module RightHook(){ ////toplevel + mirror([1,0,0]) Hook(); +} -//FArcSegment(0, 20, 20,30, 20,160); +FPlan(); +translate([60,0,0]) Plan(); +//ElevationCore(); +//RightHook();