$fn=50; HIEGHT = 3; SLOT = 42; WALL_THINKNESS = 1; SOCKET_TOLLARANCE = 0.25; module square_rounded(size1, size2, r1, r2, h) { if (is_num(size1)) { size1 = [size1, size1]; size2 = [size2, size2]; square_rounded(size1, size2, r1, r2, h); } else { union() { difference() { translate([0, 0, h/2]) { cube([size1[0]-r1*2, size2[1], h], center=true); cube([size2[0], size1[1]-r1*2, h], center=true); } for(r=[ [ 0, size1[0], size1[1]], [ 90, size1[1], size1[0]], [180, size1[0], size1[1]], [-90, size1[1], size1[0]] ]) rotate([0, 0, r[0]]) translate([-r[1]/2, r[2]/2, 0]) rotate([-45, 0, 0]) cube([r[1], 2*h, 2*h]); } for(r=[ [ 0, size1[0], size1[1]], [ 90, size1[1], size1[0]], [180, size1[0], size1[1]], [-90, size1[1], size1[0]] ]) rotate([0, 0, r[0]]) translate([r[1]/2-r1, r[2]/2-r1]) cylinder(h=h, r1=r1, r2=r2); } } } module gf_bottom() { union() { square_rounded(size1=35.6, size2=37.2, r1=0.8, r2=1.6, h=0.8+0.001); translate([0, 0, 0.8]) square_rounded(size1=37.2, size2=37.2, r1=1.6, r2=1.6, h=1.8+0.001); translate([0, 0, 2.6]) square_rounded(size1=37.2, size2=41.5, r1=1.6, r2=3.75, h=2.15+0.001); } } module gf_inside_cut_top(size, fill=false) { hieght_mm = size[2]*7+5; add = [(size[0]-1) * 42, (size[1]-1) * 42]; t = WALL_THINKNESS; a = t*sin(45); b = t*tan(22.5); t2 = SOCKET_TOLLARANCE; a2 = t2*sin(45); b2 = t2*tan(22.5); c2 = t2/sin(45); union() { bot_l2_h = (4.75)+b; bot_l2_w = (41.5)-2*t; bot_l2_r = (3.75)-t; top_l0_h = hieght_mm-c2; top_l0_w = (41.5); top_l0_r = (3.75); top_l1_hd = (2.15)-c2+b2; top_l1_h = top_l0_h-top_l1_hd; top_l1_w = (37.2)+t2*2; top_l1_r = (1.6)+t2; top_l2_hd = (1.8)-b2; top_l2_h = top_l1_h-top_l2_hd; top_l2_w = (37.2)+t2*2; top_l2_r = (1.6)+t2; top_l3_hd = (bot_l2_w-top_l2_w)/2; top_l3_h = top_l2_h-top_l3_hd; top_l3_w = bot_l2_w; top_l3_r = bot_l2_r; top_l3f_hd = (0.7); top_l3f_h = top_l2_h-top_l3f_hd; top_l3f_w = top_l2_w-top_l3f_hd*2; top_l3f_r = top_l2_r-top_l3f_hd; // bottom layer 2 - top layer 3 if (!fill) translate([0, 0, bot_l2_h]) square_rounded(size1=[add[0]+bot_l2_w,add[1]+bot_l2_w], size2=[add[0]+top_l3_w,add[1]+top_l3_w], r1=bot_l2_r, r2=top_l3_r, h=top_l3_h-bot_l2_h+0.001); // top layer 3-0 if (!fill) translate([0, 0, top_l3_h+top_l3_hd+0.001]) rotate([180, 0]) square_rounded(size1=[add[0]+top_l2_w,add[1]+top_l2_w], size2=[add[0]+top_l3_w,add[1]+top_l3_w], r1=top_l2_r, r2=top_l3_r, h=top_l3_hd+0.001); if (fill) translate([0, 0, top_l3f_h]) square_rounded(size1=[add[0]+top_l3f_w,add[1]+top_l3f_w], size2=[add[0]+top_l2_w,add[1]+top_l2_w], r1=top_l3f_r, r2=top_l2_r, h=top_l3f_hd+0.001); // top layer 2-1 (top flat) translate([0, 0, top_l2_h]) square_rounded(size1=[add[0]+top_l2_w,add[1]+top_l2_w], size2=[add[0]+top_l1_w,add[1]+top_l1_w], r1=top_l2_r, r2=top_l1_r, h=top_l2_hd+0.001); // top layer 1-0 (top chan l) translate([0, 0, top_l1_h]) square_rounded(size1=[add[0]+top_l1_w,add[1]+top_l1_w], size2=[add[0]+top_l0_w,add[1]+top_l0_w], r1=top_l1_r, r2=top_l0_r, h=top_l1_hd+0.001); // something else translate([-size[0]*21, -size[1]*21, top_l0_h]) cube([size[0]*42, size[1]*42, hieght_mm-top_l0_h+1]); } } module gf_inside_cut_bot(size) { hieght_mm = size[2]*7+5; t = WALL_THINKNESS; a = t*sin(45); b = t*tan(22.5); t2 = SOCKET_TOLLARANCE; a2 = t2*sin(45); b2 = t2*tan(22.5); c2 = t2/sin(45); union() { bot_l0_h = t; bot_l0_w = (37.2)-2*a-((2.6)+a-t)*2; bot_l0_r = (1.6)-a; bot_l1_h = (2.6)+a; bot_l1_hd = bot_l1_h-bot_l0_h; bot_l1_w = (37.2)-2*a; bot_l1_r = (1.6)-a; bot_l2_h = (4.75)+b; bot_l2_hd = bot_l2_h-bot_l1_h; bot_l2_w = (41.5)-2*t; bot_l2_r = (3.75)-t; // bottom layer 0-1 (bott chan s, bot flat) translate([0, 0, bot_l1_h+0.001]) rotate([180,0,0]) linear_extrude(height = bot_l1_hd, scale = bot_l0_w/bot_l1_w) translate([-(bot_l1_w/2-bot_l1_r), -(bot_l1_w/2-bot_l1_r)]) minkowski() { square([bot_l1_w-bot_l1_r*2, bot_l1_w-bot_l1_r*2]); circle(r=bot_l1_r); } // bottom layer 1-2 (bot chan l) translate([0, 0, bot_l1_h]) square_rounded(size1=bot_l1_w, size2=bot_l2_w, r1=bot_l1_r, r2=bot_l2_r, h=bot_l2_hd+0.001); } } GF_BAKJE_MODE_DEFALT=0; GF_BAKJE_MODE_DEEP=1; GF_BAKJE_MODE_FILLED=2; GF_BAKJE_MODE_PARFILL=3; module gf_bakje(size=[1,1,4], mode=GF_BAKJE_MODE_DEFALT, fill_dis=0) { hieght_mm = size[2]*7+5; intersection() { difference() { union() { difference() { union() { translate(-[size[0]-1,size[1]-1]*21) for (x = [0:size[0]-1]) for (y = [0:size[1]-1]) translate([x*42, y*42]) gf_bottom(); translate([-size[0]*21+0.25+3.75, -size[1]*21+0.25+3.75, 4.75]) linear_extrude(hieght_mm-4.75) minkowski() { square([size[0]*42-0.5-3.75*2, size[1]*42-0.5-3.75*2]); circle(r=3.75); } } gf_inside_cut_top(size, fill=(mode==GF_BAKJE_MODE_FILLED)); if (mode == GF_BAKJE_MODE_DEEP) { translate(-[size[0]-1,size[1]-1]*21) for (x = [0:size[0]-1]) for (y = [0:size[1]-1]) translate([x*42, y*42]) gf_inside_cut_bot(); } } if (mode == GF_BAKJE_MODE_DEEP) { // inside point for grid shape union() { translate(-[size[0],size[1]]*21) for (x = [1:size[0]-1]) translate([x*42, size[1]*42/2, 5]) rotate([0, 45, 0]) cube([2, size[1]*42-1, 2], center=true); translate(-[size[0],size[1]]*21) for (y = [1:size[1]-1]) translate([size[0]*42/2, y*42, 5]) rotate([45, 0, 0]) cube([size[0]*42-1, 2, 2], center=true); // corner rounding translate([-size[0]*21,-size[1]*21]) for (x = [0:size[0]]) for (y = [0:size[1]]) translate([x*42, y*42, 5.75]) difference() { cube([3.75*2+.5, 3.75*2+.5, 1.3], center=true); for (r = [0:90:360]) rotate([0, 0, r]) translate([3.75+.25, 3.75+.25, -1.3/2-0.001]) cylinder(h=1.302, r1=(3.65)-WALL_THINKNESS, r2=(3.65)-WALL_THINKNESS+1.3); } } } if (mode == GF_BAKJE_MODE_DEFALT || mode == GF_BAKJE_MODE_PARFILL) translate([0, 0, (mode == GF_BAKJE_MODE_PARFILL) ? fill_dis/2+5.5 : 5.5]) cube([ size[0]*42-0.5-WALL_THINKNESS*2, size[1]*42-0.5-WALL_THINKNESS*2, (mode == GF_BAKJE_MODE_PARFILL) ? fill_dis : 1 ], center=true); } // bottom cut for git shape translate(-[size[0],size[1]]*21) for (x = [1:size[0]-1]) translate([x*42, size[1]*42/2, 3.59]) rotate([0, 45, 0]) cube([2, size[1]*42-1, 2], center=true); translate(-[size[0],size[1]]*21) for (y = [1:size[1]-1]) translate([size[0]*42/2, y*42, 3.59]) rotate([45, 0, 0]) cube([size[0]*42-1, 2, 2], center=true); // bottom cut for intersections translate([-size[0]*21,-size[1]*21]) for (x = [0:size[0]]) for (y = [0:size[1]]) translate([x*42, y*42, 4.6]) difference() { cube([3.75*2+.5, 3.75*2+.5, 0.8], center=true); for (r = [0:90:360]) rotate([0, 0, r]) translate([3.75+.25, 3.75+.25, -0.401]) cylinder(h=0.804, r1=3.7-0.5, r2=3.7+0.3); } } square_rounded(size1 = [size[0]*42-.5, size[1]*42-.5], size2 = [size[0]*42-.5, size[1]*42-.5], r1 = 3.75, r2 = 3.75, h = hieght_mm); } } module gf_socket_cut() { t = 0.25; a = sin(45)*t; b = a*tan(22.5); c = t/sin(45); translate([0, 0, -a]) union() { square_rounded(size1=35.6+a*2, size2=37.2+2*t, r1=0.8+a, r2=1.6+t, h=0.8+b+0.001); translate([0, 0, 0.8+b]) square_rounded(size1=37.2+2*t, size2=37.2+2*t, r1=1.6+t, r2=1.6+t, h=1.8+b+0.001); translate([0, 0, 2.6+b]) square_rounded(size1=37.2+2*t, size2=41.5+2*c, r1=1.6+t, r2=3.75+c, h=2.15+a-b-0.001); } } if (RENDER_GF_BASE) { gf_bakje([WIDTH, DEPTH, HIEGHT], mode=MODE); } gf_bakje([2, 2, 5], mode=1);