rack case design branch merge and sbcmf update

This commit is contained in:
Edward Kisiel
2025-05-25 12:24:39 -04:00
14 changed files with 3669 additions and 262 deletions

116
README.md
View File

@@ -56,14 +56,15 @@ NOTE: The submodule *SBC Model Framework* needs to be updated anytime SBC Case B
- Paper, Folded - complete
- Standard MB SBC Adapters & io plates - completed
+ SSI-EEB, SSI-CEB, ATX, Micro-ATX, DTX, Flex-ATX, Mini-DTX, Mini-Itx, Mini-ITX Thin, Mini-STX, Mini-STX Thin
- Standard MB Cases - completed
- Standard MB Cases - complete
+ SSI-EEB, SSI-CEB, ATX, Micro-ATX, DTX, Flex-ATX, Mini-DTX, Mini-ITX, Mini-ITX Thin, Mini-STX, Mini-STX Thin, Nano-ITX, NUC, Pico-ITX
- Sheet Metal, Folded
- NAS - panel_nas complete
- Rack - 1U and 2U complete
- Stacked Levels
- Sliding
- Cylinder
- Free Form
- NAS
- Rack
- Sheet Metal, Folded
- CNC Cases
All case data is stored in the json file sbc_case_builder.json with the accessory data stored in a separate file structure in sbc_case_builder_accessories.cfg. An accessory group name for a given case is stored as part of the case data in the json file. This allows for the reuse or sharing of an accessory set by different cases and can be used to manage groups of accessories.
@@ -88,6 +89,10 @@ This tab exclusively deals with folded cases. At this time the bend allowance e
Both standard motherboard adapters and cases can be generated with SBC Case Builder and this tab controls the specific settings. Since it is not possible to know the motherboard thickness it is set to 2mm and the *standard motherboard thickness* setting is used to add or subtract thickness for an accurate representation of the user provided PCB. The *rear io shield* setting is only used when generating full cases and is not needed when generating adapters and io shields. Most of the adjustments in the *3D Case Adjustments* tab also work for motherboard adapters which allows for the SBC or other device to be repositioned on the adapter while providing the full use of the accessory subsystem. Any accessory entries in the sbc_case_builder_accessories.cfg file should reference the bottom face. The *bottom cover pattern* in the *Fan and Vent Openings* tab and the *SBC Bottom Standoff* tabs also apply to motherboard adapters. There are predefined example cases and adapters available in the GUI for further reference.
### Rack Mount Case Adjustments Tab
Both 1U and 2U, 10" and 19", rack cases are configured in this tab. The first entry *rack width* selects if 10" or 19" rack cases are being created. The *rack size* sets wether 1U or 2U. The remaining tab is divided into six groups of settings each representing a virtual bay. Each bay group specifies the SBC thru the pickbox *Rack Bay1* respectively. With *rack bay1 xyz loc* and *rack bay1 rotation determining the position and z-axis rotation. The type of bay is set in the *rack bay1 face* pickbox followed by two checkboxes for the internal dividing wall, rear fan and a bay conduit selection pickbox.
### 3D Case Adjustments Tab
The *3D Case Adjustments* tab makes up the bulk of the possible case adjustments for 3D printed cases. Most of the entries in this tab are self explanatory. The *pcb loc* adjustments allow the selected device model to be moved in the case design, the *case offset* adjustments increase the selected case design dimensions. The *wallthick*, *floorthick* and *sidethick* adjust their respective areas. Do note that the *floorthick* adjustment also determines the ceiling thickness for all case designs and the *sidethick* only affects the tray_sides, tray_vu5, tray_vu7 case designs. The *gap* entry is the distance between the device PCB and the sidewall of the case design. The *tol* adjustment, located at the bottom of the tab, is a tolerance fitment adjustment for the snap, fitted, round and hex case design tops. Adjust accordingly if the tops are too tight or loose.
@@ -214,12 +219,12 @@ Multi-associative parametric positioning of accessories is implemented and allow
### classes: add1, sub, suball, add2, model, platter
Class *add1* and *add2* are used to add geometry to the case. The difference is when the addition occurs. *add1* happens at the beginning when the core case geometry is created before any subtractions and *add2* happens at the end after all subtractions have occurred. *suball* is used to affect all faces of a case, not just a single face. The “face” is the case piece that will be effected by the addition or subtraction. The *model* class is for placing supporting accessories in the model view. e.g. hard drives, fans. The *platter* class is for adding supporting accessories, that are not part of the core case geometry, to the print platter for printing e.g. an access panel cover.
Class *add1* and *add2* are used to add geometry to the case. The difference is when the addition occurs. *add1* happens at the beginning when the core case geometry is created before any subtractions and *add2* happens at the end after all subtractions have occurred. *suball* is used to affect all faces of a case, not just a single face. The “face” is the case piece that will be effected by the addition or subtraction. The *model* class is for placing supporting accessories in the model view. e.g. hard drives, fans. The *platter* class is for adding supporting accessories, that are not part of the core case geometry, to the print platter for printing e.g. a fan cover or access panel cover.
**additive type:**
art, access_panel, batt_holder, button, button_assembly, fan_cover, feet, hd_holder, hk_boom_grill, hk_boom_speaker_holder, hk_boom_vring, hk_h3_port_extender_holder, hk_hc4_oled_holder, hk_uart_holder, hk_uart_strap, keyhole, nut_holder, pcb_holder, rectangle, round, slot, sphere, standoff, text, vent_panel_hex, uart_holder, hc4_oled_holder, button, pcb_holder
art, access_panel, batt_holder, button, button_assembly, fan_cover, feet, grommet, hd_holder, hk_boom_grill, hk_boom_speaker_holder, hk_boom_vring, hk_h3_port_extender_holder, hk_hc4_oled_holder, hk_uart_holder, hk_uart_strap, keyhole, nut_holder, panel_clamp, pcb_holder, rectangle, round, slot, sphere, standoff, text, vent_panel_hex, uart_holder, hc4_oled_holder, button, pcb_holder
**subtractive type:**
@@ -234,7 +239,7 @@ access_cover, adafruit_lcd, dsub, fan, hd25, hd35, hk_boom, hk_boom_speaker, hk_
**platter type:**
access_cover, button_assembly, fan_cover, feet, hk_boom_vring, hk_h3_port_extender_holder, hk_uart_strap, vent_panel_hex
access_cover, button_assembly, fan_cover, feet, grommet, hk_boom_vring, hk_h3_port_extender_holder, hk_uart_strap, vent_panel_hex
## Accessory Reference Manual
@@ -459,6 +464,35 @@ DESCRIPTION: creates case feet.
```
### grommet
```
CLASSES: add1, add2, platter
DESCRIPTION: creates different groumet styles.
MASK: yes
USAGE: "class", "grommet", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
class = "add1", "add2", "platter"
type = "grommet"
loc_x = x location placement
loc_y = y location placement
loc_z = z location placement
face = "top", "bottom", "right", "left", "front", "rear"
rotation[] = object rotation
parametric[] = "case", "sbc", "sbc-case_z"
size[0] = od outside diameter of grommet body
size[1] = id inside hole diameter of grommet body
size[2] = wall thickness of installation
data[0] = "top","bottom","front","rear","left","right"
data[1] = "sleeve"
data[2] = assembled true, false
mask[0] = true enables component mask
mask[1] = mask length
mask[2] = mask setback
mask[3] = mstyle "default"
```
### hd_holder
```
@@ -771,6 +805,35 @@ DESCRIPTION: creates nut holder of various styles.
```
### panel_clamp
```
CLASSES: add1, add2
DESCRIPTION: creates clamps to join two panels.
MASK: yes
USAGE: "class", "panel_clamp", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
class = "add1", "add2"
type = "panel_clamp"
loc_x = x location placement
loc_y = y location placement
loc_z = z location placement
face = "top", "bottom", "right", "left", "front", "rear"
rotation[] = object rotation
parametric[] = "case", "sbc", "sbc-case_z"
size[0] = top diameter or x size in mm
size[1] = bottom diameter or y size in mm
size[2] = clamp height in mm
data[0] = orientation "top","bottom","rear","front","left","right"
data[1] = "sloped"
data[2] = "m2", "m2.5", "m3", "m4"
mask[0] = false
mask[1] = length
mask[2] = set back
mask[3] = mstyle "default", "holes"
```
### pcb_holder
```
@@ -2088,6 +2151,35 @@ DESCRIPTION: creates case feet.
```
### grommet
```
CLASSES: add1, add2, platter
DESCRIPTION: creates different groumet styles.
MASK: yes
USAGE: "class", "grommet", loc_x, loc_y, loc_z, face, rotation[], parametric[], size[], data[], mask[]
class = "add1", "add2", "platter"
type = "grommet"
loc_x = x location placement
loc_y = y location placement
loc_z = z location placement
face = "top", "bottom", "right", "left", "front", "rear"
rotation[] = object rotation
parametric[] = "case", "sbc", "sbc-case_z"
size[0] = od outside diameter of grommet body
size[1] = id inside hole diameter of grommet body
size[2] = wall thickness of installation
data[0] = "top","bottom","front","rear","left","right"
data[1] = "sleeve"
data[2] = assembled true, false
mask[0] = true enables component mask
mask[1] = mask length
mask[2] = mask setback
mask[3] = mstyle "default"
```
### hk_boom_speaker_holder
```
@@ -2220,6 +2312,16 @@ DESCRIPTION: creates hex pattern covers for vent openings.
```
## Case Build Notes
This area covers specific build notes for specific cases. Hardware used or other relavent information is list by case design name.
### panel_nas Case Design
The panel_nas design can be CNC cut or 3D printed. By changing the top and bottom standoff type to "none" in the *SBC Standoff Global Settings* tabs respectively, only a hole is generated for CNC cutting support. Panels can be exported in DXF or SVG by selecting the *part" view under the *view* tab, then the indivual part and select the *section part* checkbox. After the projection has been generated render it by pressing F7 or by selecting render from the user interface. Exported DXF and SVG file formats are available under the File->Export menu.
### rack Case Design
This case is divided into 3 pieces for the 19" cases and 2 pieces for the 10" cases. They can be selected in the *part* view for STL export under the *view* tab by selecting the left, bottom or right individual part. The peices are held together using M2x8mm screws and nuts. The 10 inch cases requires 5 sets of screws and nuts and the 19" rack case takes 10 sets.
## Accuracy
In the past there was been no way of validating whether a SBC Model Framework model and its components were dimensionaly accurate in their size and placement other then trial and error. Along with producing cases this project provides a much needed model validation tool to assure model accuracy thru the use of test cases. It works on the very simple premise that if the real SBC fits the test case then the virtual model is accurate or otherwise shows were corrections are needed. This will further increased the overall accuracy of models over time.

View File

@@ -1,10 +1,11 @@
// Gets a list of SBCs from the SBC Model Framework and Accessory sets
// for use with SBC Case Builder.
// After running this script, copy the output from the first Echo command into the
// list of SBC boards in `sbc_case_builder.scad:32`
// Also copy the output from the second Echo command into the list of case acceessory
// sets in `sbc_case_builder.scad:196`
/* Gets a list of SBCs from the SBC Model Framework and Accessory sets
for use with SBC Case Builder.
After running this script, copy the output from the first Echo command into the
list of SBC boards in `sbc_case_builder.scad:32` and `sbc_case_builder.scad`
6 locations line 82,90,98,106,114,122 for the sbc selection for the rack case design.
Also copy the output from the second Echo command into the list of case acceessory
sets in `sbc_case_builder.scad:196`
*/
include <./SBC_Model_Framework/sbc_models.cfg>;
include <./sbc_case_builder_accessories.cfg>;
echo(" ");

109
lib/grommet.scad Normal file
View File

@@ -0,0 +1,109 @@
/*
This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder
Copyright 2022,2023,2024,2025 Edward A. Kisiel hominoid@cablemi.com
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.
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 <http://www.gnu.org/licenses/>
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
grommet(face, style, od, id, wall, assembly, mask)
grommet_clip(style, od, id, wall)
*/
/*
NAME: grommet
DESCRIPTION: creates different groumet styles
TODO: none
USAGE: grommet(face, style, od, id, wall, assembly, mask)
data[0] = "top","bottom","front","rear","left","right"
data[1] = "sleeve"
size[0] = od outside diameter of grommet body
size[1] = id inside hole diameter of grommet body
size[2] = wall thickness of installation
data[3] = assembled true, false
mask[0] = true enables component mask
mask[1] = mask length
mask[2] = mask setback
mask[3] = mstyle "default"
*/
module grommet(face = "bottom", style = "sleeve", od, id, wall, assembly, mask) {
height = 4.5+(2*wall);
enablemask = mask[0];
mlength = height+mask[1];
msetback = mask[2];
mstyle = mask[3];
cut = .25;
lip_od = od+4;
lip_thick = 2.5;
adj = .01;
$fn = 90;
rotx = face == "rear" ? 270 : face == "front" || face == "left" || face == "right" ? 90 : face == "top" ? 180 : 0;
roty = 0;
rotz = face == "left" ? 90 : face == "right" ? 270 : 0;
rx = face == "left" ? -lip_thick : face == "right" ? lip_thick : 0;
ry = face == "front" ? lip_thick : face == "rear" ? -lip_thick : 0;
rz = face == "bottom" ? -lip_thick : face == "top" ? lip_thick : 0;
translate([rx,ry,rz]) rotate([rotx,roty,rotz]) {
if(enablemask == true && mstyle == "default") {
if(style == "sleeve") {
translate([0, 0, -adj-msetback]) cylinder(d = od+.5, h = mlength);
}
}
if(enablemask == false) {
if(style == "sleeve") {
difference() {
union() {
cylinder(d=od, h=height);
cylinder(d=lip_od, h=2.5);
}
translate([0,0,-adj]) cylinder(d=id, h=height+(2*adj));
translate([-lip_od/2,-cut/2,-adj]) cube([lip_od+(2*adj),cut,height+(2*adj)]);
translate([0,0,2.5+wall]) grommet_clip(style,od,id,wall);
}
if(assembly == true) {
translate([0,0,2.5+wall]) grommet_clip(style,od,id,wall);
}
}
}
}
}
module grommet_clip(style,od,id,wall) {
height = 2.5+wall;
lip_od = od+4;
adj = .01;
$fn = 90;
if(style == "sleeve") {
difference() {
cylinder(d=lip_od, h=2.5);
difference() {
translate([0,0,-adj]) cylinder(d=od, h=wall+2*adj);
translate([-lip_od/2,-od/2,-adj]) cube([lip_od+(2*adj),2,height-2]);
translate([-lip_od/2,-2+od/2,-adj]) cube([lip_od+(2*adj),2,height-2]);
}
translate([-lip_od,-(od-6)/2,-adj]) cube([lip_od+(2*adj),od-6,wall+(2*adj)]);
}
}
}

118
lib/panel_clamp.scad Normal file
View File

@@ -0,0 +1,118 @@
/*
NAME: panel_clamp
DESCRIPTION: creates various clamps to join two panels
TODO: none
USAGE: panel_clamp(face, style, screw, dia_x, dia_y, height, mask)
data[0] = "top","bottom","rear","front","left","right"
data[1] = "sloped"
data[2] = "m2", "m2.5", "m3", "m4"
size_x = top diameter or x size in mm
size_y = bottom diameter or y size in mm
size_z = clamp height in mm
mask[0] = true enables component mask
mask[1] = mask length
mask[2] = mask setback
mask[3] = mstyle "default", "holes"
*/
module panel_clamp(face, style, screw, dia_x, dia_y, height, mask) {
nuts = [[2,4,1.6], // m2 size, diameter, height
[2.5,5,2], // m2.5 size, diameter, height
[3,5.5,2.4], // m3 size, diameter, height
[4,7,3.2]]; // m4 size, diameter, height
enablemask = mask[0];
mlength = mask[1];
msetback = mask[2];
mstyle = mask[3];
adj = .01;
$fn = 90;
rotx = face == "rear" ? 270 : face == "front" || face == "left" || face == "right" ? 90 : face == "top" ? 180 : 0;
roty = 0;
rotz = face == "left" ? 90 : face == "right" ? 270 : 0;
if(enablemask == true) {
rotate([rotx,roty,rotz]) {
if(mstyle == "default") {
cylinder(d=dia_y, h=height);
}
if(screw == "m2" && mstyle == "holes") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 2.25]) rotate([0,90,0])
cylinder(d=nuts[0][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 2.25]) rotate([0,90,0])
cylinder(d=nuts[0][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[0][0]+.5, 0, 2.25]) rotate([0,90,0])
cylinder(d=nuts[0][1]+.5, h=dia_y*.375);
}
if(screw == "m2.5" && mstyle == "holes") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[1][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
cylinder(d=nuts[1][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[1][0]+.5, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[1][1]+.5, h=dia_y*.375);
}
if(screw == "m3" && mstyle == "holes") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[2][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
cylinder(d=nuts[2][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[2][0]+.5, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[2][1]+.5, h=dia_y*.375);
}
if(screw == "m4" && mstyle == "holes") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[3][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
cylinder(d=nuts[3][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[3][0]+.5, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[3][1]+.5, h=dia_y*.375);
}
}
}
if(enablemask == false) {
rotate([rotx,roty,rotz]) {
difference() {
cylinder(d2=dia_x, d1=dia_y, h=height);
if(screw == "m2") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 2.25]) rotate([0,90,0])
cylinder(d=nuts[0][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 2.25]) rotate([0,90,0])
cylinder(d=nuts[0][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[0][0]+.5, 0, 2.25]) rotate([0,90,0])
cylinder(d=nuts[0][1]+.5, h=dia_y*.375);
}
if(screw == "m2.5") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[1][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
cylinder(d=nuts[1][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[1][0]+.5, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[1][1]+.5, h=dia_y*.375);
}
if(screw == "m3") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[2][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
cylinder(d=nuts[2][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[2][0]+.5, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[2][1]+.5, h=dia_y*.375);
}
if(screw == "m4") {
translate([(-dia_y-(nuts[2][0]+.5)/2)/2, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[3][0]+.5, h=dia_y+2);
translate([-(dia_y/2), 0, 3]) rotate([0,90,0])
cylinder(d=nuts[3][1]*2/sqrt(3), h=dia_y*.375, $fn=6);
translate([nuts[3][0]+.5, 0, 3]) rotate([0,90,0])
cylinder(d=nuts[3][1]+.5, h=dia_y*.375);
}
}
}
}
}

84
lib/rack.scad Normal file
View File

@@ -0,0 +1,84 @@
/*
This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder
Copyright 2022,2023,2024,2025 Edward A. Kisiel hominoid@cablemi.com
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.
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 <http://www.gnu.org/licenses/>
Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
rack_end_bracket(side, size, thick)
*/
/*
NAME: rack_end_bracket
DESCRIPTION: creates rack mounting ears
TODO: none
USAGE: rack_end_bracket(side, size, thick)
side = "left", "right"
size = "1u", "2u", "3u", "4u"
thick = thickness of bracket
*/
module rack_end_bracket(side, size, thick) {
depth = size == "1u" ? 44.45 : size == "1u+" ? 59.26 : size == "1u++" ? 74.07 : size == "2u" ? 2*44.45 : size == "3u" ? 3*44.45 : 4*44.45;
c_fillet = 2;
hole = 3.2;
rack_hole = 6;
tab_width = 15.875+thick;
b_width = thick;
b_depth = depth;
b_height = thick;
b_loc = [-thick,0,0];
adjust = .01;
$fn=90;
if(side == "left") {
translate([thick,-thick,depth]) rotate([270,0,0])
difference() {
union() {
translate([(-tab_width/2),(depth/2),thick/2])
cube_fillet_inside([tab_width,depth,thick],
vertical=[0,c_fillet,c_fillet,0],top=[0,0,0,0],bottom=[0,0,0,0], $fn=90);
translate([(b_width/2)+b_loc[0],(b_depth/2)+b_loc[1],(b_height/2)+b_loc[2]])
cube_fillet_inside([b_width,b_depth,b_height],
vertical=[0,0,0,0],top=[c_fillet,0,c_fillet,0],bottom=[0,0,0,0], $fn=90);
}
for (c=[7.5:15:depth]) {
translate([(3-thick)-9-(15.875-9)/2,c,-adjust]) slot(rack_hole,3,thick+(adjust*2));
}
}
}
if(side == "right") {
translate([-thick,-thick,0]) rotate([270,180,0])
difference() {
union() {
translate([(-tab_width/2),(depth/2),thick/2])
cube_fillet_inside([tab_width,depth,thick],
vertical=[0,c_fillet,c_fillet,0],top=[0,0,0,0],bottom=[0,0,0,0], $fn=90);
translate([(b_width/2)+b_loc[0],(b_depth/2)+b_loc[1],(b_height/2)+b_loc[2]])
cube_fillet_inside([b_width,b_depth,b_height],
vertical=[0,0,0,0],top=[c_fillet,0,c_fillet,0],bottom=[0,0,0,0], $fn=90);
}
for (c=[7.5:15:depth]) {
translate([(3-thick)-9-(15.875-9)/2,c,-adjust]) slot(rack_hole,3,thick+(adjust*2));
}
}
}
}

View File

@@ -82,6 +82,9 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
if(type == "feet") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) feet(size_x, size_z);
}
if(type == "grommet") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) grommet(data[0], data[1], size_x, size_y, size_z, data[2], mask);
}
if(type == "hd_holder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_mount(data[0],data[1],data[2],data[3]);
}
@@ -112,6 +115,9 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) {
if(type == "nut_holder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) nut_holder(data[0], data[1], size_x, size_y, size_z, mask);
}
if(type == "panel_clamp") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) panel_clamp(data[0], data[1], data[2], size_x, size_y, size_z, mask);
}
if(type == "pcb_holder") {
translate([loc_x,loc_y,loc_z]) rotate(rotation) pcb_holder([size_x,size_y,size_z],data[0]);
}

View File

@@ -408,19 +408,39 @@ echo(pcb_depth+case_offset_y-10);
if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_rear" &&
bottom_rear_left_enable == true && bottom_standoff[6] != "blind") {
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
ahpx = sbc_model == "n2" ? 7 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_x;
ahpy = sbc_model == "n2" ? 15 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_y;
translate([ahpx,ahpy,-adj])
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
}
if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_front" &&
bottom_front_left_enable == true && bottom_standoff[6] != "blind") {
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
ahpx = sbc_model == "n2" ? 8 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_x;
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 112.75 : pcbhole_y;
translate([ahpx,ahpy,-adj])
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
}
if (class == "pcbhole" && id == 0 && pcbhole_pos == "right_rear" &&
bottom_rear_right_enable == true && bottom_standoff[6] != "blind") {
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 80.75 : pcbhole_x;
ahpy = sbc_model == "n2" ? 6 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_y;
translate([ahpx,ahpy,-adj])
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
}
if (class == "pcbhole" && id == 0 && pcbhole_pos == "right_front" &&
bottom_front_right_enable == true && bottom_standoff[6] != "blind") {
translate([pcbhole_x,pcbhole_y,-adj]) cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 80.75 : pcbhole_x;
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 112.75 : pcbhole_y;
translate([ahpx,ahpy,-adj])
cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
}
}
@@ -445,6 +465,7 @@ echo(pcb_depth+case_offset_y-10);
pcbhole_size = sbc_data[s[0]][i+9][0];
pcbhole_state = sbc_data[s[0]][i+10][0];
pcbhole_pos = sbc_data[s[0]][i+10][4];
if(id == pcbid && id != 0 && pcbclass == "pcbhole") {
if (pcbclass == "pcbhole" && pcbhole_pos == "left_rear" &&
multipcb_bottom_rear_left_enable == true &&
@@ -599,13 +620,15 @@ echo(pcb_depth+case_offset_y-10);
pcbhole_z = sbc_data[s[0]][i+6];
pcbhole_size = sbc_data[s[0]][i+9][0];
pcbhole_pos = sbc_data[s[0]][i+10][4];
pcbadj_z = sbc_model == "n2" || sbc_model == "m1" ? -6 :
sbc_model == "n2+" ? -4.5 : 0;
if(class == "pcbhole" && id == pcb_id) {
if (pcbhole_pos == "left_rear" && bottom_rear_left_enable == true) {
bottom_support = bottom_sidewall_support == true ? bottom_rear_left_support : "none";
pcb_standoff = [bottom_standoff[0],
bottom_standoff[1],
bottom_height-pcb_z+pcb_loc_z+bottom_rear_left_adjust,
bottom_height-pcb_z+pcb_loc_z+bottom_rear_left_adjust+pcbadj_z,
bottom_standoff[3],
bottom_standoff[4],
bottom_standoff[5],
@@ -616,13 +639,18 @@ echo(pcb_depth+case_offset_y-10);
bottom_standoff[10],
bottom_standoff[11],
bottom_standoff[12]];
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
ahpx = sbc_model == "n2" ? 7 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_x;
ahpy = sbc_model == "n2" ? 15 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_y;
translate([ahpx,ahpy,0])
standoff(pcb_standoff,[false,10,2,"default"]);
}
if (pcbhole_pos == "left_front" && bottom_front_left_enable == true) {
bottom_support = bottom_sidewall_support == true ? bottom_front_left_support : "none";
pcb_standoff = [bottom_standoff[0],
bottom_standoff[1],
bottom_height-pcb_z+pcb_loc_z+bottom_front_left_adjust,
bottom_height-pcb_z+pcb_loc_z+bottom_front_left_adjust+pcbadj_z,
bottom_standoff[3],
bottom_standoff[4],
bottom_standoff[5],
@@ -633,13 +661,18 @@ echo(pcb_depth+case_offset_y-10);
bottom_standoff[10],
bottom_standoff[11],
bottom_standoff[12]];
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
ahpx = sbc_model == "n2" ? 8 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_x;
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 112.75 : pcbhole_y;
translate([ahpx,ahpy,0])
standoff(pcb_standoff,[false,10,2,"default"]);
}
if (pcbhole_pos == "right_rear" && bottom_rear_right_enable == true) {
bottom_support = bottom_sidewall_support == true ? bottom_rear_right_support : "none";
pcb_standoff = [bottom_standoff[0],
bottom_standoff[1],
bottom_height-pcb_z+pcb_loc_z+bottom_rear_right_adjust,
bottom_height-pcb_z+pcb_loc_z+bottom_rear_right_adjust+pcbadj_z,
bottom_standoff[3],
bottom_standoff[4],
bottom_standoff[5],
@@ -650,13 +683,18 @@ echo(pcb_depth+case_offset_y-10);
bottom_standoff[10],
bottom_standoff[11],
bottom_standoff[12]];
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 80.75 : pcbhole_x;
ahpy = sbc_model == "n2" ? 6 : sbc_model == "n2+" ? 9.25 :
sbc_model == "m1" ? 9.25 : pcbhole_y;
translate([ahpx,ahpy,0])
standoff(pcb_standoff,[false,10,2,"default"]);
}
if (pcbhole_pos == "right_front" && bottom_front_right_enable == true) {
bottom_support = bottom_sidewall_support == true ? bottom_front_right_support : "none";
pcb_standoff = [bottom_standoff[0],
bottom_standoff[1],
bottom_height-pcb_z+pcb_loc_z+bottom_front_right_adjust,
bottom_height-pcb_z+pcb_loc_z+bottom_front_right_adjust+pcbadj_z,
bottom_standoff[3],
bottom_standoff[4],
bottom_standoff[5],
@@ -667,7 +705,12 @@ echo(pcb_depth+case_offset_y-10);
bottom_standoff[10],
bottom_standoff[11],
bottom_standoff[12]];
translate([pcbhole_x,pcbhole_y,0]) standoff(pcb_standoff,[false,10,2,"default"]);
ahpx = sbc_model == "n2" ? 82 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 80.75 : pcbhole_x;
ahpy = sbc_model == "n2" ? 75 : sbc_model == "n2+" ? 80.75 :
sbc_model == "m1" ? 112.75 : pcbhole_y;
translate([ahpx,ahpy,0])
standoff(pcb_standoff,[false,10,2,"default"]);
}
}
}

1352
mod/case_rack.scad Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -31,7 +31,7 @@ individual_part = "bottom"; // [top, bottom, right, left, front, rear, io_shield
// section individual parts for panel cases
section_part = false; // [true,false]
// single board computer model
sbc_model = "c1+"; // ["c1+", "c2", "c4", "hc4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express", "ssi-eeb", "ssi-ceb", "atx", "micro-atx", "dtx", "flex-atx", "mini-dtx", "mini-itx", "mini-itx_thin", "mini-stx", "mini-stx_thin", "nano-itx", "nuc", "pico-itx"]
sbc_model = "c1+"; // ["c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express", "ssi-eeb", "ssi-ceb", "atx", "micro-atx", "dtx", "flex-atx", "mini-dtx", "mini-itx", "mini-itx_thin", "mini-stx", "mini-stx_thin", "nano-itx", "nuc", "pico-itx"]
// sbc off in model view
sbc_off = false;
@@ -42,7 +42,7 @@ sbc_highlight = false;
// enable highlight for accessory subtractive geometry
accessory_highlight = false;
// base case design
case_design = "shell"; // [shell,panel,panel_nas,stacked,tray,tray_sides,tray_vu5,tray_vu7,round,hex,snap,fitted,paper_split-top,paper_full-top,adapter_ssi-eeb,adapter_ssi-ceb,adapter_atx,adapter_micro-atx,adapter_dtx,adapter_flex-atx,adapter_mini-dtx,adapter_mini-itx,adapter_mini-itx_thin,adapter_mini-stx,adapter_mini-stx_thin]
case_design = "shell"; // [shell,panel,panel_nas,stacked,tray,tray_sides,tray_vu5,tray_vu7,round,hex,snap,fitted,rack,paper_split-top,paper_full-top,adapter_ssi-eeb,adapter_ssi-ceb,adapter_atx,adapter_micro-atx,adapter_dtx,adapter_flex-atx,adapter_mini-dtx,adapter_mini-itx,adapter_mini-itx_thin,adapter_mini-stx,adapter_mini-stx_thin]
// raises top mm in model view or < 0 = off
raise_top = 0; // [-1:100]
@@ -73,6 +73,59 @@ standard_motherboard_thickness = 0; //[-3:.01:3]
// rear io plate opening for standard form motherboards
rear_io_shield = false;
/* [Rack Mount Case Adjustments] */
// size of rack 10" or 19" //
rack_width = 19; //[10,19]
// size of rack mount cases 1U or 2U //
rack_size = "1u"; //["1u","1u+","1u++","2u"]
// enable rack io plate opening for sbc
Rack_Bay1 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450]
rack_bay1_rotation = 0; // [0:90:270]
rack_bay1_face = "fixed"; //["open","fixed","removable","vent"]
rack_bay1_wall = false; // [true,false]
rack_bay1_rear_fan = false; //[true,false]
rack_bay1_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
Rack_Bay2 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450]
rack_bay2_rotation = 0; // [0:90:270]
rack_bay2_face = "fixed"; //["open","fixed","removable","vent"]
rack_bay2_wall = false; // [true,false]
rack_bay2_rear_fan = false; //[true,false]
rack_bay2_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
Rack_Bay3 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450]
rack_bay3_rotation = 0; // [0:90:270]
rack_bay3_face = "fixed"; //["open","fixed","removable","vent"]
rack_bay3_wall = false; // [true,false]
rack_bay3_rear_fan = false; //[true,false]
rack_bay3_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
Rack_Bay4 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450]
rack_bay4_rotation = 0; // [0:90:270]
rack_bay4_face = "fixed"; //["open","fixed","removable","vent"]
rack_bay4_wall = false; // [true,false]
rack_bay4_rear_fan = false; //[true,false]
rack_bay4_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
Rack_Bay5 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450]
rack_bay5_rotation = 0; // [0:90:270]
rack_bay5_face = "fixed"; //["open","fixed","removable","vent"]
rack_bay5_wall = false; // [true,false]
rack_bay5_rear_fan = false; //[true,false]
rack_bay5_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
Rack_Bay6 = "none"; // ["none", "c1+", "c2", "c4", "hc4", "c5", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express"]
rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450]
rack_bay6_rotation = 0; // [0:90:270]
rack_bay6_face = "fixed"; //["open","fixed","removable","vent"]
rack_bay6_rear_fan = false; //[true,false]
rack_bay6_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"]
/* [3D Case Adjustments] */
// sbc location x axis
pcb_loc_x = 0; //[0:.01:300]
@@ -153,7 +206,7 @@ hd_y_position = 25; // [0:300]
hd_z_position = 40; // [0:300]
// case accessory group to load
accessory_name = "none"; // ["none", "hk_uart", "c4_shell_boombox", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_panel_lcd3.5", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_shifter_shield", "xu4_keyhole", "hc4_panel_nas", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "hc4_tray_drivebox2.5", "m2_shell", "m2_eyespi_eink1.54", "m2_eyespi_lcd2.8", "m1s_shell_nvme", "m1s_shell_ups", "m1s_tray_nvme", "m1_tray_ssd", "m1_fitted_pizzabox2.5", "m1_fitted_pizzabox3.5", "h3_shell", "h3_shell_router", "h3_lowboy", "h3_lowboy_router", "h3_panel_nas", "h3_ultimate", "h3_ultimate2", "h4_panel_nas", "h4_panel_nas-bottom_sbc", "show2_shell", "rpi5_m2hat", "rpi5_bottom_m2hat", "rock5b", "adapter_mini-stx_m1s", "nas", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"]
accessory_name = "none"; // ["none", "hk_uart", "c4_shell_boombox", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_panel_lcd3.5", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_shifter_shield", "xu4_keyhole", "hc4_panel_nas", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "hc4_tray_drivebox2.5", "n-series_rack19-1u", "n1_rack10-1u", "m2_shell", "m2_eyespi_eink1.54", "m2_eyespi_lcd2.8", "m1s_shell_nvme", "m1s_shell_ups", "m1s_tray_nvme", "m1_tray_ssd", "m1_fitted_pizzabox2.5", "m1_fitted_pizzabox3.5", "h3_shell", "h3_shell_router", "h3_lowboy", "h3_lowboy_router", "h3_panel_nas", "h3_ultimate", "h3_ultimate2", "h4_panel_nas", "show2_shell", "rpi5_m2hat", "rpi5_bottom_m2hat", "rock5b", "adapter_mini-stx_m1s", "nas", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"]
// sbc information text color
text_color = "Green"; // [Green, Black, Dimgrey, White, Yellow, Orange, Red, DarkbBlue]
@@ -372,6 +425,7 @@ multipcb_bottom_front_right_enable = true;
multipcb_bottom_front_right_adjust = 0; //[-20:.01:20]
multipcb_bottom_front_right_support = "front"; //[none,left,rear,front,right]
/* [Hidden] */
a = search([accessory_name],accessory_data);
s = search([sbc_model],sbc_data);
@@ -385,19 +439,16 @@ pcb_color = sbc_data[s[0]][11][1];
pcb_radius = sbc_data[s[0]][11][0];
pcb_z = sbc_model == "ssi-eeb" || sbc_model == "ssi-ceb" || sbc_model == "atx" || sbc_model == "micro-atx" || sbc_model == "dtx" || sbc_model == "flex-atx" || sbc_model == "mini-dtx" || sbc_model == "mini-itx" || sbc_model == "mini-itx_thin" || sbc_model == "mini-stx" || sbc_model == "mini-stx_thin" || sbc_model == "nano-itx" || sbc_model == "nuc" || sbc_model == "pico-itx" ? pcb_z_orig + standard_motherboard_thickness : pcb_z_orig;
width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+gap)+case_offset_x+(101.6-pcb_width) : case_design == "panel_nas" && pcb_width > 100 ? pcb_width+2*(sidethick+gap)+case_offset_x : pcb_width+(2*(wallthick+gap))+case_offset_x;
depth = case_design == "panel_nas" ? pcb_depth+2*(wallthick+gap)+case_offset_y + 147-pcb_depth+hd_y_position : pcb_depth+2*(wallthick+gap)+case_offset_y;
width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+gap)+case_offset_x+(101.6-pcb_width) : case_design == "panel_nas" && pcb_width > 100 ? pcb_width+2*(sidethick+gap)+case_offset_x : case_design == "rack" && rack_width == 19 ? 450 : case_design == "rack" && rack_width == 10 ? 221.5 : pcb_width+(2*(wallthick+gap))+case_offset_x;
depth = case_design == "panel_nas" ? pcb_depth+2*(wallthick+gap)+case_offset_y + 147-pcb_depth+hd_y_position : case_design == "rack" ? 100+case_offset_y : pcb_depth+2*(wallthick+gap)+case_offset_y;
top_height = pcb_tmaxz+floorthick+case_offset_tz+pcb_loc_z;
bottom_height = (case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") ? pcb_z+pcb_bmaxz+floorthick+case_offset_bz+4 : pcb_z+pcb_bmaxz+floorthick+case_offset_bz;
case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position+(hd_bays * (hd_space + 26.1)) : bottom_height+top_height;
case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position+(hd_bays * (hd_space + 26.1)) : case_design == "rack" && rack_size == "1u" ? 44.45+floorthick : case_design == "rack" && rack_size == "1u+" ? 59.26+floorthick : case_design == "rack" && rack_size == "1u++" ? 74.07+floorthick : case_design == "rack" && rack_size == "2u" ? 88.90+floorthick : bottom_height+top_height;
case_diameter = sqrt(pow(width-wallthick-gap,2)+pow(depth-wallthick-gap,2));
hex_diameter = sqrt(pow(width+2*(wallthick+gap),2)+pow(depth+2*(wallthick+gap),2));
//hd_spacer = case_design == "panel_nas" && pcb_width > 100 ? (pcb_width+case_offset_x+2*gap)-101.6 :
// case_design == "panel_nas" && pcb_width <= 100 ? (width-2*(sidethick+gap)-101.6) : 0;
hd_spacer = case_design == "panel_nas" && pcb_width > 100 ? (pcb_width+case_offset_x+2*gap)-101.6 :
case_design == "panel_nas" && pcb_width <= 100 ? (width-2*(sidethick+gap)-101.6) : 0;
/* [Hidden] */
top_standoff = [top_standoff_size,
top_standoff_diameter,
18,
@@ -482,6 +533,25 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size,
multipcb_bottom_standoff_insert_dia,
multipcb_bottom_standoff_insert_height];
rack_bay_sbc = [Rack_Bay1,Rack_Bay2,Rack_Bay3,Rack_Bay4,Rack_Bay5,Rack_Bay6];
rack_bay_xyz_loc = [[rack_bay1_xyz_loc[0],rack_bay1_xyz_loc[1],rack_bay1_xyz_loc[2]],
[rack_bay2_xyz_loc[0],rack_bay2_xyz_loc[1],rack_bay2_xyz_loc[2]],
[rack_bay3_xyz_loc[0],rack_bay3_xyz_loc[1],rack_bay3_xyz_loc[2]],
[rack_bay4_xyz_loc[0],rack_bay4_xyz_loc[1],rack_bay4_xyz_loc[2]],
[rack_bay5_xyz_loc[0],rack_bay5_xyz_loc[1],rack_bay5_xyz_loc[2]],
[rack_bay6_xyz_loc[0],rack_bay6_xyz_loc[1],rack_bay6_xyz_loc[2]]];
rack_bay_rotation = [rack_bay1_rotation, rack_bay2_rotation, rack_bay3_rotation, rack_bay4_rotation, rack_bay5_rotation, rack_bay6_rotation];
rack_bay_face = [rack_bay1_face, rack_bay2_face, rack_bay3_face, rack_bay4_face, rack_bay5_face, rack_bay6_face];
rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall, rack_bay5_wall, false];
rack_bay_rear_fan = [rack_bay1_rear_fan, rack_bay2_rear_fan, rack_bay3_rear_fan, rack_bay4_rear_fan, rack_bay5_rear_fan, rack_bay6_rear_fan];
rack_bay_rear_conduit = [rack_bay1_rear_conduit, rack_bay2_rear_conduit, rack_bay3_rear_conduit, rack_bay4_rear_conduit, rack_bay5_rear_conduit, rack_bay6_rear_conduit];
baysize = (450-(2*wallthick))/6;
bay_height = rack_size == "1u" ? 44.45-floorthick :
rack_size == "1u+" ? (44.45/3)+44.45-floorthick :
rack_size == "1u++" ? 2*(44.45/3)+44.45-floorthick : (2 * 44.45)-floorthick;
adj = .01;
$fn=90;
@@ -541,6 +611,43 @@ if (view == "platter") {
case_bottom(case_design);
translate([0,(2*depth)+20,case_z+floorthick]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "rack") {
case_rack(case_design,"bottom");
translate([0,(2*depth)+20,case_z+floorthick]) rotate([180,0,0]) case_rack(case_design,"top");
// rear fan covers
ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1;
for(r = [0:ucount-1]) {
fan_offset = -75+(75-rear_fan_size)/2;
if(rack_bay_rear_fan[r] == true) {
translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8,
-80,(case_z-rear_fan_size)/2])
fan_cover(rear_fan_size, wallthick, rear_cooling);
}
}
// rear grommets
for(r = [0:len(rack_bay_sbc)-1]) {
grommet_offset = -75+11;
if(rack_bay_rear_conduit[r] == "grommet") {
translate([0,-50,0]) rotate([270,0,0]) difference() {
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
}
translate([0,-30,0]) rotate([270,0,0]) difference() {
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
}
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,-70,0])
grommet_clip("sleeve", 10, r+2, wallthick);
}
}
for(r = [0:ucount-1]) {
if(rack_bay_face[r] == "removable") {
translate([-gap-wallthick-1+(75*(r))+8,-300,0]) bay_tray(depth, r);
}
}
}
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
color("dimgrey",1) case_adapter(case_design);
color("dimgrey",1) translate([-180, 0, 4]) rotate([270,0,0]) io_shield();
@@ -1011,6 +1118,125 @@ if (view == "model") {
sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false);
}
}
if(case_design == "rack") {
if(lower_bottom >= 0) {
difference() {
color("dimgrey",1) translate([0,0,-lower_bottom]) case_rack(case_design,"bottom");
if(move_rear < 0) {
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
cube([width+2,gap+wallthick+1.01,case_z+2]);
}
if(move_front < 0) {
translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1])
cube([width+2,gap+wallthick+1.01,case_z+2]);
}
if(move_leftside < 0) {
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
cube([gap+wallthick+1.01,depth+2,case_z+2]);
}
if(move_rightside < 0) {
translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1])
cube([gap+wallthick+1,depth+2,case_z+2]);
}
}
}
if(raise_top >= 0) {
difference() {
color("dimgrey",1) translate([0,0,raise_top]) case_rack(case_design,"top");
if(move_rear < 0) {
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
cube([width+2,gap+wallthick+1.01,case_z+2]);
}
if(move_front < 0) {
translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1])
cube([width+2,gap+wallthick+1.01,case_z+2]);
}
if(move_leftside < 0) {
translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1])
cube([gap+wallthick+1.01,depth+2,case_z+2]);
}
if(move_rightside < 0) {
translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1])
cube([gap+wallthick+1,depth+2,case_z+2]);
}
}
}
ucount = rack_width == 10 ? 2 : len(rack_bay_sbc)-1;
// rear fan covers
for(r = [0:ucount]) {
fan_offset = -75+(75-rear_fan_size)/2;
if(rack_bay_rear_fan[r] == true) {
translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8,
depth-gap,(case_z-rear_fan_size)/2])
rotate([90,0,0]) fan_cover(rear_fan_size, wallthick, rear_cooling);
}
// rear grommets
grommet_offset = -75+11;
if(rack_bay_rear_conduit[r] == "grommet" || rack_bay_rear_conduit[r] == "grommets-vertical") {
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset+4,depth-wallthick-gap,13])
color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]);
}
if(rack_bay_rear_conduit[r] == "grommets-vertical") {
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset+4,depth-wallthick-gap,30])
color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]);
}
// bay inserts
bayadj = r == 0 ? -75.5 : r == 5 ? -74.75: -75;
if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "none") {
color("gray") translate([bayadj+75*(r+1),0,floorthick])
bay_tray(depth-2*wallthick-gap-.5-tol,r);
}
if(rack_bay_face[r] == "removable" && r !=0 && rack_bay_sbc[r] != "none") {
color("gray") translate([bayadj+75*(r+1),0,floorthick])
bay_tray(depth-2*wallthick-gap-.5-tol,r);
}
}
// sbc placement
if(sbc_off == false) {
for(i = [0:len(rack_bay_sbc)-1]) {
if(rack_bay_sbc[i] != "none" && rack_bay_face[i] != "removable") {
s = search([rack_bay_sbc[i]],sbc_data);
pcb_id = sbc_data[s[0]][4];
pcb_width = sbc_data[s[0]][10][0];
pcb_depth = sbc_data[s[0]][10][1];
pcb_z_orig = sbc_data[s[0]][10][2];
pcb_tmaxz = sbc_data[s[0]][11][5];
pcb_bmaxz = sbc_data[s[0]][11][6];
pcb_loc_x = rack_bay_rotation[i] == 90 ? rack_bay_xyz_loc[i][0] + pcb_width : rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][0] + pcb_width : rack_bay_xyz_loc[i][0];
pcb_loc_y = rack_bay_rotation[i] == 270 ? rack_bay_xyz_loc[i][1]+pcb_width : rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][1]+pcb_depth : rack_bay_xyz_loc[i][1];
pcb_loc_z = rack_bay_sbc[i] == "n2+" ? rack_bay_xyz_loc[i][2]+1.5 : rack_bay_xyz_loc[i][2];
translate([pcb_loc_x ,pcb_loc_y,pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z])
rotate([0,0,rack_bay_rotation[i]])
sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false);
}
if(rack_bay_sbc[i] != "none" && rack_bay_face[i] == "removable") {
bayadj = i == 0 ? -75.5 : i == 5 ? -74.75: -75;
s = search([rack_bay_sbc[i]],sbc_data);
pcb_id = sbc_data[s[0]][4];
pcb_width = sbc_data[s[0]][10][0];
pcb_depth = sbc_data[s[0]][10][1];
pcb_z_orig = sbc_data[s[0]][10][2];
pcb_tmaxz = sbc_data[s[0]][11][5];
pcb_bmaxz = sbc_data[s[0]][11][6];
pcb_loc_x = rack_bay_rotation[i] == 90 ? rack_bay_xyz_loc[i][0] + pcb_width :
rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][0] + pcb_width :
rack_bay_xyz_loc[i][0];
pcb_loc_y = rack_bay_rotation[i] == 270 ? rack_bay_xyz_loc[i][1]+pcb_width :
rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][1]+pcb_depth :
rack_bay_xyz_loc[i][1];
pcb_loc_z = rack_bay_xyz_loc[i][2];
translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap,
pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+1]) rotate([0,0,rack_bay_rotation[i]])
sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false);
}
}
}
}
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
color("dimgrey",1) case_adapter(case_design);
if(sbc_off == false) {
@@ -1118,11 +1344,25 @@ if (view == "part") {
}
}
if(individual_part == "bottom") {
if(case_design == "shell" || case_design == "stacked" || case_design == "round" || case_design == "hex"
|| case_design == "round" || case_design == "snap" || case_design == "fitted") {
case_bottom(case_design);
}
if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") {
translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design);
}
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
case_adapter(case_design);
}
else {
if(section_part == false) {
if(case_design == "rack") {
difference() {
translate([-150,0,-lower_bottom]) case_rack(case_design,"bottom");
translate([-gap-wallthick-450,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
translate([150-gap-wallthick,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
}
}
if(case_design == "panel" || case_design == "panel_nas") {
if(section_part == false) {
case_bottom(case_design);
}
else {
@@ -1167,6 +1407,18 @@ if (view == "part") {
if(case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") {
translate([depth,0,width-gap]) rotate([0,90,90]) case_side(case_design,"right");
}
if(case_design == "rack" && rack_width == 19) {
difference() {
translate([-300,0,-lower_bottom]) case_rack(case_design,"bottom");
translate([-gap-wallthick-450,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
}
}
if(case_design == "rack" && rack_width == 10) {
difference() {
translate([-150,0,-lower_bottom]) case_rack(case_design,"bottom");
translate([-gap-wallthick-450,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
}
}
}
if(individual_part == "left") {
if(case_design == "panel" || case_design == "panel_nas") {
@@ -1184,6 +1436,13 @@ if (view == "part") {
translate([gap,0,2*sidethick+gap]) rotate([0,-90,-90])
case_side(case_design,"left");
}
if(case_design == "rack") {
difference() {
translate([0,0,-lower_bottom]) case_rack(case_design,"bottom");
translate([150-gap-wallthick,-gap-wallthick-1,-adj]) cube([450,depth+2,case_z+2*adj]);
}
}
}
if(individual_part == "io_shield") {
if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") {
@@ -1195,7 +1454,41 @@ if (view == "part") {
if(case_design == "panel_nas" && (pcb_width > 100 || width > 101.6)) {
rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4);
}
// ui access panel
if(case_design == "rack") {
// rear fan covers
ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1;
for(r = [0:ucount-1]) {
fan_offset = -75+(75-rear_fan_size)/2;
if(rack_bay_rear_fan[r] == true) {
translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8,0,0])
fan_cover(rear_fan_size, wallthick, rear_cooling);
}
}
// rear grommets
for(r = [0:len(rack_bay_sbc)-1]) {
grommet_offset = -75+11;
if(rack_bay_rear_conduit[r] == "grommet") {
translate([0,0,0]) rotate([270,0,0]) difference() {
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
}
translate([0,20,0]) rotate([270,0,0]) difference() {
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,0,0])
grommet("bottom", "sleeve", 10, r+2, wallthick, false, [false,10,0,"default"]);
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset-10,-.125,-3]) cube([20,10,20]);
}
translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,-20,0])
grommet_clip("sleeve", 10, r+2, wallthick);
}
}
for(r = [0:ucount-1]) {
if(rack_bay_face[r] == "removable") {
translate([-gap-wallthick-1+(75*(r))+8,-300,0]) bay_tray(depth, r);
}
}
}
// ui access panel
if(bottom_access_panel_enable == true) {
if(access_panel_rotation == 0) {
translate([access_panel_location[0],-access_panel_location[1], 0]) rotate([0,0,access_panel_rotation])

View File

@@ -255,6 +255,16 @@ accessory_data = [
"model","fan_cover",37,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"],
"platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]],
// Odroid-N2
["n-series_rack19-1u",
"add2","hd_holder",229,102,1.99,"bottom",[0,0,180],["case",false,false,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"],
"model","hd25",229,102,3,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["portrait",15],[true,10,2,"both"],
"model","hd25",229,102,20.5,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["portrait",15],[true,10,2,"default"]],
["n1_rack10-1u",
"add2","hd_holder",1,10,1.99,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"],
"model","hd25",1,10,3,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"both"],
"model","hd25",1,10,20.5,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"default"]],
// Odroid-M2
["m2_shell",
"add2","button",5.5,56,24,"top",[0,0,180],["sbc-case_z",false,false,true],[12,8,1.5],["cutout",[2,2,2,2],2.25],[true,10,2,"default"]],

View File

@@ -25,6 +25,7 @@ use <./SBC_Model_Framework/sbc_models_library.scad>
include <./mod/add.scad>;
include <./mod/case_adapter.scad>;
include <./mod/case_bottom.scad>;
include <./mod/case_rack.scad>;
include <./mod/case_side.scad>;
include <./mod/case_top.scad>;
include <./mod/case_folded.scad>;
@@ -44,11 +45,14 @@ include <./lib/dsub.scad>;
include <./lib/fans.scad>;
include <./lib/fastener.scad>;
include <./lib/feet.scad>;
include <./lib/grommet.scad>;
include <./lib/hd.scad>;
include <./lib/holder.scad>;
include <./lib/keyhole.scad>;
include <./lib/oem_adafruit.scad>;
include <./lib/oem_hk.scad>;
include <./lib/oem_rpi.scad>;
include <./lib/panel_clamp.scad>;
include <./lib/rack.scad>;
include <./lib/standoff.scad>;
include <./lib/vent.scad>;

View File

@@ -1,20 +0,0 @@
/* find correct tolerance and use for respective entry's data_1 value within sbc_case_builder.cfg */
use <./sbc_case_builder_library.scad>;
battery_tolerance = 0;
speaker_tolerance = 0;
volume_tolerance = 0;
$fn = 90;
translate([-33,0,0]) batt_holder(battery_tolerance);
difference() {
translate([-17,-17,0]) cube([34,34,2]);
translate([0,0,-1]) cylinder(d=24, h=4);
}
translate([0,0,1.99]) boom_speaker_holder("friction",speaker_tolerance);
translate([30,0,0]) boom_vring(volume_tolerance);