-
Notifications
You must be signed in to change notification settings - Fork 1
/
honeycombRack.scad
135 lines (114 loc) · 3.93 KB
/
honeycombRack.scad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//------Created by Dsphar------//
//------Hope you find it usefull, for updates, see repo below------//
//https://github.com/Dsphar/openscad_honeycomb_shelf.git
//User Entered Values
numRows = 6;
numCols = 5;
wallThickness = 2;
minDiameter = 32;
height = 35;
tiltDeg = 30;
screwDiameter = 5;
screwHoleOffset = 3;
plateThickness = 2;
//Rectangle
buildCombRect(numRows,numCols);
//addMountingPlate(2, numRows, 2, numCols); //(row, numRows, col, numCols)
//addMountingPlate(2, numRows, 4, numCols); //(row, numRows, col, numCols)
//addMountingPlate(5, numRows, 3, numCols); //(row, numRows, col, numCols)
//Calculated Values
minRad = minDiameter/2;
minRadWall = minRad+wallThickness;
minDiam = minRadWall*2;
rad = 2*minRad / sqrt(3);
diam = rad*2;
evenRowBaseOffset = (minDiam-wallThickness)*cos(tiltDeg);
//modules
module buildCombRect(numRows, numColumns){
for(col = [0:1:numColumns-1]){
offsetCol(col)
buildCol(numRows);
}
}
module buildHex(){
linear_extrude(height)
translate([-minRad-wallThickness,rad+wallThickness,0])
rotate(30)
difference(){
circle(rad+wallThickness, $fn=6);
circle(rad, $fn=6);
};
}
module buildCol(size){
for(i = [0:1:size-1])
shiftObjectX(i)
tiltHex(tiltDeg)
buildHex();
}
module offsetCol(colNum){
xShift = (colNum%2 == 0) ? 0
: (evenRowBaseOffset+(minDiam)*sin(tiltDeg)/tan(90-tiltDeg))/2;
yShift = (colNum%2 == 0) ? colNum/2*(diam+rad+wallThickness*cos(30)*2)
: colNum*(diam-rad/2+wallThickness*cos(30));
translate([xShift,yShift,0])
{
for(i=[0:$children-1])
children(i);
}
}
module shiftObjectX(units){
translate([units*((minDiameter+wallThickness)*cos(tiltDeg)+(minDiameter+wallThickness)*sin(tiltDeg)/tan(90-tiltDeg)), 0, 0])
{
for(i=[0:$children-1])
children(i);
}
}
module tiltHex(deg){
rotate([0,deg,0]){
for(i=[0:$children-1])
children(i);
}
}
module addMountingPlate(row, numRows, col, numCols){
place(numRows-row,numCols-col)
translate([-minDiam*cos(tiltDeg) - (minDiam)*sin(tiltDeg)/tan(90-tiltDeg)+wallThickness/2,(minDiameter+wallThickness)*.33,0])
difference(){
cube([minDiam*cos(tiltDeg) + (minDiam)*sin(tiltDeg)/tan(90-tiltDeg)-wallThickness/2,minRadWall+wallThickness/2,plateThickness]);
translate([minDiam-screwHoleOffset, (minRadWall+wallThickness/2)/2, -1])
cylinder(wallThickness+2, screwDiameter/2, screwDiameter/2+.5);
}
}
module place(row,column){
offsetCol(column)
shiftObjectX(row)
{
for(i=[0:$children-1])
children(i);
}
}
//Note: Everything below is a hack to allow Thingiverse Customizer
//users to add plates as they wish. I do not suggest you do it this
//way in OpenSCAD. Instead, just call addMountingPlate for every
//plate you want to add. See lines 18-20.
mountingPlatePositions = "1,3|5,3";//No spaces (row,col|row,col)
addMountingPlates(mountingPlatePositions);
module addMountingPlates(platesAsString){
plates = [for(i = split("|", platesAsString)) split(",", i)];
for(i = [0:len(plates)-1]){
addMountingPlate(strToInt(plates[i][0]),numRows,strToInt(plates[i][1]),numCols);
}
}
//courtesy of thingiverse.com/groups/openscad/forums/general/topic:10294
function substr(s, st, en, p="") =
(st >= en || st >= len(s))
? p
: substr(s, st+1, en, str(p, s[st]));
function split(h, s, p=[]) =
let(x = search(h, s))
x == []
? concat(p, s)
: let(i=x[0], l=substr(s, 0, i), r=substr(s, i+1, len(s)))
split(h, r, concat(p, l));
//courtesy of thingiverse.com/thing:202724/files
function strToInt(str, base=10, i=0, nb=0) = (str[0] == "-") ? -1*_strToInt(str, base, 1) : _strToInt(str, base);
function _strToInt(str, base, i=0, nb=0) = (i == len(str)) ? nb : nb+_strToInt(str, base, i+1, search(str[i],"0123456789")[0]*pow(base,len(str)-i-1));