Improve rack-mount. Individual rack-mount systems are now organized in their own directories, with a standard entry.scad file.

This commit is contained in:
zhao
2023-08-31 00:20:12 -04:00
parent 3167feea03
commit 658fcf9948
67 changed files with 186 additions and 191 deletions

View File

@ -12,7 +12,7 @@
## Assembly ## Assembly
Pre-generated STLs for roughly 200mm^3 (mini), 180mm^3 (micro), and 100mm^3 (nano) rack frames can be found in the [stl](stl) dir. Pre-generated STLs for roughly 200mm^3 (mini), 180mm^3 (micro), and 100mm^3 (nano) rack frames can be found in the [stl](stl) dir.
These STLs are generated from the files in [rack/print](rack/print), and [rack-mount/print](rack-mount/print) - further information about printing these parts These STLs are generated from the files in [rack/print](rack/print) - further information about printing these parts
(supports, orientation) can be found in these files. (supports, orientation) can be found in these files.
### Assembly Instructions ### Assembly Instructions
@ -63,9 +63,12 @@ but beware of PLA's thermal limits. Higher infill is recommended for all parts.
## Trays, Boxes, etc ## Trays, Boxes, etc
Some parametric trays and support rails for your rack can be found in [rack-mount/print](./rack-mount/print). Some parametric rack mount items can be found in [rack-mount](./rack-mount). The following rack-mount systems
These files are currently pretty rough around the edges. However, they still make a great jumping off point for designing are currently supported:
rack-mount items. - [Enclosed Box](./rack-mount/enclosed-box/entry.scad): For mounting box-shaped objects, without the need for any mounting holes on the box.
- [Tray](./rack-mount/tray/entry.scad): Simple tray mounted using only the front rails. Can be configured to have screw mounts at the bottom of the tray.
- [Patch Panel](./rack-mount/patch-panel/entry.scad): Linear patch panel array. Number of keystone slots can be configured.
## Configuring + Generating STLs ## Configuring + Generating STLs
A python script: [rbuild.py](./rbuild.py) is provided to generate different project stls. **Before running the script**, please A python script: [rbuild.py](./rbuild.py) is provided to generate different project stls. **Before running the script**, please

View File

@ -1,5 +0,0 @@
basePlateConnYBarCornerDx = yBarWidth; // distance from a plate body corner and the nearest yBar corner
basePlateConnYBarCornerDy = xBarY; // distance from a plate body corner and the nearest yBar corner
basePlateConnPosX = basePlateScrewMountToYBarYZFace - basePlateConnYBarCornerDx; // distance between plateBody corner at (0,0,0) and the related corner
basePlateConnPosY = basePlateScrewMountToYBarXZFace - basePlateConnYBarCornerDy;

View File

@ -1,53 +0,0 @@
include <../../rack/sharedVariables.scad>
include <../common.scad>
use <../sideRail.scad>
use <../frontBoxHolder.scad>
/*
(WIP) Enclosed box mounting system:
Helper file to use semi-enclosed side rails and a front plate to mount a box.
This system does not require any mounting holes for the enclosed box.
!!! Please also make sure that the correct rack frame preset is set in rackFrame.scad !!!
*/
// begin config ////////////////////////////////////////////////////////////////////////////////////////////////////////
boxWidth = 160;
boxHeight = 27;
boxDepth = 100;
railDefaultThickness = 1.2;
zOrientation = "middle";
// Does not affect any part dimensions. Set this to true to visualize how a box wound be mounted.
visualize = true;
// end config //////////////////////////////////////////////////////////////////////////////////////////////////////////
#cube(size=[boxWidth, boxDepth, boxHeight]);
sideSupportRailBase(top=true, defaultThickness=railDefaultThickness, supportedZ=boxHeight, supportedY=boxDepth, supportedX=boxWidth, zOrientation=zOrientation);
translate(v=[boxWidth,0,0])
mirror(v=[1,0,0])
sideSupportRailBase(top=true, defaultThickness=railDefaultThickness, supportedZ=boxHeight, supportedY=boxDepth, supportedX=boxWidth, zOrientation=zOrientation);
translate(v=[0,0,10])
rotate(a=[-90,0,0])
*frontBoxHolder(
u=2,
plateThickness=3,
cutoutOffsetX=(rackMountScrewWidth-147)/2,
cutoutOffsetY=4.25,
cutoutX=147,
cutoutY=21.5,
support=true,
supportedZ=boxHeight,
supportWidth=120,
supportDepth=5,
supportRailBaseThickness=1.75
);

