chiark / gitweb /
ksafe-base: fix a measurement
[reprap-play.git] / sewing-table.scad.m4
index bed22ea..b71e041 100644 (file)
@@ -7,12 +7,14 @@ ply_th = 18;
 ply_hole_dia = 15;
 ply_edge_min = 10;
 
+ply_hole_dia_real = 12;
+
 tile_th = 3;
 post_dia = 8;
 
 post_shorter = 1;
 
-screw_dia = 2.2;
+$screw_dia = 3.2;
 screw_big_dia = 3.6;
 screw_big_len = 4.0;
 
@@ -28,17 +30,43 @@ interlock_fine_lenslop = 1.0;
 
 demo_slop = 0.1;
 
+leg_height = 53.75 - 0.95;
+
+leg_hole_dia = 5 + 0.75;
+leg_big_dia = 37;
+leg_bot_dia = 15;
+leg_top_flat_z = 2;
+leg_top_thick = 8;
+
+leg_midspc_dia = 20;
+leg_bot_thick = 8;
+leg_bot_mid_dia = 12;
+
+leg_fin_top_w = 3;
+leg_fin_bot_w = 5;
+leg_fin_bot_rad = 30;
+leg_fin_bot_flat_z = 5;
+
+leg_n_fins = 4;
+leg_n_tubules = 4;
+leg_tubule_dia = 4;
+
+// spacer
+
+spacer_ext_slop = 0.25;
+spacer_int_slop = 0.25;
+spacer_height = 10;
+
 // cutout
 
 machine_rear_to_front = 84 + 0.25 - 1.4;
 
 cutout_l_end_y_front_slop = 0.5;
 cutout_l_end_y_rear_slop = 0.5;
-cutout_l_end_x_slop = 0.25;
 
 cutout_l_end_x = 22;
 cutout_l_end_y = machine_rear_to_front;
-cutout_l_end_curve = 1;
+cutout_l_end_new_x_slop = 1.4 - 1.95;
 cutout_l_end_y_total = cutout_l_end_y
   + cutout_l_end_y_front_slop + cutout_l_end_y_rear_slop;
 
@@ -46,12 +74,12 @@ tile02_tr = [-250, 0];
 tile01_tr = [  0, 0];
 
 cutout_tile01_y = 170 - 147 + cutout_l_end_y_front_slop;
-cutout_tile11_x = cutout_l_end_x + cutout_l_end_curve;
 cutout_tile11_y = cutout_l_end_y_total - cutout_tile01_y;
 
 // front and rear curves
 
-rearedge_len = 170;
+rearedge_len = 170 + 0.70;
+frontedge_len = 170;
 
 rearcurve_strt_len = 52;
 
