chiark / gitweb /
ksafe-base: adjustment from first tests
[reprap-play.git] / ksafe-base.scad
index a4e51c4cee596611523f695f977270a7079914bc..8653fc33778a4fa587899c626f8ab86c2d748582 100644 (file)
@@ -1,13 +1,18 @@
 // -*- C -*-
 
-// xxx from actual ksafe, needs slop adding
-bolt_above = 14.30;
-bolthole_height = 4.24;
+// from actual ksafe
+bolt_above = 8.50 - 0.50;
+bolthole_height = 4.24 + 1.00;
 wall_thick = 4.50;
-bolthole_width = 16.62;
-main_sz = 150.56;
-cnr_rad = 13.5; // approx
-lidinner_thick_allow = 20.78;
+bolthole_width = 16.62 + 1.00;
+main_sz = 149.06 + 0.50;
+cnr_rad = 18; // think this is more like 20; // approx
+lidinner_thick_allow = 20.78 + 0.50;
+display_width = 69.81 - 0.50;
+
+dpp3 = [ -5.5, 8.5 ];
+dpp2 = [ -11.0, 7.0 ];
+dpp1 = [ -34.0, 14.0 ];
 
 // other parameters
 web_thick = 4;
@@ -21,10 +26,25 @@ space = 25;
 anchor_thick = 4;
 anchor_rad = 4;
 bevel = 8;
+string_slot = 3.0;
+string_depth = 6.0;
+thumbslot_depth = 5.0;
+thumbslot_width = 15.0;
+thumbslot_between = 10;
+ksafecover_lip = 4.62;
+display_rhs_secs = 15;
+dcover_endthick = 3.0;
+dcover_mainthick = 5.0;
+dcover_slop_height = 0.35;
+dcover_slop_depth = 0.25;
+dcover_slop_inside = 1.50;
+dcover_commonvertoff = 0.00; // slop_height or slop_inside is added too
+dcover_edge_gap_more_width = 2.0; // each side
 
 // ----- calculated -----
 
 hsz = main_sz/2;
+cut = main_sz + 20;
 
 gppA = [0,0];
 gppB = gppA - [ wall_thick, 0 ];
@@ -43,6 +63,19 @@ yw11 = yw2 + anchor_wall_space;
 yw12 = yw11 + wall_thick;
 yw13 = -yw6;
 
+cpp1 = dpp1 + [  dcover_slop_depth, dcover_slop_height ];
+cpp2 = [ dpp2[0] - dcover_slop_depth, dpp3[1] + dcover_slop_height ];
+cppH = cpp1 + [ 0, dcover_endthick ];
+cppA = [ cpp2[0], dpp3[1] + dcover_slop_inside ];
+cppK = cppA + [ 0, dcover_mainthick ];
+cppZ = [ -ksafecover_lip, -dcover_commonvertoff ];
+cppD = cppZ + [ 0, -dcover_slop_inside ];
+cppC = [ dcover_slop_inside, cppD[1] ];
+cppF = cppC + dcover_mainthick * [1,-1];
+cppB = [ cppC[0], cppA[1] ];
+cppG = [ cppF[0], cppK[1] ];
+cppE = [ cppD[0], cppF[1] - (cppF[0] - cppD[0]) ];
+
 // anchor
 
 anchor_b = anchor_thick + anchor_rad;
@@ -151,52 +184,190 @@ module WebProfile(){
   }
 }
 
+module SomeBaseProfile(I, F){
+  polygon([ I,
+           F,
+           [ hsz+1, F[1] ],
+           [ hsz+1, I[1] ] ]);
+}
+
+module BaseProfile(){
+  SomeBaseProfile($xppI, $xppF);
+}
+
+module DCoverProfileRaw(){
+  polygon([ cpp1,
+           cpp2,
+           cppA,
+           cppB,
+           cppC,
+           cppD,
+           cppE,
+           cppF,
+           cppG,
+           cppK,
+           cppH ],
+         convexity = 10);
+}
+
+module DCoverProfile(){
+  mirror([1,0])
+    translate(-cppZ)
+    DCoverProfileRaw();
+}
+
 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)
-      union(){
-        for (xm=[0,1]) {
-         mirror([xm,0])
-           translate([-hsz, 0])
+      for (xm=[0,1])
+       mirror([xm,0])
+         translate([-hsz, 0])
            children();
-       }
-      }
   }
 }
 
-module KsafeBase(){
-  /// corners
-  for (xm=[0,1]) for (ym=[0,1]) {
-    mirror([xm,0,0]) mirror([0,ym,0])
+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])
-       UsualProfile();
+       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 DCover(){ ////toplevel
+  translate([ -display_width/2, -hsz, 0 ])
+    rotate([0,90,0])
+    rotate([0,0,90])
+    linear_extrude( display_width - display_rhs_secs, convexity = 10)
+    DCoverProfile();
+}
 
-  // side walls
-  SWalls(yw6 , yw4 , bevel  ) UsualProfile();
-  SWalls(yw5 , yw4 , a_bevel) AnchorWallProfile();
-  SWalls(yw5 , yw12, a_bevel) NearAnchorProfile();
-  SWalls(yw3 , yw2 , a_bevel) AnchorProfile();
-  SWalls(yw11, yw12, a_bevel) AnchorWallProfile();
-  SWalls(yw11, yw13, bevel  ) UsualProfile();
+module DCoverSupportAllowance(){
+  translate([0, -hsz, 0])
+    cube(center=true,
+        [ display_width + 2 * dcover_edge_gap_more_width,
+          wall_thick * 2,
+          dcover_slop_inside * 2 + 0.01 ]);
 }
 
-module DemoProfiles(){
+module BoltHoles(){
+  translate([0,0, -(bolt_above + 0.5 * bolthole_height)])
+    cube(center=true, [ cut, bolthole_width, bolthole_height ]);
+}
+
+module KsafeBase(){ ////toplevel
+  DCover();
+
+  difference(){
+    Box();
+
+    BoltHoles();
+
+    // 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 ]);
+
+    // thumb slots
+    for (mx=[0,1]) mirror([mx,0,0]) {
+      translate([ thumbslot_between/2,
+                 0,
+                 -thumbslot_depth ])
+       cube([ thumbslot_width,
+              cut,
+              thumbslot_depth+1 ]);
+    }
+
+    DCoverSupportAllowance();
+  }
+}
+
+module DemoProfiles(){ ////toplevel
   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();
+  translate([0,0,6]) color("purple") DCoverProfile();
+}
+
+module RimTest(){ ////toplevel
+  intersection(){
+    Box();
+    cube(center=true, [ main_sz*2, main_sz*2,
+                       2.5 ]);
+  }
+}
+
+module DCoverTest(){ ////toplevel
+  intersection(){
+    difference(){
+      union(){
+       Box();
+       DCover();
+      }
+      DCoverSupportAllowance();
+      BoltHoles();
+    }
+    translate([0,0,60])
+    cube(center=true, [ main_sz*2, main_sz*2,
+                       2 * (60 + 10) ]);
+  }
+}
+
+module BoltTest(){ ////toplevel
+  dy = 0.5 * (bolthole_width+4);
+  intersection(){
+    KsafeBase();
+    translate([ 0, -dy, -(bolt_above + bolthole_height + 1) ])
+      cube([ main_sz, dy*2, 50 ]);
+  }
 }
 
 //DemoProfiles();
-KsafeBase();
+//Box();
+//KsafeBase();
+//RimTest();