View File

@ -0,0 +1,65 @@
include <../../rack/sharedVariables.scad>
include <../common.scad>
include <./helper.scad>
use <./sideRail.scad>
use <./frontBoxHolder.scad>
/*
Enclosed box mounting system:
Helper file to use semi-enclosed side rails and a front plate to mount a box.
This system does not require any mounting holes on the enclosed box.
!!! Please also make sure that the correct rack frame preset is set in rackFrame.scad !!!
TODO support full box (so for the micro profile it would be 180) this may require widening the main rail
*/
// begin config ////////////////////////////////////////////////////////////////////////////////////////////////////////
// Does not affect any part dimensions. Set this to true to visualize how a box would be mounted.
visualize = false;
boxWidth = 170;
boxHeight = 27.0;
boxDepth = 100;
railDefaultThickness = 1.5;
railSideThickness = 3;
frontPlateThickness = 3;
frontPlateCutoutYSpace = 3;
frontPlateCutoutXSpace = 5;
zOrientation = "middle"; // or "bottom"
// end config //////////////////////////////////////////////////////////////////////////////////////////////////////////
leftRailTrans = identity;
rightRailTrans = visualize
? translate(v=[boxWidth,0,0]) * mirror(v=[1,0,0])
: translate(v=[sideRailBaseWidth*2,0,0]) * mirror(v=[1,0,0]);
u = findU(boxHeight, railDefaultThickness);
railBottomThickness = railBottomThickness(u, boxHeight, railDefaultThickness, zOrientation);
frontBoxHolderTrans = visualize
? translate(v=[railSideThickness-(railSupportsDx-boxWidth)/2,0, sideRailLowerMountPointToBottom-railBottomThickness]) * mirror(v=[0,1,0]) * rotate(a=[90,0,0])
: mirror(v=[0,1,0]) * translate(v=[0,uDiff,frontPlateThickness - railBottomThickness]);
if (visualize) {
%cube(size = [boxWidth, boxDepth, boxHeight]);
}
multmatrix(leftRailTrans)
sideSupportRailBase(top=true, defaultThickness=railDefaultThickness, supportedZ=boxHeight, supportedY=boxDepth, supportedX=boxWidth, zOrientation=zOrientation, railSideThickness=railSideThickness);
multmatrix(rightRailTrans)
sideSupportRailBase(top=true, defaultThickness=railDefaultThickness, supportedZ=boxHeight, supportedY=boxDepth, supportedX=boxWidth, zOrientation=zOrientation, railSideThickness=railSideThickness);
multmatrix(frontBoxHolderTrans)
frontBoxHolder(
cutoutOffsetX=(rackMountScrewWidth-(boxWidth-2*frontPlateCutoutXSpace))/2, cutoutOffsetY=railBottomThickness+frontPlateCutoutYSpace,
cutoutX=boxWidth-2*frontPlateCutoutXSpace, cutoutY=boxHeight-2*frontPlateCutoutYSpace,
zOrientation = zOrientation, supportedZ=boxHeight, supportWidth=max(10, boxWidth-(sideRailBaseWidth+10)), supportRailDefaultThickness = railDefaultThickness, plateThickness=frontPlateThickness
);

View File

