X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=fairphone-case.scad;h=600b18f0f80840d9451677fca8b4da08162fcba4;hb=0391eb5230c5b4a7710a5ebd4a108e21734da934;hp=a4fc59fab1efa35304efbc36f758338cef5873db;hpb=67c90f7ce0d5bc86a81967f53add66dae867b223;p=reprap-play.git diff --git a/fairphone-case.scad b/fairphone-case.scad index a4fc59f..600b18f 100644 --- a/fairphone-case.scad +++ b/fairphone-case.scad @@ -121,7 +121,7 @@ prop_main_width = 3; prop_side_gap = 0.75; // each side prop_lidrecess_behind = 0.75; prop_caserecess_behind = 0.75; -prop_caserecess_taper = 0.35; // one side only +prop_caserecess_taper = 0.45; // one side only prop_prop_gap = 0.5; prop_prong_heel_slope = 0.5; @@ -622,11 +622,12 @@ module CaseBase(){ EdgeProfile(); } -module PropProfile(gamma, cut=0){ ////toplevel +function prop_x(gamma) = hp_k / (2 * sin(gamma/2)) - hppT[0]; + +module PropProfile(gamma, cut=0, rot=0){ ////toplevel // https://en.wikipedia.org/wiki/Solution_of_triangles#Two_sides_and_the_included_angle_given_(SAS) - k = hp_k; + x = prop_x(gamma); p = phone_height - prlp10[0] - hppB[0]; - x = k / (2 * sin(gamma/2)) - hppT[0]; b = p + x; q = phone_height - hppT[0]; // prpp7[0] is 0 by definition @@ -636,7 +637,7 @@ module PropProfile(gamma, cut=0){ ////toplevel theta = 90 - alpha; beta = 180 - alpha - gamma; - psi = 90 - beta + atan(prop_caserecess_taper); + psi = 90 - beta; echo("abc", a,b,c); @@ -683,13 +684,13 @@ module PropProfile(gamma, cut=0){ ////toplevel } rectfromto(prpp12 + [0,-0.1], prpp3); } - %hull(){ + hull(){ circleat(prpp1, prp_r1); rectfromto(prpp12 + [0,-0.1], prpp3); } } // main shaft - rotate([0,0, cut ? -theta : 0]){ + rotate([0,0, rot*-theta]){ hull(){ extra = cut ? prop_recess_slop : 0; rectfromto(prpp6, prpp9); @@ -699,6 +700,17 @@ module PropProfile(gamma, cut=0){ ////toplevel } } +module PropAggregateProfile(){ + for (angle = prop_angles) + PropProfile(angle, 0,0); +} + +module Prop(){ ////toplevel + hw = prop_main_width/2; + linextr(-hw, +hw) + PropAggregateProfile(); +} + module Case(){ ////toplevel difference(){ union(){ @@ -844,6 +856,15 @@ module Lid(){ ////toplevel // screw holes in the hinge arms HingeScrews(); + + // prop recess + translate([prop_x_pos, -prlp10[0], prlp10[1]]) + rotate([90,0,90]) + linextr(-prop_recess_hw, +prop_recess_hw) + mirror([1,0]) + hull() + for (pa = prop_angles) + PropProfile(pa, 1,1); } } @@ -972,19 +993,6 @@ module LidPrint(){ ////toplevel Lid(); } -module TestSelectPropRecesses(posns){ - linextr(-100,100){ - translate([phone_width/2, -phone_height]){ - square([ 3, 500 ], center=true); - for (y=posns) - hull() - for (dy=[ -prp5[0], -prp2[0] ]) - translate([0,y+dy]) - square([prop_main_width+5, 5], center=true); - } - } -} - module TestSelectFrame(){ include = [1,-1] * (epp2i[0] + 4); @@ -998,7 +1006,6 @@ module TestSelectFrame(){ module TestSelectLidFrame(){ TestSelectFrame(); - TestSelectPropRecesses(prop_lid_posns); } module TestFrameCase(){ ////toplevel @@ -1041,6 +1048,39 @@ module HingeScrews(){ } } +module DemoPropAngleSelect(c){ + color(c) difference(){ + union(){ children(); } + translate([ prop_x_pos, -400, -200 ]) + cube([ 400,800,400 ]); + } +} + +module DemoPropAngle(ang){ + hL = [0, -(phone_height - hppT[0]), hppT[1]]; + hC = [0, -(phone_height - hppB[0]), hppB[1] + hp_k*2]; + + DemoPropAngleSelect("red") Case(); + + translate([0,0, -hp_k*2]) + translate(hC) + rotate([-ang/2,0,0]) + translate(-hC) + translate(hL) + rotate([-ang/2,0,0]) + translate(-hL) + DemoPropAngleSelect("blue") Lid(); + + color("orange") + translate([prop_x_pos, -prlp10[0], prlp10[1]]) + rotate([90,0,90]) + Prop(); +} + +module DemoPropAngles(){ ////toplevel + DemoPropAngle(15); +} + module DemoFrame(){ ////toplevel color("red") TestFrameCase(); color("blue") intersection(){ Lid(); TestSelectLidFrame(); } @@ -1109,12 +1149,15 @@ module DemoProfiles(){ ////toplevel translate([40,-30]) { difference(){ - %LidEdgeProfile(); - //translate(prlp10) - //PropProfile(10, 1); + LidEdgeProfile(); + translate(prlp10) + PropProfile(10, 1, 0); } translate(prlp10) - PropProfile(60, 0); + PropProfile(15, 0); + } + translate([60,-30]) { + PropAggregateProfile(); } }