chiark / gitweb /
fairphone-case: TestLidTopAperturesPrint: make frameish
[reprap-play.git] / fairphone-case.scad
index 1990985baf0e6deb27ae8bd496e590f2b53387b5..678ea67cea016a48739b4046521647cdbf232690 100644 (file)
@@ -21,9 +21,11 @@ led_window_style = 3;
 // 3: like 2 but one-layer window for ad-hoc multi-colour
 
 initial_layer_thick = 0.400; // ^ needed for mode 3 only
+initial_layer_width = 0.750; // ^ needed for mode 3 only
 multicolour_gap = 0.15; // each side
 
 phone_cnr_rad = 6.0;
+phone_rim_depth = 0.80; // includes allowance for a screen protector
 
 button_cutout_depth = 9;
 
@@ -38,9 +40,9 @@ camera_pos_br = [ 22.300, 37.600 ]; // tl/br as seen from back
 jack_pos = [ 13.83, 8.485 ];
 jack_dia = 10.64 + .5; // some jack I had lying around
 
-led_pos = [ 12.50, 8.00 ];
-led_aperture = 5;
-led_windowledge = 0.75; // each side
+led_pos = [ 13.98, 10.00 ];
+led_aperture = 9;
+led_window_ledge = 0.75; // each side
 
 noisecancelmic_pos = [ 19.54, 7.37 ];   // from rhs
 noisecancelmic_dia = 4.00;
@@ -56,10 +58,12 @@ microusb_below = 0.0;
 microusb_width = 16.12 + 1.25;
 
 case_th_bottom = 2.5;
-case_th_lid = 2.5;
+case_th_lid = 3.0;
 case_th_side = 2;
 case_th_lip = 1.2;
 
+lid_screen_gap_extra = .66;
+
 case_struts_count = 6;
 case_struts_solid_below = 1.00;
 case_struts_solid_above = 0.75;
@@ -195,7 +199,20 @@ kppa = [ kppb[0], kppf[1] ];
 lpp10 = [ epp5[0] + lid_gap_x, kppc[1] + lid_gap_z ];
 lpp11 = [ lpp10[0],            epp5[1] + lid_gap_z ];
 
-lp_r12 = case_th_lid - (lpp11[1] - lpp10[1]);
+lpp14 = lpp10 + [1,0] * keeper_inner_width;
+// exact x posn not very important; must extend past end of keeper
+
+lpp15 = [ lpp14[0],
+         epp0[1] - phone_rim_depth + 1/2.5 * case_th_lid
+         + lid_screen_gap_extra ];
+// ^ beam theory says to maximise force before contact,
+//   the gap below the `beam' (the lid) must be 1/3
+//   the thickness (ie the lid thickness) if the beam
+//   is solid, or 1/2 if it has a top and bottom only.
+//   ours is mostly solid.
+
+lp_r12 = max(case_th_lid - (lpp11[1] - lpp15[1]),
+            case_th_lip);
 
 lpp12 = [ epp4[0] + lp_r12,    lpp11[1] ];
 lpp13 = [ lpp12[0],            lpp12[1] + lp_r12 ];
@@ -220,7 +237,7 @@ bppW = lpp10;
 // notification led aperture
 
 nla_r0 = led_aperture/2;
-nla_r1 = nla_r0 + led_windowledge;
+nla_r1 = nla_r0 + led_window_ledge;
 nla_r2 = nla_r1 + multicolour_gap;
 nla_t =
   led_window_style >= 3 ? initial_layer_thick :
@@ -330,6 +347,26 @@ $prp_r10 = prl_r10;
 
 // ---------- modules ----------
 
