X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=fairphone-case.scad;h=ff067db6bbc92ae078d3cd318fc1002912c1049e;hb=013ba6f9b5604a291f19969948133731ed29c1d6;hp=fdd879ad6c022d78d71ed7ee0d8ecdf081d3e0b8;hpb=215770041463207b6ccae5e91c02aa96ca139b0b;p=reprap-play.git diff --git a/fairphone-case.scad b/fairphone-case.scad index fdd879a..ff067db 100644 --- a/fairphone-case.scad +++ b/fairphone-case.scad @@ -118,6 +118,7 @@ // this case will meet your needs. include +include phone = [ 75.0, 145.0 ]; @@ -167,8 +168,8 @@ noisecancelmic_dia = 4.00; //fingerpushhole_dias = [ 15, 18 ]; fingerpushhole_dias = []; -lanyard_half_dia = 1.0; - +lanyard_half_dia = 1.15; +lanyard_entry_rel_breadth = 2; rearspeaker_pos_bl = [ 12.64, 18.72 ]; rearspeaker_size = [ 3.76, 7.36 ]; @@ -445,6 +446,15 @@ cppQ = [ cppR[0], cppV[1] - (catch_finger_height - cp_rQ) ]; cppF = [ cppV[0] + catch_finger_depth, cppC[1] ]; +// lanyard + +ly_r = lanyard_half_dia / 2; +ly_rc = ly_r * 2; + +ly_theta = -atan2vector(epp2i - epp1); + +ly_re = 10; // xxx + // prop recess in case prop_x_pos = phone_width/2; @@ -520,14 +530,108 @@ module EdgeProfile(){ } } -module LanyardLanyardProfile(){ +module LanyardLanyardProfile(entry=false){ hull(){ - for (xs=[-1,+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); } } +module LanyardCurveChannelProfile(){ + translate([0, -ly_r]) + LanyardLanyardProfile(); +} + +module LanyardEntryChannelProfile(){ + LanyardLanyardProfile(true); +} + +module LanyardMainChannelProfile(){ + LanyardCurveChannelProfile(); + difference(){ + square(center=true, ly_r * [6, 2]); + for (xs=[-1,+1]) + translate(ly_r * [3 * xs, -1]) + circle(r = ly_r); + } +} + +module LanyardEntryOuterProfile(){ + circleat([ly_re + ly_r, 0], ly_re); +} + +module LanyardEntry(){ + q_z = -(ly_rc + ly_r); + d_x = -ly_rc; + + oec_y = lanyard_entry_rel_breadth * ly_r; + + translate([d_x, 0, q_z]) { + intersection(){ + rotate([90,0,0]) + rotate_extrude(convexity=10) + rotate(90) + translate([0, -q_z]) + LanyardCurveChannelProfile(); + translate([0,-10,0]) + cube([20,20,20]); + } + } + + mirror([0,0,1]) + translate([0,0,-1]) + linear_extrude(height=20) + rotate(-90) + LanyardEntryChannelProfile(); + + translate([0, ly_r*2, 0]) + rotate([90,0,0]) + linear_extrude(height = ly_r*4){ + difference(){ + rectfromto([d_x, q_z], [ly_r, 0]); + 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){ + rotate([0,-90,0]) + linear_extrude(height=l) + rotate(-90) + LanyardMainChannelProfile(); + + for (ee=[0,1]){ + translate(ee * l * [-1,0]) + mirror([ee,0,0]) + LanyardEntry(); + } +} + module LidEdgeProfile(){ polygon([ lpp10, lpp11, @@ -1523,6 +1627,10 @@ module DemoFrame(){ ////toplevel %HingeLever(); } +module DemoLanyardCutout(){ ////toplevel + LanyardCutout(25); +} + module DemoHingedFrame(){ ///toplevel color("red") TestFrameCase(); translate([0,0, -2*hp_k]) @@ -1547,7 +1655,20 @@ module DemoProfiles(){ ////toplevel %EdgeProfile(); KeeperProfile(); translate([0,0,-1]) color("black") KeeperProfile(1); - color("purple") LanyardLanyardProfile(); + color("purple") translate(epp2i) + rotate(-ly_theta) { + 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([0,20]) { + LanyardMainChannelProfile(); + translate([0,0,1]) color("purple") LanyardCurveChannelProfile(); + translate([0,0,-1]) color("red") LanyardEntryChannelProfile(); + } translate([20,0]) { LidEdgeProfile();