@ -0,0 +1,40 @@
include <../common.scad>
include <./helper.scad>
use <../plateBase.scad>
// To be used with closed sideRails to fully encapsulate a box
module frontBoxHolder(plateThickness=3, cutoutOffsetX, cutoutOffsetY, cutoutX, cutoutY, supportedZ, supportWidth, supportDepth=5, supportRailDefaultThickness, zOrientation) {
//assert(supportedZ + 2*supportThickness <= boxPlateScrewToYEdge*2 + u*uDiff);
//assert(supportWidth < rackMountScrewWidth); // not tight, need to include screw radii
u = findU(supportedZ, supportRailDefaultThickness);
supportRailBottomThickness = railBottomThickness(u, supportedZ, supportRailDefaultThickness, zOrientation);
difference() {
union() {
plateBase(U=u, plateThickness=plateThickness, screwToXEdge=boxPlateScrewToXEdge, screwToYEdge=boxPlateScrewToYEdge, screwType=mainRailScrewType, filletR=2);
// bottom support
translate(v=[(rackMountScrewWidth-supportWidth)/2, -boxPlateScrewToYEdge,0])
cube(size=[supportWidth, supportRailBottomThickness, supportDepth]);
// top support
translate(v=[(rackMountScrewWidth-supportWidth)/2, -boxPlateScrewToYEdge+supportRailBottomThickness+supportedZ,0])
cube(size=[supportWidth, supportRailDefaultThickness, supportDepth]);
}
union() {
translate(v=[cutoutOffsetX, cutoutOffsetY-boxPlateScrewToYEdge,-inf/2])
minkowski() {
r=2;
cylinder(r=r,h=inf);
translate(v=[r, r, 0])
cube(size = [cutoutX-2*r, cutoutY-2*r, inf]);
}
}
}
}

View File

@ -0,0 +1,21 @@
include <../common.scad>
// Some utility functions, as well as global functions to make code cleaner
sideRailLowerMountPointToBottom = uDiff/2;
sideRailBaseWidth = 15;
// distance between front and back main rail screw mounts
sideRailScrewMountDist = yBarDepth - 2*(frontScrewSpacing + railFrontThickness + railSlotToXZ);
boxPlateScrewToXEdge = 4.5; // wow these are named poorly
boxPlateScrewToYEdge = 5;
function findU(boxHeight, minRailThickness) = max(1, ceil((boxHeight + 2*minRailThickness)/uDiff) - 1);
function railBottomThickness(u, boxHeight, minRailThickness, zOrientation) =
(zOrientation == "middle")
? (((u+1) * uDiff) - boxHeight)/2
: (zOrientation == "bottom")
? minRailThickness
: minRailThickness;

View File

