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); -