chiark / gitweb /
ksafe-base: toplevels
[reprap-play.git] / ksafe-base.scad
index b2536af81f05fa49f37732f7a265229a73b7b18c..d6daa8f91bf3b0e5eb0be822a9a02d8d529edd95 100644 (file)
 // -*- 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;
-minbevel = space/2;
+bevel = 8;
+string_slot = 3.0;
+string_depth = 6.0;
+
+// ----- calculated -----
+
+hsz = main_sz/2;
+
+gppA = [0,0];
+gppB = gppA - [ wall_thick, 0 ];
 
-// calculated
+gppL = [ gppB[0], -(lidinner_thick_allow + space + base_thick) ];
 
-uppA = [0,0];
-uppB = uppA - [ wall_thick, 0 ];
+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
 
-uppL = [ uppB[0], -(lidinner_thick_allow + space + base_thick) ];
 anchor_b = anchor_thick + anchor_rad;
-uppM = uppL + anchor_b * [1,1];
+appM = gppL + anchor_b * [1,1];
+
+a_bevel = 2 * anchor_b * (1 + sqrt(0.5));
+
+module upp_app_Vars(t_bevel){
+  $xppE = gppL + t_bevel * [0,1];
+  $xppF = gppL + t_bevel * [1,0];
 
-bevel = max(minbevel, 2 * anchor_b * (1 + sqrt(0.5)));
-uppE = uppL + bevel * [0,1];
-uppF = uppL + bevel * [1,0];
+  $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 ],
+         convexity=10);
+}
 
-uppJ = uppE + wall_thick * [ 1, tan(22.5) ];
-uppI = uppF + base_thick + [ tan(22.5), 1 ];
-uppH = upp
 
 module UsualProfile(){
-  
+  upp_app_Vars(bevel) upp_app_Profile();
+}
+
+module NearAnchorProfile(){
+  upp_app_Vars(a_bevel) upp_app_Profile();
+}
+
+module AnchorProfile(){
+  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);
+    }
+  }
+}
+
+module AnchorWallProfile(){
+  UsualProfile();
+  NearAnchorProfile();
+  hull(){
+    for (bev = [bevel, a_bevel]) {
+      upp_app_Vars(bev) {
+       polygon([ $xppE,
+                 $xppF,
+                 $xppI,
+                 $xppJ ],
+         convexity=10);
+      }
+    }
+  }
+}
+
+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);
+    }
+    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(){ ////toplevel
+  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 DemoProfiles(){
+  translate([0,0,-2]) color("yellow") AnchorWallProfile();
+  color("red") AnchorProfile();
+  translate([0,0,2]) color("black") NearAnchorProfile();
+  translate([0,0,4]) color("blue") UsualProfile();
+  translate([0,0,-4]) color("pink") WebProfile();
+}
+
+//DemoProfiles();
+//Box();
+//KsafeBase();
+//RimTest();