chiark / gitweb /
scaffold-clamp: wip straphook
[reprap-play.git] / fairphone-case.scad
index d87bdc2149b97cb80f3586c79e1058c9262dc7a6..2998b54d82d5b98df037a769a11706f42e0b1018 100644 (file)
@@ -169,7 +169,8 @@ noisecancelmic_dia = 4.00;
 fingerpushhole_dias = [];
 
 lanyard_half_dia = 1.15;
-
+lanyard_entry_rel_breadth = 2;
+lanyard_channel_len = 15;
 rearspeaker_pos_bl = [ 12.64, 18.72 ];
 rearspeaker_size   = [  3.76,  7.36 ];
 
@@ -209,8 +210,7 @@ lid_gap_z = 0.25;
 lid_lip = 1.75;
 lid_edgepart_width = 5.0;
 lid_buttoncover_thick = 1.3;
-
-catch_slop = 0.50;
+lid_buttoncover_reinf = 0.65;
 
 foldover_gap = 0.50;
 foldover_lever_gap = 0.50;
@@ -252,17 +252,9 @@ hinge_r_arms_gap = 0.55;
 
 rearspeaker_gap    = [ 2.0, 2.0 ]; // each side
 
-catch_len = 7.5;
-catch_width = 15;
-catch_thickness = 1.0;
-catch_side_gap = 0.75; // each side
-
-catch_depth = 0.75;
-catch_height = 0.35;
-catch_finger_height = 1.5;
-catch_finger_depth = 2.5;
-
-catch_topcurve_r = 5.0;
+thumbrecess_depth = 1.3;
+thumbrecess_width = 16.5;
+thumbrecess_topcurve_r = 5.0;
 
 prop_recess_under = 0.50;
 prop_recess_slop = 0.200; // each side
@@ -279,6 +271,9 @@ prop_prong_heel_slope = 0.5;
 
 lid_fold_clearance_antislop = 0.5;
 
+$button_leg_only = false;
+$suppress_forward_holes = false;
+
 // ---------- calculated ----------
 
 phone_width =  (phone + bumper*2)[0];
@@ -425,32 +420,28 @@ lid_fold_clearance_skew =
 
 echo("SK",lid_fold_clearance_skew);
 
-// catch
-
-cppJ = [ epp4[0] + catch_thickness, lpp10[1] ];
-cppA = cppJ + [lid_gap_x, -lid_gap_z];
-cppB = [ epp0[0], cppA[1] ];
-cppP = [ epp4[0], cppJ[1] ];
+// thumb recess (used to be "catch" hence cpp*
 
-cppS = cppJ + [0,-1] * catch_len;
-cppD = [ cppA[0], cppS[1] + catch_slop ];
-cppC = [ cppB[0], cppD[1] ];
-cppT = cppS + [1,0] * catch_depth;
-cppU = cppT + [0,-1] * catch_height;
-cppV = [ cppS[0], cppU[1] - catch_depth ];
-
-cppR = 0.5*(cppP + cppJ);
-
-cp_rQ = 0.5 * (cppJ[0] - cppP[0]);
-cppQ = [ cppR[0],
-        cppV[1] - (catch_finger_height - cp_rQ) ];
-cppF = [ cppV[0] + catch_finger_depth, cppC[1] ];
+cppA = epp4 + [thumbrecess_depth, 0];
+cppB = [ cppA[0], epp1[1] ];
 
 // lanyard
 
 ly_r = lanyard_half_dia / 2;
 ly_rc = ly_r * 2;
 
+ly_theta = -atan2vector(epp2i - epp1);
+ly_o = epp2i + 3 * ly_r * unitvector2d(epp1 - epp2i);
+
+max_case_bottom_edge_thickness =
+  case_th_bottom
+  + sin(ly_theta) * (epp2i-epp2o)[0];
+
+ly_q_z = -(ly_rc + ly_r);
+ly_re = max_case_bottom_edge_thickness - (-ly_q_z);
+
+ly_oec_y = lanyard_entry_rel_breadth * ly_r;
+
 // prop recess in case
 
 prop_x_pos = phone_width/2;