@@ -81,9 +109,12 @@ teststrapslots_at = [ [ 110, 70 ], [ 110, -35 ],
 teststrap = [ 3, 5 ];
 teststrap_peg = [7.5, 3.5];
 
+ply_edge_hole_dist_real = 14;
+
 // calculated
 
 TEST = false;
+JIG = false;
 
 ply_edge_hole_dist = ply_edge_min + ply_hole_dia/2;
 
@@ -104,23 +135,30 @@ thehd_tl = [ -thehd_tr[0], thehd_tr[1] ];
 thehd_bl = -thehd_tr;
 thehd_br = -thehd_tl;
 
-tablet_z_slop = 0.25;
+tablet_z_slop = 1.00;
 
 interlock_rad = interlock_dia/2;
 interlock_negative_rad = interlock_rad + 0.125;
 
 interlock_sq_adj = 0.2; // arbitrary
 
+leg_fin_top_rad = sqrt( pow(leg_big_dia/2,2) -
+                       pow(leg_fin_top_w/2,2) );
+
+leg_tubule_pos_rad = leg_big_dia/2 * 0.6;
+
 m4_define(`POST_TCROSSSZ',
           `2*( tile_hard_edge_hole_dist - test_edge + 1 )')
 
 module Post(){
   mirror([0,0,1]) {
-    difference(){
-      cylinder(r= post_dia/2, h= tile_th + ply_th - post_shorter);
-      translate([0,0, tile_th]) {
-       cylinder(r= screw_big_dia/2, h= screw_big_len);
-       cylinder(r= screw_dia/2, h= ply_th, $fn=20);
+    if (!JIG) {
+      difference(){
+       cylinder(r= post_dia/2, h= tile_th + ply_th - post_shorter);
+       translate([0,0, tile_th]) {
+         cylinder(r= screw_big_dia/2, h= screw_big_len);
+         cylinder(r= $screw_dia/2, h= ply_th, $fn=20);
+       }
       }
     }
     if (TEST) {
@@ -129,6 +167,24 @@ module Post(){
        cube([POST_TCROSSSZ, post_dia,      tile_th], center=true);
       }
     }
+    if (JIG) {
+      translate([0,0, tile_th/2]) {
+       cube([POST_TCROSSSZ, POST_TCROSSSZ, tile_th], center=true);
+      }
+    }
+  }
+}
+
+module PostHole(){
+  if (JIG) {
+    translate([0,0,-5])
+      cylinder(r= post_dia/2 + jig_post_hole_slop, h=10);
+    translate([0,0, -jig_min_th])
+      cylinder(r= ply_hole_dia_real/2, h = 5);
+    for (rot=[0:90:270]) rotate(rot) {
+       translate([ ply_edge_hole_dist_real, 0, 0 ])
+         cube([ jig_pencil_rad*2, jig_pencil_slotlen, 20 ], center=true);
+      }
   }
 }
 
@@ -138,6 +194,12 @@ module Posts(posts) {
       Post();
   }
 }
+module PostHoles(posts) {
+  for (p= posts)  {
+    translate(concat(p, [0]))
+      PostHole();
+  }
+}
 
 module TileBase(botleft, topright){
   size = topright - botleft;
@@ -147,7 +209,7 @@ module TileBase(botleft, topright){
     mirror([0,0,1])
       translate(concat(botleft, [0]))
       cube(concat(size, [tile_th]));
-    if (!TEST) {
+    if (!(TEST || JIG)) {
       cidsz = topright_post-botleft_post
        + [-post_dia,-post_dia]
        + [0, thehd[1]];
@@ -158,16 +220,17 @@ module TileBase(botleft, topright){
                 + 0.5 * concat( cidsz - cidszr, [ 0 ]) )
        Commitid_BestCount_M(cidszr);
     }
-    if (TEST) {
+    if ((TEST || JIG)) {
       crossoff = tile_hard_edge_hole_dist + POST_TCROSSSZ/2;
       cidsz = [ thehd[0], size[1] - 2*crossoff ];
       cidszr = [ cidsz[0], min(cidsz[1], 50) ];
-      translate( concat(botleft + [0, crossoff] + (cidsz-cidszr)/2, [0]) )
-       Commitid_BestCount(cidszr);
+      if (TEST)
+       translate( concat(botleft + [0, crossoff] + (cidsz-cidszr)/2, [0]) )
+         Commitid_BestCount(cidszr);
       difference(){
        mirror([0,0,1]) {
          translate(concat(botleft + [test_edge,test_edge], [test_tile_th]))
-           cube(concat(size - [test_edge,test_edge]*2, [tile_th]));
+           cube(concat(size - [test_edge,test_edge]*2, [tile_th*2]));
          translate(concat(botleft_post, [-1]))
            cube(concat(topright_post-botleft_post, [tile_th+2]));
        }
@@ -176,6 +239,17 @@ module TileBase(botleft, topright){
          MachineEnvelope();
          cube(shufflesz, center=true);
        }
+       if (JIG) {
+         translate([0,0,-20]) linear_extrude(height=20) {
+           for (diag=[[ +1, botleft                   ],
+                      [ -1, [topright[0], botleft[1]] ]]) {
+             translate(diag[1])
+               rotate(atan2(size[1], diag[0] * size[0]))
+               translate([0, -test_edge/2])
+               square([vectorlen2d(size), test_edge]);
+           }
+         }
+       }
       }
     }
   }
@@ -386,6 +460,7 @@ module TestPiece1(){ ////toplevel
     }
     InterlockEdge(corners[1], corners[2], 1, nlobes=1);
     RoundCornerCut(rcs);
+    PostHoles(holes);
   }
   RoundCornerAdd(rcs);
 }
@@ -395,10 +470,15 @@ module TestPiece2(){ ////toplevel
            [  50, 0]
            ];
   corners = TestPiece_holes2corners(holes);
-  TileBase(corners[0], corners[2]);
-  Posts(holes);
-  RoundEdge(corners[0], corners[1]);
-  InterlockEdge(corners[3], corners[0], 0, nlobes=1);
+  difference(){
+    union(){
+      TileBase(corners[0], corners[2]);
+      Posts(holes);
+      RoundEdge(corners[0], corners[1]);
+      InterlockEdge(corners[3], corners[0], 0, nlobes=1);
+    }
+    PostHoles(holes);
+  }
 }
 
 module TestDemo(){ ////toplevel
@@ -409,19 +489,30 @@ module TestDemo(){ ////toplevel
     TestPiece2();
 }
 
-module Machine_Arm(){
-  ysz = cutout_l_end_y_total;
-  // assume the round end is arc of a circle
-  chordlen = dist2d([0,0], [ cutout_l_end_y, cutout_l_end_curve ]);
-  endrad = cutout_l_end_y / cutout_l_end_curve * chordlen;
-  
-  translate([0,0,-30]) linear_extrude(height=60) {
-    translate(tile01_tr + [0, (-cutout_tile01_y + cutout_tile11_y)/2]) {
-      intersection(){
-       translate([-50, -ysz/2])
-         square([400, ysz]);
-       translate([ endrad - cutout_tile11_x - cutout_l_end_x_slop, 0 ])
-         circle(r=endrad, $fa=0.01,$fd=5);
+module PostTestPiece(){ ////toplevel
+  hole_sizes = [2.8, 3.0, 3.1, 3.134, 3.168, 3.2, 3.3, 3.5];
+  nholes = len(hole_sizes)*2;
+  nrows = 4;
+  stride = post_dia*1.5;
+  rect_sz = stride * [ nrows,
+                      ceil(nholes/nrows) ];
+  corners = Rectangle_corners(-stride * 0.5 * [1,1], rect_sz);
+  difference(){
+    union(){
+      TileBase(corners[0], corners[2]);
+      RoundEdge(corners[0], corners[1]);
+      for (i= [ 0: nholes-1 ]) {
+       $screw_dia = hole_sizes[ floor(i/2) ];
+       translate(stride * [ (nrows-1) - (i % nrows),
+                            floor(i / nrows),
+                            0
+                            ]) {
+         Posts([[0,0]]);
+         color("blue")
+           mirror([0,0,1])
+           translate([post_dia/2, -post_dia/2, 1])
+           cube([1, post_dia * (i / nholes), tile_th]);
+       }
       }
     }
   }
@@ -483,7 +574,7 @@ module Machine_NewEndProfile(){
   sh = (0.5 * (endline[0] + endline[1])) - posbox;
 
   ellen = sc * dist2d(endline[0],endline[1]);
-  scy = cutout_l_end_y / ellen;
+  scy = cutout_l_end_y_total / ellen;
 
   scale([scy,1]) scale(sc) rotate(rot + rot_adj) translate(-[sh[0],-sh[1]]){
 
@@ -514,6 +605,20 @@ module Machine_NewEndProfileDemo(){ ////toplevel
   }
 }
 
+module Machine_NewArm(){
+  translate([0,0,-30]) linear_extrude(height=60) {
+    translate(tile01_tr + [ -cutout_l_end_x - cutout_l_end_new_x_slop,
+                           (-cutout_tile01_y + cutout_tile11_y)/2 ]){
+      rotate(-90){
+       hull(){
+         for (d=[0,400]) 
+           translate([0,d]) Machine_NewEndProfile();
+       }
+      }
+    }
+  }
+}
+
 module Machine_NewRearCurve(){
   slant = atan2(4,210-10);
   //echo("SL",slant);
@@ -558,7 +663,7 @@ module Machine_Curves(){ ////toplevel
             reartablet_y+1,
             20 ]);
   }
-  translate([ tile01_tr[0] - cutout_l_end_x + rearedge_len,
+  translate([ tile01_tr[0] - cutout_l_end_x + frontedge_len,
              cutout_tile11_y,
              frontcurve_z_slop ]){
     translate([0, -machine_rear_to_front, 0])
@@ -569,7 +674,10 @@ module Machine_Curves(){ ////toplevel
       mirror([1,0,0]) rotate([0,-90,0])rotate([0,0,-90])
       linear_extrude(height= 200)
       Machine_NewFrontProfile();
-
+  }
+  translate([ tile01_tr[0] - cutout_l_end_x + rearedge_len,
+             cutout_tile11_y,
+             frontcurve_z_slop ]){
     translate([ rearcurve_strt_len,
                0,
                rearcurve_z_slop ]){
@@ -600,8 +708,19 @@ module TestStrapPeg_Long(){ ////toplevel
   TestStrapPeg_any(60);
 }
 
+module PostSpacer(){ ////toplevel
+  $fn = 50;
+  difference(){
+    cylinder(r= ply_hole_dia_real/2 - spacer_ext_slop,
+            h= spacer_height);
+    translate([0,0,-1])
+      cylinder(r= post_dia/2 + spacer_int_slop,
+              h= ply_th + 2);
+  }
+}
+
 module Machine(){ ////toplevel
-  Machine_Arm();
+  Machine_NewArm();
   Machine_Curves();
   if (TEST)
     TestStrapSlots();
@@ -611,7 +730,7 @@ module MachineEnvelope(){
   // used for testing
   p_arm_bl = [-cutout_l_end_x, -cutout_tile01_y];
   y_arm_t  = cutout_tile11_y;
-  p_crv_fl = p_arm_bl + [rearedge_len, -frontcurve_avoid_y];
+  p_crv_fl = p_arm_bl + [frontedge_len, -frontcurve_avoid_y];
   y_crv_b  = y_arm_t + rearcurve_avoid_y;
 
   translate([0,0,-50]) linear_extrude(height= 100){
@@ -620,6 +739,65 @@ module MachineEnvelope(){
   }
 }
 
+module Leg(){ ////toplevel
+  difference(){
+    union(){
+      hull(){
+       mirror([0,0,1])
+         cylinder(r= leg_big_dia/2, h=leg_top_flat_z, $fn=100);
+       translate([0,0, -leg_top_thick])
+         cylinder(r= leg_bot_dia/2, height=1, $fn=100);
+      }
+      if (!TEST)
+       translate([0,0,-leg_height])
+         cylinder(r= leg_bot_mid_dia/2, h=leg_bot_thick);
+      for (rot=[0: 360/leg_n_fins : 359]) rotate(rot) {
+         hull(){
+           mirror([0,0,1]) translate([0, -leg_fin_top_w/2, 0])
+             cube([ leg_fin_top_rad - 0.1,
+                    leg_fin_top_w,
+                    1 ])
+             ;
+           translate([0, -leg_fin_bot_w/2, -leg_height])
+             cube([ leg_fin_bot_rad,
+                    leg_fin_bot_w,
+                    leg_fin_bot_flat_z ]);
+         }
+       }
+    }
+    mirror([0,0,1]) translate([0,0,-1])
+      cylinder(r= leg_hole_dia/2,
+              h= (!TEST ? leg_height+2 : leg_height/2),
+              $fn=30);
+    mirror([0,0,1]) translate([0,0,leg_top_thick - 0.1])
+      hull(){
+        cylinder(r= (!TEST ? leg_midspc_dia/2 : 0.1),
+                h= leg_height - leg_top_thick - leg_bot_thick + 0.2,
+                $fn=30);
+       if (TEST)
+         cylinder(r= leg_midspc_dia/2,
+                  h= leg_height - leg_top_thick - leg_bot_thick
+                     + (!TEST ? 0.2 : -leg_midspc_dia/2),
+                  $fn=30);
+      }
+    cid_shear = (leg_fin_bot_w - leg_fin_top_w)/2 /
+                 (leg_height -leg_fin_bot_flat_z);
+    multmatrix([[ 1, 0, 0, leg_midspc_dia/2 ],
+                 [ 0, cid_shear,
+                         1, -leg_fin_bot_w/2 ],
+                 [ 0, 1, 0, -leg_height + leg_fin_bot_flat_z ],
+                 [ 0, 0, 0, 1 ]])
+      Commitid_BestCount([ leg_big_dia/2 - leg_midspc_dia/2,
+                            leg_height - leg_fin_bot_flat_z
+                             - leg_top_thick ]);
+    if (!TEST)
+      for (rot=[45: 360/leg_n_tubules : 359]) rotate(rot) {
+         mirror([0,0,1]) translate([ leg_tubule_pos_rad, 0, -1])
+           cylinder(r= leg_tubule_dia/2, h=leg_height+2, $fn=20);
+       }
+  }
+}
+
 function Rectangle_corners(c0, sz) =
   // returns the corners of a rectangle from c0 to c0+sz
   // if sz is positive, the corners are anticlockwise starting with c0
@@ -654,6 +832,7 @@ module Tile02(){ ////toplevel
     }
     InterlockEdge(R_EDGE(c,1), 1);
     RoundCornerCut(rcs);
+    PostHoles(posts);
   }
   RoundCornerAdd(rcs);
 }
@@ -674,6 +853,7 @@ module Tile12(){ ////toplevel
     InterlockEdge(R_EDGE(c,0), 1);
     InterlockEdge(R_EDGE(c,1), 1);
     RoundCornerCut(rcs);
+    PostHoles(posts);
   }
   RoundCornerAdd(rcs);
 }
@@ -703,6 +883,7 @@ module Tile11(){ ////toplevel
     }
     InterlockEdge(c[0], tile_01_11_cnr, 1);
     InterlockEdge(tile_11_10_cnr, c[2], 1);
+    PostHoles(posts);
     Machine();
   }
 }    
@@ -726,6 +907,7 @@ module Tile01(){ ////toplevel
       InterlockEdge(tile_01_11_cnr, c[3]);
       InterlockEdge(R_EDGE(c,3));
     }
+    PostHoles(posts);
     InterlockEdge(c[1], tile_01_00_cnr, 1);
     Machine();
   }
@@ -752,6 +934,7 @@ module Tile10(){ ////toplevel
       RoundEdge(R_EDGE(c,2));
       InterlockEdge(c[3], tile_11_10_cnr);
     }
+    PostHoles(posts);
     RoundCornerCut(rcs);
     Machine();
   }
@@ -764,7 +947,7 @@ module Tile00(){ ////toplevel
   c = Rectangle_corners(c0, sz);
 
   // the edge c[1]..c[2] needs a diagonal chunk, from c1bis to c2bis
-  c2bis = [ -cutout_l_end_x + rearedge_len + frontcurve_strt_len, c[2][1] ];
+  c2bis = [ -cutout_l_end_x + frontedge_len + frontcurve_strt_len, c[2][1] ];
   c1bis = [ c[1][0],
            c[2][1] -
            (c[2][0] - c2bis[0]) * tan(90 - frontcurve_dualcurve_angle) ];
@@ -774,8 +957,9 @@ module Tile00(){ ////toplevel
   rcy = cty + frontcurve_avoid_y;
   posts = [ cnr_posts[0],
            cnr_posts[1],
+           0.5 * (cnr_posts[0] + cnr_posts[1]),
            cnr_posts[2] + [ 0,                             -rcy ],
-           cnr_posts[2] + [ -sz[0] + rearedge_len - cutout_l_end_x, -cty ],
+           cnr_posts[2] + [ -sz[0] + frontedge_len - cutout_l_end_x, -cty ],
            cnr_posts[3] + [ 0,                             -cty ]
            ];
   rcs = R_CNR(c,1);
@@ -798,6 +982,7 @@ module Tile00(){ ////toplevel
       RoundEdge(c1bis, c2bis);
     }
     Machine();
+    PostHoles(posts);
     RoundCornerCut(rc2);
   }
   RoundCornerAdd(rcs);
@@ -930,9 +1115,9 @@ module FitTest_EntireDemo(){ ////toplevel
 }
 
 module FitTest_EndEnd(){ ////toplevel
-  p0 = [-32,-32];
-  sz = [188,113];
-  sz2 = [168,100];
+  p0 = [-30,-32];
+  sz = [156,81] - p0;
+  sz2 = [136,68] - p0;
   difference(){
     FitTest_general(p0, sz);
     translate([ p0[0] -1, p0[1]+sz2[1], -10])
@@ -985,6 +1170,12 @@ module Demo(){ ////toplevel
   translate(demo_slop*[-3,1]) color("blue")   Tile10();
   translate(demo_slop*[-3,0]) color("red")    Tile00();
   %Machine();
+  // Can also do this, to print reference sheet:
+  //  load this into openscad
+  //  select Ctrl-4 view, view all, scale appropriately
+  //  import sewing-table,Demo-flat.png
+  //  pngtopnm <sewing-table,Demo-flat.png | ppmbrighten -s -50 -v +100 >t.pnm
+  //  lpr t.pnm
 }
   
 //TestPiece1();