diff --git a/README.md b/README.md
index 6245313..f03a677 100644
--- a/README.md
+++ b/README.md
@@ -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.
diff --git a/SBC_Model_Framework b/SBC_Model_Framework
index ad4ba81..0128dd7 160000
--- a/SBC_Model_Framework
+++ b/SBC_Model_Framework
@@ -1 +1 @@
-Subproject commit ad4ba818a78370eff3fdaf0d2775da85c7bfb755
+Subproject commit 0128dd7014f54863a99b1c547d2d0e290dff64c4
diff --git a/get_customizer_values.scad b/get_customizer_values.scad
index 3980297..67d3e37 100644
--- a/get_customizer_values.scad
+++ b/get_customizer_values.scad
@@ -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(" ");
diff --git a/lib/grommet.scad b/lib/grommet.scad
new file mode 100644
index 0000000..ee7c7d8
--- /dev/null
+++ b/lib/grommet.scad
@@ -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
+ 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)]);
+ }
+ }
+}
diff --git a/lib/panel_clamp.scad b/lib/panel_clamp.scad
new file mode 100644
index 0000000..faaa230
--- /dev/null
+++ b/lib/panel_clamp.scad
@@ -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);
+ }
+ }
+ }
+ }
+}
diff --git a/lib/rack.scad b/lib/rack.scad
new file mode 100644
index 0000000..1e78736
--- /dev/null
+++ b/lib/rack.scad
@@ -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
+ 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));
+ }
+ }
+ }
+}
diff --git a/mod/add.scad b/mod/add.scad
index eaa6b15..9a6b18d 100644
--- a/mod/add.scad
+++ b/mod/add.scad
@@ -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]);
}
diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad
index 492752a..f4c08f3 100644
--- a/mod/case_bottom.scad
+++ b/mod/case_bottom.scad
@@ -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"]);
}
}
}
diff --git a/mod/case_rack.scad b/mod/case_rack.scad
new file mode 100644
index 0000000..9e1db35
--- /dev/null
+++ b/mod/case_rack.scad
@@ -0,0 +1,1352 @@
+/*
+ This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder
+ Copyright 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
+ Code released under GPLv3: http://www.gnu.org/licenses/gpl.html
+
+ case_rack(case_design,side)
+
+
+ NAME: case_rack
+ DESCRIPTION: creates 1u-2u rack cases
+ TODO: none
+
+ USAGE: case_rack(case_design,side)
+
+*/
+
+module case_rack(case_design,side) {
+
+rack_asm_gap = .25;
+rack_asm_size = 5;
+rack_asm_hole = 2.25;
+
+if(case_design == "rack" && side == "bottom") {
+ difference() {
+ union() {
+ difference() {
+ union() {
+ difference() {
+ translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap,(case_z-floorthick)/2])
+ cube_fillet_inside([width,depth,case_z-floorthick],
+ vertical=[corner_fillet,corner_fillet,0,0],
+ top=[0,0,0,0], bottom=[edge_fillet,edge_fillet,edge_fillet,edge_fillet,edge_fillet], $fn=90);
+ translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap,floorthick+(floorthick+case_z)/2])
+ cube_fillet_inside([width-(wallthick*2),depth-(wallthick*2),case_z+floorthick],
+ vertical=[corner_fillet-wallthick,corner_fillet-wallthick,-wallthick,-wallthick],
+ top=[0,0,0,0], bottom=[edge_fillet,edge_fillet,edge_fillet,edge_fillet,edge_fillet], $fn=90);
+ // case upper panel clamp holes
+ translate([150-gap-wallthick,-gap-adj,case_z-13+4])
+ panel_clamp("rear", "sloped", "m2", 6, 18, 5, [true,10,2,"default"]);
+ translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj,
+ case_z-13+4]) panel_clamp("front", "sloped", "m2", 6, 18, 5, [true,10,2,"default"]);
+ if(rack_width == 19) {
+ translate([300-gap-wallthick,-gap-adj,case_z-13+4])
+ panel_clamp("rear", "sloped", "m2", 6, 18, 5, [true,10,2,"default"]);
+ translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj,
+ case_z-13+4]) panel_clamp("front", "sloped", "m2", 6, 18, 5, [true,10,2,"default"]);
+ }
+
+ }
+ // rack mounting tabs
+ translate([-gap-wallthick, -gap+(sidethick-wallthick), 0])
+ rack_end_bracket("left", rack_size, sidethick);
+ translate([width-wallthick-gap, -gap+(sidethick-wallthick), 0])
+ rack_end_bracket("right", rack_size, sidethick);
+
+ // bay divider walls
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ if(rack_bay_wall[r] == true) {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1),-gap-wallthick-adj,0])
+ cube([2,depth,case_z-2*floorthick]);
+ }
+ }
+ // case upper panel clamps
+ translate([150-gap-wallthick,-gap-adj,case_z-13+4])
+ panel_clamp("rear", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj,
+ case_z-13+4]) panel_clamp("front", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ if(rack_width == 19) {
+ translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj,
+ case_z-13+4]) panel_clamp("front", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ translate([300-gap-wallthick,-gap-adj,case_z-13+4])
+ panel_clamp("rear", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ }
+
+ // case floor panel clamps
+ translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5])
+ panel_clamp("bottom", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ if(rack_width == 19) {
+ translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5])
+ panel_clamp("bottom", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ }
+ // top support
+ translate([-gap,depth-gap-wallthick-18,case_z-floorthick]) rotate([0,0,270])
+ panel_clamp("rear", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ translate([width-gap-(2*wallthick),depth-gap-wallthick-18,case_z-floorthick]) rotate([0,0,270])
+ panel_clamp("front", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+
+ translate([-gap,18-gap,case_z-floorthick]) rotate([0,0,270])
+ panel_clamp("rear", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+ translate([width-gap-(2*wallthick),18-gap,case_z-floorthick]) rotate([0,0,270])
+ panel_clamp("front", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]);
+
+ // additive accessories
+ if(accessory_name != "none") {
+ for (i=[1:11:len(accessory_data[a[0]])-1]) {
+ class = accessory_data[a[0]][i];
+ type = accessory_data[a[0]][i+1];
+ loc_x = accessory_data[a[0]][i+2];
+ loc_y = accessory_data[a[0]][i+3];
+ loc_z = accessory_data[a[0]][i+4];
+ face = accessory_data[a[0]][i+5];
+ rotation = accessory_data[a[0]][i+6];
+ parametric = accessory_data[a[0]][i+7];
+ size = accessory_data[a[0]][i+8];
+ data = accessory_data[a[0]][i+9];
+ mask = accessory_data[a[0]][i+10];
+
+ if(class == "add1" && face == "bottom") {
+ parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric,
+ size, data, [false,mask[1],mask[2],mask[3]]);
+ }
+ }
+ }
+ }
+ // pcb and multi-pcb standoff holes
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ if(rack_bay_sbc[r] != "none" && rack_bay_face[r] != "removable") {
+ s = search([rack_bay_sbc[r]],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_color = sbc_data[s[0]][11][1];
+ pcb_radius = sbc_data[s[0]][11][0];
+
+ pcb_loc_x = rack_bay_rotation[r] == 90 ? rack_bay_xyz_loc[r][0] + pcb_width :
+ rack_bay_rotation[r] == 180 ? rack_bay_xyz_loc[r][0] + pcb_width : rack_bay_xyz_loc[r][0];
+ pcb_loc_y = rack_bay_rotation[r] == 270 ? rack_bay_xyz_loc[r][1]+pcb_width :
+ rack_bay_rotation[r] == 180 ? rack_bay_xyz_loc[r][1]+pcb_depth : rack_bay_xyz_loc[r][1];
+
+ translate([pcb_loc_x,pcb_loc_y,0]) rotate([0,0,rack_bay_rotation[r]]) union() {
+ // pcb standoff holes
+ if(sbc_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4];
+ pcbhole_y = sbc_data[s[0]][i+5];
+ 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];
+
+ if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_rear" &&
+ bottom_rear_left_enable == true && bottom_standoff[6] != "blind") {
+ ahpx = rack_bay_sbc[r] == "n2" ? 7 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 15 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "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") {
+ ahpx = rack_bay_sbc[r] == "n2" ? 8 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 75 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "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") {
+ ahpx = rack_bay_sbc[r] == "n2" ? 82 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 6 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "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") {
+ ahpx = rack_bay_sbc[r] == "n2" ? 82 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 75 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "m1" ? 112.75 : pcbhole_y;
+ translate([ahpx,ahpy,-adj])
+ cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+
+ }
+ }
+ // multi-pcb standoff holes
+ if(multipcb_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ pcbid = sbc_data[s[0]][i+3];
+ pcbloc_x = sbc_data[s[0]][i+4];
+ pcbloc_y = sbc_data[s[0]][i+5];
+ pcbloc_z = sbc_data[s[0]][i+6];
+ if(class == "pcb") {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ pcbclass = sbc_data[s[0]][i+1];
+ pcbtype = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4]+pcbloc_x;
+ pcbhole_y = sbc_data[s[0]][i+5]+pcbloc_y;
+ pcbhole_z = sbc_data[s[0]][i+6];
+ 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 &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ if (pcbclass == "pcbhole" && pcbhole_pos == "left_front" &&
+ multipcb_bottom_front_left_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ if (pcbclass == "pcbhole" && pcbhole_pos == "right_rear" &&
+ multipcb_bottom_rear_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ if (pcbclass == "pcbhole" && pcbhole_pos == "right_front" &&
+ multipcb_bottom_front_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // bottom cover pattern
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ vent_offset = -75+32;
+ if(bottom_cover_pattern != "solid") {
+ if(bottom_cover_pattern == "hex_5mm") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset,rack_bay_xyz_loc[r][1]+10,-floorthick+adj])
+ vent_hex(15/3.75,(depth-40)/6,floorthick+4,5,1.5,"horizontal");
+ }
+ if(bottom_cover_pattern == "hex_8mm") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset-10,rack_bay_xyz_loc[r][1]+5,-floorthick+adj])
+ vent_hex(35/5.5,(depth-10)/9.5,floorthick+4,8,1.5,"horizontal");
+ }
+ if(bottom_cover_pattern == "linear_vertical") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset,rack_bay_xyz_loc[r][1]+10,-floorthick+adj])
+ vent(2,25,floorthick+4,1,1,9,"horizontal");
+ translate([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+55,-floorthick+adj])
+ vent(2,25,floorthick+4,1,1,9,"horizontal");
+ }
+ if(bottom_cover_pattern == "linear_horizontal") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset-10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj])
+ vent(35-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/4,1,"horizontal");
+ }
+ if(bottom_cover_pattern == "astroid") {
+ for(c=[rack_bay_xyz_loc[r][1]+10:12:85+rack_bay_xyz_loc[r][1]]) {
+ for(r=[rack_bay_xyz_loc[r][0]:12:55+rack_bay_xyz_loc[r][0]]) {
+ translate([r,c,-floorthick-adj]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf");
+ }
+ }
+ }
+ }
+ }
+ // case floor panel clamp holes
+ translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5])
+ panel_clamp("bottom", "sloped", "m2", 6, 18, 5, [true,10,2,"holes"]);
+ if(rack_width == 19) {
+ translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5])
+ panel_clamp("bottom", "sloped", "m2", 6, 18, 5, [true,10,2,"holes"]);
+ }
+ }
+ // pcb and multi-pcb standoffs
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ if(rack_bay_sbc[r] != "none" && rack_bay_face[r] != "removable") {
+ s = search([rack_bay_sbc[r]],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[r] == 90 ? rack_bay_xyz_loc[r][0] + pcb_width :
+ rack_bay_rotation[r] == 180 ? rack_bay_xyz_loc[r][0] + pcb_width : rack_bay_xyz_loc[r][0];
+ pcb_loc_y = rack_bay_rotation[r] == 270 ? rack_bay_xyz_loc[r][1]+pcb_width :
+ rack_bay_rotation[r] == 180 ? rack_bay_xyz_loc[r][1]+pcb_depth : rack_bay_xyz_loc[r][1];
+ pcb_loc_z = rack_bay_sbc[r] == "n2" || rack_bay_sbc[r] == "m1" ? rack_bay_xyz_loc[r][2]-6 :
+ rack_bay_sbc[r] == "n2+" ? rack_bay_xyz_loc[r][2]-4.5 : rack_bay_xyz_loc[r][2];
+
+ translate([pcb_loc_x,pcb_loc_y,0]) rotate([0,0,rack_bay_rotation[r]]) union() {
+ // primary pcb standoffs
+ if(sbc_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4];
+ pcbhole_y = sbc_data[s[0]][i+5];
+ 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];
+ pcb_bmaxz = sbc_data[s[0]][11][6];
+
+ 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],
+ pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_rear_left_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[r] == "n2" ? 7 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 15 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r]== "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],
+ pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_front_left_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[r] == "n2" ? 8 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 75 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "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],
+ pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_rear_right_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[r] == "n2" ? 82 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 6 : rack_bay_sbc[r] == "n2+" ? 9.25 :
+ rack_bay_sbc[r] == "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],
+ pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_front_right_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[r] == "n2" ? 82 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[r] == "n2" ? 75 : rack_bay_sbc[r] == "n2+" ? 80.75 :
+ rack_bay_sbc[r] == "m1" ? 112.75 : pcbhole_y;
+ translate([ahpx,ahpy,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ }
+ }
+ }
+ // multi-pcb standoffs
+ if(multipcb_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ pcbid = sbc_data[s[0]][i+3];
+ pcbloc_x = sbc_data[s[0]][i+4];
+ pcbloc_y = sbc_data[s[0]][i+5];
+ pcbloc_z = sbc_data[s[0]][i+6];
+ if(class == "pcb") {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ pcbclass = sbc_data[s[0]][i+1];
+ pcbtype = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4]+pcbloc_x;
+ pcbhole_y = sbc_data[s[0]][i+5]+pcbloc_y;
+ pcbhole_z = sbc_data[s[0]][i+6];
+ 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(pcbclass == "pcbhole" && pcbid == id && id != 0) {
+ if (pcbhole_pos == "left_rear" && multipcb_bottom_rear_left_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_rear_left_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_rear_left_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ if (pcbhole_pos == "left_front" && multipcb_bottom_front_left_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_front_left_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_front_left_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ if (pcbhole_pos == "right_rear" && multipcb_bottom_rear_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_rear_right_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_rear_right_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ if (pcbhole_pos == "right_front" && multipcb_bottom_front_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_front_right_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_front_right_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // rear fan, rear conduit and front bay openings
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ // rear fan openings
+ fan_offset = -75+(75-rear_fan_size)/2;
+ if(rack_bay_rear_fan[r] == true) {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+fan_offset+8,depth-gap-wallthick-adj,
+ (case_z-rear_fan_size)/2]) rotate([90,0,0]) fan_mask(rear_fan_size, wallthick, "fan_open");
+ }
+ // rear grommet openings
+ grommet_offset = -75+11;
+ if(rack_bay_rear_conduit[r] == "grommet" || rack_bay_rear_conduit[r] == "grommets-vertical") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+grommet_offset+4,depth-wallthick-gap,13])
+ grommet("front", "sleeve", 10, 4, wallthick, true, [true,10,0,"default"]);
+ }
+ if(rack_bay_rear_conduit[r] == "grommets-vertical") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+grommet_offset+4,depth-wallthick-gap,30])
+ grommet("front", "sleeve", 10, 4, wallthick, true, [true,10,0,"default"]);
+ }
+ if(rack_bay_rear_conduit[r] == "conduit") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+grommet_offset+1.5,depth-gap-wallthick+adj,5])
+ rotate([90,0,0]) slab([5,30,wallthick+2*adj],2.5);
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+grommet_offset+4,depth-gap-wallthick+adj,30])
+ rotate([90,0,0]) cylinder(d=15, h=2*(wallthick+adj));
+ }
+ // front vent
+ if(rack_bay_face[r] == "vent") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)-75+14,-gap-adj,case_z-16])
+ vent(2,10,wallthick+4,2,1,9,"vertical");
+ }
+ // open front
+ if(rack_bay_face[r] == "open" || rack_bay_face[r] == "removable") {
+ open_radius = rack_bay_face[r] == "removable" ? 1 : 6;
+ open_height = rack_bay_face[r] == "removable" ? 2 : 6;
+
+ open_offset = r == 0 && rack_bay_wall[r] == true ? wallthick :
+ r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "none" ? wallthick+gap+.5 :
+ r == 2 && rack_width == 10 ? 3 :
+ r >= 1 && r < 5 && rack_bay_wall[r] == true ? 2.5 :
+ r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "none" ? 2.5 :
+ r == 5 ? 3 : 3;
+
+ open_size = r == 0 && rack_bay_wall[r] == true ? 75-wallthick-gap-2 :
+ r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "none" ? 75-wallthick-gap-2.5+baysize :
+ r == 1 && rack_width == 10 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "none" ? 70-wallthick-gap+baysize :
+ r == 2 && rack_width == 10 ? 65.25 :
+ r >= 1 && r < 5 && rack_bay_wall[r] == true ? 75-wallthick-gap-2 :
+ r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "none" ||
+ (r != 2 && rack_width == 10) ? 75-wallthick-gap+baysize-.5 :
+ r == 5 ? 74.75-wallthick-sidethick : 69;
+
+ translate([open_offset-wallthick-gap+rack_asm_gap/2+75*(r+1)-75,
+ -wallthick-gap-adj,floorthick+case_z+open_height])
+ rotate([270,0,0]) slab([open_size,case_z,2*wallthick+8],open_radius);
+ }
+ }
+ // subtractive accessories
+ if(accessory_name != "none") {
+ for (i=[1:11:len(accessory_data[a[0]])-1]) {
+ class = accessory_data[a[0]][i];
+ type = accessory_data[a[0]][i+1];
+ loc_x = accessory_data[a[0]][i+2];
+ loc_y = accessory_data[a[0]][i+3];
+ loc_z = accessory_data[a[0]][i+4];
+ face = accessory_data[a[0]][i+5];
+ rotation = accessory_data[a[0]][i+6];
+ parametric = accessory_data[a[0]][i+7];
+ size_x = accessory_data[a[0]][i+8][0];
+ size_y = accessory_data[a[0]][i+8][1];
+ size_z = accessory_data[a[0]][i+8][2];
+ data = accessory_data[a[0]][i+9];
+ mask = accessory_data[a[0]][i+10];
+
+ if ((class == "sub" && face == "bottom") || class == "suball") {
+ if(accessory_highlight == false) {
+ parametric_move_sub(type, loc_x, loc_y, loc_z, face, rotation, parametric,
+ [size_x,size_y,size_z],data, mask);
+ }
+ else {
+ #parametric_move_sub(type,loc_x,loc_y,loc_z,face,rotation,parametric,
+ [size_x,size_y,size_z],data, mask);
+
+ }
+ }
+
+ // create openings for additive
+ if ((class == "add1" || class == "add2" || class == "model") && mask[0] == true) {
+ if(accessory_highlight == false) {
+ parametric_move_add(type,loc_x,loc_y,loc_z,face,rotation,parametric,
+ [size_x,size_y,size_z],data,[true,mask[1],mask[2],mask[3]]);
+ }
+ else {
+ #parametric_move_add(type,loc_x,loc_y,loc_z,face,rotation,parametric,
+ [size_x,size_y,size_z],data,[true,mask[1],mask[2],mask[3]]);
+ }
+ }
+ }
+ }
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ if(rack_bay_sbc[r] != "none" && rack_bay_face[r] != "removable") {
+ s = search([rack_bay_sbc[r]],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[r] == 90 ? rack_bay_xyz_loc[r][0] + pcb_width : rack_bay_rotation[r] == 180 ?
+ rack_bay_xyz_loc[r][0] + pcb_width : rack_bay_xyz_loc[r][0];
+ pcb_loc_y = rack_bay_rotation[r] == 270 ? rack_bay_xyz_loc[r][1]+pcb_width : rack_bay_rotation[r] == 180 ?
+ rack_bay_xyz_loc[r][1]+pcb_depth : rack_bay_xyz_loc[r][1];
+ pcb_loc_z = rack_bay_sbc[r] == "n2+" ? rack_bay_xyz_loc[r][2]+1.5 : rack_bay_xyz_loc[r][2];
+
+ // sbc openings
+ if(sbc_highlight == true && rack_bay_sbc[r] != "none") {
+ #translate([pcb_loc_x ,pcb_loc_y,pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[r]])
+ sbc(rack_bay_sbc[r], cooling, fan_size, gpio_opening, uart_opening, true);
+ }
+ if(sbc_highlight != true && rack_bay_sbc[r] != "none") {
+ translate([pcb_loc_x ,pcb_loc_y,pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[r]])
+ sbc(rack_bay_sbc[r], cooling, fan_size, gpio_opening, uart_opening, true);
+ }
+ }
+ // case divide
+ translate([150-gap-wallthick,-gap-wallthick-1,-adj]) cube([rack_asm_gap,depth+2,case_z+2*adj]);
+ translate([300-gap-wallthick,-gap-wallthick-1,-adj]) cube([rack_asm_gap,depth+2,case_z+2*adj]);
+ }
+ // clean fillets
+ if(case_design == "shell") {
+ translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap,bottom_height/2])
+ cube_negative_fillet([width,depth,bottom_height], radius=-1,
+ vertical=[corner_fillet,corner_fillet,corner_fillet,corner_fillet], top=[0,0,0,0],
+ bottom=[edge_fillet,edge_fillet,edge_fillet,edge_fillet,edge_fillet], $fn=90);
+ }
+ // cleanup for recessed top
+ translate([-gap,-gap,case_z-floorthick-2])
+ slab([width-(2*wallthick),depth-(2*wallthick),2+adj],corner_fillet);
+ translate([-gap-wallthick-adj,-gap-wallthick,case_z-floorthick])
+ slab([width,depth+adj,20],corner_fillet);
+ }
+ // additive accessories
+ if(accessory_name != "none") {
+ for (i=[1:11:len(accessory_data[a[0]])-1]) {
+ class = accessory_data[a[0]][i];
+ type = accessory_data[a[0]][i+1];
+ loc_x = accessory_data[a[0]][i+2];
+ loc_y = accessory_data[a[0]][i+3];
+ loc_z = accessory_data[a[0]][i+4];
+ face = accessory_data[a[0]][i+5];
+ rotation = accessory_data[a[0]][i+6];
+ parametric = accessory_data[a[0]][i+7];
+ size = accessory_data[a[0]][i+8];
+ data = accessory_data[a[0]][i+9];
+ mask = accessory_data[a[0]][i+10];
+
+ if(class == "add2" && face == "bottom") {
+ parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric, size, data,
+ [false,mask[1],mask[2],mask[3]]);
+ }
+ }
+ }
+ // case lower assembly blocks
+ difference() {
+ union() {
+ // rear left - left side
+ translate([150-gap-wallthick-rack_asm_size,-gap-adj,floorthick-adj])
+ cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ // rear left - right side
+ translate([150-gap-wallthick+rack_asm_gap,-gap-adj,floorthick-adj])
+ cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ if(rack_width == 19) {
+ // rear right - right
+ translate([300-gap-wallthick+rack_asm_gap,-gap-adj,floorthick-adj])
+ cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ // rear right - left side
+ translate([300-gap-wallthick-rack_asm_size,-gap-adj,floorthick-adj])
+ cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ }
+ // front left - left
+ translate([150-gap-wallthick-rack_asm_size,depth-gap-(2*wallthick)-rack_asm_size+adj,
+ floorthick-adj]) cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ // front left - right
+ translate([150-gap-wallthick+rack_asm_gap,
+ depth-gap-(2*wallthick)-rack_asm_size+adj,floorthick-adj])
+ cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ if(rack_width == 19) {
+ // front right - right
+ translate([300-gap-wallthick+rack_asm_gap,
+ depth-gap-(2*wallthick)-rack_asm_size+adj,floorthick-adj])
+ cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ // front right - left
+ translate([300-gap-wallthick-rack_asm_size,depth-gap-(2*wallthick)-rack_asm_size+adj,
+ floorthick-adj]) cube([rack_asm_size,rack_asm_size,rack_asm_size]);
+ }
+ }
+ // case lower block assembly holes
+ // rear left
+ translate([150-gap-wallthick-rack_asm_size-adj,-gap-adj+(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=rack_asm_hole, h=rack_asm_gap+(2*rack_asm_size)+(2*adj));
+ // rear left nut
+ translate([150-gap-wallthick-rack_asm_size-adj,-gap-adj+(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2, $fn=6);
+ // rear left recess
+ translate([150-gap-wallthick+rack_asm_size+adj+rack_asm_gap-2,-gap-adj+(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2);
+ // rear right
+ translate([300-gap-wallthick-rack_asm_size-adj,-gap-adj+(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=rack_asm_hole, h=rack_asm_gap+(2*rack_asm_size)+(2*adj));
+ // rear right nut
+ translate([300-gap-wallthick-rack_asm_size-adj,-gap-adj+(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2, $fn=6);
+ // rear right recess
+ translate([300-gap-wallthick+rack_asm_size+adj+rack_asm_gap-2,-gap-adj+(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2);
+ // front left
+ translate([150-gap-wallthick-rack_asm_size-adj,depth-gap-(2*wallthick)-(rack_asm_size/2)+adj,
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=rack_asm_hole, h=rack_asm_gap+(2*rack_asm_size)+(2*adj));
+ // front left nut
+ translate([150-gap-wallthick-rack_asm_size-adj,depth-gap-(2*wallthick)-(rack_asm_size/2)+adj,
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2, $fn=6);
+ // front left recess
+ translate([150-gap-wallthick+rack_asm_size+adj+rack_asm_gap-2,depth-gap-(2*wallthick)-(rack_asm_size/2)+adj,
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2);
+ // front right
+ translate([300-gap-wallthick-rack_asm_size-adj,depth-gap-(2*wallthick)+adj-(rack_asm_size/2),
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=rack_asm_hole, h=rack_asm_gap+(2*rack_asm_size)+(2*adj));
+ // front right nut
+ translate([300-gap-wallthick-rack_asm_size-adj,depth-gap-(2*wallthick)-(rack_asm_size/2)+adj,
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2, $fn=6);
+ // front right recess
+ translate([300-gap-wallthick+rack_asm_size+adj+rack_asm_gap-2,depth-gap-(2*wallthick)-(rack_asm_size/2)+adj,
+ floorthick-adj+(rack_asm_size/2)]) rotate([0,90,0])
+ cylinder(d=4*2/sqrt(3), h=2);
+ }
+}
+if(case_design == "rack" && side == "top") {
+ difference() {
+ union() {
+ difference() {
+ translate([-gap,-gap,case_z-floorthick-2])
+ slab([width-(2*wallthick),depth-(2*wallthick),2],corner_fillet);
+ // case divide
+ translate([150-gap-wallthick,-gap-wallthick-1,-adj]) cube([rack_asm_gap,depth+2,case_z+2*adj]);
+ translate([300-gap-wallthick,-gap-wallthick-1,-adj]) cube([rack_asm_gap,depth+2,case_z+2*adj]);
+ }
+
+ // additive accessories
+ if(accessory_name != "none") {
+ for (i=[1:11:len(accessory_data[a[0]])-1]) {
+ class = accessory_data[a[0]][i];
+ type = accessory_data[a[0]][i+1];
+ loc_x = accessory_data[a[0]][i+2];
+ loc_y = accessory_data[a[0]][i+3];
+ loc_z = accessory_data[a[0]][i+4];
+ face = accessory_data[a[0]][i+5];
+ rotation = accessory_data[a[0]][i+6];
+ parametric = accessory_data[a[0]][i+7];
+ size = accessory_data[a[0]][i+8];
+ data = accessory_data[a[0]][i+9];
+ mask = accessory_data[a[0]][i+10];
+
+ if(class == "add1" && face == "top") {
+ parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric,
+ size, data, [false,mask[1],mask[2],mask[3]]);
+ }
+ }
+ }
+ }
+ // top cover pattern
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ vent_offset = -75+32;
+ if(top_cover_pattern != "solid") {
+ if(top_cover_pattern == "hex_5mm") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset,rack_bay_xyz_loc[r][1]+10,case_z-floorthick-2+adj])
+ vent_hex(15/3.75,(depth-40)/6,floorthick+4,5,1.5,"horizontal");
+ }
+ if(top_cover_pattern == "hex_8mm") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset-10,rack_bay_xyz_loc[r][1]+5,case_z-floorthick-2+adj])
+ vent_hex(35/5.5,(depth-10)/9.5,floorthick+4,8,1.5,"horizontal");
+ }
+ if(top_cover_pattern == "linear_vertical") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset,rack_bay_xyz_loc[r][1]+10,case_z-floorthick-2+adj])
+ vent(2,25,floorthick+4,1,1,9,"horizontal");
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset,rack_bay_xyz_loc[r][1]+55,case_z-floorthick-2+adj])
+ vent(2,25,floorthick+4,1,1,9,"horizontal");
+ }
+ if(top_cover_pattern == "linear_horizontal") {
+ translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+vent_offset-10,rack_bay_xyz_loc[r][1]+10,case_z-floorthick-2+adj])
+ vent(35-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/4,1,"horizontal");
+ }
+ if(top_cover_pattern == "astroid") {
+ for(c=[rack_bay_xyz_loc[r][1]+10:12:85+rack_bay_xyz_loc[r][1]]) {
+ for(r=[rack_bay_xyz_loc[r][0]:12:55+rack_bay_xyz_loc[r][0]]) {
+ translate([r,c,case_z-floorthick-4+adj]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf");
+ }
+ }
+ }
+ }
+ }
+ // subtractive accessories
+ if(accessory_name != "none") {
+ for (i=[1:11:len(accessory_data[a[0]])-1]) {
+ class = accessory_data[a[0]][i];
+ type = accessory_data[a[0]][i+1];
+ loc_x = accessory_data[a[0]][i+2];
+ loc_y = accessory_data[a[0]][i+3];
+ loc_z = accessory_data[a[0]][i+4];
+ face = accessory_data[a[0]][i+5];
+ rotation = accessory_data[a[0]][i+6];
+ parametric = accessory_data[a[0]][i+7];
+ size_x = accessory_data[a[0]][i+8][0];
+ size_y = accessory_data[a[0]][i+8][1];
+ size_z = accessory_data[a[0]][i+8][2];
+ data = accessory_data[a[0]][i+9];
+ mask = accessory_data[a[0]][i+10];
+
+ if ((class == "sub" && face == "top") || class == "suball") {
+ if(accessory_highlight == false) {
+ parametric_move_sub(type,loc_x,loc_y,loc_z,face,rotation,
+ parametric,[size_x,size_y,size_z],data,mask);
+ }
+ else {
+ #parametric_move_sub(type,loc_x,loc_y,loc_z,face,rotation,
+ parametric,[size_x,size_y,size_z],data,mask);
+ }
+ }
+
+ // create openings for additive
+ if((class == "add1" || class == "add2" || class == "model") && mask[0] == true) {
+ if(accessory_highlight == false) {
+ parametric_move_add(type,loc_x,loc_y,loc_z,face,rotation,
+ parametric,[size_x,size_y,size_z],data,mask);
+ }
+ else {
+ #parametric_move_add(type,loc_x,loc_y,loc_z,face,rotation,
+ parametric,[size_x,size_y,size_z],data,mask);
+ }
+ }
+ }
+ }
+ // sbc openings
+ for(r = [0:len(rack_bay_sbc)-1]) {
+ if(rack_bay_sbc[r] != "none" && rack_bay_face[r] != "removable") {
+ s = search([rack_bay_sbc[r]],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_color = sbc_data[s[0]][11][1];
+ pcb_radius = sbc_data[s[0]][11][0];
+
+ pcb_loc_x = rack_bay_rotation[r] == 90 ? rack_bay_xyz_loc[r][0] + pcb_width : rack_bay_rotation[r] == 180 ?
+ rack_bay_xyz_loc[r][0] + pcb_width : rack_bay_xyz_loc[r][0];
+ pcb_loc_y = rack_bay_rotation[r] == 270 ? rack_bay_xyz_loc[r][1] + pcb_width : rack_bay_rotation[r] == 180 ?
+ rack_bay_xyz_loc[r][1]+pcb_depth : rack_bay_xyz_loc[r][1];
+ pcb_loc_z = rack_bay_xyz_loc[r][2];
+
+ // sbc openings
+ if(sbc_highlight == true && rack_bay_sbc[r] != "none") {
+ #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[r]])
+ sbc(rack_bay_sbc[r], cooling, fan_size, gpio_opening, uart_opening, true);
+ }
+ if(sbc_highlight != true && rack_bay_sbc[r] != "none") {
+ translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[r]])
+ sbc(rack_bay_sbc[r], cooling, fan_size, gpio_opening, uart_opening, true);
+ }
+ }
+ }
+ }
+ // additive accessories
+ if(accessory_name != "none") {
+ for (i=[1:11:len(accessory_data[a[0]])-1]) {
+ class = accessory_data[a[0]][i];
+ type = accessory_data[a[0]][i+1];
+ loc_x = accessory_data[a[0]][i+2];
+ loc_y = accessory_data[a[0]][i+3];
+ loc_z = accessory_data[a[0]][i+4];
+ face = accessory_data[a[0]][i+5];
+ rotation = accessory_data[a[0]][i+6];
+ parametric = accessory_data[a[0]][i+7];
+ size = accessory_data[a[0]][i+8];
+ data = accessory_data[a[0]][i+9];
+ mask = accessory_data[a[0]][i+10];
+
+ if(class == "add2" && face == "top") {
+ parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric, size, data,
+ [false,mask[1],mask[2],mask[3]]);
+ }
+ }
+ }
+}
+}
+
+module bay_tray(depth, bay) {
+
+ rack_asm_gap = .25;
+ rack_asm_size = 5;
+ reminsert = rack_bay_wall[bay] == false && bay == 0 && rack_bay_sbc[bay+1] == "none" ? 74+baysize :
+ rack_width == 10 && bay == 1 && rack_bay_wall[bay] == false &&
+ rack_bay_sbc[bay+1] == "none" ? 70+baysize :
+ rack_width == 10 && bay == 2 ? 70 :
+ rack_bay_wall[bay] == false && bay != 0 && rack_bay_sbc[bay+1] == "none" ? 75+baysize : baysize;
+
+ difference() {
+ union() {
+ slab([reminsert-wallthick-gap-2,depth-.5,1],.5);
+ translate([0, 1.5, 0]) rotate([90,0,0])
+ slab([reminsert-wallthick-gap-2,bay_height-floorthick-1,1.5],.5);
+ }
+ // case floor panel clamp holes
+ translate([baysize-2.5,(depth/2)-gap-wallthick+3.75,-adj])
+ cylinder(d=20, h=7);
+ translate([-gap-wallthick+.5,(depth/2)-gap-wallthick+3.75,-adj])
+ cylinder(d=20, h=7);
+ if(reminsert/9 > 10) {
+ translate([reminsert-4,(depth/2)-gap-wallthick+3.75,-adj])
+ cylinder(d=20, h=7);
+ }
+ // rear assembly block opening
+ // rear left
+ translate([2-2*rack_asm_size,depth-wallthick-1.25,-adj])
+ cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]);
+ // rear middle
+ translate([2+baysize-2*rack_asm_size,depth-wallthick-1.25,-adj])
+ cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]);
+ // rear right
+ translate([2+2*baysize-2*rack_asm_size+1.25-.25,depth-wallthick-1.25,-adj])
+ cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]);
+ // front assembly block opening
+ // front left
+ translate([2-(2*rack_asm_size)-.25,-gap,-adj])
+ cube([.25+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]);
+ // front middle
+ if((bay == 1 || bay) == 3 && reminsert/9 > 10)
+ translate([2+baysize-2*rack_asm_size,-gap,-adj])
+ cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]);
+ // front right
+ translate([2*baysize-2*rack_asm_size+1.25-.25,-gap,-adj])
+ cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]);
+
+ // front vent
+ if(rack_bay_face[bay] == "removable") {
+ vadj = reminsert/9 > 10 ? 36 : 0;
+// translate([-gap-wallthick-1+(rack_asm_gap/2)+14,gap+wallthick-adj,bay_height-13])
+// vent(2,5,wallthick+4,2,1,(reminsert+vadj)/9,"vertical");
+ translate([-gap-wallthick-1+(rack_asm_gap/2)+14,gap+wallthick-adj,2])
+ vent(2,5,wallthick+4,2,1,(reminsert+vadj)/9,"vertical");
+ }
+ // pcb and multi-pcb standoff holes
+ if(rack_bay_sbc[bay] != "none") {
+ s = search([rack_bay_sbc[bay]],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[bay] == 90 ? rack_bay_xyz_loc[bay][0] + pcb_width :
+ rack_bay_rotation[bay] == 180 ? rack_bay_xyz_loc[bay][0] + pcb_width : rack_bay_xyz_loc[bay][0];
+ pcb_loc_y = rack_bay_rotation[bay] == 270 ? rack_bay_xyz_loc[bay][1]+pcb_width :
+ rack_bay_rotation[bay] == 180 ? rack_bay_xyz_loc[bay][1]+pcb_depth : rack_bay_xyz_loc[bay][1];
+ pcb_loc_z = rack_bay_xyz_loc[bay][2];
+ translate([pcb_loc_x,pcb_loc_y+wallthick+gap,0]) rotate([0,0,rack_bay_rotation[bay]]) union() {
+ // pcb standoff holes
+ if(sbc_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4];
+ pcbhole_y = sbc_data[s[0]][i+5];
+ 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];
+
+ if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_rear" &&
+ bottom_rear_left_enable == true && bottom_standoff[6] != "blind") {
+ ahpx = rack_bay_sbc[bay] == "n2" ? 7 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 15 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "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") {
+ ahpx = rack_bay_sbc[bay] == "n2" ? 8 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 75 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "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") {
+ ahpx = rack_bay_sbc[bay] == "n2" ? 82 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 6 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "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") {
+ ahpx = rack_bay_sbc[bay] == "n2" ? 82 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 75 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "m1" ? 112.75 : pcbhole_y;
+ translate([ahpx,ahpy,-adj])
+ cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+
+ }
+ }
+ // multi-pcb standoff holes
+ if(multipcb_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ pcbid = sbc_data[s[0]][i+3];
+ pcbloc_x = sbc_data[s[0]][i+4];
+ pcbloc_y = sbc_data[s[0]][i+5];
+ pcbloc_z = sbc_data[s[0]][i+6];
+
+ if(class == "pcb") {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ pcbclass = sbc_data[s[0]][i+1];
+ pcbtype = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4]+pcbloc_x;
+ pcbhole_y = sbc_data[s[0]][i+5]+pcbloc_y;
+ pcbhole_z = sbc_data[s[0]][i+6];
+ 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 &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ if (pcbclass == "pcbhole" && pcbhole_pos == "left_front" &&
+ multipcb_bottom_front_left_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ if (pcbclass == "pcbhole" && pcbhole_pos == "right_rear" &&
+ multipcb_bottom_rear_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ if (pcbclass == "pcbhole" && pcbhole_pos == "right_front" &&
+ multipcb_bottom_front_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ translate([pcbhole_x,pcbhole_y,-adj])
+ cylinder(d=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ // sbc openings
+ if(sbc_highlight == true && rack_bay_sbc[bay] != "none") {
+ #translate([pcb_loc_x, pcb_loc_y+gap+1.5,pcb_bmaxz+case_offset_bz+pcb_loc_z+1-adj])
+ rotate([0,0,rack_bay_rotation[bay]])
+ sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true);
+ }
+ if(sbc_highlight != true && rack_bay_sbc[bay] != "none") {
+ translate([pcb_loc_x, pcb_loc_y+gap+1.5,pcb_bmaxz+case_offset_bz+pcb_loc_z+1-adj])
+ rotate([0,0,rack_bay_rotation[bay]])
+ sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true);
+ }
+ }
+ }
+
+ // pcb and multi-pcb standoffs
+ if(rack_bay_sbc[bay] != "none") {
+ s = search([rack_bay_sbc[bay]],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_color = sbc_data[s[0]][11][1];
+ pcb_radius = sbc_data[s[0]][11][0];
+
+ pcb_loc_x = rack_bay_rotation[bay] == 90 ? rack_bay_xyz_loc[bay][0] + pcb_width :
+ rack_bay_rotation[bay] == 180 ? rack_bay_xyz_loc[bay][0] + pcb_width : rack_bay_xyz_loc[bay][0];
+ pcb_loc_y = rack_bay_rotation[bay] == 270 ? rack_bay_xyz_loc[bay][1]+pcb_width :
+ rack_bay_rotation[bay] == 180 ? rack_bay_xyz_loc[bay][1]+pcb_depth : rack_bay_xyz_loc[bay][1];
+ pcb_loc_z = rack_bay_sbc[bay] == "n2" || rack_bay_sbc[bay] == "m1" ? rack_bay_xyz_loc[bay][2]-6 :
+ rack_bay_sbc[bay] == "n2+" ? rack_bay_xyz_loc[bay][2]-4.5 : rack_bay_xyz_loc[bay][2];
+
+ translate([pcb_loc_x,pcb_loc_y+wallthick+gap,0]) rotate([0,0,rack_bay_rotation[bay]]) union() {
+ // primary pcb standoffs
+ if(sbc_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4];
+ pcbhole_y = sbc_data[s[0]][i+5];
+ 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];
+
+ 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],
+ pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_rear_left_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[bay] == "n2" ? 7 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 15 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay]== "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],
+ pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_front_left_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[bay] == "n2" ? 8 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "m1" ? 9.25 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 75 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "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],
+ pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_rear_right_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[bay] == "n2" ? 82 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 6 : rack_bay_sbc[bay] == "n2+" ? 9.25 :
+ rack_bay_sbc[bay] == "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],
+ pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_front_right_adjust,
+ bottom_standoff[3],
+ bottom_standoff[4],
+ bottom_standoff[5],
+ bottom_standoff[6],
+ bottom_standoff[7],
+ bottom_support,
+ bottom_standoff[9],
+ bottom_standoff[10],
+ bottom_standoff[11],
+ bottom_standoff[12]];
+ ahpx = rack_bay_sbc[bay] == "n2" ? 82 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "m1" ? 80.75 : pcbhole_x;
+ ahpy = rack_bay_sbc[bay] == "n2" ? 75 : rack_bay_sbc[bay] == "n2+" ? 80.75 :
+ rack_bay_sbc[bay] == "m1" ? 112.75 : pcbhole_y;
+ translate([ahpx,ahpy,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ }
+ }
+ }
+ // multi-pcb standoffs
+ if(multipcb_bottom_standoffs == true) {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ class = sbc_data[s[0]][i+1];
+ type = sbc_data[s[0]][i+2];
+ pcbid = sbc_data[s[0]][i+3];
+ pcbloc_x = sbc_data[s[0]][i+4];
+ pcbloc_y = sbc_data[s[0]][i+5];
+ pcbloc_z = sbc_data[s[0]][i+6];
+ if(class == "pcb") {
+ for (i=[1:11:len(sbc_data[s[0]])-2]) {
+ pcbclass = sbc_data[s[0]][i+1];
+ pcbtype = sbc_data[s[0]][i+2];
+ id = sbc_data[s[0]][i+3];
+ pcbhole_x = sbc_data[s[0]][i+4]+pcbloc_x;
+ pcbhole_y = sbc_data[s[0]][i+5]+pcbloc_y;
+ pcbhole_z = sbc_data[s[0]][i+6];
+ 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(pcbclass == "pcbhole" && pcbid == id && id != 0) {
+ if (pcbhole_pos == "left_rear" && multipcb_bottom_rear_left_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_rear_left_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_rear_left_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ if (pcbhole_pos == "left_front" && multipcb_bottom_front_left_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_front_left_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_front_left_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ if (pcbhole_pos == "right_rear" && multipcb_bottom_rear_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_rear_right_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_rear_right_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ if (pcbhole_pos == "right_front" && multipcb_bottom_front_right_enable == true &&
+ (pcbhole_state == "bottom" || pcbhole_state == "both")) {
+ bottom_support = multipcb_bottom_sidewall_support == true ?
+ multipcb_bottom_front_right_support : "none";
+ pcb_standoff = [multipcb_bottom_standoff[0],
+ multipcb_bottom_standoff[1],
+ bottom_height-pcb_z+pcb_loc_z+multipcb_bottom_front_right_adjust,
+ multipcb_bottom_standoff[3],
+ multipcb_bottom_standoff[4],
+ multipcb_bottom_standoff[5],
+ multipcb_bottom_standoff[6],
+ multipcb_bottom_standoff[7],
+ bottom_support,
+ multipcb_bottom_standoff[9],
+ multipcb_bottom_standoff[10],
+ multipcb_bottom_standoff[11],
+ multipcb_bottom_standoff[12]];
+ translate([pcbhole_x,pcbhole_y,0])
+ standoff(pcb_standoff,[false,10,2,"default"]);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/sbc_case_builder.json b/sbc_case_builder.json
index 7a5ed6e..c0ea487 100644
--- a/sbc_case_builder.json
+++ b/sbc_case_builder.json
@@ -1486,6 +1486,528 @@
"view": "model",
"wallthick": "2"
},
+ "c-series_rack10-1u": {
+ "$fn": "90",
+ "Rack_Bay1": "c4",
+ "Rack_Bay2": "c4",
+ "Rack_Bay3": "c4",
+ "Rack_Bay4": "none",
+ "Rack_Bay5": "none",
+ "Rack_Bay6": "none",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "none",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "solid",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "false",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "3.4",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.2",
+ "bottom_standoff_insert_height": "5.1",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_size": "m3",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "rack",
+ "case_offset_bz": "0",
+ "case_offset_tz": "0",
+ "case_offset_x": "0",
+ "case_offset_y": "10",
+ "cooling": "default",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_size": "m3",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "false",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "5.75",
+ "ext_top_standoff_hole_size": "2.75",
+ "ext_top_standoff_insert": "false",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_size": "m3",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "false",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "2",
+ "front_cover_pattern": "solid",
+ "gap": "1",
+ "gpio_opening": "none",
+ "hd_bays": "2",
+ "hd_center": "false",
+ "hd_reverse": "false",
+ "hd_space": "10",
+ "hd_y_position": "25",
+ "hd_z_position": "40",
+ "indents": "false",
+ "individual_part": "bottom",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "multipcb_bottom_front_left_adjust": "0",
+ "multipcb_bottom_front_left_enable": "true",
+ "multipcb_bottom_front_left_support": "front",
+ "multipcb_bottom_front_right_adjust": "0",
+ "multipcb_bottom_front_right_enable": "true",
+ "multipcb_bottom_front_right_support": "front",
+ "multipcb_bottom_rear_left_adjust": "0",
+ "multipcb_bottom_rear_left_enable": "true",
+ "multipcb_bottom_rear_left_support": "rear",
+ "multipcb_bottom_rear_right_adjust": "0",
+ "multipcb_bottom_rear_right_enable": "true",
+ "multipcb_bottom_rear_right_support": "rear",
+ "multipcb_bottom_sidewall_support": "false",
+ "multipcb_bottom_standoff_diameter": "5.75",
+ "multipcb_bottom_standoff_hole_size": "3.4",
+ "multipcb_bottom_standoff_insert": "false",
+ "multipcb_bottom_standoff_insert_dia": "4.2",
+ "multipcb_bottom_standoff_insert_height": "5.1",
+ "multipcb_bottom_standoff_pillar": "hex",
+ "multipcb_bottom_standoff_reverse": "false",
+ "multipcb_bottom_standoff_size": "m2.5",
+ "multipcb_bottom_standoff_support_height": "4",
+ "multipcb_bottom_standoff_support_size": "7",
+ "multipcb_bottom_standoff_type": "countersunk",
+ "multipcb_bottom_standoffs": "false",
+ "multipcb_top_front_left_adjust": "0",
+ "multipcb_top_front_left_enable": "true",
+ "multipcb_top_front_left_support": "front",
+ "multipcb_top_front_right_adjust": "0",
+ "multipcb_top_front_right_enable": "true",
+ "multipcb_top_front_right_support": "front",
+ "multipcb_top_rear_left_adjust": "0",
+ "multipcb_top_rear_left_enable": "true",
+ "multipcb_top_rear_left_support": "rear",
+ "multipcb_top_rear_right_adjust": "0",
+ "multipcb_top_rear_right_enable": "true",
+ "multipcb_top_rear_right_support": "rear",
+ "multipcb_top_sidewall_support": "false",
+ "multipcb_top_standoff_diameter": "5.75",
+ "multipcb_top_standoff_hole_size": "2.75",
+ "multipcb_top_standoff_insert": "false",
+ "multipcb_top_standoff_insert_dia": "4.2",
+ "multipcb_top_standoff_insert_height": "5.1",
+ "multipcb_top_standoff_pillar": "hex",
+ "multipcb_top_standoff_reverse": "true",
+ "multipcb_top_standoff_size": "m2.5",
+ "multipcb_top_standoff_support_height": "4",
+ "multipcb_top_standoff_support_size": "7",
+ "multipcb_top_standoff_type": "blind",
+ "multipcb_top_standoffs": "false",
+ "nas_sbc_location": "top",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "0",
+ "rack_bay1_face": "vent",
+ "rack_bay1_rear_conduit": "grommet",
+ "rack_bay1_rear_fan": "true",
+ "rack_bay1_rotation": "270",
+ "rack_bay1_wall": "false",
+ "rack_bay1_xyz_loc": "[11, 0, 0]",
+ "rack_bay2_face": "vent",
+ "rack_bay2_rear_conduit": "grommet",
+ "rack_bay2_rear_fan": "true",
+ "rack_bay2_rotation": "270",
+ "rack_bay2_wall": "false",
+ "rack_bay2_xyz_loc": "[84, 0, 0]",
+ "rack_bay3_face": "vent",
+ "rack_bay3_rear_conduit": "grommet",
+ "rack_bay3_rear_fan": "true",
+ "rack_bay3_rotation": "270",
+ "rack_bay3_wall": "false",
+ "rack_bay3_xyz_loc": "[157, 0, 0]",
+ "rack_bay4_face": "vent",
+ "rack_bay4_rear_conduit": "false",
+ "rack_bay4_rear_fan": "false",
+ "rack_bay4_rotation": "270",
+ "rack_bay4_wall": "false",
+ "rack_bay4_xyz_loc": "[237.5, 0, 0]",
+ "rack_bay5_face": "vent",
+ "rack_bay5_rear_conduit": "false",
+ "rack_bay5_rear_fan": "false",
+ "rack_bay5_rotation": "270",
+ "rack_bay5_wall": "false",
+ "rack_bay5_xyz_loc": "[313, 0, 0]",
+ "rack_bay6_face": "vent",
+ "rack_bay6_rear_conduit": "false",
+ "rack_bay6_rear_fan": "false",
+ "rack_bay6_rotation": "270",
+ "rack_bay6_xyz_loc": "[383, 0, 0]",
+ "rack_size": "1u",
+ "rack_width": "10",
+ "raise_top": "0",
+ "rear_cooling": "fan_1",
+ "rear_dualfan_spacing": "6",
+ "rear_fan": "1",
+ "rear_fan_center": "false",
+ "rear_fan_position": "0",
+ "rear_fan_size": "40",
+ "rear_io_shield": "false",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "c4",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "false",
+ "section_part": "false",
+ "sidethick": "3",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "solid",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "rear",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "rear",
+ "top_sidewall_support": "false",
+ "top_standoff_diameter": "5.75",
+ "top_standoff_hole_size": "2.75",
+ "top_standoff_insert": "false",
+ "top_standoff_insert_dia": "4.2",
+ "top_standoff_insert_height": "5.1",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_size": "m3",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "none",
+ "view": "model",
+ "wallthick": "2"
+ },
+ "c-series_rack19-1u": {
+ "$fn": "90",
+ "Rack_Bay1": "c4",
+ "Rack_Bay2": "c4",
+ "Rack_Bay3": "c4",
+ "Rack_Bay4": "c4",
+ "Rack_Bay5": "c4",
+ "Rack_Bay6": "c4",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "none",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "solid",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "false",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "3.4",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.2",
+ "bottom_standoff_insert_height": "5.1",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_size": "m3",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "rack",
+ "case_offset_bz": "0",
+ "case_offset_tz": "0",
+ "case_offset_x": "0",
+ "case_offset_y": "10",
+ "cooling": "default",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_size": "m3",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "false",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "5.75",
+ "ext_top_standoff_hole_size": "2.75",
+ "ext_top_standoff_insert": "false",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_size": "m3",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "false",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "2",
+ "front_cover_pattern": "solid",
+ "gap": "1",
+ "gpio_opening": "none",
+ "hd_bays": "2",
+ "hd_center": "false",
+ "hd_reverse": "false",
+ "hd_space": "10",
+ "hd_y_position": "25",
+ "hd_z_position": "40",
+ "indents": "false",
+ "individual_part": "bottom",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "multipcb_bottom_front_left_adjust": "0",
+ "multipcb_bottom_front_left_enable": "true",
+ "multipcb_bottom_front_left_support": "front",
+ "multipcb_bottom_front_right_adjust": "0",
+ "multipcb_bottom_front_right_enable": "true",
+ "multipcb_bottom_front_right_support": "front",
+ "multipcb_bottom_rear_left_adjust": "0",
+ "multipcb_bottom_rear_left_enable": "true",
+ "multipcb_bottom_rear_left_support": "rear",
+ "multipcb_bottom_rear_right_adjust": "0",
+ "multipcb_bottom_rear_right_enable": "true",
+ "multipcb_bottom_rear_right_support": "rear",
+ "multipcb_bottom_sidewall_support": "false",
+ "multipcb_bottom_standoff_diameter": "5.75",
+ "multipcb_bottom_standoff_hole_size": "3.4",
+ "multipcb_bottom_standoff_insert": "false",
+ "multipcb_bottom_standoff_insert_dia": "4.2",
+ "multipcb_bottom_standoff_insert_height": "5.1",
+ "multipcb_bottom_standoff_pillar": "hex",
+ "multipcb_bottom_standoff_reverse": "false",
+ "multipcb_bottom_standoff_size": "m2.5",
+ "multipcb_bottom_standoff_support_height": "4",
+ "multipcb_bottom_standoff_support_size": "7",
+ "multipcb_bottom_standoff_type": "countersunk",
+ "multipcb_bottom_standoffs": "false",
+ "multipcb_top_front_left_adjust": "0",
+ "multipcb_top_front_left_enable": "true",
+ "multipcb_top_front_left_support": "front",
+ "multipcb_top_front_right_adjust": "0",
+ "multipcb_top_front_right_enable": "true",
+ "multipcb_top_front_right_support": "front",
+ "multipcb_top_rear_left_adjust": "0",
+ "multipcb_top_rear_left_enable": "true",
+ "multipcb_top_rear_left_support": "rear",
+ "multipcb_top_rear_right_adjust": "0",
+ "multipcb_top_rear_right_enable": "true",
+ "multipcb_top_rear_right_support": "rear",
+ "multipcb_top_sidewall_support": "false",
+ "multipcb_top_standoff_diameter": "5.75",
+ "multipcb_top_standoff_hole_size": "2.75",
+ "multipcb_top_standoff_insert": "false",
+ "multipcb_top_standoff_insert_dia": "4.2",
+ "multipcb_top_standoff_insert_height": "5.1",
+ "multipcb_top_standoff_pillar": "hex",
+ "multipcb_top_standoff_reverse": "true",
+ "multipcb_top_standoff_size": "m2.5",
+ "multipcb_top_standoff_support_height": "4",
+ "multipcb_top_standoff_support_size": "7",
+ "multipcb_top_standoff_type": "blind",
+ "multipcb_top_standoffs": "false",
+ "nas_sbc_location": "top",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "0",
+ "rack_bay1_face": "vent",
+ "rack_bay1_rear_conduit": "grommet",
+ "rack_bay1_rear_fan": "true",
+ "rack_bay1_rotation": "270",
+ "rack_bay1_wall": "true",
+ "rack_bay1_xyz_loc": "[13.5, 0, 0]",
+ "rack_bay2_face": "vent",
+ "rack_bay2_rear_conduit": "grommet",
+ "rack_bay2_rear_fan": "true",
+ "rack_bay2_rotation": "270",
+ "rack_bay2_wall": "true",
+ "rack_bay2_xyz_loc": "[88, 0, 0]",
+ "rack_bay3_face": "vent",
+ "rack_bay3_rear_conduit": "grommet",
+ "rack_bay3_rear_fan": "true",
+ "rack_bay3_rotation": "270",
+ "rack_bay3_wall": "true",
+ "rack_bay3_xyz_loc": "[163.5, 0, 0]",
+ "rack_bay4_face": "vent",
+ "rack_bay4_rear_conduit": "grommet",
+ "rack_bay4_rear_fan": "true",
+ "rack_bay4_rotation": "270",
+ "rack_bay4_wall": "true",
+ "rack_bay4_xyz_loc": "[238, 0, 0]",
+ "rack_bay5_face": "vent",
+ "rack_bay5_rear_conduit": "grommet",
+ "rack_bay5_rear_fan": "true",
+ "rack_bay5_rotation": "270",
+ "rack_bay5_wall": "true",
+ "rack_bay5_xyz_loc": "[313.5, 0, 0]",
+ "rack_bay6_face": "vent",
+ "rack_bay6_rear_conduit": "grommet",
+ "rack_bay6_rear_fan": "true",
+ "rack_bay6_rotation": "270",
+ "rack_bay6_xyz_loc": "[386.5, 0, 0]",
+ "rack_size": "1u",
+ "rack_width": "19",
+ "raise_top": "0",
+ "rear_cooling": "fan_1",
+ "rear_dualfan_spacing": "6",
+ "rear_fan": "1",
+ "rear_fan_center": "false",
+ "rear_fan_position": "0",
+ "rear_fan_size": "40",
+ "rear_io_shield": "false",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "c4",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "false",
+ "section_part": "false",
+ "sidethick": "3",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "solid",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "rear",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "rear",
+ "top_sidewall_support": "false",
+ "top_standoff_diameter": "5.75",
+ "top_standoff_hole_size": "2.75",
+ "top_standoff_insert": "false",
+ "top_standoff_insert_dia": "4.2",
+ "top_standoff_insert_height": "5.1",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_size": "m3",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "none",
+ "view": "model",
+ "wallthick": "2"
+ },
"hc4_shell_drivebox2.5": {
"$fn": "90",
"access_panel_location": "[10, 15]",
@@ -4622,6 +5144,731 @@
"view": "model",
"wallthick": "2"
},
+ "n1_rack10-1u": {
+ "$fn": "90",
+ "Rack_Bay1": "none",
+ "Rack_Bay2": "n1",
+ "Rack_Bay3": "none",
+ "Rack_Bay4": "none",
+ "Rack_Bay5": "none",
+ "Rack_Bay6": "none",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "n1_rack10-1u",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "solid",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "false",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "3.4",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.2",
+ "bottom_standoff_insert_height": "5.1",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_size": "m3",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "rack",
+ "case_offset_bz": "0",
+ "case_offset_tz": "0",
+ "case_offset_x": "0",
+ "case_offset_y": "10",
+ "cooling": "vent_hex_8mm",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_size": "m3",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "false",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "5.75",
+ "ext_top_standoff_hole_size": "2.75",
+ "ext_top_standoff_insert": "false",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_size": "m3",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "false",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "2",
+ "front_cover_pattern": "solid",
+ "gap": "1",
+ "gpio_opening": "none",
+ "hd_bays": "2",
+ "hd_center": "false",
+ "hd_reverse": "false",
+ "hd_space": "10",
+ "hd_y_position": "25",
+ "hd_z_position": "40",
+ "indents": "false",
+ "individual_part": "bottom",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "multipcb_bottom_front_left_adjust": "0",
+ "multipcb_bottom_front_left_enable": "true",
+ "multipcb_bottom_front_left_support": "front",
+ "multipcb_bottom_front_right_adjust": "0",
+ "multipcb_bottom_front_right_enable": "true",
+ "multipcb_bottom_front_right_support": "front",
+ "multipcb_bottom_rear_left_adjust": "0",
+ "multipcb_bottom_rear_left_enable": "true",
+ "multipcb_bottom_rear_left_support": "rear",
+ "multipcb_bottom_rear_right_adjust": "0",
+ "multipcb_bottom_rear_right_enable": "true",
+ "multipcb_bottom_rear_right_support": "rear",
+ "multipcb_bottom_sidewall_support": "false",
+ "multipcb_bottom_standoff_diameter": "5.75",
+ "multipcb_bottom_standoff_hole_size": "3.4",
+ "multipcb_bottom_standoff_insert": "false",
+ "multipcb_bottom_standoff_insert_dia": "4.2",
+ "multipcb_bottom_standoff_insert_height": "5.1",
+ "multipcb_bottom_standoff_pillar": "hex",
+ "multipcb_bottom_standoff_reverse": "false",
+ "multipcb_bottom_standoff_size": "m2.5",
+ "multipcb_bottom_standoff_support_height": "4",
+ "multipcb_bottom_standoff_support_size": "7",
+ "multipcb_bottom_standoff_type": "countersunk",
+ "multipcb_bottom_standoffs": "false",
+ "multipcb_top_front_left_adjust": "0",
+ "multipcb_top_front_left_enable": "true",
+ "multipcb_top_front_left_support": "front",
+ "multipcb_top_front_right_adjust": "0",
+ "multipcb_top_front_right_enable": "true",
+ "multipcb_top_front_right_support": "front",
+ "multipcb_top_rear_left_adjust": "0",
+ "multipcb_top_rear_left_enable": "true",
+ "multipcb_top_rear_left_support": "rear",
+ "multipcb_top_rear_right_adjust": "0",
+ "multipcb_top_rear_right_enable": "true",
+ "multipcb_top_rear_right_support": "rear",
+ "multipcb_top_sidewall_support": "false",
+ "multipcb_top_standoff_diameter": "5.75",
+ "multipcb_top_standoff_hole_size": "2.75",
+ "multipcb_top_standoff_insert": "false",
+ "multipcb_top_standoff_insert_dia": "4.2",
+ "multipcb_top_standoff_insert_height": "5.1",
+ "multipcb_top_standoff_pillar": "hex",
+ "multipcb_top_standoff_reverse": "true",
+ "multipcb_top_standoff_size": "m2.5",
+ "multipcb_top_standoff_support_height": "4",
+ "multipcb_top_standoff_support_size": "7",
+ "multipcb_top_standoff_type": "blind",
+ "multipcb_top_standoffs": "false",
+ "nas_sbc_location": "top",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "0",
+ "rack_bay1_face": "vent",
+ "rack_bay1_rear_conduit": "none",
+ "rack_bay1_rear_fan": "true",
+ "rack_bay1_rotation": "0",
+ "rack_bay1_wall": "false",
+ "rack_bay1_xyz_loc": "[5, 0, 0]",
+ "rack_bay2_face": "vent",
+ "rack_bay2_rear_conduit": "grommet",
+ "rack_bay2_rear_fan": "true",
+ "rack_bay2_rotation": "0",
+ "rack_bay2_wall": "false",
+ "rack_bay2_xyz_loc": "[123.5, 0, 3]",
+ "rack_bay3_face": "vent",
+ "rack_bay3_rear_conduit": "grommet",
+ "rack_bay3_rear_fan": "true",
+ "rack_bay3_rotation": "270",
+ "rack_bay3_wall": "false",
+ "rack_bay3_xyz_loc": "[163.5, 0, 0]",
+ "rack_bay4_face": "vent",
+ "rack_bay4_rear_conduit": "none",
+ "rack_bay4_rear_fan": "true",
+ "rack_bay4_rotation": "0",
+ "rack_bay4_wall": "false",
+ "rack_bay4_xyz_loc": "[245, 0, 0]",
+ "rack_bay5_face": "vent",
+ "rack_bay5_rear_conduit": "grommet",
+ "rack_bay5_rear_fan": "false",
+ "rack_bay5_rotation": "0",
+ "rack_bay5_wall": "false",
+ "rack_bay5_xyz_loc": "[345, 0, 6]",
+ "rack_bay6_face": "fixed",
+ "rack_bay6_rear_conduit": "grommets-vertical",
+ "rack_bay6_rear_fan": "true",
+ "rack_bay6_rotation": "0",
+ "rack_bay6_xyz_loc": "[350, 0, 0]",
+ "rack_size": "1u",
+ "rack_width": "10",
+ "raise_top": "0",
+ "rear_cooling": "fan_1",
+ "rear_dualfan_spacing": "6",
+ "rear_fan": "1",
+ "rear_fan_center": "false",
+ "rear_fan_position": "0",
+ "rear_fan_size": "40",
+ "rear_io_shield": "false",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "c4",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "false",
+ "section_part": "false",
+ "sidethick": "3",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "solid",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "rear",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "rear",
+ "top_sidewall_support": "false",
+ "top_standoff_diameter": "5.75",
+ "top_standoff_hole_size": "2.75",
+ "top_standoff_insert": "false",
+ "top_standoff_insert_dia": "4.2",
+ "top_standoff_insert_height": "5.1",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_size": "m3",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "none",
+ "view": "model",
+ "wallthick": "2"
+ },
+ "n2l-sensors": {
+ "$fn": "90",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "n2l_env_sensors",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "solid",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "true",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "2.5",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.5",
+ "bottom_standoff_insert_height": "5",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_size": "custom",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "shell",
+ "case_offset_bz": "0",
+ "case_offset_tz": "17",
+ "case_offset_x": "0",
+ "case_offset_y": "65",
+ "cooling": "default",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_size": "custom",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "true",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "5.75",
+ "ext_top_standoff_hole_size": "2.75",
+ "ext_top_standoff_insert": "false",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_size": "custom",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "true",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "2",
+ "gap": "1",
+ "gpio_opening": "none",
+ "indents": "true",
+ "individual_part": "bottom",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "multipcb_bottom_front_left_adjust": "0",
+ "multipcb_bottom_front_left_enable": "true",
+ "multipcb_bottom_front_left_support": "front",
+ "multipcb_bottom_front_right_adjust": "0",
+ "multipcb_bottom_front_right_enable": "true",
+ "multipcb_bottom_front_right_support": "front",
+ "multipcb_bottom_rear_left_adjust": "0",
+ "multipcb_bottom_rear_left_enable": "true",
+ "multipcb_bottom_rear_left_support": "rear",
+ "multipcb_bottom_rear_right_adjust": "0",
+ "multipcb_bottom_rear_right_enable": "true",
+ "multipcb_bottom_rear_right_support": "rear",
+ "multipcb_bottom_sidewall_support": "false",
+ "multipcb_bottom_standoff_diameter": "5.75",
+ "multipcb_bottom_standoff_hole_size": "3.4",
+ "multipcb_bottom_standoff_insert": "false",
+ "multipcb_bottom_standoff_insert_dia": "4.2",
+ "multipcb_bottom_standoff_insert_height": "5.1",
+ "multipcb_bottom_standoff_pillar": "hex",
+ "multipcb_bottom_standoff_reverse": "false",
+ "multipcb_bottom_standoff_size": "m2.5",
+ "multipcb_bottom_standoff_support_height": "4",
+ "multipcb_bottom_standoff_support_size": "7",
+ "multipcb_bottom_standoff_type": "countersunk",
+ "multipcb_bottom_standoffs": "false",
+ "multipcb_top_front_left_adjust": "0",
+ "multipcb_top_front_left_enable": "true",
+ "multipcb_top_front_left_support": "front",
+ "multipcb_top_front_right_adjust": "0",
+ "multipcb_top_front_right_enable": "true",
+ "multipcb_top_front_right_support": "front",
+ "multipcb_top_rear_left_adjust": "0",
+ "multipcb_top_rear_left_enable": "true",
+ "multipcb_top_rear_left_support": "rear",
+ "multipcb_top_rear_right_adjust": "0",
+ "multipcb_top_rear_right_enable": "true",
+ "multipcb_top_rear_right_support": "rear",
+ "multipcb_top_sidewall_support": "false",
+ "multipcb_top_standoff_diameter": "5.75",
+ "multipcb_top_standoff_hole_size": "2.75",
+ "multipcb_top_standoff_insert": "false",
+ "multipcb_top_standoff_insert_dia": "4.2",
+ "multipcb_top_standoff_insert_height": "5.1",
+ "multipcb_top_standoff_pillar": "hex",
+ "multipcb_top_standoff_reverse": "true",
+ "multipcb_top_standoff_size": "m2.5",
+ "multipcb_top_standoff_support_height": "4",
+ "multipcb_top_standoff_support_size": "7",
+ "multipcb_top_standoff_type": "blind",
+ "multipcb_top_standoffs": "false",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "0",
+ "raise_top": "0",
+ "rear_io_shield": "false",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "n2l",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "true",
+ "sidethick": "2",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "solid",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "rear",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "rear",
+ "top_sidewall_support": "true",
+ "top_standoff_diameter": "5.75",
+ "top_standoff_hole_size": "2.5",
+ "top_standoff_insert": "false",
+ "top_standoff_insert_dia": "4.5",
+ "top_standoff_insert_height": "5",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_size": "custom",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "default",
+ "view": "model",
+ "wallthick": "2"
+ },
+ "n-series_rack19-1u": {
+ "$fn": "90",
+ "Rack_Bay1": "n2",
+ "Rack_Bay2": "none",
+ "Rack_Bay3": "none",
+ "Rack_Bay4": "n1",
+ "Rack_Bay5": "n2+",
+ "Rack_Bay6": "none",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "n-series_rack19-1u",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "solid",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "false",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "3.4",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.2",
+ "bottom_standoff_insert_height": "5.1",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_size": "m3+",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "rack",
+ "case_offset_bz": "0",
+ "case_offset_tz": "0",
+ "case_offset_x": "0",
+ "case_offset_y": "35",
+ "cooling": "none",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_size": "m3",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "false",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "5.75",
+ "ext_top_standoff_hole_size": "2.75",
+ "ext_top_standoff_insert": "false",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_size": "m3",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "false",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "2",
+ "front_cover_pattern": "solid",
+ "gap": "2",
+ "gpio_opening": "none",
+ "hd_bays": "2",
+ "hd_center": "false",
+ "hd_reverse": "false",
+ "hd_space": "10",
+ "hd_y_position": "25",
+ "hd_z_position": "40",
+ "indents": "false",
+ "individual_part": "bottom",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "multipcb_bottom_front_left_adjust": "0",
+ "multipcb_bottom_front_left_enable": "true",
+ "multipcb_bottom_front_left_support": "front",
+ "multipcb_bottom_front_right_adjust": "0",
+ "multipcb_bottom_front_right_enable": "true",
+ "multipcb_bottom_front_right_support": "front",
+ "multipcb_bottom_rear_left_adjust": "0",
+ "multipcb_bottom_rear_left_enable": "true",
+ "multipcb_bottom_rear_left_support": "rear",
+ "multipcb_bottom_rear_right_adjust": "0",
+ "multipcb_bottom_rear_right_enable": "true",
+ "multipcb_bottom_rear_right_support": "rear",
+ "multipcb_bottom_sidewall_support": "false",
+ "multipcb_bottom_standoff_diameter": "5.75",
+ "multipcb_bottom_standoff_hole_size": "3.4",
+ "multipcb_bottom_standoff_insert": "false",
+ "multipcb_bottom_standoff_insert_dia": "4.2",
+ "multipcb_bottom_standoff_insert_height": "5.1",
+ "multipcb_bottom_standoff_pillar": "hex",
+ "multipcb_bottom_standoff_reverse": "false",
+ "multipcb_bottom_standoff_size": "m2.5",
+ "multipcb_bottom_standoff_support_height": "4",
+ "multipcb_bottom_standoff_support_size": "7",
+ "multipcb_bottom_standoff_type": "countersunk",
+ "multipcb_bottom_standoffs": "false",
+ "multipcb_top_front_left_adjust": "0",
+ "multipcb_top_front_left_enable": "true",
+ "multipcb_top_front_left_support": "front",
+ "multipcb_top_front_right_adjust": "0",
+ "multipcb_top_front_right_enable": "true",
+ "multipcb_top_front_right_support": "front",
+ "multipcb_top_rear_left_adjust": "0",
+ "multipcb_top_rear_left_enable": "true",
+ "multipcb_top_rear_left_support": "rear",
+ "multipcb_top_rear_right_adjust": "0",
+ "multipcb_top_rear_right_enable": "true",
+ "multipcb_top_rear_right_support": "rear",
+ "multipcb_top_sidewall_support": "false",
+ "multipcb_top_standoff_diameter": "5.75",
+ "multipcb_top_standoff_hole_size": "2.75",
+ "multipcb_top_standoff_insert": "false",
+ "multipcb_top_standoff_insert_dia": "4.2",
+ "multipcb_top_standoff_insert_height": "5.1",
+ "multipcb_top_standoff_pillar": "hex",
+ "multipcb_top_standoff_reverse": "true",
+ "multipcb_top_standoff_size": "m2.5",
+ "multipcb_top_standoff_support_height": "4",
+ "multipcb_top_standoff_support_size": "7",
+ "multipcb_top_standoff_type": "blind",
+ "multipcb_top_standoffs": "false",
+ "nas_sbc_location": "top",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "0",
+ "rack_bay1_face": "fixed",
+ "rack_bay1_rear_conduit": "none",
+ "rack_bay1_rear_fan": "true",
+ "rack_bay1_rotation": "0",
+ "rack_bay1_wall": "false",
+ "rack_bay1_xyz_loc": "[13.5, 0, 0]",
+ "rack_bay2_face": "fixed",
+ "rack_bay2_rear_conduit": "grommet",
+ "rack_bay2_rear_fan": "true",
+ "rack_bay2_rotation": "0",
+ "rack_bay2_wall": "false",
+ "rack_bay2_xyz_loc": "[120, 0, 0]",
+ "rack_bay3_face": "vent",
+ "rack_bay3_rear_conduit": "none",
+ "rack_bay3_rear_fan": "true",
+ "rack_bay3_rotation": "270",
+ "rack_bay3_wall": "false",
+ "rack_bay3_xyz_loc": "[163.5, 0, 0]",
+ "rack_bay4_face": "vent",
+ "rack_bay4_rear_conduit": "none",
+ "rack_bay4_rear_fan": "true",
+ "rack_bay4_rotation": "0",
+ "rack_bay4_wall": "false",
+ "rack_bay4_xyz_loc": "[244.5, 0, 3]",
+ "rack_bay5_face": "vent",
+ "rack_bay5_rear_conduit": "grommet",
+ "rack_bay5_rear_fan": "true",
+ "rack_bay5_rotation": "0",
+ "rack_bay5_wall": "false",
+ "rack_bay5_xyz_loc": "[345, 0, 1.5]",
+ "rack_bay6_face": "fixed",
+ "rack_bay6_rear_conduit": "grommet",
+ "rack_bay6_rear_fan": "true",
+ "rack_bay6_rotation": "0",
+ "rack_bay6_xyz_loc": "[350, 0, 0]",
+ "rack_size": "1u",
+ "rack_width": "19",
+ "raise_top": "0",
+ "rear_cooling": "fan_1",
+ "rear_dualfan_spacing": "47",
+ "rear_fan": "1",
+ "rear_fan_center": "false",
+ "rear_fan_position": "0",
+ "rear_fan_size": "40",
+ "rear_io_shield": "false",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "c1+",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "false",
+ "section_part": "false",
+ "sidethick": "3",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "solid",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "rear",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "rear",
+ "top_sidewall_support": "false",
+ "top_standoff_diameter": "5.75",
+ "top_standoff_hole_size": "2.75",
+ "top_standoff_insert": "false",
+ "top_standoff_insert_dia": "4.2",
+ "top_standoff_insert_height": "5.1",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_size": "m3",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "none",
+ "view": "model",
+ "wallthick": "2"
+ },
"h3_shell": {
"$fn": "90",
"access_panel_location": "[0, 30]",
@@ -6193,6 +7440,267 @@
"view": "model",
"wallthick": "3"
},
+ "h4_rack19-1u+": {
+ "$fn": "90",
+ "Rack_Bay1": "h4_ultra",
+ "Rack_Bay2": "none",
+ "Rack_Bay3": "h4_ultra",
+ "Rack_Bay4": "none",
+ "Rack_Bay5": "h4_ultra",
+ "Rack_Bay6": "none",
+ "access_panel_location": "[10, 15]",
+ "access_panel_orientation": "landscape",
+ "access_panel_rotation": "0",
+ "access_panel_size": "[70, 30]",
+ "accessory_highlight": "false",
+ "accessory_name": "none",
+ "adj": "0.01",
+ "bend_allowance": "1",
+ "bottom_access_panel_enable": "false",
+ "bottom_clearence": "3.5",
+ "bottom_cover_pattern": "solid",
+ "bottom_front_left_adjust": "0",
+ "bottom_front_left_enable": "true",
+ "bottom_front_left_support": "front",
+ "bottom_front_right_adjust": "0",
+ "bottom_front_right_enable": "true",
+ "bottom_front_right_support": "front",
+ "bottom_rear_left_adjust": "0",
+ "bottom_rear_left_enable": "true",
+ "bottom_rear_left_support": "rear",
+ "bottom_rear_right_adjust": "0",
+ "bottom_rear_right_enable": "true",
+ "bottom_rear_right_support": "rear",
+ "bottom_sidewall_support": "false",
+ "bottom_standoff_diameter": "5.75",
+ "bottom_standoff_hole_size": "3.4",
+ "bottom_standoff_insert": "false",
+ "bottom_standoff_insert_dia": "4.2",
+ "bottom_standoff_insert_height": "5.1",
+ "bottom_standoff_pillar": "hex",
+ "bottom_standoff_reverse": "false",
+ "bottom_standoff_size": "m3",
+ "bottom_standoff_support_height": "4",
+ "bottom_standoff_support_size": "10",
+ "bottom_standoff_type": "countersunk",
+ "case_design": "rack",
+ "case_offset_bz": "0",
+ "case_offset_tz": "0",
+ "case_offset_x": "0",
+ "case_offset_y": "50",
+ "cooling": "default",
+ "corner_fillet": "3",
+ "edge_fillet": "0",
+ "ext_bottom_front_left_adjust": "0",
+ "ext_bottom_front_left_enable": "true",
+ "ext_bottom_front_left_support": "front",
+ "ext_bottom_front_right_adjust": "0",
+ "ext_bottom_front_right_enable": "true",
+ "ext_bottom_front_right_support": "front",
+ "ext_bottom_rear_left_adjust": "0",
+ "ext_bottom_rear_left_enable": "true",
+ "ext_bottom_rear_left_support": "rear",
+ "ext_bottom_rear_right_adjust": "0",
+ "ext_bottom_rear_right_enable": "true",
+ "ext_bottom_rear_right_support": "rear",
+ "ext_bottom_sidewall_support": "true",
+ "ext_bottom_standoff_diameter": "5.75",
+ "ext_bottom_standoff_hole_size": "3.4",
+ "ext_bottom_standoff_insert": "false",
+ "ext_bottom_standoff_insert_dia": "4.2",
+ "ext_bottom_standoff_insert_height": "5.1",
+ "ext_bottom_standoff_pillar": "hex",
+ "ext_bottom_standoff_reverse": "false",
+ "ext_bottom_standoff_size": "m3",
+ "ext_bottom_standoff_support_height": "4",
+ "ext_bottom_standoff_support_size": "10",
+ "ext_bottom_standoff_type": "countersunk",
+ "ext_bottom_standoffs": "false",
+ "ext_top_front_left_adjust": "0",
+ "ext_top_front_left_enable": "true",
+ "ext_top_front_left_support": "front",
+ "ext_top_front_right_adjust": "0",
+ "ext_top_front_right_enable": "true",
+ "ext_top_front_right_support": "front",
+ "ext_top_rear_left_adjust": "0",
+ "ext_top_rear_left_enable": "true",
+ "ext_top_rear_left_support": "rear",
+ "ext_top_rear_right_adjust": "0",
+ "ext_top_rear_right_enable": "true",
+ "ext_top_rear_right_support": "rear",
+ "ext_top_sidewall_support": "true",
+ "ext_top_standoff_diameter": "5.75",
+ "ext_top_standoff_hole_size": "2.75",
+ "ext_top_standoff_insert": "false",
+ "ext_top_standoff_insert_dia": "4.2",
+ "ext_top_standoff_insert_height": "5.1",
+ "ext_top_standoff_pillar": "hex",
+ "ext_top_standoff_reverse": "true",
+ "ext_top_standoff_size": "m3",
+ "ext_top_standoff_support_height": "4",
+ "ext_top_standoff_support_size": "10",
+ "ext_top_standoff_type": "blind",
+ "ext_top_standoffs": "false",
+ "fan_size": "0",
+ "flat_blank_section": "false",
+ "floorthick": "3",
+ "front_cover_pattern": "solid",
+ "gap": "2",
+ "gpio_opening": "default",
+ "hd_bays": "2",
+ "hd_center": "false",
+ "hd_reverse": "false",
+ "hd_space": "10",
+ "hd_y_position": "25",
+ "hd_z_position": "40",
+ "indents": "true",
+ "individual_part": "bottom",
+ "lower_bottom": "0",
+ "material_thickness": "0.5",
+ "move_front": "0",
+ "move_leftside": "0",
+ "move_rear": "0",
+ "move_rightside": "0",
+ "multipcb_bottom_front_left_adjust": "0",
+ "multipcb_bottom_front_left_enable": "true",
+ "multipcb_bottom_front_left_support": "front",
+ "multipcb_bottom_front_right_adjust": "0",
+ "multipcb_bottom_front_right_enable": "true",
+ "multipcb_bottom_front_right_support": "front",
+ "multipcb_bottom_rear_left_adjust": "0",
+ "multipcb_bottom_rear_left_enable": "true",
+ "multipcb_bottom_rear_left_support": "rear",
+ "multipcb_bottom_rear_right_adjust": "0",
+ "multipcb_bottom_rear_right_enable": "true",
+ "multipcb_bottom_rear_right_support": "rear",
+ "multipcb_bottom_sidewall_support": "false",
+ "multipcb_bottom_standoff_diameter": "5.75",
+ "multipcb_bottom_standoff_hole_size": "3.4",
+ "multipcb_bottom_standoff_insert": "false",
+ "multipcb_bottom_standoff_insert_dia": "4.2",
+ "multipcb_bottom_standoff_insert_height": "5.1",
+ "multipcb_bottom_standoff_pillar": "hex",
+ "multipcb_bottom_standoff_reverse": "false",
+ "multipcb_bottom_standoff_size": "m2.5",
+ "multipcb_bottom_standoff_support_height": "4",
+ "multipcb_bottom_standoff_support_size": "7",
+ "multipcb_bottom_standoff_type": "countersunk",
+ "multipcb_bottom_standoffs": "false",
+ "multipcb_top_front_left_adjust": "0",
+ "multipcb_top_front_left_enable": "true",
+ "multipcb_top_front_left_support": "front",
+ "multipcb_top_front_right_adjust": "0",
+ "multipcb_top_front_right_enable": "true",
+ "multipcb_top_front_right_support": "front",
+ "multipcb_top_rear_left_adjust": "0",
+ "multipcb_top_rear_left_enable": "true",
+ "multipcb_top_rear_left_support": "rear",
+ "multipcb_top_rear_right_adjust": "0",
+ "multipcb_top_rear_right_enable": "true",
+ "multipcb_top_rear_right_support": "rear",
+ "multipcb_top_sidewall_support": "false",
+ "multipcb_top_standoff_diameter": "5.75",
+ "multipcb_top_standoff_hole_size": "2.75",
+ "multipcb_top_standoff_insert": "false",
+ "multipcb_top_standoff_insert_dia": "4.2",
+ "multipcb_top_standoff_insert_height": "5.1",
+ "multipcb_top_standoff_pillar": "hex",
+ "multipcb_top_standoff_reverse": "true",
+ "multipcb_top_standoff_size": "m2.5",
+ "multipcb_top_standoff_support_height": "4",
+ "multipcb_top_standoff_support_size": "7",
+ "multipcb_top_standoff_type": "blind",
+ "multipcb_top_standoffs": "false",
+ "nas_sbc_location": "top",
+ "pcb_loc_x": "0",
+ "pcb_loc_y": "0",
+ "pcb_loc_z": "0",
+ "rack_bay1_face": "open",
+ "rack_bay1_rear_conduit": "none",
+ "rack_bay1_rear_fan": "false",
+ "rack_bay1_rotation": "0",
+ "rack_bay1_wall": "false",
+ "rack_bay1_xyz_loc": "[13, 0, 0]",
+ "rack_bay2_face": "fixed",
+ "rack_bay2_rear_conduit": "grommet",
+ "rack_bay2_rear_fan": "false",
+ "rack_bay2_rotation": "0",
+ "rack_bay2_wall": "true",
+ "rack_bay2_xyz_loc": "[0, 0, 0]",
+ "rack_bay3_face": "open",
+ "rack_bay3_rear_conduit": "none",
+ "rack_bay3_rear_fan": "false",
+ "rack_bay3_rotation": "0",
+ "rack_bay3_wall": "false",
+ "rack_bay3_xyz_loc": "[160, 0, 0]",
+ "rack_bay4_face": "fixed",
+ "rack_bay4_rear_conduit": "grommet",
+ "rack_bay4_rear_fan": "false",
+ "rack_bay4_rotation": "0",
+ "rack_bay4_wall": "true",
+ "rack_bay4_xyz_loc": "[0, 0, 0]",
+ "rack_bay5_face": "open",
+ "rack_bay5_rear_conduit": "none",
+ "rack_bay5_rear_fan": "false",
+ "rack_bay5_rotation": "0",
+ "rack_bay5_wall": "false",
+ "rack_bay5_xyz_loc": "[310, 0, 0]",
+ "rack_bay6_face": "fixed",
+ "rack_bay6_rear_conduit": "grommet",
+ "rack_bay6_rear_fan": "false",
+ "rack_bay6_rotation": "0",
+ "rack_bay6_xyz_loc": "[0, 0, 0]",
+ "rack_size": "1u+",
+ "rack_width": "19",
+ "raise_top": "0",
+ "rear_cooling": "fan_hex",
+ "rear_dualfan_spacing": "6",
+ "rear_fan": "1",
+ "rear_fan_center": "false",
+ "rear_fan_position": "0",
+ "rear_fan_size": "80",
+ "rear_io_shield": "false",
+ "sbc_bottom_standoffs": "true",
+ "sbc_highlight": "false",
+ "sbc_information": "false",
+ "sbc_model": "c1+",
+ "sbc_off": "false",
+ "sbc_top_standoffs": "false",
+ "section_part": "false",
+ "sidethick": "3",
+ "standard_motherboard_thickness": "0",
+ "text_color": "Green",
+ "text_font": "Nimbus Mono PS",
+ "tol": "0.25",
+ "top_cover_pattern": "solid",
+ "top_front_left_adjust": "0",
+ "top_front_left_enable": "true",
+ "top_front_left_support": "front",
+ "top_front_right_adjust": "0",
+ "top_front_right_enable": "true",
+ "top_front_right_support": "front",
+ "top_rear_left_adjust": "0",
+ "top_rear_left_enable": "true",
+ "top_rear_left_support": "rear",
+ "top_rear_right_adjust": "0",
+ "top_rear_right_enable": "true",
+ "top_rear_right_support": "rear",
+ "top_sidewall_support": "false",
+ "top_standoff_diameter": "5.75",
+ "top_standoff_hole_size": "2.75",
+ "top_standoff_insert": "false",
+ "top_standoff_insert_dia": "4.2",
+ "top_standoff_insert_height": "5.1",
+ "top_standoff_pillar": "hex",
+ "top_standoff_reverse": "true",
+ "top_standoff_size": "m3",
+ "top_standoff_support_height": "4",
+ "top_standoff_support_size": "10",
+ "top_standoff_type": "blind",
+ "uart_opening": "default",
+ "view": "model",
+ "wallthick": "2"
+ },
"show2_shell": {
"$fn": "90",
"access_panel_location": "[10, 15]",
@@ -8655,209 +10163,6 @@
"view": "model",
"wallthick": "2"
},
- "odroid-n2l_sensors": {
- "$fn": "90",
- "access_panel_location": "[10, 15]",
- "access_panel_orientation": "landscape",
- "access_panel_rotation": "0",
- "access_panel_size": "[70, 30]",
- "accessory_highlight": "false",
- "accessory_name": "n2l_env_sensors",
- "adj": "0.01",
- "bend_allowance": "1",
- "bottom_access_panel_enable": "false",
- "bottom_clearence": "3.5",
- "bottom_cover_pattern": "solid",
- "bottom_front_left_adjust": "0",
- "bottom_front_left_enable": "true",
- "bottom_front_left_support": "front",
- "bottom_front_right_adjust": "0",
- "bottom_front_right_enable": "true",
- "bottom_front_right_support": "front",
- "bottom_rear_left_adjust": "0",
- "bottom_rear_left_enable": "true",
- "bottom_rear_left_support": "rear",
- "bottom_rear_right_adjust": "0",
- "bottom_rear_right_enable": "true",
- "bottom_rear_right_support": "rear",
- "bottom_sidewall_support": "true",
- "bottom_standoff_diameter": "5.75",
- "bottom_standoff_hole_size": "2.5",
- "bottom_standoff_insert": "false",
- "bottom_standoff_insert_dia": "4.5",
- "bottom_standoff_insert_height": "5",
- "bottom_standoff_pillar": "hex",
- "bottom_standoff_reverse": "false",
- "bottom_standoff_size": "custom",
- "bottom_standoff_support_height": "4",
- "bottom_standoff_support_size": "10",
- "bottom_standoff_type": "countersunk",
- "case_design": "shell",
- "case_offset_bz": "0",
- "case_offset_tz": "17",
- "case_offset_x": "0",
- "case_offset_y": "65",
- "cooling": "default",
- "corner_fillet": "3",
- "edge_fillet": "0",
- "ext_bottom_front_left_adjust": "0",
- "ext_bottom_front_left_enable": "true",
- "ext_bottom_front_left_support": "front",
- "ext_bottom_front_right_adjust": "0",
- "ext_bottom_front_right_enable": "true",
- "ext_bottom_front_right_support": "front",
- "ext_bottom_rear_left_adjust": "0",
- "ext_bottom_rear_left_enable": "true",
- "ext_bottom_rear_left_support": "rear",
- "ext_bottom_rear_right_adjust": "0",
- "ext_bottom_rear_right_enable": "true",
- "ext_bottom_rear_right_support": "rear",
- "ext_bottom_sidewall_support": "true",
- "ext_bottom_standoff_diameter": "5.75",
- "ext_bottom_standoff_hole_size": "3.4",
- "ext_bottom_standoff_insert": "false",
- "ext_bottom_standoff_insert_dia": "4.2",
- "ext_bottom_standoff_insert_height": "5.1",
- "ext_bottom_standoff_pillar": "hex",
- "ext_bottom_standoff_reverse": "false",
- "ext_bottom_standoff_size": "custom",
- "ext_bottom_standoff_support_height": "4",
- "ext_bottom_standoff_support_size": "10",
- "ext_bottom_standoff_type": "countersunk",
- "ext_bottom_standoffs": "true",
- "ext_top_front_left_adjust": "0",
- "ext_top_front_left_enable": "true",
- "ext_top_front_left_support": "front",
- "ext_top_front_right_adjust": "0",
- "ext_top_front_right_enable": "true",
- "ext_top_front_right_support": "front",
- "ext_top_rear_left_adjust": "0",
- "ext_top_rear_left_enable": "true",
- "ext_top_rear_left_support": "rear",
- "ext_top_rear_right_adjust": "0",
- "ext_top_rear_right_enable": "true",
- "ext_top_rear_right_support": "rear",
- "ext_top_sidewall_support": "true",
- "ext_top_standoff_diameter": "5.75",
- "ext_top_standoff_hole_size": "2.75",
- "ext_top_standoff_insert": "false",
- "ext_top_standoff_insert_dia": "4.2",
- "ext_top_standoff_insert_height": "5.1",
- "ext_top_standoff_pillar": "hex",
- "ext_top_standoff_reverse": "true",
- "ext_top_standoff_size": "custom",
- "ext_top_standoff_support_height": "4",
- "ext_top_standoff_support_size": "10",
- "ext_top_standoff_type": "blind",
- "ext_top_standoffs": "true",
- "fan_size": "0",
- "flat_blank_section": "false",
- "floorthick": "2",
- "gap": "1",
- "gpio_opening": "none",
- "indents": "true",
- "individual_part": "bottom",
- "lower_bottom": "0",
- "material_thickness": "0.5",
- "move_front": "0",
- "move_leftside": "0",
- "move_rear": "0",
- "move_rightside": "0",
- "multipcb_bottom_front_left_adjust": "0",
- "multipcb_bottom_front_left_enable": "true",
- "multipcb_bottom_front_left_support": "front",
- "multipcb_bottom_front_right_adjust": "0",
- "multipcb_bottom_front_right_enable": "true",
- "multipcb_bottom_front_right_support": "front",
- "multipcb_bottom_rear_left_adjust": "0",
- "multipcb_bottom_rear_left_enable": "true",
- "multipcb_bottom_rear_left_support": "rear",
- "multipcb_bottom_rear_right_adjust": "0",
- "multipcb_bottom_rear_right_enable": "true",
- "multipcb_bottom_rear_right_support": "rear",
- "multipcb_bottom_sidewall_support": "false",
- "multipcb_bottom_standoff_diameter": "5.75",
- "multipcb_bottom_standoff_hole_size": "3.4",
- "multipcb_bottom_standoff_insert": "false",
- "multipcb_bottom_standoff_insert_dia": "4.2",
- "multipcb_bottom_standoff_insert_height": "5.1",
- "multipcb_bottom_standoff_pillar": "hex",
- "multipcb_bottom_standoff_reverse": "false",
- "multipcb_bottom_standoff_size": "m2.5",
- "multipcb_bottom_standoff_support_height": "4",
- "multipcb_bottom_standoff_support_size": "7",
- "multipcb_bottom_standoff_type": "countersunk",
- "multipcb_bottom_standoffs": "false",
- "multipcb_top_front_left_adjust": "0",
- "multipcb_top_front_left_enable": "true",
- "multipcb_top_front_left_support": "front",
- "multipcb_top_front_right_adjust": "0",
- "multipcb_top_front_right_enable": "true",
- "multipcb_top_front_right_support": "front",
- "multipcb_top_rear_left_adjust": "0",
- "multipcb_top_rear_left_enable": "true",
- "multipcb_top_rear_left_support": "rear",
- "multipcb_top_rear_right_adjust": "0",
- "multipcb_top_rear_right_enable": "true",
- "multipcb_top_rear_right_support": "rear",
- "multipcb_top_sidewall_support": "false",
- "multipcb_top_standoff_diameter": "5.75",
- "multipcb_top_standoff_hole_size": "2.75",
- "multipcb_top_standoff_insert": "false",
- "multipcb_top_standoff_insert_dia": "4.2",
- "multipcb_top_standoff_insert_height": "5.1",
- "multipcb_top_standoff_pillar": "hex",
- "multipcb_top_standoff_reverse": "true",
- "multipcb_top_standoff_size": "m2.5",
- "multipcb_top_standoff_support_height": "4",
- "multipcb_top_standoff_support_size": "7",
- "multipcb_top_standoff_type": "blind",
- "multipcb_top_standoffs": "false",
- "pcb_loc_x": "0",
- "pcb_loc_y": "0",
- "pcb_loc_z": "0",
- "raise_top": "0",
- "rear_io_shield": "false",
- "sbc_bottom_standoffs": "true",
- "sbc_highlight": "false",
- "sbc_information": "false",
- "sbc_model": "n2l",
- "sbc_off": "false",
- "sbc_top_standoffs": "true",
- "sidethick": "2",
- "standard_motherboard_thickness": "0",
- "text_color": "Green",
- "text_font": "Nimbus Mono PS",
- "tol": "0.25",
- "top_cover_pattern": "solid",
- "top_front_left_adjust": "0",
- "top_front_left_enable": "true",
- "top_front_left_support": "front",
- "top_front_right_adjust": "0",
- "top_front_right_enable": "true",
- "top_front_right_support": "front",
- "top_rear_left_adjust": "0",
- "top_rear_left_enable": "true",
- "top_rear_left_support": "rear",
- "top_rear_right_adjust": "0",
- "top_rear_right_enable": "true",
- "top_rear_right_support": "rear",
- "top_sidewall_support": "true",
- "top_standoff_diameter": "5.75",
- "top_standoff_hole_size": "2.5",
- "top_standoff_insert": "false",
- "top_standoff_insert_dia": "4.5",
- "top_standoff_insert_height": "5",
- "top_standoff_pillar": "hex",
- "top_standoff_reverse": "true",
- "top_standoff_size": "custom",
- "top_standoff_support_height": "4",
- "top_standoff_support_size": "10",
- "top_standoff_type": "blind",
- "uart_opening": "default",
- "view": "model",
- "wallthick": "2"
- },
"milk-V_duoS_shell": {
"$fn": "90",
"access_panel_location": "[10, 15]",
diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad
index d328e7d..2c19efd 100644
--- a/sbc_case_builder.scad
+++ b/sbc_case_builder.scad
@@ -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])
diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg
index 465de88..5cc0470 100644
--- a/sbc_case_builder_accessories.cfg
+++ b/sbc_case_builder_accessories.cfg
@@ -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"]],
diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad
index 34e9cef..e241e2d 100644
--- a/sbc_case_builder_library.scad
+++ b/sbc_case_builder_library.scad
@@ -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>;
diff --git a/tolerance_check.scad b/tolerance_check.scad
deleted file mode 100644
index f77e175..0000000
--- a/tolerance_check.scad
+++ /dev/null
@@ -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);
-