@@ -528,7 +519,7 @@ module EdgeProfile(){
 
 module LanyardLanyardProfile(entry=false){
   hull(){
-    for (xs=[-1,+1] * (entry ? 2 : 1))
+    for (xs=[-1,+1] * (entry ? lanyard_entry_rel_breadth : 1))
       translate(xs * 0.5 * lanyard_half_dia * [1,0])
        circle(r= lanyard_half_dia/2);
   }
@@ -553,8 +544,14 @@ module LanyardMainChannelProfile(){
   }
 }
 
+module LanyardEntryOuterProfile(){
+  circleat([ly_re + ly_r, 0], ly_re);
+}
+
 module LanyardEntry(){
-  q_z = -(ly_rc + ly_r);
+  q_z = ly_q_z;
+  oec_y = ly_oec_y;
+
   d_x = -ly_rc;
 
   translate([d_x, 0, q_z]) {
@@ -583,6 +580,30 @@ module LanyardEntry(){
       circleat([d_x, q_z], ly_rc);
     }
   }
+
+  translate([0,0,q_z]){
+    for (my=[0,1])
+      mirror([0,my,0]){
+       translate([0, oec_y, 0]){
+         difference(){
+           translate(ly_re * [-1,0,-2])
+             cube(ly_re * [2,1,2]);
+           rotate_extrude(convexity=10)
+             LanyardEntryOuterProfile();
+         }
+       }
+      }
+    difference(){
+      translate([-ly_re, -(oec_y + 0.01), -2*ly_re])
+       cube([ly_re*2, 2*(oec_y + 0.01), 2*ly_re]);
+      for (mx=[0,1])
+       mirror([mx,0,0])
+         rotate([90,0,0])
+         translate([0,0,-10])
+         linear_extrude(height=20)
+         LanyardEntryOuterProfile();
+    }
+  }
 }
 
 module LanyardCutout(l){
@@ -684,29 +705,30 @@ module ButtonPlan(l, deep, cut){
   }
 }
 
-module CatchCatchProfile(){
-  hull(){
-    for (c=[ cppR, cppQ ])
-      circleat(c, cp_rQ);
+module ButtonCoverReinf(){ ////toplevel
+  minkowski(){
+    rotate([90,0,0])
+      linear_extrude(height=0.01)
+      intersection(){
+        ButtonCoverProfile();
+       translate([bppJ[0] + 0.1, -50]) mirror([1,0])
+         square([100,100]);
+    }
+    mirror([0,0,1]) linear_extrude(height=0.01) intersection(){
+      circle(r= lid_buttoncover_reinf);
+      translate([-20,0]) square(40, center=true);
+    }
   }
-  hull(){
-    circleat(lpp12, lp_r12);
-    circleat(lpp12 + [5,0], lp_r12);
-    rectfromto(cppP, cppP + [5,0.1]);
+}
+
+module ThumbRecessCutProfile(){
+  difference(){
+    polygon([ cppA + [-10,0],
+             cppB + [-10,0],
+             cppB,
+             cppA ]);
+    circleat(epp1, r=case_th_side);
   }
-  polygon([cppJ, cppS, cppT, cppU, cppV, cppQ, cppR]);
-}
-
-module CatchCutProfile(){
-  polygon([ cppB,
-           cppA,
-           cppD,
-           cppF,
-           cppF + [0,-10],
-           cppF + [-10,-10],
-           lpp12 + [-10,0],
-           lpp12 + [10,0]
-           ]);
 }
 
 module Flip_rhs(yn=[0,1]) {
@@ -931,9 +953,9 @@ module HingePortion(x0,x1){
     children();
 }
 
-module CatchPortion(xwidth, ztop){
-  width = catch_width + xwidth;
-  w = width + catch_topcurve_r*2 + 1;
+module ThumbRecessApply(ztop){
+  width = thumbrecess_width;
+  w = width + thumbrecess_topcurve_r*2 + 1;
   translate([phone_width/2, 0,0]){
     difference(){
       rotate([90,0,-90])
@@ -944,10 +966,10 @@ module CatchPortion(xwidth, ztop){
        linear_extrude(height=100){
        for (m=[0,1]) mirror([m,0,0]) {
          hull(){
-           translate([w/2, ztop - catch_topcurve_r])
-             circle(catch_topcurve_r);
+           translate([w/2, ztop - thumbrecess_topcurve_r])
+             circle(thumbrecess_topcurve_r);
            translate([w/2, -50])
-             square(catch_topcurve_r*2, center=true);
+             square(thumbrecess_topcurve_r*2, center=true);
          }
        }
       }
@@ -1008,7 +1030,7 @@ module PropProfileAssignments(gamma){
   children();
 }
 
-module PropProfile(gamma, cut=0, rot=0){ ////toplevel
+module PropProfile(gamma, cut=0, rot=0){
   PropProfileAssignments(gamma){
 
     //#circleat($prpp3,1);
@@ -1133,9 +1155,11 @@ module Case(){ ////toplevel
     }
 
     // apertures along top edge
-    CaseAperture(jack_pos, jack_dia, 8);
-    Flip_rhs(1)
-      CaseAperture(noisecancelmic_pos, noisecancelmic_dia, 8);
+    if (!$suppress_forward_holes) {
+      CaseAperture(jack_pos, jack_dia, 8);
+      Flip_rhs(1)
+       CaseAperture(noisecancelmic_pos, noisecancelmic_dia, 8);
+    }
 
     OrdinaryRearApertures();
 
@@ -1152,9 +1176,16 @@ module Case(){ ////toplevel
     // screw holes in the hinge arms
     HingeScrews();
 
-    // catch striker
-    CatchPortion(catch_side_gap*2, epp4[1])
-      CatchCutProfile();
+    // thumb recess
+    ThumbRecessApply(epp4[1])
+      ThumbRecessCutProfile();
+
+    // lanyard
+    Flip_bot(1)
+      translate([ly_o[0], -(phone_cnr_rad + ly_re), ly_o[1]])
+      rotate([0, ly_theta, 0])
+      rotate([0,0,90])
+      LanyardCutout(lanyard_channel_len);
 
     // prop recess
     Flip_rhs(1)
@@ -1206,10 +1237,17 @@ module Lid(){ ////toplevel
            translate([0,0,-10])
            linear_extrude(height= 20)
            ButtonPlan($button_l, 1,0);
-         rotate([90,0,0])
-            translate([0,0,-100])
-           linear_extrude(height= 200)
-           ButtonCoverProfile();
+         union(){
+           rotate([90,0,0])
+             translate([0,0,-100])
+             linear_extrude(height= 200)
+             ButtonCoverProfile();
+           hull()
+             for (y= [-1,+1] * (($button_l + button_l_fudge)/2
+                                - lid_buttoncover_reinf))
+               translate([0,y,0])
+                 ButtonCoverReinf();
+         }
        }
       }
 
@@ -1218,10 +1256,6 @@ module Lid(){ ////toplevel
        LidEdgeProfile();
        HingeLidProfile();
       }
-
-      // catch
-      CatchPortion(0, lpp12[1])
-       CatchCatchProfile();
     }
     Struts(lpp10[0] + strut_min_at_end, lpp13[1], -case_th_lid);
 
@@ -1621,14 +1655,20 @@ module DemoProfiles(){ ////toplevel
   %EdgeProfile();
   KeeperProfile();
   translate([0,0,-1]) color("black") KeeperProfile(1);
-  color("purple") translate(epp2i)
-    rotate(atan2vector(epp2i - epp1)) {
-    translate(lanyard_half_dia * 0.5 * [-3,-1])
-      LanyardLanyardProfile();
-    translate(lanyard_half_dia * 0.5 * [-3,+1])
-      translate([0,-1] * case_th_side)
-      LanyardLanyardProfile(true);
+  translate(ly_o){
+    rotate(-ly_theta){
+      translate([0,0,+1]) color("purple") LanyardMainChannelProfile();
+      translate([0,0,+2]) color("red") LanyardCurveChannelProfile();
+      translate([0, ly_q_z]){
+       translate([0,0,-1]) color("blue") LanyardEntryChannelProfile();
+       translate([ly_oec_y,0,-2]) color("black") LanyardEntryOuterProfile();
+      }
+    }
   }
+  translate([0,0,-5]) color("white") translate(epp2i)
+    rotate(-ly_theta)
+    rectfromto([-15, 0],
+              [+15, -max_case_bottom_edge_thickness]);
 
   translate([0,20]) {
     LanyardMainChannelProfile();
@@ -1685,9 +1725,9 @@ module DemoProfiles(){ ////toplevel
   translate([20,-30]) {
     %EdgeProfile();
     %LidEdgeProfile();
-    //translate([0,0,1]) CatchCutProfile();
-    color("blue") CatchCatchProfile();
-    color("red") difference(){ EdgeProfile(); CatchCutProfile(); }
+    //translate([0,0,1]) ThumbRecessCutProfile();
+    translate([0,0,+1]) color("red")
+      difference(){ EdgeProfile(); ThumbRecessCutProfile(); }
   }
 
   translate([40,-30]) {