mirror of
https://github.com/kennetek/gridfinity-rebuilt-openscad.git
synced 2024-10-31 22:07:16 +00:00
84cbba7ee8
Motivated by [#147](https://github.com/kennetek/gridfinity-rebuilt-openscad/issues/147), I think it ends up more intuitive if upon opening the bin is actually a bin. From a first impression perspective, it seems unlikely a user is opening up the bins.scad to produce a bin-sized-blank vs. a bin.
177 lines
6.4 KiB
OpenSCAD
177 lines
6.4 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). Set to zero for default height. Units: mm
|
|
height_internal = 1;
|
|
// 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) {
|
|
|
|
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);
|
|
}
|
|
|
|
|
|
// ===== 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);
|
|
*/
|