9 Commits

Author SHA1 Message Date
f67aa3d3b0 Fixed Grid mount
Moved Threads out


Signed-off-by: Stephen J Carpenter <sjc@carpanet.net>
2025-08-15 18:45:09 -04:00
41776c7f87 Updated Readme
Recent changes. Document issue with magnet lid holder.
2025-08-14 08:38:19 -04:00
f3eb7858a7 Tweak grid mount
Grid mount too thin, screws bottomed out. Made thicker.
2025-08-14 08:26:04 -04:00
4357cb940d Added Handle 2025-08-13 15:36:28 -04:00
d54c3fa1ce Fix Floor Connector
Floor edge connectors overlapped floor.
Added cutout.
2025-08-04 23:38:54 -04:00
332f8c58fe Readme added BOSL
Added link to BOSL in Reademe
2025-08-04 20:28:20 -04:00
444e25866d Updated Joiner Size 2025-08-04 20:23:43 -04:00
ae6433cf38 Updated Readme
Updated readme for 3.0
2025-08-03 08:54:18 -04:00
db656c08d3 Changes for V3
- Glue no longer needed
- Reinforced feet
- Foot lock not needed, optional.
2025-08-03 08:10:46 -04:00
2 changed files with 100 additions and 25 deletions

View File

@@ -2,23 +2,52 @@ Drybox-NG an Unoriginal Drybox Implemented in OpenSCAD
Openscad Code by sjc (Stephen Carpenter)
Magnet.svg by [Solar Icons](https://www.figma.com/community/file/1166831539721848736?ref=svgrepo.com) in CC Attribution License
Finalized and printing parts.
Snaps could be better.
# Background
TODO:
I really liked some of the Drybox options I found, especially the
[Unoriginal Prusa Drybox](https://www.printables.com/model/551828-unoriginal-prusa-drybox)
but I stock different sized heat set inserts and I don't use normal CAD.
So I set about to rebuild it in OpenSCAD; my way.
Version 1.0 fell off its mount.
V2.0 has feet that hook onto the mount, Magnets for hinged lid and
doors, and a buffer mount for the rear.
Version 3.0 goes together without glue so parts are replacable.
Silica cup mounts have inserts spaced to mount a 1x3 Gridfinity base.
Cup and base generated from gridfinity_extended. (see Other Sources)
# Building
Insert models use my
[Inserts Library](https://sancus.carpanet.net/sjc/inserts)
Box parts rely on [BOSL](https://github.com/revarbat/BOSL)
Modify parameters as you like, the default will give a pretty decent
aproximation of the original that it is based on which will mount on
similar stands. Change dimensions and you are on your own. Not all
parameters have been well tested. Good Luck.
Parts snap together solidly, shove a small piece of filament in the
tiny holes in between them.
## TODO
- Cleanup
- Handles
- Hold-up door?
- Need lid magnet
Done:
Lid has features that block access to magnets. Also, handle too large.
Need to bridge gap!
## Done
- Hinge cut for door fit
- Removed inserts behind door
- Removed window/floor inserts from corners
- inset offset to edge
- Need Mount for Buffer
- Door Handle
- ALL THE MAGNETS!
V1:
@@ -27,3 +56,9 @@ Top Corners 13hr 126g
Top Corners 13hr 126g
Back Bottom Edge (pcm) 12h 136 g
# Other Sources
Magnet.svg by [Solar Icons](https://www.figma.com/community/file/1166831539721848736?ref=svgrepo.com) in CC Attribution License
Silica Cup and Gridfinity base generated from
[gridfinity_extended](https://github.com/ostat/gridfinity_extended_openscad)

View File

@@ -10,7 +10,7 @@ include <fdmouse.scad>
/* [Part] */
PART = ""; // [ all_corners, corner_top_rear, corner_top_front_l, corner_top_front_r, corner_bottom, edge_back_bottom_a, edge_back_bottom_b, edge_back_bottom_c, edge_back_bottom_d, edge_front_bottom, edge_side_top, edge_side_foot_left, edge_side_foot_right, edge_top_front, edge_top_back, edge_test, full_box, joiner_top, joiner_bottom, joiner_slop, profile, side_edge, rbfoot, hinge, new_joiner, rear_mount, grid_mount ]
PART = ""; // [ all_corners, corner_top_rear, corner_top_front_l, corner_top_front_r, corner_bottom, edge_back_bottom_a, edge_back_bottom_b, edge_back_bottom_c, edge_back_bottom_d, edge_front_bottom, edge_side_top, edge_side_front, edge_side_foot_left, edge_side_foot_right, edge_top_front, edge_top_back, edge_test, full_box, joiner_top, joiner_bottom, joiner_slop, profile, side_edge, rbfoot, hinge, new_joiner, rear_mount, grid_mount, handle ]
/* [Profile Dimensions] */
@@ -29,8 +29,8 @@ FLOOR_THICK = 5;
//JOINER_H = 26;
//JOINER_W = 10;
JOINER_H = 10;
JOINER_W = 8;
JOINER_H = 14;
JOINER_W = 10;
JOINER_SLOP = .1;
RB_MOUNT_INSET=17;
@@ -88,7 +88,7 @@ module profile(ps=PROFILE_SIZE, wl=WIN_LIP, wt=WIN_THICK, wtr=WIN_TRIM, fl=FLOOR
polygon(points = gon, convexity=conv);
}
module rb_foot(fw=RB_MOUNT_WIDTH, rl=RB_MOUNT_LEN+5, rh=RB_MOUNT_OUT_H, fl=10) {
module rb_foot(fw=RB_MOUNT_WIDTH, rl=RB_MOUNT_LEN+5, rh=RB_MOUNT_OUT_H, li=false, fl=10) {
difference() {
union() {
translate([-(fl+rl/2),0]) {
@@ -111,7 +111,10 @@ module rb_foot(fw=RB_MOUNT_WIDTH, rl=RB_MOUNT_LEN+5, rh=RB_MOUNT_OUT_H, fl=10) {
cyl(r=4.5, h=fw, align=V_TOP);
right(20)cyl(r=4.5, h=fw, align=V_TOP);
}
up(4) right(fl+rl/2) back(rh + 6) xrot(180)yrot(90)m3s_clear(bl=12,bz=-12, sh=0, drop=true, $die=true);
if (li == true) {
up(4) right(fl+rl/2) back(rh + 6) xrot(180)yrot(90)m3s_clear(bl=12,bz=-12, sh=0, drop=true, $die=true);
}
up(fw/2-.5)xspread(l=2+rl+rh/2, n=2) #back(23)cuboid([3,20,3]);
}
back=5;
bmax = back + (fw-1);
@@ -129,24 +132,25 @@ module hinge_mount(bz=WIN_THICK, inv=false, bl=10) {
zrot(-90)xrot(90)right(5) {
up(3+2) cyl(d1=7, d2=9,h=7, align=V_TOP);
//thread_insertM3(bl=bl,bz=-(bl-3), $die=true);
m3s_clear(bl=bl,bz=-(bl-3), sh=inv ? .2 : 0, $die=true);
m3s_clear(bl=bl,bz=-(bl-3), sh=inv ? .23 : 0, $die=true);
//%thread_insertM3(bl=10,bz=-7);
}
}
zrot(-90)xrot(90)left(5) {
up(3+2) cyl(d1=7, d2=9,h=7, align=V_TOP);
//thread_insertM3(bl=bl,bz=-(bl-3), $die=true);
m3s_clear(bl=bl,bz=-(bl-3), sh=inv ? .2 : 0, $die=true);
m3s_clear(bl=bl,bz=-(bl-3), sh=inv ? .23 : 0, $die=true);
//%thread_insertM3(bl=10,bz=-7);
}
}
module hinge(theta=90, show=true) {
module hinge(theta=90, mx=1.8, my=5, mz=20, show=true) {
x=7;
py=20;
d = .4 / sqrt(2);
difference() {
left(x/2)cuboid([x,20+2*d,50], fillet=2, edges=EDGES_X_ALL);
zspread(n=2, l=(-1+py+mz/2)) back(5)left(x-.4-mx/2) cuboid([mx, my, mz+2]);
hinge_mount($die=true);
}
left(5+d)back(py/2 + 5+2*d)zrot(theta){
@@ -155,12 +159,13 @@ module hinge(theta=90, show=true) {
right(5.3)fwd(9/4)cuboid([x,2*d+1+9/2,6], align=V_LEFT, chamfer=1, edges=EDGES_Y_RT+EDGE_BK_RT);
}
cyl(r=2, h=42);
zspread(n=3, l=25 ) difference() {
zspread(n=3, l=25 ) {difference() {
union() {
cyl(d=9, h=6, chamfer=.8);
right(5+d)back(9/4)cuboid([x,2+9/2,6], align=V_LEFT, chamfer=1, edges=EDGES_Y_RT+EDGE_FR_RT);
}
cyl(r=2.2, h=6.2);
}
}
difference() {
left((x)/2-(5+d))back(15+5)cuboid([x,30+2*d,50], fillet=2, edges=EDGES_X_ALL);
@@ -168,6 +173,7 @@ module hinge(theta=90, show=true) {
hinge_mount(bl=9, $die=true);
if (show) %hinge_mount(bl=9,$die=false);
}
zspread(n=2, l=(-1+py+mz/2)) back(10)right(.4-mx/2) cuboid([mx, my, mz+2]);
}
}
}
@@ -193,11 +199,25 @@ module rearMount(md=141.333, theta=90, show=true) {
}
}
module handle(d=15, l=110) {
w=1.2;
up((d+10)/2) {
cyl(d=d, h=l+1, orient=ORIENT_X);
xspread(n=2, l=l) difference() {
hull() {
cyl(d=d+10, h=8, orient=ORIENT_X, fillet=1);
down((d+10-6)/2)fwd(10)cyl(d=6, h=8, orient=ORIENT_X, fillet=1);
}
down((d+10)/2)xrot(180)m3s_clear(bl=12, bz=-12);
}
}
}
module box_edge(ps=PROFILE_SIZE, l=10, orient=ORIENT_Z, jh = JOINER_H,jw = JOINER_W, slop=JOINER_SLOP, jb=5, jup = false, jdown=false, flx=false, ft=FLOOR_THICK, wl=WIN_LIP, ioff=0, wx=true, wt=WIN_THICK, wtr = WIN_TRIM, hm=false, hc=false, ht=0, hs=false, tubepass=false, tn = 2, ix=true, iy=true, rbfoot=false, rbleft=false, cm=false, gm=false, my=false, align=V_CENTER) {
jzoff = l/2-jw/2;
inner_off = ps/2 + wt;
jdiff = (ps-wt)/2 - jh;
joiner_off = inner_off - 1 - (jh+jdiff/2)/sqrt(2)/2;//- (ps-.14)/(2*sqrt(2)) + jw/2; //- (jw)/sqrt(2);
joiner_off = inner_off - (jh+jdiff/2)/sqrt(2)/2;//- (ps-.14)/(2*sqrt(2)) + jw/2; //- (jw)/sqrt(2);
psoff = ps/2 - wl - wt;
face_off = ((ps+psoff)/4);
orient_and_align([ps,ps,l], orient=orient, align=align, orig_orient=ORIENT_Z) left(ps/2) fwd(ps/2) {
@@ -252,8 +272,13 @@ module box_edge(ps=PROFILE_SIZE, l=10, orient=ORIENT_Z, jh = JOINER_H,jw = JOINE
}
}
}
if (jup) up(l/2)back(joiner_off)right(joiner_off)zrot(-45)new_joiner(slop=slop, orient=ORIENT_Y, align=V_CENTER);
if (jdown) down(l/2)back(joiner_off)right(joiner_off)zrot(-45)yrot(180)new_joiner(slop=slop, orient=ORIENT_Y, align=V_CENTER);
difference() {
union() {
if (jup) up(l/2)back(joiner_off)right(joiner_off)zrot(-45)new_joiner(slop=slop, orient=ORIENT_Y, align=V_CENTER);
if (jdown) down(l/2)back(joiner_off)right(joiner_off)zrot(-45)yrot(180)new_joiner(slop=slop, orient=ORIENT_Y, align=V_CENTER);
}
back(wl+6)right(ps-wl/2-.01)cuboid([wl,wl,l+10]);
}
if (rbfoot) right(ps/2+psoff-2)zrot(180) {
if (rbleft) { yrot(90) rb_foot(); } else { yrot(-90) zflip() rb_foot(); }
}
@@ -319,8 +344,8 @@ module new_joiner(spacing=0, slop=JOINER_SLOP, align=V_FRONT, jh=JOINER_H, jw=JO
spread = jw + spacing;
color(cl)
orient_and_align([2*jw+spacing,0,jh], orig_align=V_FRONT, align=align, orient=orient) {
left(spread/2) half_joiner(slop=slop, h=jh, w=jw, l=l, screwsize=$preview ? undef : undef);
right(spread/2) half_joiner2(h=jh, w=jw, l=l, screwsize=$preview ? undef : undef);
left(spread/2) half_joiner(slop=slop, h=jh, w=jw, l=l, screwsize=$preview ? undef : 2);
right(spread/2) half_joiner2(h=jh, w=jw, l=l, screwsize=$preview ? undef : 2);
}
}
module new_joiner2(spacing=0, slop=JOINER_SLOP, align=V_FRONT, jh=JOINER_H, jw=JOINER_W, l=4, orient=ORIENT_Z, cl=undef) {
@@ -337,6 +362,7 @@ module new_joiner_clear(spacing=0, slop=JOINER_SLOP, align=V_FRONT, jh=JOINER_H,
orient_and_align([2*jw+spacing,0,jh], orig_align=V_FRONT, align=align, orient=orient) {
left(spread/2) half_joiner_clear(h=jh, w=jw);
right(spread/2) half_joiner_clear(h=jh, w=jw);
cyl(d=2, h=50, orient=ORIENT_X);
}
}
@@ -430,6 +456,15 @@ if (PART == "edge_side_top") {
}
up((wt+wl)/sqrt(2))yrot(45)box_edge(l=ly, rbfoot=false, flx=false, wx=true, jup=true, jdown=true, cm=false, orient=ORIENT_Y);
}
if (PART == "edge_side_front") {
if (Print_Ears) {
left(coff/2-2*psoff) back(ly/2)zrot(315)ear(thick=.2, dis=-2);
right(coff/2-2*psoff) back(ly/2)zrot(225)ear(thick=.2, dis=-2);
left(coff/2-2*psoff) fwd(ly/2)zrot(45)ear(thick=.2, dis=-2);
right(coff/2-2*psoff) fwd(ly/2)zrot(135)ear(thick=.2, dis=-2);
}
up((wt+wl)/sqrt(2))yrot(45)box_edge(l=ly, rbfoot=false, flx=false, wx=true, iy=false, my=true, jup=true, jdown=true, cm=false, orient=ORIENT_Y);
}
if (PART == "edge_top_front") {
//r = $t *90 - 45;
r=-45;
@@ -522,13 +557,18 @@ if (PART == "edge_test")
if (PART == "hinge") {
r = $t *90;
hinge(theta=r);
// r = 135; // max
yrot(90)hinge(theta=r);
}
if (PART == "rear_mount") {
up(7) yrot(-90) rearMount();
}
if (PART == "handle") {
handle();
}
if (PART == "new_joiner") {
new_joiner();
//#new_joiner_clear();
@@ -538,13 +578,13 @@ if (PART == "new_joiner") {
if (PART == "grid_mount") {
difference() {
union() {
fwd(19.799/2)cuboid([48,6+19.799,2], fillet=1, align=V_TOP);
fwd(19.799/2-1)cuboid([48,3+19.799,4], fillet=1, align=V_TOP);
up(1)fwd(3.4+19.799)xrot(-45) cuboid([10+84,6,25], fillet=1, align=V_TOP+V_BACK);
}
cuboid([200,200,10], align=V_BOTTOM);
xspread(n=2, l=42) cyl(d=3.3, h=50);
xrot(45)up(17.2)xspread(n=2, l=84)m3s_clear(bl=10,bz=-9, sh=0, drop=false, $die=true);
xrot(45)back(5)up(17.2)xspread(n=2, l=84)m3s_clear(bl=10,bz=-9, sh=0, drop=false, $die=true);
}
}