X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=ksafe-base.scad;h=4441b2a5713508b2123d40eef0d139405c93061d;hp=b21b6939f94952fa26bd66ed445b3d8f3c8b79b1;hb=391e60ac3303391d9e929ee5f84b1db3ce2e40ee;hpb=91296712544fb62972b6b094d6aab25a078acde4 diff --git a/ksafe-base.scad b/ksafe-base.scad index b21b693..4441b2a 100644 --- a/ksafe-base.scad +++ b/ksafe-base.scad @@ -1,24 +1,50 @@ // -*- C -*- -// xxx -bolt_above = 4; -wall_thick = 4; -bolthole_height = 4; -bolthole_width = 10; -base_thick = 5; -lidinner_thick_allow = 20; +// from actual ksafe +bolt_above = 8.50 - 0.50; +bolthole_height = 4.24 + 1.00; +wall_thick = 4.50; +bolthole_width = 16.62 + 2.00; +main_sz = 150.56 + 0.75; +cnr_rad = 13.5; // approx +lidinner_thick_allow = 20.78 + 0.50; + +// other parameters +web_thick = 4; +web_height = 20; // excluding wall and base thick +bolthole_rhs = 20; +bolthole_lhs = 20; +boltreinf_thick = 6; +anchor_wall_space = 25; +base_thick = 4; space = 25; anchor_thick = 4; anchor_rad = 4; -bevel = 15; +bevel = 8; +string_slot = 3.0; +string_depth = 6.0; // ----- calculated ----- +hsz = main_sz/2; + gppA = [0,0]; gppB = gppA - [ wall_thick, 0 ]; gppL = [ gppB[0], -(lidinner_thick_allow + space + base_thick) ]; +yw1 = -web_thick/2; +yw2 = yw1 - bolthole_rhs; +yw3 = yw2 - anchor_thick; +yw4 = yw3 - anchor_wall_space; +yw5 = yw4 - wall_thick; +yw6 = -(hsz - cnr_rad + 0.1); + +yw10 = web_thick/2; +yw11 = yw2 + anchor_wall_space; +yw12 = yw11 + wall_thick; +yw13 = -yw6; + // anchor anchor_b = anchor_thick + anchor_rad; @@ -26,53 +52,204 @@ appM = gppL + anchor_b * [1,1]; a_bevel = 2 * anchor_b * (1 + sqrt(0.5)); -module upp_app_Profile(t_bevel){ - xppE = gppL + t_bevel * [0,1]; - xppF = gppL + t_bevel * [1,0]; +module upp_app_Vars(t_bevel){ + $xppE = gppL + t_bevel * [0,1]; + $xppF = gppL + t_bevel * [1,0]; - xppJ = xppE + wall_thick * [ 1, tan(22.5) ]; - xppI = xppF + base_thick + [ tan(22.5), 1 ]; + $xppJ = $xppE + wall_thick * [ 1, tan(22.5) ]; + $xppI = $xppF + base_thick * [ tan(22.5), 1 ]; + // must pass a_bevel for t_bevel for these to be valid + $gppP = gppA + [0,-1] * lidinner_thick_allow; + $gppQ = $gppP + [1,-1] * web_height; + $gppR = $xppJ + [ 1, tan(22.5) ] * web_height; + $gppS = $xppI + [ tan(22.5), 1 ] * web_height; + $gppT = [ $gppQ[0], $xppE[1] ]; + + children(); +} + +module upp_app_Profile(){ polygon([ gppA, gppB, - xppE, - xppF, - xppF + [1,0], - xppI + [1,0], - xppJ ]); + $xppE, + $xppF, + $xppF + [1,0], + $xppI + [1,0], + $xppJ ], + convexity=10); } module UsualProfile(){ - upp_app_Profile(bevel); + upp_app_Vars(bevel) upp_app_Profile(); } module NearAnchorProfile(){ - upp_app_Profile(a_bevel); + upp_app_Vars(a_bevel) upp_app_Profile(); } module AnchorProfile(){ - xppE = gppL + t_bevel * [0,1]; - xppF = gppL + t_bevel * [1,0]; + upp_app_Vars(a_bevel) { + + upp_app_Profile(); + + difference(){ + hull(){ + polygon([ $xppE, + $xppF, + $xppF + [0,1], + $xppE + [1,0] ], + convexity=10); + translate(appM) circle(r= anchor_b); + } + translate(appM) circle(r= anchor_rad); + } + } +} - upp_app_Profile(a_bevel); +module AnchorWallProfile(){ + UsualProfile(); + NearAnchorProfile(); + hull(){ + for (bev = [bevel, a_bevel]) { + upp_app_Vars(bev) { + polygon([ $xppE, + $xppF, + $xppI, + $xppJ ], + convexity=10); + } + } + } +} - difference(){ - hull(){ - polygon([ xppE, - xppF, - xppF + [0,1], - xppE + [1,0] ]); - translate(appM) circle(r= anchor_b); +module WebProfile(){ + upp_app_Vars(a_bevel){ + if ($gppR[1] <= $gppP[1]) { + polygon([ $gppP, + $xppE, + $gppT, + $gppQ ]); + polygon([ $gppP, + $xppE, + $xppF, + $gppS, + $gppR ], + convexity=10); + } else { + polygon([ $gppP, + $xppE, + $xppF, + $gppS, + $gppP + web_height * [1,0] ], + convexity=10); } - translate(appM) circle(r= anchor_rad); + polygon([ $gppS, + $xppF, + $xppF + [1,0], + $gppS + [1,0] ], + convexity=10); + } +} + +module SomeBaseProfile(I, F){ + polygon([ I, + F, + [ hsz+1, F[1] ], + [ hsz+1, I[1] ] ]); +} + +module BaseProfile(){ + SomeBaseProfile($xppI, $xppF); +} + +module SWalls(ymin, ymax, t_bevel) { + upp_app_Vars(t_bevel) { + translate([0,ymin,0]) + mirror([0,1,0]) + rotate([90,0,0]) + linear_extrude(height= ymax-ymin, convexity=10) + for (xm=[0,1]) + mirror([xm,0]) + translate([-hsz, 0]) + children(); + } +} + +module AtTwoCorners(){ + for (xm=[0,1]) { + mirror([xm,0,0]) + translate((hsz - cnr_rad) * [1,1]) + intersection(){ + rotate_extrude(convexity=10) + translate([-cnr_rad,0]) + children(); + translate([0,0,-250]) + cube([50,50,500]); + } + } +} + +module Box(){ + /// corners, and front and back of base + for (ym=[0,1]) mirror([0,ym,0]) { + AtTwoCorners(){ + UsualProfile(); + } + hull() AtTwoCorners(){ + upp_app_Vars(bevel){ + polygon([ $xppI, + $xppF, + $xppF + [0.1, 0], + $xppI + [0.1, 0] + ]); + } + } + } + + // side walls and base + SWalls(yw6 , yw4 , bevel ) { UsualProfile(); BaseProfile(); } + SWalls(yw5 , yw4 , a_bevel) { AnchorWallProfile(); BaseProfile(); } + SWalls(yw5 , yw12, a_bevel) { NearAnchorProfile(); BaseProfile(); } + SWalls(yw3 , yw2 , a_bevel) { AnchorProfile(); BaseProfile(); } + SWalls(yw11, yw12, a_bevel) { AnchorWallProfile(); BaseProfile(); } + SWalls(yw11, yw13, bevel ) { UsualProfile(); BaseProfile(); } + SWalls(yw1, yw10, a_bevel) { WebProfile(); SomeBaseProfile($gppS, $xppF); } + + // front and rear walls + rotate([0,0,90]) SWalls(yw6, yw13, bevel) UsualProfile(); +} + +module KsafeBase(){ + cut = main_sz + 20; + + difference(){ + Box(); + + // bolt holes + translate([0,0, -bolt_above -0.5 * bolthole_height]) + cube(center=true, [ cut, bolthole_width, bolthole_height ]); + + // string slot + translate([ -cut, + -(bolthole_width/2 + bolthole_rhs), + 1 ]) + mirror([0,1,0]) mirror([0,0,1]) + cube([ cut*2, + string_slot, + lidinner_thick_allow + string_depth + 1 ]); } } -module Demo(){ +module DemoProfiles(){ + translate([0,0,-2]) color("yellow") AnchorWallProfile(); color("red") AnchorProfile(); translate([0,0,2]) color("black") NearAnchorProfile(); - color("blue") UsualProfile(); + translate([0,0,4]) color("blue") UsualProfile(); + translate([0,0,-4]) color("pink") WebProfile(); } -Demo(); +//DemoProfiles(); +//Box(); +KsafeBase();