From 5a4396f4805595278dda63c9943fb26bb13bfb31 Mon Sep 17 00:00:00 2001 From: kennetek Date: Sat, 1 Oct 2022 23:10:19 -0700 Subject: [PATCH] screw holes, file naming, and base dividing - screw holes toggle - renamed base file to utility to avoid confusion - base dividing will now always be safe to use on baseplates (cannot divide into sections that cannot be multiplied by an integer to equal 1) --- ...se.scad => gridfinity-rebuilt-utility.scad | 126 +++++++----------- gridfinity-rebuilt.scad | 71 ++++++---- .../gridfinity-spiral-vase.json | 46 +++++++ .../gridfinity-spiral-vase.scad | 14 +- 4 files changed, 145 insertions(+), 112 deletions(-) rename gridfinity-rebuilt-base.scad => gridfinity-rebuilt-utility.scad (81%) create mode 100644 gridfinity-spiral-vase/gridfinity-spiral-vase.json diff --git a/gridfinity-rebuilt-base.scad b/gridfinity-rebuilt-utility.scad similarity index 81% rename from gridfinity-rebuilt-base.scad rename to gridfinity-rebuilt-utility.scad index a83acc1..7634ca7 100644 --- a/gridfinity-rebuilt-base.scad +++ b/gridfinity-rebuilt-utility.scad @@ -1,22 +1,18 @@ // UTILITY FILE, DO NOT EDIT +// EDIT OTHER FILES IN REPO FOR RESULTS -// ===== Extra Math ===== // - -gzd = gridz_define; -dht = (gzd==0)?gridz*7 : (gzd==1)?h_bot+gridz+h_base : gridz-(enable_lip?3.8:0); -assert(dht > 0, "Height is too small!"); -dht2 = enable_zsnap?((abs(dht)%7==0)?dht:dht+7-abs(dht)%7):dht; -d_height = dht2-h_base; -r_scoop = length*((d_height-2)/7+1)/12 - r_f2; // scoop radius +dht = (gridz_define==0)?gridz*7 : (gridz_define==1)?h_bot+gridz+h_base : gridz-(enable_lip?3.8:0); +d_height = (enable_zsnap?((abs(dht)%7==0)?dht:dht+7-abs(dht)%7):dht)-h_base; d_wall2 = r_base-r_c1-d_clear*sqrt(2); -xl = gridx*length-2*d_clear-2*d_wall+d_div; +xl = gridx*length-2*d_clear-2*d_wall+d_div; yl = gridy*length-2*d_clear-2*d_wall+d_div; -echo("====="); -echo(height_total=d_height+h_base+(enable_lip?3.8:0)); -echo(effective_units=(d_height+h_base)/7); -echo("====="); +//echo("====="); +//echo(height_total=d_height+h_base+(enable_lip?3.8:0)); +//echo(effective_units=(d_height+h_base)/7); +//echo("====="); + // ===== User Modules ===== // // Creates an equally divided gridfinity bin. @@ -37,7 +33,7 @@ module gridfinityEqual(n_divx=1, n_divy=1, style_tab=1, enable_scoop=true) { // wrapper module // DOES NOT CHECK FOR VALID COMPARTMENT STRUCTURE module gridfinityCustom() { - if (gridz > 0) { + if (gridz > 0 && dht > 0) { difference() { color("firebrick") block_bottom(height_internal==0?d_height-0.1:height_internal); children(); @@ -72,48 +68,6 @@ module cut_move(x, y, w, h) { children(); } - - -module block_negative_chamfer(depth = 10, top = 0, bot = 0) { - bc = abs(bot); - tc = abs(top); - - hull() { - linear_extrude(2*(depth), center = true) - offset(-bc) - children(); - - linear_extrude(2*(depth-bc), center = true) - children(); - } - - if (tc != 0) - translate([0,0,tc]) - block_negative_chamfer(depth = tc*2, bot = tc, top = 0) - offset(delta = tc-0.01) - children(); -} - -module block_negative_fillet(depth = 10, bot_fillet = 0) { - bf = abs(bot_fillet); - - block_negative_chamfer(depth, 0, bf) - children(); - - minkowski() { - linear_extrude(2*(depth-bf), center = true) - offset(-bf) - children(); - - if (bf > 0) sphere(r = bf); - } -} - -module block_negative(depth) { - linear_extrude(2*depth, center=true) - children(); -} - // ===== Modules ===== // module profile_base() { @@ -128,17 +82,24 @@ module profile_base() { } module block_base() { + dbnxt = [for (i=[1:10]) if (abs(gridx*i)%1 < 0.001 || abs(gridx*i)%1 > 0.999) i]; + dbnyt = [for (i=[1:10]) if (abs(gridy*i)%1 < 0.001 || abs(gridy*i)%1 > 0.999) i]; + dbnx = 1/(div_base_auto ? len(dbnxt) > 0 ? dbnxt[0] : 1 : round(div_base_x)); + dbny = 1/(div_base_auto ? len(dbnyt) > 0 ? dbnyt[0] : 1 : round(div_base_y)); + xx = gridx*length-0.5; + yy = gridy*length-0.5; + translate([0,0,h_base]) - rounded_rectangle(gridx*length-0.5+0.002, gridy*length-0.5+0.002, h_bot/1.5, r_fo1/2+0.001); + rounded_rectangle(xx+0.002, yy+0.002, h_bot/1.5, r_fo1/2+0.001); intersection(){ translate([0,0,-1]) - rounded_rectangle(gridx*length-0.5+0.005, gridy*length-0.5+0.005, h_base+h_bot/2*10, r_fo1/2+0.001); + rounded_rectangle(xx+0.005, yy+0.005, h_base+h_bot/2*10, r_fo1/2+0.001); render() difference() { - pattern_linear2(gridx/divbasex, gridy/divbasey, divbasex*length, divbasey*length) - block_base_solid(); + pattern_linear2(gridx/dbnx, gridy/dbny, dbnx*length, dbny*length) + block_base_solid(dbnx, dbny); if (enable_holes) @@ -148,20 +109,22 @@ module block_base() { } } -module block_base_solid() { +module block_base_solid(dbnx, dbny) { + xx = dbnx*length-0.05; + yy = dbny*length-0.05; translate([0,0,h_base]) - mirror([0,0,1]) - union() { - hull() { - rounded_rectangle(divbasex*length-0.05-2*r_c2-2*r_c1,divbasey*length-0.05-2*r_c2-2*r_c1, h_base, r_fo3/2); - rounded_rectangle(divbasex*length-0.05-2*r_c2, divbasey*length-0.05-2*r_c2, h_base-r_c1, r_fo2/2); - } - hull() { - rounded_rectangle(divbasex*length-0.05-2*r_c2, divbasey*length-0.05-2*r_c2,r_c2, r_fo2/2); - mirror([0,0,1]) - rounded_rectangle(divbasex*length-0.05, divbasey*length-0.05, h_bot/2, r_fo1/2); - } + 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); } + hull() { + rounded_rectangle(xx-2*r_c2, yy-2*r_c2,r_c2, r_fo2/2); + mirror([0,0,1]) + rounded_rectangle(xx, yy, h_bot/2, r_fo1/2); + } + } } module block_base_hole() { @@ -170,11 +133,12 @@ module block_base_hole() { union() { difference() { cylinder(h = 2*(h_hole+(enable_hole_slit?0.2:0)), r = r_hole2, center=true); - if (enable_hole_slit) + if (enable_hole_slit && enable_screw) copy_mirror([0,1,0]) translate([-1.5*r_hole2,r_hole1+0.1,h_hole]) cube([r_hole2*3,r_hole2*3, 0.4]); } + if (enable_screw) cylinder(h = 3*h_base, r = r_hole1, center=true); } } @@ -376,14 +340,14 @@ module fillet_cutter(t = 0, c = "goldenrod") { } } -module profile_cutter(h, length, s) { - scoop = s ? r_scoop : 0; +module profile_cutter(h, l, s) { + scoop = s ? (length*((d_height-2)/7+1)/12-r_f2) : 0; translate([r_f2,r_f2]) hull() { - if (length-scoop-2*r_f2 > 0) + if (l-scoop-2*r_f2 > 0) square(0.1); if (scoop < h) { - translate([length-2*r_f2,h-r_f2/2]) + translate([l-2*r_f2,h-r_f2/2]) mirror([1,1]) square(0.1); @@ -392,18 +356,18 @@ module profile_cutter(h, length, s) { square(0.1); } difference() { - translate([length-scoop-2*r_f2, scoop]) + translate([l-scoop-2*r_f2, scoop]) if (scoop != 0) { intersection() { circle(scoop); mirror([0,1]) square(2*scoop); } } else mirror([1,0]) square(0.1); - translate([length-scoop-2*r_f2,-1]) - square([-(length-scoop-2*r_f2),2*h]); + translate([l-scoop-2*r_f2,-1]) + square([-(l-scoop-2*r_f2),2*h]); translate([0,h]) - square([2*length,scoop]); + square([2*l,scoop]); } } } diff --git a/gridfinity-rebuilt.scad b/gridfinity-rebuilt.scad index 158b90a..290d747 100644 --- a/gridfinity-rebuilt.scad +++ b/gridfinity-rebuilt.scad @@ -27,7 +27,7 @@ $fs = 0.25; /* [General Settings] */ // number of bases along x-axis -gridx = 2; +gridx = 2.5; // number of bases along y-axis gridy = 2; // bin height. See bin height information and "gridz_define" below. @@ -50,6 +50,8 @@ enable_hole_slit = true; enable_zsnap = false; // enable upper lip for stacking other bins enable_lip = true; +// disable the screw part of base holes +enable_screw = true; // internal fillet for easy part removal scoop = true; @@ -63,11 +65,12 @@ tab_style = 0; //[0:Full,1:Auto,2:Left,3:Center,4:Right,5:None] // overrides internal block height of bin (for solid containers). Leave zero for default height. Units: mm height_internal = 0; -/* [Test] */ -// multiplier for bases along X axis. For example, if you wanted a gridx of 1.5, setting this to 0.5 would get you 3 bases divided along X that are compatible with the provided length. (default: 1, intended to work between 0 and 1) -divbasex = 1; -// multiplier for bases along Y axis. For example, if you wanted a gridy of 1.5, setting this to 0.5 would get you 3 bases divided along Y that are compatible with the provided length. (default: 1, intended to work between 0 and 1) -divbasey = 1; +// Automatically guess the ideal base dividing values based on gridx and gridy (if they are integers, defaults to 1) +div_base_auto = true; +// number of divisions per 1 unit of base along the X axis. For instance, a value of 3 would make 3 mini-bases per length. (default 1, only use integers) +div_base_x = 1; +// number of divisions per 1 unit of base along the Y axis. For instance, a value of 3 would make 3 mini-bases per length. (default 1, only use integers) +div_base_y = 1; // ===== Commands ===== // @@ -76,34 +79,54 @@ color("tomato") // ===== Reference Dimensions ===== // /*[Other Miscellaneous Features]*/ -h_base = 5; // height of the base -r_base = 4; // outside rounded radius of bin -r_c1 = 0.8; // lower base chamfer "radius" -r_c2 = 2.4; // upper base chamfer "radius" -h_bot = 2.2; // bottom thiccness of bin -r_fo1 = 7.5+1; // outside radii +// height of the base +h_base = 5; +// outside rounded radius of bin +r_base = 4; +// lower base chamfer "radius" +r_c1 = 0.8; +// upper base chamfer "radius" +r_c2 = 2.4; +// bottom thiccness of bin +h_bot = 2.2; +// outside radii 1 +r_fo1 = 8.5; +// outside radii 2 r_fo2 = 3.2; +// outside radii 3 r_fo3 = 1.6; -r_hole1 = 1.5; // screw hole radius -r_hole2 = 3.25; // magnet hole radius -d_hole = 26; // center-to-center distance between holes -h_hole = 2.4; // magnet hole depth +// screw hole radius +r_hole1 = 1.5; +// magnet hole radius +r_hole2 = 3.25; +// center-to-center distance between holes +d_hole = 26; +// magnet hole depth +h_hole = 2.4; -r_f1 = 0.6; // top edge fillet radius -r_f2 = 2.8; // internal fillet radius +// top edge fillet radius +r_f1 = 0.6; +// internal fillet radius +r_f2 = 2.8; -d_div = 1.2; // width of divider between compartments -d_wall = 0.95; // minimum wall thickness -d_clear = 0.25; // tolerance fit factor +// width of divider between compartments +d_div = 1.2; +// minimum wall thickness +d_wall = 0.95; +// tolerance fit factor +d_clear = 0.25; -d_tabh = 15.85; // height of tab (yaxis, measured from inner wall) -d_tabw = length; // maximum width of tab +// height of tab (yaxis, measured from inner wall) +d_tabh = 15.85; +// maximum width of tab +d_tabw = 42; +// angle of tab a_tab = 36; // ===== Include ===== // -include +include diff --git a/gridfinity-spiral-vase/gridfinity-spiral-vase.json b/gridfinity-spiral-vase/gridfinity-spiral-vase.json new file mode 100644 index 0000000..3bee464 --- /dev/null +++ b/gridfinity-spiral-vase/gridfinity-spiral-vase.json @@ -0,0 +1,46 @@ +{ + "fileFormatVersion": "1", + "parameterSets": { + "New set 1": { + "$fa": "8", + "$fs": "0.25", + "a_tab": "40", + "bottom_layer": "3", + "d_clear": "0.25", + "d_div": "1.2", + "d_hole": "26", + "d_tabh": "15.85", + "d_wall": "0.94999999999999996", + "enable_funnel": "true", + "enable_holes": "true", + "enable_inset": "true", + "enable_lip": "true", + "enable_pinch": "true", + "enable_scoop_chamfer": "true", + "enable_zsnap": "false", + "gridx": "2", + "gridy": "2", + "gridz": "6", + "gridz_define": "0", + "h_base": "5", + "h_hole": "2.3999999999999999", + "layer": "0.34999999999999998", + "length": "42", + "n_divx": "3", + "nozzle": "0.59999999999999998", + "r_base": "4", + "r_c1": "0.80000000000000004", + "r_c2": "2.3999999999999999", + "r_f1": "0.59999999999999998", + "r_f2": "2.7999999999999998", + "r_fo1": "7.5", + "r_fo2": "3.2000000000000002", + "r_fo3": "1.6000000000000001", + "r_hole1": "1.5", + "r_hole2": "3.25", + "style_base": "0", + "style_tab": "0", + "type": "1" + } + } +} diff --git a/gridfinity-spiral-vase/gridfinity-spiral-vase.scad b/gridfinity-spiral-vase/gridfinity-spiral-vase.scad index 84534c3..82d46b9 100644 --- a/gridfinity-spiral-vase/gridfinity-spiral-vase.scad +++ b/gridfinity-spiral-vase/gridfinity-spiral-vase.scad @@ -2,15 +2,15 @@ $fa = 8; $fs = 0.25; +/* [Bin or Base] */ +type = 0; // [0:bin, 1:base] + // ===== COMMANDS ===== // color("tomato") -// Generate a single base -//gridfinityBaseVase(); - -// Generate the bin -gridfinityVase(); +if (type != 0) gridfinityBaseVase(); // Generate a single base +else gridfinityVase(); // Generate the bin // ==================== // @@ -116,7 +116,7 @@ a_tab = 40; // ===== Include ===== // -include <../gridfinity-rebuilt-base.scad> +include <../gridfinity-rebuilt-utility.scad> // ===== Constants ===== // @@ -128,7 +128,7 @@ f2c = sqrt(2)*(sqrt(2)-1); // fillet to chamfer ratio me = ((gridx*length-0.5)/n_divx)-nozzle*4-r_fo1-12.7-4; me2 = min(d_tabw/1.8 + max(0,me), d_tabw/1.25); m = me2; -d_ramp = f2c*r_scoop+d_wall2; +d_ramp = f2c*(length*((d_height-2)/7+1)/12-r_f2)+d_wall2; d_edge = ((gridx*length-0.5)/n_divx-d_tabw-r_fo1)/2; n_st = d_edge < 2 && style_tab != 0 && style_tab != 6 ? 1 : style_tab == 1 && n_divx <= 1? 0 : style_tab;