From b717689c32ef7e361c9db686e13410a12f9dcf6e Mon Sep 17 00:00:00 2001 From: kennetek Date: Tue, 11 Oct 2022 18:34:02 -0700 Subject: [PATCH] moved func to baseplate file, organized features functions in the utility file should be more applicable to "extension" modules, so the baseplate generation was moved to its file. Removed some constants that should be defined by already existing constants. Altered the base generator function to make an accurate model instead of using a scale. --- gridfinity-constants.scad | 29 ++++---- gridfinity-rebuild-baseplate.scad | 108 ++++++++++++++++++++++++++---- gridfinity-rebuilt-utility.scad | 77 +++------------------ 3 files changed, 119 insertions(+), 95 deletions(-) diff --git a/gridfinity-constants.scad b/gridfinity-constants.scad index 3207641..7726bf7 100644 --- a/gridfinity-constants.scad +++ b/gridfinity-constants.scad @@ -49,24 +49,9 @@ d_magic = -2*d_clear-2*d_wall+d_div; // Baseplate constants -// Baseplate top part height (weigthed=false part) -bp_h_top = 4.65; - // Baseplate bottom part height (part added with weigthed=true) bp_h_bot = 6.4; -// Baseplate z offset -bp_z_offset = 0.1; - -// Baaseplate fitting clearance -bp_clear = 0.5; - -// Baseplate countersink hole biggest diameter -bp_csink_d1 = 8.5; - -// Baseplate countersink hole height -bp_csink_h = 2.5; - // Baseplate bottom cutout rectangle size bp_cut_size = 21.4; @@ -80,4 +65,16 @@ bp_rcut_width = 8.5; bp_rcut_length = 4.25; // Baseplate bottom cutout rounded thingy depth -bp_rcut_depth = 2; \ No newline at end of file +bp_rcut_depth = 2; + +// countersink diameter for baseplate +d_cs = 2.5; + +// radius of cutout for skeletonized baseplate +r_skel = 2; + +// baseplate counterbore radius +r_cb = 2.75; + +// baseplate counterbore depth +h_cb = 3; diff --git a/gridfinity-rebuild-baseplate.scad b/gridfinity-rebuild-baseplate.scad index 3da6deb..e2553b9 100644 --- a/gridfinity-rebuild-baseplate.scad +++ b/gridfinity-rebuild-baseplate.scad @@ -20,25 +20,107 @@ gridy = 2; // base unit length = 42; -/* [Base] */ -style_hole = 1; // [0:no holes, 1:magnet holes only, 2: magnet and screw holes - no printable slit, 3: magnet and screw holes - printable slit, 4: magnet and countersunk screw holes] -// number of divisions per 1 unit of base along the X axis. (default 1, only use integers. 0 means automatically guess the right division) -div_base_x = 0; -// number of divisions per 1 unit of base along the Y axis. (default 1, only use integers. 0 means automatically guess the right division) -div_base_y = 0; +/* [Styles] */ -/* [Togglles] */ +// baseplate styles +style_plate = 2; // [0: thin, 1:weighted, 2:skeletonized] -// weigthed baseplate with possibility for magnet / screw holes -weigthed = true; +// enable magnet hole +style_magnet = true; + +// hole styles +style_hole = 2; // [0:none, 1:contersink, 2:counterbore] -// cutout in the bottom for weigthed baseplate only -bottom_cutout = true; // ===== Commands ===== // -color("tomato") { +color("tomato") +gridfinityBaseplate(gridx, gridy, length, style_plate, style_magnet, style_hole); - baseplate(gridx, gridy, length, div_base_x, div_base_y, style_hole, weigthed, bottom_cutout); +// Baseplate modules +module gridfinityBaseplate(gridx, gridy, length, sp, sm, sh) { + + off = (sp==0?0:sp==1?bp_h_bot:1+(sm?h_hole:0)+(sh==0?0:sh==1?d_cs:h_cb)); + difference() { + translate([0,0,h_base]) + mirror([0,0,1]) + rounded_rectangle(gridx*length-0.5, gridy*length-0.5, h_base+off, r_base); + + gridfinityBase(gridx, gridy, length, 1, 1, 0, 0.5, false); + + translate([0,0,h_base-0.6]) + rounded_rectangle(gridx*length*2, gridy*length*2, h_base*2, r_base); + + pattern_linear(gridx, gridy, length) { + if (sm) + block_base_hole(1); + + if (sp == 1) { + translate([0,0,-off]) + cutter_weight(); + } else if (sp == 2) { + linear_extrude(10*(h_base+off), center = true) + profile_skeleton(); + } + + if (sh == 1) { + pattern_circular(4) + translate([d_hole/2, d_hole/2, 0]) { + cylinder(r = r_hole1+d_clear, h = 10*(h_base+off), center = true); + + translate([0,0,d_cs-off]) + mirror([0,0,1]) + hull() { + cylinder(h = d_cs+10, r=r_hole1+d_clear); + translate([0,0,d_cs]) + cylinder(h=d_cs+10, r=r_hole1+d_clear+d_cs); + } + } + } else if (sh == 2) { + pattern_circular(4) + translate([d_hole/2,d_hole/2,-off]) { + cylinder(h=10*(h_base+off), r=r_hole1+d_clear, center=true); + difference() { + cylinder(h = 2*(h_cb+0.2), r=r_cb, center=true); + copy_mirror([0,1,0]) + translate([-1.5*r_cb,r_hole1+0.1,h_cb]) + cube([r_cb*3,r_cb*3, 0.4]); + } + } + } + + } + } +} + +module cutter_weight(){ + union() { + linear_extrude(bp_cut_depth*2,center=true) + square(bp_cut_size, center=true); + pattern_circular(4) + translate([0,10,0]) + linear_extrude(bp_rcut_depth*2,center=true) + union() { + square([bp_rcut_width, bp_rcut_length], center=true); + translate([0,bp_rcut_length/2,0]) + circle(d=bp_rcut_width); + } + } +} + +module profile_skeleton() { + l = length-2*r_c2-2*r_c1; + minkowski() { + difference() { + square([l-2*r_skel+2*d_clear,l-2*r_skel+2*d_clear], center = true); + pattern_circular(4) + translate([d_hole/2,d_hole/2,0]) + minkowski() { + square([l,l]); + circle(r_hole2+r_skel+2); + } + } + circle(r_skel); + } } \ No newline at end of file diff --git a/gridfinity-rebuilt-utility.scad b/gridfinity-rebuilt-utility.scad index df782fc..0f0f9bc 100644 --- a/gridfinity-rebuilt-utility.scad +++ b/gridfinity-rebuilt-utility.scad @@ -79,7 +79,7 @@ module profile_base() { ]); } -module gridfinityBase(gx, gy, l, dx, dy, style_hole, block_scale=1, final_cut=true) { +module gridfinityBase(gx, gy, l, dx, dy, style_hole, off=0, final_cut=true) { dbnxt = [for (i=[1:5]) if (abs(gx*i)%1 < 0.001 || abs(gx*i)%1 > 0.999) i]; dbnyt = [for (i=[1:5]) if (abs(gy*i)%1 < 0.001 || abs(gy*i)%1 > 0.999) i]; dbnx = 1/(dx==0 ? len(dbnxt) > 0 ? dbnxt[0] : 1 : round(dx)); @@ -91,15 +91,14 @@ module gridfinityBase(gx, gy, l, dx, dy, style_hole, block_scale=1, final_cut=tr rounded_rectangle(xx+0.002, yy+0.002, h_bot/1.5, r_fo1/2+0.001); intersection(){ - if(final_cut) { + if (final_cut) translate([0,0,-1]) rounded_rectangle(xx+0.005, yy+0.005, h_base+h_bot/2*10, r_fo1/2+0.001); - } + render() difference() { pattern_linear(gx/dbnx, gy/dbny, dbnx*l, dbny*l) - scale([block_scale,block_scale,1]) - block_base_solid(dbnx, dbny, l); + block_base_solid(dbnx, dbny, l, off); if (style_hole > 0) pattern_linear(gx, gy, l) @@ -108,25 +107,26 @@ module gridfinityBase(gx, gy, l, dx, dy, style_hole, block_scale=1, final_cut=tr } } -module block_base_solid(dbnx, dbny, l) { +module block_base_solid(dbnx, dbny, l, o) { xx = dbnx*l-0.05; yy = dbny*l-0.05; + oo = (o/2)*(sqrt(2)-1); translate([0,0,h_base]) mirror([0,0,1]) union() { hull() { - rounded_rectangle(xx-2*r_c2-2*r_c1,yy-2*r_c2-2*r_c1, h_base, r_fo3/2); - rounded_rectangle(xx-2*r_c2, yy-2*r_c2, h_base-r_c1, r_fo2/2); + rounded_rectangle(xx-2*r_c2-2*r_c1+o,yy-2*r_c2-2*r_c1+o, h_base+oo, r_fo3/2); + rounded_rectangle(xx-2*r_c2+o, yy-2*r_c2+o, h_base-r_c1+oo, r_fo2/2); } hull() { - rounded_rectangle(xx-2*r_c2, yy-2*r_c2,r_c2, r_fo2/2); + rounded_rectangle(xx-2*r_c2+o, yy-2*r_c2+o,r_c2+oo, r_fo2/2); mirror([0,0,1]) - rounded_rectangle(xx, yy, h_bot/2, r_fo1/2); + rounded_rectangle(xx+o, yy+o, h_bot/2+oo, r_fo1/2); } } } -module block_base_hole(style_hole, cs_z=0) { +module block_base_hole(style_hole) { pattern_circular(4) translate([d_hole/2, d_hole/2, 0]) union() { @@ -140,11 +140,6 @@ module block_base_hole(style_hole, cs_z=0) { } if (style_hole > 1) cylinder(h = 3*h_base, r = r_hole1, center=true); - - if (style_hole == 4 && cs_z != 0) - translate([0,0,cs_z]) - cylinder(bp_csink_h, d2=bp_csink_d1, r1=r_hole1); - } } @@ -385,56 +380,6 @@ module profile_cutter_tab(h, tab, ang) { } -// Baseplate modules -module baseplate(gridx, gridy, length, div_base_x, div_base_y, style_hole, weighted, bottom_cutout) { - - scale_factor = (bp_clear / (length /100)) /100 + 1; - - union() { - difference(){ - rounded_rectangle(gridx*length, gridy*length, bp_h_top + bp_z_offset - 0.001, r_base); - translate([0,0,-bp_z_offset]) - - gridfinityBase(gridx, gridy, length, div_base_x, div_base_y, 0, scale_factor, false); - } - - if(weighted) { - difference() { - translate([0,0,-1*(bp_h_bot - bp_clear)]) - rounded_rectangle(gridx*length, gridy*length, bp_h_bot, r_base); - - pattern_linear(gridx, gridy, length) - union() { - if (style_hole != 0) { - rotate([180,0,0]) - block_base_hole(style_hole, bp_h_bot - bp_z_offset - bp_csink_h); - } - - if (bottom_cutout) { - translate([0,0,-1*(bp_h_bot + bp_z_offset)]) - bottom_cutout(); - } - } - } - } - } -} - -module bottom_cutout(){ - union() { - linear_extrude(bp_cut_depth) - square(bp_cut_size, center=true); - pattern_circular(4) - translate([0,10,0]) - linear_extrude(bp_rcut_depth) - union() { - square([bp_rcut_width, bp_rcut_length], center=true); - translate([0,bp_rcut_length/2,0]) - circle(d=bp_rcut_width); - } - } -} - // ==== Utilities ===== function clp(x,a,b) = min(max(x,a),b);