+module AdhocMultiprintFrame(phase, z0, zs) {
+  // from z0 to z0 + zs*layer
+  extra = phase * (initial_layer_width + multicolour_gap) + 5;
+  xextra = extra + -epp4[0];
+  xrange = [ 0, phone_width ] + [-1,+1] * xextra;
+  yextra = extra + -epp4[0];
+  yrange = [ -phone_height + +hppB[0] - hp_r2, 0 ] + [-1,+1] * yextra;
+  p0 = [ xrange[0], yrange[0] ];
+  p1 = [ xrange[1], yrange[1] ];
+  echo(p0, p1);
+  translate([0,0, z0])
+    mirror([0,0, zs<0 ? 1 : 0])
+    linear_extrude(height= initial_layer_thick)
+    difference(){
+      rectfromto(p0 - [1,1] * initial_layer_width,
+                p1 + [1,1] * initial_layer_width);
+      rectfromto(p0, p1);
+    }
+}
+
 module KeeperProfile(slant=0){
   use_e = kppe + [0,-1] * slant * keeper_inner_width / keeper_slant_slope;
   polygon([use_e, kppd, kppc, kppb, kppa, kppf]);
@@ -356,7 +393,9 @@ module LidEdgeProfile(){
            lpp12,
            lpp13,
            lpp13 + [10, 0],
-           lpp10 + [10, 0]
+           lpp15 + [10, 0],
+           lpp15,
+           lpp14,
            ]);
   intersection(){
     circleat(lpp12, r=lp_r12);
@@ -368,7 +407,8 @@ module LidEdgeProfile(){
 module ButtonCoverProfile(){
   intersection(){
     polygon(concat([ bppM, bppP, bppO, bppJ ],
-                  (enable_support ? [ bppU, bppV, bppW ] : []),
+                  (enable_support && !$button_suppress_over_keeper
+                   ? [ bppU, bppV, bppW ] : []),
                   [ bppL, bppK ]));
     hull(){
       EdgeProfile();
@@ -514,12 +554,13 @@ module CaseAperture(pos, dia, $fn) {
             h = 60);
 }
 
-module SideButton(y, y_ref_sign, l){
+module SideButton(y, y_ref_sign, l, suppress_over_keeper=0){
   // y_ref_sign:
   //   +1  measured from top    of actual phone to top    of button
   //   -1  measured from bottom of actual phone to bottom of button
   //    0  y is centre of button in coordinate system
   $button_l= l;
+  $button_suppress_over_keeper= suppress_over_keeper;
   eff_y = y_ref_sign > 0 ?         -bumper [1] -y -l/2 :
          y_ref_sign < 0 ? (-phone -bumper)[1] +y +l/2 :
          y;
@@ -534,9 +575,9 @@ module LidButtonishLeg(y, y_ref_sign, l=buttonishleg_default_l_is_fudge) {
 }
 
 module Buttons(){
-  Flip_rhs(1) SideButton(15.580, +1, 8.9) children(); // power
-  Flip_rhs(1) SideButton(48.700, -1, 8.920) children(); // camera
-  Flip_rhs(0) SideButton(30.800, +1, 21.96) children(); // volume
+  Flip_rhs(1) SideButton(15.580, +1, 8.9     ) children(); // power
+  Flip_rhs(1) SideButton(48.700, -1, 8.920   ) children(); // camera
+  Flip_rhs(0) SideButton(30.800, +1, 21.96, 1) children(); // volume
   Flip_rhs(   ) LidButtonishLeg(14, -1) children();
 //  Flip_rhs(0) LidButtonishLeg(20, +1, 20) children();
 }
@@ -840,7 +881,7 @@ module Case(){ ////toplevel
                translate([phone_width/2, -400, kppe[1]])
                mirror([1-abs($rhsflip - keeper_side),0,0])
                cube([400, 800, 50]);
-           if (enable_support)
+           if (enable_support && !$button_suppress_over_keeper)
              rotate([-90,90,0])
              translate([-400, -400, kppd[1]])
                mirror([0,0,1])
@@ -891,6 +932,12 @@ module Case(){ ////toplevel
   }
 }
 
+module LidAdhocMultiprintFrame(phase){
+  if (led_window_style >= 3) {
+    AdhocMultiprintFrame(phase, lpp13[1], -1);
+  }
+}
+
 module Lid(){ ////toplevel
   difference(){
     union(){
@@ -941,7 +988,10 @@ module Lid(){ ////toplevel
          translate([0,0, -nla_t])
            cylinder(r=nla_r2, height=20);
       }
-  }
+
+    }
+
+  LidAdhocMultiprintFrame(1);
 }
 
 module HingeLever(){ ////toplevel
@@ -967,6 +1017,33 @@ module HingeLever(){ ////toplevel
   }
 }
 
+module LidWindow(){ ////toplevel
+  translate([led_pos[0], -led_pos[1], lpp13[1]])
+    mirror([0,0,1])
+    cylinder(r= nla_r1, h=nla_t);
+  LidAdhocMultiprintFrame(0);
+}
+
+module LidWindowPrint(){ ////toplevel
+  rotate([0,180,0])
+    LidWindow();
+}
+
+module DemoLidWindowSelect(){
+  translate([led_pos[0], led_pos[1], -100]) {
+    translate([0, -30, 0]) cube([400, 400, 200]);
+  }
+}
+
+module DemoLidWindow(){ ////toplevel
+  %Lid();
+  LidWindow();
+  translate([0,40,0]){
+    color("blue") intersection(){ Lid(); DemoLidWindowSelect(); }
+    color("red") intersection(){ LidWindow(); DemoLidWindowSelect(); }
+  }
+}
+
 module HingeLeverPrint(){ ////toplevel
   rotate([-90,0,0])
     translate([-phone_width/2, phone_height, 0])
@@ -1087,6 +1164,8 @@ module TestSelectFrame(){
 
 module TestSelectLidFrame(){
   TestSelectFrame();
+  translate([led_pos[0], -led_pos[1], -50])
+    cylinder(r= nla_r2+3, h=100);
 }
 
 module TestFrameCase(){ ////toplevel
@@ -1100,12 +1179,33 @@ module TestFrameCase(){ ////toplevel
   }
 }
 
+module TestSelectTopApertures(){
+  translate([-100, -35, -100])
+    cube([400, 100, 200]);
+  LidAdhocMultiprintFrame(0);
+  LidAdhocMultiprintFrame(1);
+}
+
 module TestTopApertures(){ ////toplevel
   intersection(){
     Case();
     TestSelectFrame();
-    translate([-100, -35, -100])
-      cube([400, 100, 200]);
+    TestSelectTopApertures();
+  }
+}
+
+module TestLidTopAperturesPrint(){ ////toplevel
+  rotate([0,180,0]) intersection(){
+    Lid();
+    TestSelectLidFrame();
+    TestSelectTopApertures();
+  }
+}
+
+module TestLidWindowTopAperturesPrint(){ ////toplevel
+  rotate([0,180,0]) intersection(){
+    LidWindow();
+    TestSelectTopApertures();
   }
 }
 
@@ -1180,6 +1280,17 @@ module DemoPropAngles(){ ////toplevel
     DemoPropAngle(prop_angles[i]);
 }
 
+module DemoSelectAdhocLeftRight(right=0) {
+  translate([phone_width/2, -400, -100]) // , -15, -100  to cross-section
+    mirror([1-right, 0,0])
+    cube([400, 800, 200]);
+}
+
+module DemoLeft(){ ////toplevel
+  color("red")  intersection(){ Case(); DemoSelectAdhocLeftRight(); }
+  color("blue") intersection(){ Lid();  DemoSelectAdhocLeftRight(); }
+}
+
 module DemoFrame(){ ////toplevel
   color("red") TestFrameCase();
   color("blue") intersection(){ Lid(); TestSelectLidFrame(); }