@ -1,33 +1,20 @@
include <../helper/common.scad> include <../common.scad>
include <../config/common.scad> include <./helper.scad>
include <../rack/sharedVariables.scad>
include <./common.scad>
//sideSupportRailBase(top=true, defaultThickness=1.5, supportedZ=27.2, supportedY=101.5, supportedX=159); //sideSupportRailBase(top=true, defaultThickness=1.5, supportedZ=27.2, supportedY=101.5, supportedX=159);
// distance between front and back main rail screw mounts
sideRailScrewMountDist = yBarDepth - 2*(frontScrewSpacing + railFrontThickness + railSlotToXZ);
module sideSupportRailBase(top=true, supportedZ, supportedY, supportedX, zOrientation="middle", defaultThickness=2) { module sideSupportRailBase(top=true, supportedZ, supportedY, supportedX, zOrientation="middle", defaultThickness=2, railSideThickness=4) {
mountBlockHeight = 10;
mountBlockDepth = 10; mountBlockDepth = 10;
screwMountGlobalDz = screwDiff / 2.0; // vertical distance between local origin and main rail screw mount screwMountGlobalDz = screwDiff / 2.0; // vertical distance between local origin and main rail screw mount
sideRailScrewToMainRailFrontDx = frontScrewSpacing+railFrontThickness; sideRailScrewToMainRailFrontDx = frontScrewSpacing+railFrontThickness;
railLength = max(sideRailScrewMountDist + sideRailScrewToMainRailFrontDx + mountBlockDepth/2, supportedY+defaultThickness); railLength = max(sideRailScrewMountDist + sideRailScrewToMainRailFrontDx + mountBlockDepth/2, supportedY+defaultThickness);
railBaseThickness = defaultThickness; // default thickness value railBaseThickness = defaultThickness; // default thickness value
railSideThickness = 4;
railBackThickness = 3; railBackThickness = 3;
railBaseWidth = 15;
// Minimum U to enclose box, while also have a minimum defaultThickness for top and bottom. // Minimum U to enclose box, while also have a minimum defaultThickness for top and bottom.
minU = max(1, ceil((supportedZ + 2*railBaseThickness) / uDiff)-1); u = findU(supportedZ, railBaseThickness);
railBottomThickness = railBottomThickness(u, supportedZ, railBaseThickness, zOrientation);
railBottomThickness =
(zOrientation == "middle")
? (((minU+1) * uDiff) - supportedZ)/2
: (zOrientation == "bottom")
? railBaseThickness
: railBaseThickness;
assert(supportedX <= maxUnitWidth); assert(supportedX <= maxUnitWidth);
assert (zOrientation == "middle" || zOrientation == "bottom", "Z-Orientation not supported"); assert (zOrientation == "middle" || zOrientation == "bottom", "Z-Orientation not supported");
@ -43,7 +30,7 @@ module sideSupportRailBase(top=true, supportedZ, supportedY, supportedX, zOrient
module applyMainRailMounts() { module applyMainRailMounts() {
mountBlockExtension = (railSupportsDx - supportedX)/2 - railSideThickness; mountBlockExtension = (railSupportsDx - supportedX)/2 - railSideThickness;
minHexNutPocketToXYDist = mountBlockHeight/2; minHexNutPocketToXYDist = sideRailLowerMountPointToBottom;
minHexNutPocketToXZDist = mountBlockDepth/2; minHexNutPocketToXZDist = mountBlockDepth/2;
minHexNutPocketToYZDist = 4; minHexNutPocketToYZDist = 4;
screwU = floor((railSideHeight) / uDiff)-1; screwU = floor((railSideHeight) / uDiff)-1;
@ -92,22 +79,22 @@ module sideSupportRailBase(top=true, supportedZ, supportedY, supportedX, zOrient
difference () { difference () {
union() { union() {
cube(size = [railBaseWidth, railLength, railBottomThickness]); cube(size = [sideRailBaseWidth, railLength, railBottomThickness]);
cube(size = [railSideThickness, railLength, railSideHeight]); cube(size = [railSideThickness, railLength, railSideHeight]);
// back support // back support
translate(v = [0, max(railLength-railBackThickness, supportedY), 0]) translate(v = [0, max(railLength-railBackThickness, supportedY), 0])
cube(size = [railBaseWidth, railBackThickness, railSideHeight]); cube(size = [sideRailBaseWidth, railBackThickness, railSideHeight]);
// back support for box // back support for box
translate(v = [0, supportedY, 0]) translate(v = [0, supportedY, 0])
cube(size = [railBaseWidth, railBackThickness, railSideHeight]); cube(size = [sideRailBaseWidth, railBackThickness, railSideHeight]);
// top support // top support
if (top) { if (top) {
translate(v = [0, 0, railSideHeight-railBaseThickness]) translate(v = [0, 0, railSideHeight-railBaseThickness])
cube(size = [railBaseWidth, railLength, railBaseThickness]); cube(size = [sideRailBaseWidth, railLength, railBaseThickness]);
} }
} }
@ -140,7 +127,7 @@ module sideSupportRailBase(top=true, supportedZ, supportedY, supportedX, zOrient
} }
} }
cylindricalFiletNegative(p0=[railBaseWidth,0,0],p1=[railBaseWidth,0,inf], n=[1,-1,0],r=r); cylindricalFiletNegative(p0=[sideRailBaseWidth,0,0],p1=[sideRailBaseWidth,0,inf], n=[1,-1,0],r=r);
} }
} }
} }

View File

