// -*- C -*-
-// xxx from actual ksafe
-bolt_above = 4;
-wall_thick = 4;
-bolthole_height = 4;
-bolthole_width = 10;
-main_sz = 30;
-cnr_rad = 10;
-lidinner_thick_allow = 20;
+// from actual ksafe
+bolt_above = 8.50 - 0.50;
+bolthole_height = 4.24 + 1.00;
+wall_thick = 4.50;
+bolthole_width = 16.62 + 1.00;
+main_sz = 149.06 - 0.25;
+cnr_rad = 19.5;
+lidinner_thick_allow = 20.78 + 0.50;
+display_width = 69.81 - 0.50;
+
+dpp3 = [ -5.5, 8.5 ];
+dpp2 = [ -11.0, 7.0 ];
+dpp1 = [ -34.0, 14.0 ];
// other parameters
web_thick = 4;
bolthole_rhs = 20;
bolthole_lhs = 20;
boltreinf_thick = 6;
-anchor_wall_space = 45;
+anchor_wall_space = 25;
base_thick = 4;
space = 25;
anchor_thick = 4;
anchor_rad = 4;
-bevel = 15;
+bevel = 8;
+string_slot = 3.0;
+string_depth = 6.0;
+thumbslot_depth = 5.0;
+thumbslot_width = 15.0;
+thumbslot_between = 10;
+ksafecover_lip = 4.62;
+display_rhs_secs = 15;
+dcover_endthick = 3.0;
+dcover_mainthick = 5.0;
+dcover_slop_height = 0.35;
+dcover_slop_depth = 0.25;
+dcover_slop_inside = 1.50;
+dcover_commonvertoff = 0.00; // slop_height or slop_inside is added too
+dcover_edge_gap_more_width = 2.0; // each side
// ----- calculated -----
+hsz = main_sz/2;
+cut = main_sz + 20;
+
gppA = [0,0];
gppB = gppA - [ wall_thick, 0 ];
gppL = [ gppB[0], -(lidinner_thick_allow + space + base_thick) ];
+yw1 = -web_thick/2;
+yw2 = yw1 - bolthole_rhs;
+yw3 = yw2 - anchor_thick;
+yw4 = yw3 - anchor_wall_space;
+yw5 = yw4 - wall_thick;
+yw6 = -(hsz - cnr_rad + 0.1);
+
+yw10 = web_thick/2;
+yw11 = yw2 + anchor_wall_space;
+yw12 = yw11 + wall_thick;
+yw13 = -yw6;
+
+cpp1 = dpp1 + [ dcover_slop_depth, dcover_slop_height ];
+cpp2 = [ dpp2[0] - dcover_slop_depth, dpp3[1] + dcover_slop_height ];
+cppH = cpp1 + [ 0, dcover_endthick ];
+cppA = [ cpp2[0], dpp3[1] + dcover_slop_inside ];
+cppK = cppA + [ 0, dcover_mainthick ];
+cppZ = [ -ksafecover_lip, -dcover_commonvertoff ];
+cppD = cppZ + [ 0, -dcover_slop_inside ];
+cppC = [ dcover_slop_inside, cppD[1] ];
+cppF = cppC + dcover_mainthick * [1,-1];
+cppB = [ cppC[0], cppA[1] ];
+cppG = [ cppF[0], cppK[1] ];
+cppE = [ cppD[0], cppF[1] - (cppF[0] - cppD[0]) ];
+
// anchor
anchor_b = anchor_thick + anchor_rad;
$xppF,
$xppF + [1,0],
$xppI + [1,0],
- $xppJ ]);
+ $xppJ ],
+ convexity=10);
}
polygon([ $xppE,
$xppF,
$xppF + [0,1],
- $xppE + [1,0] ]);
+ $xppE + [1,0] ],
+ convexity=10);
translate(appM) circle(r= anchor_b);
}
translate(appM) circle(r= anchor_rad);
polygon([ $xppE,
$xppF,
$xppI,
- $xppJ ]);
+ $xppJ ],
+ convexity=10);
}
}
}
$xppE,
$xppF,
$gppS,
- $gppR ]);
+ $gppR ],
+ convexity=10);
} else {
polygon([ $gppP,
$xppE,
$xppF,
$gppS,
- $gppP + web_height * [1,0] ]);
+ $gppP + web_height * [1,0] ],
+ convexity=10);
}
polygon([ $gppS,
$xppF,
$xppF + [1,0],
- $gppS + [1,0] ]);
+ $gppS + [1,0] ],
+ convexity=10);
+ }
+}
+
+module SomeBaseProfile(I, F){
+ polygon([ I,
+ F,
+ [ hsz+1, F[1] ],
+ [ hsz+1, I[1] ] ]);
+}
+
+module BaseProfile(){
+ SomeBaseProfile($xppI, $xppF);
+}
+
+module DCoverProfileRaw(){
+ polygon([ cpp1,
+ cpp2,
+ cppA,
+ cppB,
+ cppC,
+ cppD,
+ cppE,
+ cppF,
+ cppG,
+ cppK,
+ cppH ],
+ convexity = 10);
+}
+
+module DCoverProfile(){
+ mirror([1,0])
+ translate(-cppZ)
+ DCoverProfileRaw();
+}
+
+module SWalls(ymin, ymax, t_bevel) {
+ upp_app_Vars(t_bevel) {
+ translate([0,ymin,0])
+ mirror([0,1,0])
+ rotate([90,0,0])
+ linear_extrude(height= ymax-ymin, convexity=10)
+ for (xm=[0,1])
+ mirror([xm,0])
+ translate([-hsz, 0])
+ children();
+ }
+}
+
+module AtTwoCorners(){
+ for (xm=[0,1]) {
+ mirror([xm,0,0])
+ translate((hsz - cnr_rad) * [1,1])
+ intersection(){
+ rotate_extrude(convexity=10)
+ translate([-cnr_rad,0])
+ children();
+ translate([0,0,-250])
+ cube([50,50,500]);
+ }
+ }
+}
+
+module Box(){
+ /// corners, and front and back of base
+ for (ym=[0,1]) mirror([0,ym,0]) {
+ AtTwoCorners(){
+ UsualProfile();
+ }
+ hull() AtTwoCorners(){
+ upp_app_Vars(bevel){
+ polygon([ $xppI,
+ $xppF,
+ $xppF + [0.1, 0],
+ $xppI + [0.1, 0]
+ ]);
+ }
+ }
+ }
+
+ // side walls and base
+ SWalls(yw6 , yw4 , bevel ) { UsualProfile(); BaseProfile(); }
+ SWalls(yw5 , yw4 , a_bevel) { AnchorWallProfile(); BaseProfile(); }
+ SWalls(yw5 , yw12, a_bevel) { NearAnchorProfile(); BaseProfile(); }
+ SWalls(yw3 , yw2 , a_bevel) { AnchorProfile(); BaseProfile(); }
+ SWalls(yw11, yw12, a_bevel) { AnchorWallProfile(); BaseProfile(); }
+ SWalls(yw11, yw13, bevel ) { UsualProfile(); BaseProfile(); }
+ SWalls(yw1, yw10, a_bevel) { WebProfile(); SomeBaseProfile($gppS, $xppF); }
+
+ // front and rear walls
+ rotate([0,0,90]) SWalls(yw6, yw13, bevel) UsualProfile();
+}
+
+module DCover(){ ////toplevel
+ translate([ -display_width/2, -hsz, 0 ])
+ rotate([0,90,0])
+ rotate([0,0,90])
+ linear_extrude( display_width - display_rhs_secs, convexity = 10)
+ DCoverProfile();
+}
+
+module DCoverSupportAllowance(){
+ translate([0, -hsz, 0])
+ cube(center=true,
+ [ display_width + 2 * dcover_edge_gap_more_width,
+ wall_thick * 2,
+ dcover_slop_inside * 2 + 0.01 ]);
+}
+
+module BoltHoles(){
+ translate([0,0, -(bolt_above + 0.5 * bolthole_height)])
+ cube(center=true, [ cut, bolthole_width, bolthole_height ]);
+}
+
+module KsafeBase(){ ////toplevel
+ DCover();
+
+ difference(){
+ Box();
+
+ BoltHoles();
+
+ // string slot
+ translate([ -cut,
+ -(bolthole_width/2 + bolthole_rhs),
+ 1 ])
+ mirror([0,1,0]) mirror([0,0,1])
+ cube([ cut*2,
+ string_slot,
+ lidinner_thick_allow + string_depth + 1 ]);
+
+ // thumb slots
+ for (mx=[0,1]) mirror([mx,0,0]) {
+ translate([ thumbslot_between/2,
+ 0,
+ -thumbslot_depth ])
+ cube([ thumbslot_width,
+ cut,
+ thumbslot_depth+1 ]);
+ }
+
+ DCoverSupportAllowance();
}
}
-module DemoProfiles(){
+module DemoProfiles(){ ////toplevel
translate([0,0,-2]) color("yellow") AnchorWallProfile();
color("red") AnchorProfile();
translate([0,0,2]) color("black") NearAnchorProfile();
translate([0,0,4]) color("blue") UsualProfile();
translate([0,0,-4]) color("pink") WebProfile();
+ translate([0,0,6]) color("purple") DCoverProfile();
+}
+
+module RimTest(){ ////toplevel
+ intersection(){
+ Box();
+ cube(center=true, [ main_sz*2, main_sz*2,
+ 2.5 ]);
+ }
+}
+
+module DCoverTest(){ ////toplevel
+ intersection(){
+ difference(){
+ union(){
+ Box();
+ DCover();
+ }
+ DCoverSupportAllowance();
+ BoltHoles();
+ }
+ translate([0,0,60])
+ cube(center=true, [ main_sz*2, main_sz*2,
+ 2 * (60 + 10) ]);
+ }
+}
+
+module BoltTest(){ ////toplevel
+ dy = 0.5 * (bolthole_width+4);
+ intersection(){
+ KsafeBase();
+ translate([ 0, -dy, -(bolt_above + bolthole_height + 1) ])
+ cube([ main_sz, dy*2, 50 ]);
+ }
}
-DemoProfiles();
+//DemoProfiles();
+//Box();
+//KsafeBase();
+//RimTest();