mirror of
https://github.com/kennetek/gridfinity-rebuilt-openscad.git
synced 2024-12-22 23:03:28 +00:00
196 lines
No EOL
7 KiB
OpenSCAD
196 lines
No EOL
7 KiB
OpenSCAD
include <gridfinity-rebuilt-utility.scad>
|
|
|
|
// ===== INFORMATION ===== //
|
|
/*
|
|
IMPORTANT: rendering will be better for analyzing the model if fast-csg is enabled. As of writing, this feature is only available in the development builds and not the official release of OpenSCAD, but it makes rendering only take a couple seconds, even for comically large bins. Enable it in Edit > Preferences > Features > fast-csg
|
|
the magnet holes can have an extra cut in them to make it easier to print without supports
|
|
tabs will automatically be disabled when gridz is less than 3, as the tabs take up too much space
|
|
base functions can be found in "gridfinity-rebuilt-utility.scad"
|
|
examples at end of file
|
|
|
|
BIN HEIGHT
|
|
the original gridfinity bins had the overall height defined by 7mm increments
|
|
a bin would be 7*u millimeters tall
|
|
the lip at the top of the bin (3.8mm) added onto this height
|
|
The stock bins have unit heights of 2, 3, and 6:
|
|
Z unit 2 -> 7*2 + 3.8 -> 17.8mm
|
|
Z unit 3 -> 7*3 + 3.8 -> 24.8mm
|
|
Z unit 6 -> 7*6 + 3.8 -> 45.8mm
|
|
|
|
https://github.com/kennetek/gridfinity-rebuilt-openscad
|
|
|
|
*/
|
|
|
|
// ===== PARAMETERS ===== //
|
|
|
|
/* [Setup Parameters] */
|
|
$fa = 8;
|
|
$fs = 0.25;
|
|
|
|
/* [General Settings] */
|
|
// number of bases along x-axis
|
|
gridx = 3;
|
|
// number of bases along y-axis
|
|
gridy = 2;
|
|
// bin height. See bin height information and "gridz_define" below.
|
|
gridz = 6;
|
|
|
|
/* [Linear Compartments] */
|
|
// number of X Divisions (set to zero to have solid bin)
|
|
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
|
|
gridz_define = 0; // [0:gridz is the height of bins in units of 7mm increments - Zack's method,1:gridz is the internal height in millimeters, 2:gridz is the overall external height of the bin in millimeters]
|
|
// overrides internal block height of bin (for solid containers). Leave zero for default height. Units: mm
|
|
height_internal = 0;
|
|
// snap gridz height to nearest 7mm increment
|
|
enable_zsnap = false;
|
|
|
|
/* [Features] */
|
|
// the type of tabs
|
|
style_tab = 1; //[0:Full,1:Auto,2:Left,3:Center,4:Right,5:None]
|
|
// how should the top lip act
|
|
style_lip = 0; //[0: Regular lip, 1:remove lip subtractively, 2: remove lip and retain height]
|
|
// scoop weight percentage. 0 disables scoop, 1 is regular scoop. Any real number will scale the scoop.
|
|
scoop = 1; //[0:0.1:1]
|
|
// only cut magnet/screw holes at the corners of the bin to save uneccesary print time
|
|
only_corners = false;
|
|
|
|
/* [Base] */
|
|
style_hole = 4; // [0:no holes, 1:magnet holes only, 2: magnet and screw holes - no printable slit, 3: magnet and screw holes - printable slit, 4: Gridfinity Refined hole - no glue needed]
|
|
// 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;
|
|
|
|
|
|
|
|
// ===== IMPLEMENTATION ===== //
|
|
|
|
color("tomato") {
|
|
gridfinityInit(gridx, gridy, height(gridz, gridz_define, style_lip, enable_zsnap), height_internal) {
|
|
|
|
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) {
|
|
rotation = (c_orientation == 0)
|
|
? [0,90,0]
|
|
: (c_orientation == 1)
|
|
? [90,0,0]
|
|
: [0,0,0];
|
|
|
|
gridx_mm = gridx*l_grid;
|
|
gridy_mm = gridy*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=gridx, h=gridy) {
|
|
translate([0,0,-c_depth]) {
|
|
rounded_rectangle(cutout_x, cutout_y, c_depth*2, r_base);
|
|
|
|
pattern_linear(x=cdivx, y=cdivy, sx=(gridx_mm - 2)/cdivx, sy=(gridy_mm - 2)/cdivy)
|
|
rotate(rotation)
|
|
cylinder(r=cd/2, h=ch*2, center=true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
gridfinityBase(gridx, gridy, l_grid, div_base_x, div_base_y, style_hole, only_corners=only_corners);
|
|
}
|
|
|
|
|
|
// ===== EXAMPLES ===== //
|
|
|
|
// 3x3 even spaced grid
|
|
/*
|
|
gridfinityInit(3, 3, height(6), 0, 42) {
|
|
cutEqual(n_divx = 3, n_divy = 3, style_tab = 0, scoop_weight = 0);
|
|
}
|
|
gridfinityBase(3, 3, 42, 0, 0, 1);
|
|
*/
|
|
|
|
// Compartments can be placed anywhere (this includes non-integer positions like 1/2 or 1/3). The grid is defined as (0,0) being the bottom left corner of the bin, with each unit being 1 base long. Each cut() module is a compartment, with the first four values defining the area that should be made into a compartment (X coord, Y coord, width, and height). These values should all be positive. t is the tab style of the compartment (0:full, 1:auto, 2:left, 3:center, 4:right, 5:none). s is a toggle for the bottom scoop.
|
|
/*
|
|
gridfinityInit(3, 3, height(6), 0, 42) {
|
|
cut(x=0, y=0, w=1.5, h=0.5, t=5, s=0);
|
|
cut(0, 0.5, 1.5, 0.5, 5, 0);
|
|
cut(0, 1, 1.5, 0.5, 5, 0);
|
|
|
|
cut(0,1.5,0.5,1.5,5,0);
|
|
cut(0.5,1.5,0.5,1.5,5,0);
|
|
cut(1,1.5,0.5,1.5,5,0);
|
|
|
|
cut(1.5, 0, 1.5, 5/3, 2);
|
|
cut(1.5, 5/3, 1.5, 4/3, 4);
|
|
}
|
|
gridfinityBase(3, 3, 42, 0, 0, 1);
|
|
*/
|
|
|
|
// Compartments can overlap! This allows for weirdly shaped compartments, such as this "2" bin.
|
|
/*
|
|
gridfinityInit(3, 3, height(6), 0, 42) {
|
|
cut(0,2,2,1,5,0);
|
|
cut(1,0,1,3,5);
|
|
cut(1,0,2,1,5);
|
|
cut(0,0,1,2);
|
|
cut(2,1,1,2);
|
|
}
|
|
gridfinityBase(3, 3, 42, 0, 0, 1);
|
|
*/
|
|
|
|
// Areas without a compartment are solid material, where you can put your own cutout shapes. using the cut_move() function, you can select an area, and any child shapes will be moved from the origin to the center of that area, and subtracted from the block. For example, a pattern of three cylinderical holes.
|
|
/*
|
|
gridfinityInit(3, 3, height(6), 0, 42) {
|
|
cut(x=0, y=0, w=2, h=3);
|
|
cut(x=0, y=0, w=3, h=1, t=5);
|
|
cut_move(x=2, y=1, w=1, h=2)
|
|
pattern_linear(x=1, y=3, sx=42/2)
|
|
cylinder(r=5, h=1000, center=true);
|
|
}
|
|
gridfinityBase(3, 3, 42, 0, 0, 1);
|
|
*/
|
|
|
|
// You can use loops as well as the bin dimensions to make different parametric functions, such as this one, which divides the box into columns, with a small 1x1 top compartment and a long vertical compartment below
|
|
/*
|
|
gx = 3;
|
|
gy = 3;
|
|
gridfinityInit(gx, gy, height(6), 0, 42) {
|
|
for(i=[0:gx-1]) {
|
|
cut(i,0,1,gx-1);
|
|
cut(i,gx-1,1,1);
|
|
}
|
|
}
|
|
gridfinityBase(gx, gy, 42, 0, 0, 1);
|
|
*/
|
|
|
|
// Pyramid scheme bin
|
|
/*
|
|
gx = 4.5;
|
|
gy = 4;
|
|
gridfinityInit(gx, gy, height(6), 0, 42) {
|
|
for (i = [0:gx-1])
|
|
for (j = [0:i])
|
|
cut(j*gx/(i+1),gy-i-1,gx/(i+1),1,0);
|
|
}
|
|
gridfinityBase(gx, gy, 42, 0, 0, 1);
|
|
*/ |