// -*- C -*- include module FArcSegment_mask(beta) { for (i=[0 : 0.75 : 3]) { rotate(i*beta/4) polygon([[0, 0], [1, 0], [cos(beta/4), sin(beta/4)]]); } } module FArcSegment(xc,yc,inrad,outrad,alpha,delta) { translate([xc,yc]) { intersection() { difference() { circle(r=outrad, $fn=70); circle(r=inrad, $fn=70); } rotate(alpha) scale(outrad*2) { FArcSegment_mask(delta); } } } } tubeslop = 0.5; tubeheight = 30 + tubeslop; tubewidth = 15 + tubeslop; mainthick = 4; clipthick = 2; clipang = 135; $stemlen = 40; topwidth = 20; hookinrad = 7.5; hookcurl = 60; hookwidth = 4; tuberad = tubewidth/2; mainoutrad = tuberad + mainthick; hookoutrad = hookinrad + hookwidth; $hookcy = -($stemlen - hookoutrad); $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); $bend = 0; module Howly(acrossly_x, frontbackly_x){ if (acrossly_x >= 0) { translate([acrossly_x,0,0]) assign($bend = atan(tuberad/$stemlen), $frontbackly = 0) child(); } if (frontbackly_x >= 0) { translate([frontbackly_x,0,0]) assign($bend = 0, $frontbackly = 1) child(); } } module Plan(){ dy = tubeheight - tuberad*2; FArcSegment(0, dy, tuberad, mainoutrad, -1, 181); FArcSegment(0, 0, tuberad, mainoutrad, -$bend, $bend+1); translate([tuberad, 0]) square(center=false, size=[mainthick,dy]); FArcSegment(0, 0, tuberad, tuberad + clipthick, 360-clipang, clipang+1); rotate(-$bend) translate([tuberad, 0]) mirror([0,1]) square(center=false, size=[mainthick, $stemlen/cos($bend)]); } 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); } } module RightHook(){ ////toplevel mirror([1,0,0]) Hook(); } module Bothly() { Acrossly() child(0); translate([70,0,0]) Frontbackly() child(0); } Howly(0,70) { Plan(); //ElevationCore(); //RightHook(); }