From 6dd18ab9f7dfdb3a0e45426c227d186279a8876f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 26 Jan 2018 17:23:37 +0000 Subject: [PATCH] fairphone-case: wip recesses for new prop Signed-off-by: Ian Jackson --- fairphone-case.scad | 147 +++++++++++++++----------------------------- 1 file changed, 48 insertions(+), 99 deletions(-) diff --git a/fairphone-case.scad b/fairphone-case.scad index f88a621..a41afd9 100644 --- a/fairphone-case.scad +++ b/fairphone-case.scad @@ -4,17 +4,7 @@ include phone = [ 75.0, 145.0 ]; -prop_lid_posns = [ 70 ]; // measured from bottom of phone - -prop_lengths = [ 80, 50 ]; - -prop_angle_specs = [ - // angle prop length index prop lid posn index - [ 15, 1, 0 ], - [ 30, 1, 0 ], - [ 45, 0, 0 ], - [ 60, 0, 0 ], - ]; +prop_angles = [ 15, 30, 45, 60 ]; bumper = [ 0.250, -0.025 ]; // ^ One side. Overall size is increased by twice this. @@ -120,20 +110,16 @@ catch_height = 0.35; catch_finger_height = 1.5; catch_finger_depth = 2.5; -prop_main_width = 3; -prop_wing_len = 3; -prop_nose_slope = 1.5; // bigger means pointier -prop_side_gap = 0.75; // each side -prop_fin_height = 1.5; -prop_fin_width = 0.75; -prop_max_angle = 45; // bigger means at worse angle -prop_recess_under = 0.30; -prop_backfwd_gap = 1.0; // total - -prop_recess_slop = 0.125; // each side +prop_recess_under = 0.50; +prop_recess_slop = 0.200; // each side prop_end_dia = 0.5; prop_main_th = 3; prop_taper_len = 6; +prop_main_width = 3; +prop_side_gap = 0.75; // each side +prop_caserecess_behind = 0.75; +prop_caserecess_taper = 0.25; // each side +prop_x_pos = 30; // ---------- calculated ---------- @@ -151,11 +137,13 @@ lid_buttoncover_overlap = case_th_lip + keeper_gap_z_top; phone_backside_slope_thick = phone_total_thick - phone_edge_thick; +prop_lidrecess_depth = case_th_lid - prop_recess_under; + prop_nose_len = case_th_lid - prop_recess_under; prop_recess_slope = tan(prop_max_angle); // bigger means steeper -prop_recess_depth = case_th_lid - prop_recess_under; prop_recess_width = prop_main_th / cos(prop_max_angle) + prop_backfwd_gap; + //lid_lip_overlap_width xxx bad name = ; //lid_lip_inner_slope = [ 5, 5 ]; // xxx @@ -255,19 +243,28 @@ cppQ = [ cppR[0], cppV[1] - (catch_finger_height - cp_rQ) ]; cppF = [ cppV[0] + catch_finger_depth, cppC[1] ]; -// prop recess - -prp1 = [0,0]; // by definition -prp2 = prp1 + [ -prop_recess_slope, -1 ] * prop_recess_depth; -prp4 = prp1 + [1,0] * prop_recess_width; -prp3 = [ prp4[0], prp2[1] ]; -prp5 = prp4 + [1,0] * prop_recess_depth; - // prop recess in lid +prl_r1 = prop_end_dia/2 + prop_recess_slop; // radius of end + prlp1 = [ lpp10[0] + prop_recess_slop + prop_end_dia/2, lpp10[1] + prop_recess_slop + prop_end_dia/2 ]; +// prop recess in case + +prcp2 = [ epp1[0], case_bottom_z ]; // protrusion corner + +prc_r2 = prop_end_dia/2 + prop_recess_slop; // radius of end + +prcp1_y = epp2o[1] - prop_recess_under - prc_r2; +prcp2_x = prcp2[0] + prop_caserecess_behind + prc_r2 + + (prcp1_y - case_bottom_z) * prop_caserecess_taper; +prcp2 = [ prcp1_x, prcp1_y ]; // centre of tip circle + +prop_recess_hw = 0.5 * prop_main_width + prop_side_gap; + +prop_caserecess_buildout_r = prcp2[0] - epp2o[0]; + // ---------- modules ---------- module KeeperProfile(slant=0){ @@ -603,65 +600,6 @@ module CatchPortion(width){ children(0); } -module PropRecess(){ - // origin is nonstandard - hwd345 = 0.5*prop_main_width + prop_side_gap; - hwd35 = 0.5*prop_fin_width + prop_side_gap; - rotate([90,0,90]){ - linextr(-hwd345, +hwd345) - polygon([ prp1, - prp2, - prp3, - prp4, - prp4 + [0,10], - prp1 + [0,10], - ]); - linextr(-hwd35, +hwd35) - polygon([ prp1, - prp3, - prp5, - prp5 + [0,10], - prp1 + [0,10], - ]); - } -} - -module SomePropProfile(gamma){ -// prop-internal - pip1 = [0,0]; - pip2 = [ 0.5 * (prop_main_th - prop_end_dia), - prop_taper_len ]; - - translate(prlp1) { - circleat([0,0], prop_end_dia/2); - cirecleat(pip2, prop_main_th); - - } -} - -module CasePropRecess(pas) { - // destructure entry in prop_angle_specs - beta = pas[0]; - b = prop_lengths [ pas[1] ]; - p = prop_lid_posns[ pas[2]] ; - - k = hp_k; - x = k / (2 * sin(beta/2)) - hppT[0]; - c = p + x; - - // https://en.wikipedia.org/wiki/Solution_of_triangles#Two_sides_and_non-included_angle_given_(SSA) [25.1.18] - // we always want the positive solution because it has a closer to c - a = c * cos(beta) + sqrt( b*b - pow(c * sin(beta),2) ); - q = a - x; - - echo(beta, a, b, c); - - Flip_bot(1) - translate([ phone_width/2, -q, case_bottom_z ]) - rotate([0,180,0]) - PropRecess(); -} - module CaseBase(){ AroundEdges(epp3[1], case_th_bottom, 1) EdgeProfile(); @@ -730,6 +668,15 @@ module Case(){ ////toplevel linear_extrude(height= 20) ButtonPlan($button_l, 1,1); } + + // buildout for prop recess + Flip_rhs(1) + linextr(-case_th_bottom, epp2i) + hull() { + for (dxs = [-1,+1]) + circleat([ prop_x_pos + dxs * prop_caserecess_buildout_r, + epp2o[0] ]); + } } // apertures along top edge @@ -756,9 +703,17 @@ module Case(){ ////toplevel CatchPortion(catch_width + catch_side_gap*2) CatchCutProfile(); - // prop recesses - #for (pas = prop_angle_specs) - CasePropRecess(pas); + // prop recess + Flip_rhs(1) + translate([0,0,x]) + rotate([90,0,90]) + linextr(-prop_recess_hw, +prop_recess_hw) + hull(){ + for (zs=[ -1,0,+1 ]) + circleat(prcp2 + 20*(abs(zs) * [0,-1] + + zs * [1,0] * prop_caserecess_taper), + pr_r2); + } } } @@ -793,12 +748,6 @@ module Lid(){ ////toplevel // screw holes in the hinge arms HingeScrews(); - - // prop recesses - Flip_bot(1) - for (y = prop_lid_posns) - translate([ phone_width/2, -y, lpp13[1] ]) - PropRecess(); } } -- 2.30.2