--- /dev/null
+/*## COPYRIGHT NOTICE
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#
+# COPYRIGHT 2020 : Slightly Cyberpunk
+# www.slightlycyberpunk.com
+#
+#
+
+### DESCRIPTION
+#
+# I've been buying Soylent (www.soylent.com) occasionally for a few years,
+# so I've collected a few of the boxes they ship it in. They're very uniform
+# in size, great for organization projects where you need twenty identical
+# boxes :)
+# This design uses these Soylent boxes (likely adaptable to other size boxes)
+# to create a set of hanging angled storage bins. Typical US large isopropyl
+# alcohol bottles (32oz; 78mm square) will fit perfectly to subdivide into
+# eight smaller bins.
+# The 3D printed components consist of six angled top hooks, and six bottom
+# braces. Also included in this design are three 2"x4" wood blocks and a
+# 1"x12"x3' board for support (and because these hooks barely fit on my
+# print bed, so I needed the 2x4 to shim them out). Assemble with your
+# favorite wood screws or some bolts.
+# Hook models are in mm, but the wood and boxes are in...deci-inches?
+# If you just print topHook() and bottomBrace() you'll be fine
+# Notice they are scaled into...deci-inches?...wherever they are used
+# I'm sorry :(
+*/
+
+// === Main model ===
+// Stack of 3 Soylent boxes at 30 degree angles
+soystack30();
+
+// Uncomment to preview other angles
+/*
+translate([150,0,0]) {
+ soystack45();
+}
+translate([300,0,0]) {
+ soystack60();
+}
+translate([450,0,0]) {
+ soystack75();
+}*/
+
+// Rear support
+// 1"x12"x3'
+translate([-6,70,0]) {
+ cube([120,10,320]);
+}
+// 2x4s
+translate([-6,56,285]) {
+ cube([120,14,34]);
+}
+translate([-6,56,185]) {
+ cube([120,14,34]);
+}
+translate([-6,56,85]) {
+ cube([120,14,34]);
+}
+
+// 30 degree Top hooks
+for(i = [0:1:2]) {
+ for(j = [0:1:1]) {
+ translate([15+65*j,22,100+100*i]) {
+ scale([1/2.54,1/2.54,1/2.54]) {
+ tophook();
+ }
+ }
+ }
+}
+
+// 30 degree Bottom braces
+for(i = [0:1:2]) {
+ for(j = [0:1:1]) {
+ translate([(15+65*j),61,35+100*i]) {
+ scale([1/2.54,1/2.54,1/2.54]) {
+ bottombrace();
+ }
+ }
+ }
+}
+
+
+// === Sub Models ===
+// Stacks of Soylent boxes at various angles
+// Made during the initial design phase to check the options
+// I didn't make hooks for the other angles, only 30 degrees
+// But if you wanted to modify the hooks, you can model off these
+module soystack30() {
+ translate([0,0,0]) {
+ rotate([30,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,100]) {
+ rotate([30,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,200]) {
+ rotate([30,0,0]) {
+ soybox();
+ }
+ }
+}
+
+module soystack45() {
+ translate([0,0,0]) {
+ rotate([45,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,100]) {
+ rotate([45,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,200]) {
+ rotate([45,0,0]) {
+ soybox();
+ }
+ }
+}
+
+module soystack60() {
+ translate([0,0,0]) {
+ rotate([60,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,90]) {
+ rotate([60,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,180]) {
+ rotate([60,0,0]) {
+ soybox();
+ }
+ }
+}
+
+module soystack75() {
+ translate([0,0,0]) {
+ rotate([75,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,80]) {
+ rotate([75,0,0]) {
+ soybox();
+ }
+ }
+
+ translate([0,0,160]) {
+ rotate([75,0,0]) {
+ soybox();
+ }
+ }
+}
+
+// === MODULES ===
+// An individual Soylent box
+module soybox() {
+ difference() {
+ cube([108,78,68]);
+ translate([4,4,4]) {
+ cube([100,70,68]);
+ }
+ }
+}
+
+// Top hook
+module tophook() {
+ cube([10,80,10]);
+
+ intersection() {
+ translate([0,82,-10]) {
+ rotate([45,0,0]) {
+ cube([10,20,20]);
+ }
+ }
+ translate([0,60,-10]) {
+ cube([10,20,30]);
+ }
+ }
+
+ translate([0,20,-39]) {
+ rotate([30,0,0]) {
+ cube([10,10,50]);
+ }
+ }
+
+ translate([0,.3,5.5]) {
+ rotate([0,90,0]) {
+ scale([1,1.2,1]) {
+ cylinder(r=4.5,h=10);
+ }
+ }
+ }
+
+ difference() {
+ union() {
+ translate([0,80,-15]) {
+ cube([10,5,40]);
+ }
+ translate([5,85,-15]) {
+ rotate([90,0,0]) {
+ cylinder(r=5,h=5);
+ }
+ }
+ translate([5,85,25]) {
+ rotate([90,0,0]) {
+ cylinder(r=5,h=5);
+ }
+ }
+ }
+ translate([5,85,-13]) {
+ rotate([90,0,0]) {
+ cylinder(r2=4,r1=2.5,h=5);
+ }
+ }
+ translate([5,85,22]) {
+ rotate([90,0,0]) {
+ cylinder(r2=4,r1=2.5,h=5);
+ }
+ }
+ }
+}
+
+// Bottom brace
+module bottombrace() {
+ difference() {
+ translate([0,2,0]) {
+ cube([20,20,15]);
+ }
+ rotate([30,0,0]) {
+ cube([20,20,15]);
+ }
+ translate([10,23,10]) {
+ rotate([90,0,0]) {
+ cylinder(r2=3.5,r1=2.5,h=5);
+ }
+ }
+ translate([10,18,10]) {
+ rotate([90,0,0]) {
+ cylinder(r=4.5,h=10);
+ }
+ }
+ }
+ }
\ No newline at end of file