@ -1,55 +0,0 @@
// To be used with closed sideRails to fully encapsulate a box
include <../config/common.scad>
include <../helper/common.scad>
include <./common.scad>
use <./plateBase.scad>
frontBoxHolder(u=2, plateThickness=3, cutoutOffsetX=20, cutoutOffsetY=2, cutoutX=147, cutoutY=26,
support=true, supportedZ = 27.5, supportWidth=120, supportDepth=5, supportRailBaseThickness=1.25);
module frontBoxHolder(u, plateThickness=3, cutoutOffsetX, cutoutOffsetY, cutoutX, cutoutY, support=false, supportedZ, supportWidth, supportDepth, bottomSupportThickness = 2, supportRailBaseThickness = 2) {
plateScrewToXEdge = 4.5; // wow these are named poorly
plateScrewToYEdge = 5;
if (support) {
//assert(supportedZ + 2*supportThickness <= plateScrewToYEdge*2 + u*uDiff);
//assert(supportWidth < rackMountScrewWidth); // not tight, need to include screw radii
}
difference() {
union() {
plateBase(U=u, plateThickness=plateThickness, screwToXEdge=plateScrewToXEdge, screwToYEdge=plateScrewToYEdge, screwType=mainRailScrewType, filletR=2);
if (support) {
bottomSuportThickness = supportRailBaseThickness;
translate(v=[(rackMountScrewWidth-supportWidth)/2, -plateScrewToYEdge,0])
cube(size=[supportWidth, bottomSuportThickness, supportDepth]);
translate(v=[(rackMountScrewWidth-supportWidth)/2, (-plateScrewToYEdge+bottomSuportThickness) + supportedZ,0])
cube(size=[supportWidth, bottomSuportThickness, supportDepth]);
}
}
union() {
translate(v=[cutoutOffsetX, cutoutOffsetY-plateScrewToYEdge,-inf/2])
minkowski() {
r=2;
cylinder(r=r,h=inf);
translate(v=[r, r, 0])
cube(size = [cutoutX-2*r, cutoutY-2*r, inf]);
}
}
}
}

View File

@ -0,0 +1,18 @@
use <./patchPanel.scad>
/*
Parametric patch panel -
Please also make sure that the correct rack frame preset is set in rackFrame.scad.
TODO add support for 2d arrays
*/
// begin config ////////////////////////////////////////////////////////////////////////////////////////////////////////
numSlots = 8;
// end config //////////////////////////////////////////////////////////////////////////////////////////////////////////
mirror(v=[0,0,1])
patchPanel(slots=numSlots);

View File

