mirror of
https://github.com/kennetek/gridfinity-rebuilt-openscad.git
synced 2024-12-22 14:53:25 +00:00
Merge branch 'main' into pre-commit
This commit is contained in:
commit
3a485537da
6 changed files with 133 additions and 40 deletions
|
@ -1,7 +1,7 @@
|
|||
## Introduction
|
||||
Gridfinity rebuilt aims to remake the brilliant Gridfinity project from [Zack Freedman](https://www.youtube.com/c/ZackFreedman/about) in a more robust and open-source way than the original Fusion 360 files. Many major CAD suites struggle with making parametric models constructed from linear patterns, due to changing fillet edges and seams. Thus, a pure mathematical approach using OpenSCAD can allow a single solution for all possible bin variants.
|
||||
|
||||
The project has expanded into more eccentric models that use modules from the original generator. This wiki aims to document these modules in great detail.
|
||||
The [project](https://github.com/kennetek/gridfinity-rebuilt-openscad/) has expanded into more eccentric models that use modules from the original generator. This wiki aims to document these modules in great detail.
|
||||
|
||||
Models are generated subtractively. First, the solid bin and bases are constructed, and then the compartments and holes are removed. This allows for internal fillets that nearly match the originals. However, they are not exactly perfect. There are some fillets that are too small and too difficult to be worth implementing, as most printers do not have a high enough resolution for it to matter.
|
||||
|
||||
|
|
|
@ -72,13 +72,13 @@ module gridfinityBaseplate(gridx, gridy, length, dix, diy, sp, sm, sh, fitx, fit
|
|||
|
||||
gx = gridx == 0 ? floor(dix/length) : gridx;
|
||||
gy = gridy == 0 ? floor(diy/length) : gridy;
|
||||
dx = max(gx*length-0.5, dix);
|
||||
dy = max(gy*length-0.5, diy);
|
||||
dx = max(gx*length-bp_xy_clearence, dix);
|
||||
dy = max(gy*length-bp_xy_clearence, diy);
|
||||
|
||||
off = calculate_off(sp, sm, sh);
|
||||
|
||||
offsetx = dix < dx ? 0 : (gx*length-0.5-dix)/2*fitx*-1;
|
||||
offsety = diy < dy ? 0 : (gy*length-0.5-diy)/2*fity*-1;
|
||||
offsetx = dix < dx ? 0 : (gx*length-bp_xy_clearence-dix)/2*fitx*-1;
|
||||
offsety = diy < dy ? 0 : (gy*length-bp_xy_clearence-diy)/2*fity*-1;
|
||||
|
||||
difference() {
|
||||
translate([offsetx,offsety,h_base])
|
||||
|
|
|
@ -29,17 +29,31 @@ $fs = 0.25;
|
|||
|
||||
/* [General Settings] */
|
||||
// number of bases along x-axis
|
||||
gridx = 5;
|
||||
gridx = 3;
|
||||
// number of bases along y-axis
|
||||
gridy = 5;
|
||||
gridy = 2;
|
||||
// bin height. See bin height information and "gridz_define" below.
|
||||
gridz = 6;
|
||||
|
||||
/* [Compartments] */
|
||||
/* [Linear Compartments] */
|
||||
// number of X Divisions (set to zero to have solid bin)
|
||||
divx = 1;
|
||||
// number of y Divisions (set to zero to have solid bin)
|
||||
divy = 1;
|
||||
divx = 0;
|
||||
// number of Y Divisions (set to zero to have solid bin)
|
||||
divy = 0;
|
||||
|
||||
/* [Cylindrical Compartments] */
|
||||
// number of cylindrical X Divisions (mutually exclusive to Linear Compartments)
|
||||
cdivx = 0;
|
||||
// number of cylindrical Y Divisions (mutually exclusive to Linear Compartments)
|
||||
cdivy = 0;
|
||||
// orientation
|
||||
c_orientation = 2; // [0: x direction, 1: y direction, 2: z direction]
|
||||
// diameter of cylindrical cut outs
|
||||
cd = 10;
|
||||
// cylinder height
|
||||
ch = 1;
|
||||
// spacing to lid
|
||||
c_depth = 1;
|
||||
|
||||
/* [Height] */
|
||||
// determine what the variable "gridz" applies to based on your use case
|
||||
|
@ -73,11 +87,16 @@ div_base_y = 0;
|
|||
color("tomato") {
|
||||
gridfinityInit(gridx, gridy, height(gridz, gridz_define, style_lip, enable_zsnap), height_internal) {
|
||||
|
||||
if (divx > 0 && divy > 0)
|
||||
if (divx > 0 && divy > 0) {
|
||||
|
||||
cutEqual(n_divx = divx, n_divy = divy, style_tab = style_tab, scoop_weight = scoop);
|
||||
|
||||
} else if (cdivx > 0 && cdivy > 0) {
|
||||
|
||||
cutCylinders(n_divx=cdivx, n_divy=cdivy, cylinder_diameter=cd, cylinder_height=ch, coutout_depth=c_depth, orientation=c_orientation);
|
||||
}
|
||||
}
|
||||
gridfinityBase(gridx, gridy, l_grid, div_base_x, div_base_y, style_hole, only_corners=only_corners);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -62,8 +62,8 @@ gridfinityLite(gridx, gridy, gridz, gridz_define, style_lip, enable_zsnap, l_gri
|
|||
|
||||
// ===== CONSTRUCTION ===== //
|
||||
|
||||
|
||||
module gridfinityLite(gridx, gridy, gridz, gridz_define, style_lip, enable_zsnap, length, div_base_x, div_base_y, style_hole, only_corners) {
|
||||
union() {
|
||||
difference() {
|
||||
union() {
|
||||
gridfinityInit(gridx, gridy, height(gridz, gridz_define, style_lip, enable_zsnap), 0, length)
|
||||
|
@ -94,4 +94,43 @@ module gridfinityLite(gridx, gridy, gridz, gridz_define, style_lip, enable_zsnap
|
|||
}
|
||||
|
||||
}
|
||||
difference() {
|
||||
translate([0,0,-1.6])
|
||||
difference() {
|
||||
difference() {
|
||||
union() {
|
||||
|
||||
gridfinityInit(gridx, gridy, height(gridz, gridz_define, style_lip, enable_zsnap), 0, length)
|
||||
children();
|
||||
}
|
||||
|
||||
difference() {
|
||||
|
||||
intersection() {
|
||||
difference() {
|
||||
gridfinityBase(gridx, gridy, length, div_base_x, div_base_y, style_hole, -d_wall*2, false, only_corners=only_corners);
|
||||
translate([-gridx*length/2,-gridy*length/2,2*h_base])
|
||||
cube([gridx*length,gridy*length,1000]);
|
||||
}
|
||||
translate([0,0,-1])
|
||||
rounded_rectangle(gridx*length-0.5005-d_wall*2, gridy*length-0.5005-d_wall*2, 1000, r_f2);
|
||||
translate([0,0,bottom_layer])
|
||||
rounded_rectangle(gridx*1000, gridy*1000, 1000, r_f2);
|
||||
}
|
||||
|
||||
|
||||
translate([0,0,-4*h_base])
|
||||
gridfinityInit(gridx, gridy, height(20,0), 0, length)
|
||||
children();
|
||||
}
|
||||
|
||||
}
|
||||
translate([0,0,9])
|
||||
rounded_rectangle(gridx*1000, gridy*1000, gridz*1000, gridz);
|
||||
}
|
||||
translate([0,0,0])
|
||||
rounded_rectangle(gridx*1000, gridy*1000, 5, r_f2);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,39 @@ module cutEqual(n_divx=1, n_divy=1, style_tab=1, scoop_weight=1) {
|
|||
cut((i-1)*$gxx/n_divx,(j-1)*$gyy/n_divy, $gxx/n_divx, $gyy/n_divy, style_tab, scoop_weight);
|
||||
}
|
||||
|
||||
// Creates equally divided cylindrical cutouts
|
||||
//
|
||||
// n_divx: number of x cutouts
|
||||
// n_divy: number of y cutouts
|
||||
// set n_div values to 0 for a solid bin
|
||||
// cylinder_diameter: diameter of cutouts
|
||||
// cylinder_height: height of cutouts
|
||||
// coutout_depth: offset from top to solid part of container
|
||||
// orientation: orientation of cylinder cutouts (0 = x direction, 1 = y direction, 2 = z direction)
|
||||
module cutCylinders(n_divx=1, n_divy=1, cylinder_diameter=1, cylinder_height=1, coutout_depth=0, orientation=0) {
|
||||
rotation = (orientation == 0)
|
||||
? [0,90,0]
|
||||
: (orientation == 1)
|
||||
? [90,0,0]
|
||||
: [0,0,0];
|
||||
|
||||
gridx_mm = $gxx*l_grid;
|
||||
gridy_mm = $gyy*l_grid;
|
||||
padding = 2;
|
||||
cutout_x = gridx_mm - d_wall*2;
|
||||
cutout_y = gridy_mm - d_wall*2;
|
||||
|
||||
cut_move(x=0, y=0, w=$gxx, h=$gyy) {
|
||||
translate([0,0,-coutout_depth]) {
|
||||
rounded_rectangle(cutout_x, cutout_y, coutout_depth*2, r_base);
|
||||
|
||||
pattern_linear(x=n_divx, y=n_divy, sx=(gridx_mm - 2)/n_divx, sy=(gridy_mm - 2)/n_divy)
|
||||
rotate(rotation)
|
||||
cylinder(r=cylinder_diameter/2, h=cylinder_height*2, center=true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// initialize gridfinity
|
||||
module gridfinityInit(gx, gy, h, h0 = 0, l = l_grid) {
|
||||
$gxx = gx;
|
||||
|
|
|
@ -69,6 +69,8 @@ bp_rcut_width = 8.5;
|
|||
bp_rcut_length = 4.25;
|
||||
// Baseplate bottom cutout rounded thingy depth
|
||||
bp_rcut_depth = 2;
|
||||
// Baseplate clearence offset
|
||||
bp_xy_clearence = 0.5;
|
||||
// countersink diameter for baseplate
|
||||
d_cs = 2.5;
|
||||
// radius of cutout for skeletonized baseplate
|
||||
|
|
Loading…
Reference in a new issue