From 42cef2a02ef8942b893b9afae6555cc32043a251 Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Fri, 13 Jan 2023 03:47:52 +0100 Subject: initial --- .gitignore | 2 ++ README.md | 12 +++++++ example.scad | 6 ++++ gridfinity.scad | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 example.scad create mode 100644 gridfinity.scad diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..928e078 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.gcode +*.stl diff --git a/README.md b/README.md new file mode 100644 index 0000000..5f92c88 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# gridfinity-scad + +[GridFinity](https://gridfinity.xyz/) implementation for [OpenSCAD](https://openscad.org/) + +## Example + +```scad +use + +// Arguments are in GridFinity units +gridfinity(2, 1, 2, lip=true, magnets=false); +``` diff --git a/example.scad b/example.scad new file mode 100644 index 0000000..f53385c --- /dev/null +++ b/example.scad @@ -0,0 +1,6 @@ +use + +difference() { + gridfinity(2, 1, 1, lip=true, magnets=false); + translate([21,0,5.2]) linear_extrude(4) rounded_square(78, 36, 0.8); +} diff --git a/gridfinity.scad b/gridfinity.scad new file mode 100644 index 0000000..9c71723 --- /dev/null +++ b/gridfinity.scad @@ -0,0 +1,104 @@ +$fn = 30; + +// https://gridfinity.xyz/specification/ + +height = 7; +width = 42; +width_tolerance = 41.5; +rounding = 3.75; + +module rounding(r,angle) { + rotate(angle,[0,0,1]) + translate([-r + 0.01, -r + 0.01]) + difference() { + square([r,r]); + circle(r); + } +} + +module rounded_square(lx, ly, r) { + difference() { + square([lx,ly],center=true); + union() { + translate([ lx/2, ly/2]) rounding(r, 0 ); + translate([-lx/2, ly/2]) rounding(r, 90 ); + translate([-lx/2,-ly/2]) rounding(r, 180); + translate([ lx/2,-ly/2]) rounding(r, 270); + } + } +} + +module magnet_hole(h = 0) { + linear_extrude(2.5) circle(3.25); + translate([0,0,2.5]) linear_extrude(h) circle(1.5); +} + +module base_solid() { + hull() { + linear_extrude(0.1)rounded_square(35.6, 35.6, 0.8); + translate([0,0,0.8]) linear_extrude(1.8) rounded_square(37.2, 37.2, 1.6); + } + translate([0,0,2.6]) hull() { + linear_extrude(0.1) rounded_square(37.2, 37.2, 1.6); + translate([0,0,2.15]) linear_extrude(0.1)rounded_square(41.5, 41.5, 3.75); + } +} + +module base(magnets = false) { + l = 35.6; + o = 4.8; + + difference() { + base_solid(); + if (magnets) union() { + translate([ l/2 - o, l/2 - o, -0.01]) magnet_hole(); + translate([-l/2 + o, l/2 - o, -0.01]) magnet_hole(); + translate([ l/2 - o, -l/2 + o, -0.01]) magnet_hole(); + translate([-l/2 + o, -l/2 + o, -0.01]) magnet_hole(); + } + } +} + +module stacking_lip_negative(ux, uy) { + x1 = (width * ux) -5.2 -0.5; + y1 = (width * uy) -5.2 -0.5; + x2 = (width * ux) -3.8 -0.5; + y2 = (width * uy) -3.8 -0.5; + x3 = (width * ux) -0.5; + y3 = (width * uy) -0.5; + + // translate and scale are here to make sure the negative pokes through + // the positive block + translate([0,0,-0.001]) scale([1,1,1.001]) hull() { + linear_extrude(0.01)rounded_square(x1, y1, 0.7); + translate([0,0,0.7]) linear_extrude(1.8) rounded_square(x2, y2, 1.6); + } + translate([0,0,2.5]) hull() { + linear_extrude(0.01) rounded_square(x2, y2, 1.7); + translate([0,0,2.15]) linear_extrude(0.01)rounded_square(x3, y3, 3.75); + } +} + +function coord_centered(ux) = (ux -1) * width - 0.5 * width * (ux - 1); + +module stacking_lip(units_x, units_y) { + difference() { + linear_extrude(4.4)rounded_square(units_x * width -0.5, units_y * width -0.5, rounding); + stacking_lip_negative(units_x, units_y); + } +} +module gridfinity(units_x, units_y, units_z, lip = true, magnets = false) { + for (ux = [0:units_x -1]) { + for (uy = [0:units_y -1]) { + translate([ux * width, uy * width,0]) base(magnets = magnets); + } + } + if (units_z > 0) + translate([coord_centered(units_x), coord_centered(units_y), 4.75]) { + extr = units_z * height - 4.75; + linear_extrude(extr) rounded_square(units_x * width - 0.5, units_y * width - 0.5, rounding); + } + if (lip) + translate([coord_centered(units_x), coord_centered(units_y), units_z * height]) + stacking_lip(units_x, units_y); +} -- cgit v1.2.3