@ -1,9 +1,12 @@
include <../config/common.scad> include <../common.scad>
include <../helper/common.scad> use <../plateBase.scad>
include <../rack/sharedVariables.scad>
use <./plateBase.scad>
/*
Parametric patch panel -
Please see ./entry.scad for configuring/printing
Please also make sure that the correct rack frame preset is set in rackFrame.scad.
*/
*patchPanel(slots=2); *patchPanel(slots=2);
module patchPanel (slots=8) { module patchPanel (slots=8) {

View File

@ -1,16 +0,0 @@
include <../../rack/sharedVariables.scad>
use <../frontBoxHolder.scad>
frontBoxHolder(
u=2,
plateThickness=3,
cutoutOffsetX=(rackMountScrewWidth-147)/2,
cutoutOffsetY=4.25,
cutoutX=147,
cutoutY=21.5,
support=true,
supportedZ = 26.5,
supportWidth=120,
supportDepth=5,
supportRailBaseThickness=1.75
);

View File

@ -1,5 +0,0 @@
use <../patchPanel.scad>
mirror(v=[0,0,1])
patchPanel(slots=8);

View File

@ -1,3 +0,0 @@
use <../sideRail.scad>
sideSupportRailBase(top=true, defaultThickness=1.4, supportedZ=27.2, supportedY=101.5, supportedX=159);

View File

@ -1,4 +0,0 @@
use <../sideRail.scad>
mirror(v=[1,0,0])
sideSupportRailBase(top=true, defaultThickness=1.4, supportedZ=27.2, supportedY=101.5, supportedX=159);

View File

@ -1,4 +1,4 @@
use <../tray.scad> use <./tray.scad>
/* /*
Parametric rack-mount tray: Parametric rack-mount tray:

View File

@ -1,9 +1,9 @@
include <./common.scad> include <../common.scad>
use <./rackEars.scad> use <../rackEars.scad>
/* /*
Parametric rack-mount tray - Parametric rack-mount tray -
Please see print/tray_P.scad for configuring/printing Please see ./entry.scad for configuring/printing
Please also make sure that the correct rack frame preset is set in rackFrame.scad. Please also make sure that the correct rack frame preset is set in rackFrame.scad.
*/ */

View File

@ -17,7 +17,6 @@ screwMask = false;
plasticMask = false; plasticMask = false;
sideSupportRailMask = true; sideSupportRailMask = true;
xBarSpaceToYBarSpace = xBarSpaceToYBarSpace =
yBarXBarConnectorTrans * yBarXBarConnectorTrans *
xBarConnectorToYBarConnectorTrans * xBarConnectorToYBarConnectorTrans *

View File

@ -128,36 +128,36 @@ def run_build(args):
final_target_directory_name = config_var final_target_directory_name = config_var
rackBuildDirFull = os.path.join(BUILD_PARENT_DIR, final_target_directory_name, RACK_BUILD_TARGET_SUB_DIR) rackBuildDirFull = os.path.join(BUILD_PARENT_DIR, final_target_directory_name, RACK_BUILD_TARGET_SUB_DIR)
rackMountBuildDirFull = os.path.join(BUILD_PARENT_DIR, final_target_directory_name, #rackMountBuildDirFull = os.path.join(BUILD_PARENT_DIR, final_target_directory_name,
RACK_MOUNT_BUILD_TARGET_SUB_DIR) # RACK_MOUNT_BUILD_TARGET_SUB_DIR)
if not os.path.exists(rackBuildDirFull): if not os.path.exists(rackBuildDirFull):
os.makedirs(rackBuildDirFull) os.makedirs(rackBuildDirFull)
if not os.path.exists(rackMountBuildDirFull): #if not os.path.exists(rackMountBuildDirFull):
os.makedirs(rackMountBuildDirFull) # os.makedirs(rackMountBuildDirFull)
if build_var == 'all': if build_var == 'all':
for dir_file in os.listdir(RACK_BUILD_DIR): for dir_file in os.listdir(RACK_BUILD_DIR):
build_single(RACK_BUILD_DIR, rackBuildDirFull, dir_file, config_var, dz, nightly) build_single(RACK_BUILD_DIR, rackBuildDirFull, dir_file, config_var, dz, nightly)
for dir_file in os.listdir(RACK_MOUNT_BUILD_DIR): #for dir_file in os.listdir(RACK_MOUNT_BUILD_DIR):
build_single(RACK_MOUNT_BUILD_DIR, rackMountBuildDirFull, dir_file, config_var, dz, # build_single(RACK_MOUNT_BUILD_DIR, rackMountBuildDirFull, dir_file, config_var, dz,
nightly) # nightly)
return return
filename_rack = find_rack(build_var) filename_rack = find_rack(build_var)
filename_rack_mount = find_rack_mount(build_var) #filename_rack_mount = find_rack_mount(build_var)
if not (filename_rack or filename_rack_mount): if not (filename_rack): #or filename_rack_mount):
print('File:', build_var, 'not found!') print('File:', build_var, 'not found!')
return return
if filename_rack: if filename_rack:
build_single(RACK_BUILD_DIR, rackBuildDirFull, filename_rack, config_var, dz, nightly) build_single(RACK_BUILD_DIR, rackBuildDirFull, filename_rack, config_var, dz, nightly)
if filename_rack_mount: #if filename_rack_mount:
build_single(RACK_MOUNT_BUILD_DIR, rackMountBuildDirFull, filename_rack_mount, config_var, dz, nightly) # build_single(RACK_MOUNT_BUILD_DIR, rackMountBuildDirFull, filename_rack_mount, config_var, dz, nightly)
def build_single(build_dir, target_dir, filename, config, dz, nightly): def build_single(build_dir, target_dir, filename, config, dz, nightly):
@ -224,8 +224,8 @@ def find_rack(filename):
return find_scad_file(RACK_BUILD_DIR, filename) return find_scad_file(RACK_BUILD_DIR, filename)
def find_rack_mount(filename): #def find_rack_mount(filename):
return find_scad_file(RACK_MOUNT_BUILD_DIR, filename) # return find_scad_file(RACK_MOUNT_BUILD_DIR, filename)
def find_scad_file(directory, filename): def find_scad_file(directory, filename):

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.