From 415d5532a1537a669008307424a5e82017ab4c06 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 27 Apr 2025 19:52:44 -0400 Subject: [PATCH 01/27] gui work for rack case design --- sbc_case_builder.scad | 168 +++++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 69 deletions(-) diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 73eaf81..107c371 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -73,6 +73,31 @@ 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_size = 19; //[10,19] +// size of rack mount cases 1U-4U // +rack_u_size = 1; //[1:4] +// number of rack bays // +rack_bays = 1; //[1:4] +// enable rack io plate opening for sbc +Rack_Bay1 = "empty"; // ["empty", "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"] +rack_bay1_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay1_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay1_wall = false; // [true,false] +Rack_Bay2 = "empty"; // ["empty", "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"] +rack_bay2_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay2_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay2_wall = false; // [true,false] +Rack_Bay3 = "empty"; // ["empty", "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"] +rack_bay3_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay3_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay3_wall = false; // [true,false] +Rack_Bay4 = "empty"; // ["empty", "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"] +rack_bay4_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay4_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay4_wall = false; // [true,false] + /* [3D Case Adjustments] */ // sbc location x axis pcb_loc_x = 0; //[0:.01:300] @@ -159,6 +184,7 @@ accessory_name = "none"; // ["none", "hk_uart", "c4_shell_boombox", "c4_desktop_ text_color = "Green"; // [Green, Black, Dimgrey, White, Yellow, Orange, Red, DarkbBlue] // sbc information text font text_font = "Nimbus Mono PS"; // [Nimbus Mono PS, Liberation Mono, Noto Sans Mono] + /* [SBC Top Standoff Global Settings] */ // enable case top standoffs sbc_top_standoffs = true; @@ -195,6 +221,76 @@ top_front_right_enable = true; top_front_right_adjust = 0; //[-30:.01:30] top_front_right_support = "front"; //[none,left,rear,front,right] +/* [ Extended Case Top Standoffs] */ +// enable case extended standoffs +ext_top_standoffs = false; +ext_top_standoff_reverse = true; +// enable wall support for extended standoffs +ext_top_sidewall_support = true; +ext_top_standoff_size = "m3"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] +ext_top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] +ext_top_standoff_pillar = "hex"; //[hex, round] +ext_top_standoff_diameter = 5.75; //[0:.01:10] +ext_top_standoff_hole_size = 2.75; //[0:.01:5] +ext_top_standoff_support_size = 10; //[0:.01:25] +ext_top_standoff_support_height = 4; //[0:.01:50] +ext_top_standoff_insert = false; +ext_top_standoff_insert_dia = 4.2; //.01 +ext_top_standoff_insert_height = 5.1; //.01 + +/* [ Extended Case Top Standoff Individual Settings] */ +// extended case top - lower left standoff settings +ext_top_rear_left_enable = true; +ext_top_rear_left_adjust = 0; //[-20:.01:20] +ext_top_rear_left_support = "rear"; //[none,left,rear,front,right] +// extended case top - upper left standoff settings +ext_top_front_left_enable = true; +ext_top_front_left_adjust = 0; //[-20:.01:20] +ext_top_front_left_support = "front"; //[none,left,rear,front,right] +// extended case top - lower right standoff settings +ext_top_rear_right_enable = true; +ext_top_rear_right_adjust = 0; //[-20:.01:20] +ext_top_rear_right_support = "rear"; //[none,left,rear,front,right] +// extended case top - upper right standoff settings +ext_top_front_right_enable = true; +ext_top_front_right_adjust = 0; //[-20:.01:20] +ext_top_front_right_support = "front"; //[none,left,rear,front,right] + +/* [ Multiple PCB Top Standoffs] */ +// enable multiple pcb standoffs +multipcb_top_standoffs = false; +multipcb_top_standoff_reverse = true; +// enable wall support for multiple pcb +multipcb_top_sidewall_support = false; +multipcb_top_standoff_size = "m2.5"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] +multipcb_top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] +multipcb_top_standoff_pillar = "hex"; //[hex, round] +multipcb_top_standoff_diameter = 5.75; //[0:.01:10] +multipcb_top_standoff_hole_size = 2.75; //[0:.01:5] +multipcb_top_standoff_support_size = 7; //[0:.01:25] +multipcb_top_standoff_support_height = 4; //[0:.01:50] +multipcb_top_standoff_insert = false; +multipcb_top_standoff_insert_dia = 4.2; //.01 +multipcb_top_standoff_insert_height = 5.1; //.01 + +/* [ Multiple PCB Top Standoff Individual Settings] */ +// multiple pcb top - lower left standoff settings +multipcb_top_rear_left_enable = true; +multipcb_top_rear_left_adjust = 0; //[-20:.01:20] +multipcb_top_rear_left_support = "rear"; //[none,left,rear,front,right] +// multiple pcb - upper left standoff settings +multipcb_top_front_left_enable = true; +multipcb_top_front_left_adjust = 0; //[-20:.01:20] +multipcb_top_front_left_support = "front"; //[none,left,rear,front,right] +// multiple pcb top - lower right standoff settings +multipcb_top_rear_right_enable = true; +multipcb_top_rear_right_adjust = 0; //[-20:.01:20] +multipcb_top_rear_right_support = "rear"; //[none,left,rear,front,right] +// multiple pcb top - upper right standoff settings +multipcb_top_front_right_enable = true; +multipcb_top_front_right_adjust = 0; //[-20:.01:20] +multipcb_top_front_right_support = "front"; //[none,left,rear,front,right] + /* [SBC Bottom Standoff Global Settings] */ // enable case bottom standoffs sbc_bottom_standoffs = true; @@ -231,40 +327,6 @@ bottom_front_right_enable = true; bottom_front_right_adjust = 0; //[-30:.01:30] bottom_front_right_support = "front"; //[none,left,rear,front,right] -/* [ Extended Case Top Standoffs] */ -// enable case extended standoffs -ext_top_standoffs = false; -ext_top_standoff_reverse = true; -// enable wall support for extended standoffs -ext_top_sidewall_support = true; -ext_top_standoff_size = "m3"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] -ext_top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] -ext_top_standoff_pillar = "hex"; //[hex, round] -ext_top_standoff_diameter = 5.75; //[0:.01:10] -ext_top_standoff_hole_size = 2.75; //[0:.01:5] -ext_top_standoff_support_size = 10; //[0:.01:25] -ext_top_standoff_support_height = 4; //[0:.01:50] -ext_top_standoff_insert = false; -ext_top_standoff_insert_dia = 4.2; //.01 -ext_top_standoff_insert_height = 5.1; //.01 -/* [ Extended Case Top Standoff Individual Settings] */ -// extended case top - lower left standoff settings -ext_top_rear_left_enable = true; -ext_top_rear_left_adjust = 0; //[-20:.01:20] -ext_top_rear_left_support = "rear"; //[none,left,rear,front,right] -// extended case top - upper left standoff settings -ext_top_front_left_enable = true; -ext_top_front_left_adjust = 0; //[-20:.01:20] -ext_top_front_left_support = "front"; //[none,left,rear,front,right] -// extended case top - lower right standoff settings -ext_top_rear_right_enable = true; -ext_top_rear_right_adjust = 0; //[-20:.01:20] -ext_top_rear_right_support = "rear"; //[none,left,rear,front,right] -// extended case top - upper right standoff settings -ext_top_front_right_enable = true; -ext_top_front_right_adjust = 0; //[-20:.01:20] -ext_top_front_right_support = "front"; //[none,left,rear,front,right] - /* [ Extended Case Bottom Standoffs] */ // enable case bottom extended standoffs ext_bottom_standoffs = false; @@ -300,40 +362,6 @@ ext_bottom_front_right_enable = true; ext_bottom_front_right_adjust = 0; //[-20:.01:20] ext_bottom_front_right_support = "front"; //[none,left,rear,front,right] -/* [ Multiple PCB Top Standoffs] */ -// enable multiple pcb standoffs -multipcb_top_standoffs = false; -multipcb_top_standoff_reverse = true; -// enable wall support for multiple pcb -multipcb_top_sidewall_support = false; -multipcb_top_standoff_size = "m2.5"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] -multipcb_top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] -multipcb_top_standoff_pillar = "hex"; //[hex, round] -multipcb_top_standoff_diameter = 5.75; //[0:.01:10] -multipcb_top_standoff_hole_size = 2.75; //[0:.01:5] -multipcb_top_standoff_support_size = 7; //[0:.01:25] -multipcb_top_standoff_support_height = 4; //[0:.01:50] -multipcb_top_standoff_insert = false; -multipcb_top_standoff_insert_dia = 4.2; //.01 -multipcb_top_standoff_insert_height = 5.1; //.01 -/* [ Multiple PCB Top Standoff Individual Settings] */ -// multiple pcb top - lower left standoff settings -multipcb_top_rear_left_enable = true; -multipcb_top_rear_left_adjust = 0; //[-20:.01:20] -multipcb_top_rear_left_support = "rear"; //[none,left,rear,front,right] -// multiple pcb - upper left standoff settings -multipcb_top_front_left_enable = true; -multipcb_top_front_left_adjust = 0; //[-20:.01:20] -multipcb_top_front_left_support = "front"; //[none,left,rear,front,right] -// multiple pcb top - lower right standoff settings -multipcb_top_rear_right_enable = true; -multipcb_top_rear_right_adjust = 0; //[-20:.01:20] -multipcb_top_rear_right_support = "rear"; //[none,left,rear,front,right] -// multiple pcb top - upper right standoff settings -multipcb_top_front_right_enable = true; -multipcb_top_front_right_adjust = 0; //[-20:.01:20] -multipcb_top_front_right_support = "front"; //[none,left,rear,front,right] - /* [ Multiple PCB Bottom Standoffs] */ // enable multiple pcb extended standoffs multipcb_bottom_standoffs = false; @@ -369,6 +397,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); @@ -394,7 +423,6 @@ 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; -/* [Hidden] */ top_standoff = [top_standoff_size, top_standoff_diameter, 18, @@ -479,6 +507,8 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size, multipcb_bottom_standoff_insert_dia, multipcb_bottom_standoff_insert_height]; +rack_bay_sbc = [Rack_Bay4,Rack_Bay4,Rack_Bay4,Rack_Bay4]; + adj = .01; $fn=90; From 5aebb0d549d00e394cac7ece0bec4025efe6fcb4 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Tue, 29 Apr 2025 14:45:29 -0400 Subject: [PATCH 02/27] initial work for rack_1u case, rack.scad with mounting tabs --- lib/rack.scad | 83 ++++++++++++ sbc_case_builder.json | 243 +++++++++++++++++++++++++++++++++- sbc_case_builder.scad | 66 +++++++-- sbc_case_builder_library.scad | 2 + 4 files changed, 384 insertions(+), 10 deletions(-) create mode 100644 lib/rack.scad diff --git a/lib/rack.scad b/lib/rack.scad new file mode 100644 index 0000000..52a9b94 --- /dev/null +++ b/lib/rack.scad @@ -0,0 +1,83 @@ +/* + 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 == "2u" ? 2*44.45 : size == "3u" ? 3*44.45 : 4*44.45; + c_fillet = 2; + hole = 3.2; + rack_hole = 6; + tab_width = 25; + b_width = thick; + b_depth = depth; + b_height = 25; + 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([-15,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([-15,c,-adjust]) slot(rack_hole,3,thick+(adjust*2)); + } + } + } +} diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 85df71f..90a86b6 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -7252,10 +7252,8 @@ "uart_opening": "none", "view": "model", "wallthick": "3" - }, "rpi5_panel_nas": { - "$fn": "90", "access_panel_location": "[10, 15]", "access_panel_orientation": "landscape", @@ -10873,6 +10871,247 @@ "uart_opening": "default", "view": "model", "wallthick": "2" + }, + "c4_rack_1u": { + "$fn": "90", + "Rack_Bay1": "c1+", + "Rack_Bay2": "empty", + "Rack_Bay3": "empty", + "Rack_Bay4": "empty", + "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": "25", + "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": "1", + "gpio_opening": "default", + "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": "io_shield", + "rack_bay1_rotation": "0", + "rack_bay1_wall": "false", + "rack_bay1_xyz_loc": "[0, 0, 0]", + "rack_bay2_face": "io_shield", + "rack_bay2_rotation": "0", + "rack_bay2_wall": "false", + "rack_bay2_xyz_loc": "[0, 0, 0]", + "rack_bay3_face": "io_shield", + "rack_bay3_rotation": "0", + "rack_bay3_wall": "false", + "rack_bay3_xyz_loc": "[0, 0, 0]", + "rack_bay4_face": "io_shield", + "rack_bay4_rotation": "0", + "rack_bay4_wall": "false", + "rack_bay4_xyz_loc": "[0, 0, 0]", + "rack_bays": "1", + "rack_size": "19", + "rack_u_size": "1u", + "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": "c4", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "section_part": "false", + "sidethick": "5", + "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": "3" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 107c371..f44dcef 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -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] @@ -77,24 +77,28 @@ rear_io_shield = false; // size of rack 10" or 19" // rack_size = 19; //[10,19] // size of rack mount cases 1U-4U // -rack_u_size = 1; //[1:4] +rack_u_size = "1u"; //["1u", "2u", "3u", "4u"] // number of rack bays // rack_bays = 1; //[1:4] // enable rack io plate opening for sbc Rack_Bay1 = "empty"; // ["empty", "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"] -rack_bay1_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay1_rotation = 0; // [0:90:270] +rack_bay1_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay1_wall = false; // [true,false] Rack_Bay2 = "empty"; // ["empty", "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"] -rack_bay2_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay2_rotation = 0; // [0:90:270] +rack_bay2_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay2_wall = false; // [true,false] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay3_rotation = 0; // [0:90:270] rack_bay3_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay3_wall = false; // [true,false] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay4_rotation = 0; // [0:90:270] rack_bay4_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay4_wall = false; // [true,false] @@ -411,15 +415,13 @@ 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; +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" ? 450 : 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; 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" ? 44.45+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; @@ -1038,6 +1040,54 @@ 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("grey",1) translate([0,0,raise_top]) 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(sbc_off == false) { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay1_rotation]) + sbc(Rack_Bay1, 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) { diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index 34e9cef..7541e78 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>; @@ -50,5 +51,6 @@ include <./lib/keyhole.scad>; include <./lib/oem_adafruit.scad>; include <./lib/oem_hk.scad>; include <./lib/oem_rpi.scad>; +include <./lib/rack.scad>; include <./lib/standoff.scad>; include <./lib/vent.scad>; From 859192bd6b3c1e7d9e1b21fd04a895c32d23c313 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 1 May 2025 17:43:39 -0400 Subject: [PATCH 03/27] multi sbc support with individual location and rotation for rack case --- mod/case_side.scad | 4 ++-- sbc_case_builder.json | 20 ++++++++++---------- sbc_case_builder.scad | 36 +++++++++++++++++++++++++++++------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/mod/case_side.scad b/mod/case_side.scad index cc83daa..dc7614d 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -136,7 +136,7 @@ module case_side(case_design, side) { difference() { union() { translate([-gap,-(2*wallthick),0]) - cube([x_adj,wallthick,case_z-wallthick]); + cube([x_adj,wallthick,case_z-floorthick]); // bottom right tab translate([xtab_adj,-(2*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); @@ -185,7 +185,7 @@ module case_side(case_design, side) { difference() { union() { translate([-gap,depth-(4*wallthick),floorthick]) - cube([x_adj,wallthick,case_z-3*wallthick]); + cube([x_adj,wallthick,case_z-3*floorthick]); // bottom right tab translate([xtab_adj,depth-(4*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 90a86b6..d014143 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10874,10 +10874,10 @@ }, "c4_rack_1u": { "$fn": "90", - "Rack_Bay1": "c1+", + "Rack_Bay1": "c4", "Rack_Bay2": "empty", - "Rack_Bay3": "empty", - "Rack_Bay4": "empty", + "Rack_Bay3": "c2", + "Rack_Bay4": "xu4", "access_panel_location": "[10, 15]", "access_panel_orientation": "landscape", "access_panel_rotation": "0", @@ -10917,7 +10917,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "25", + "case_offset_y": "40", "cooling": "default", "corner_fillet": "3", "edge_fillet": "0", @@ -11046,21 +11046,21 @@ "pcb_loc_y": "0", "pcb_loc_z": "0", "rack_bay1_face": "io_shield", - "rack_bay1_rotation": "0", + "rack_bay1_rotation": "270", "rack_bay1_wall": "false", - "rack_bay1_xyz_loc": "[0, 0, 0]", + "rack_bay1_xyz_loc": "[15, 0, 0]", "rack_bay2_face": "io_shield", "rack_bay2_rotation": "0", "rack_bay2_wall": "false", - "rack_bay2_xyz_loc": "[0, 0, 0]", + "rack_bay2_xyz_loc": "[120, 0, 0]", "rack_bay3_face": "io_shield", - "rack_bay3_rotation": "0", + "rack_bay3_rotation": "270", "rack_bay3_wall": "false", - "rack_bay3_xyz_loc": "[0, 0, 0]", + "rack_bay3_xyz_loc": "[250, 0, 0]", "rack_bay4_face": "io_shield", "rack_bay4_rotation": "0", "rack_bay4_wall": "false", - "rack_bay4_xyz_loc": "[0, 0, 0]", + "rack_bay4_xyz_loc": "[350, 0, 0]", "rack_bays": "1", "rack_size": "19", "rack_u_size": "1u", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index f44dcef..2e50e61 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -82,22 +82,22 @@ rack_u_size = "1u"; //["1u", "2u", "3u", "4u"] rack_bays = 1; //[1:4] // enable rack io plate opening for sbc Rack_Bay1 = "empty"; // ["empty", "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"] -rack_bay1_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] rack_bay1_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay1_wall = false; // [true,false] Rack_Bay2 = "empty"; // ["empty", "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"] -rack_bay2_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] rack_bay2_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay2_wall = false; // [true,false] Rack_Bay3 = "empty"; // ["empty", "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"] -rack_bay3_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] rack_bay3_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay3_wall = false; // [true,false] Rack_Bay4 = "empty"; // ["empty", "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"] -rack_bay4_xyz_loc = [0,0,0]; // [0:.5:300] +rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] rack_bay4_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay4_wall = false; // [true,false] @@ -509,7 +509,11 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size, multipcb_bottom_standoff_insert_dia, multipcb_bottom_standoff_insert_height]; -rack_bay_sbc = [Rack_Bay4,Rack_Bay4,Rack_Bay4,Rack_Bay4]; +rack_bay_sbc = [Rack_Bay1,Rack_Bay2,Rack_Bay3,Rack_Bay4]; +rack_bay_xyz_loc = [rack_bay1_xyz_loc, rack_bay2_xyz_loc, rack_bay3_xyz_loc, rack_bay4_xyz_loc]; +rack_bay_rotation = [rack_bay1_rotation, rack_bay2_rotation, rack_bay3_rotation, rack_bay4_rotation]; +rack_bay_face = [rack_bay1_face, rack_bay2_face, rack_bay3_face, rack_bay4_face]; +rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall]; adj = .01; $fn=90; @@ -1084,8 +1088,26 @@ if (view == "model") { } } if(sbc_off == false) { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay1_rotation]) - sbc(Rack_Bay1, cooling, fan_size, gpio_opening, uart_opening, false); + for(i = [0:3]) { + s = search([rack_bay_sbc[i]],sbc_data); + pcb_loc_z = rack_bay_xyz_loc[i][2]; + 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[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]; + if(rack_bay_sbc[i] != "empty") { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + 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") { From ca26347358e319c3a3fa052c0f685ecd69f8fab4 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sat, 3 May 2025 17:42:27 -0400 Subject: [PATCH 04/27] rack case piece fastening geometry, added panel_clamp to library --- lib/panel_clamp.scad | 81 ++++ mod/case_rack.scad | 799 ++++++++++++++++++++++++++++++++++ sbc_case_builder_library.scad | 1 + 3 files changed, 881 insertions(+) create mode 100644 lib/panel_clamp.scad create mode 100644 mod/case_rack.scad diff --git a/lib/panel_clamp.scad b/lib/panel_clamp.scad new file mode 100644 index 0000000..5c673dd --- /dev/null +++ b/lib/panel_clamp.scad @@ -0,0 +1,81 @@ +/* + NAME: panel_clamp + DESCRIPTION: creates various clamps to join two panels + TODO: none + + USAGE: panel_clamp(face, screw, style, dia_x, dia_y, height, mask) + + face = "top","bottom","rear","front","left","right" + screw = "m2", "m2.5", "m3", "m4" + style = "sloped" + dia_x = top diameter or x size in mm + dia_y = bottom diameter or y size in mm + height = holder height in mm + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" + +*/ + + +module panel_clamp(face, screw, style, 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 && mstyle == "default") { + } + if(enablemask == false) { + translate([0,0,0]) 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, 3]) rotate([0,90,0]) + cylinder(d=nuts[0][0]+.5, h=dia_y+2); + translate([-(dia_y/2), 0, 3]) rotate([0,90,0]) + cylinder(d=nuts[0][1]*2/sqrt(3), h=dia_y*.375, $fn=6); + translate([nuts[0][0]+.5, 0, 3]) 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/mod/case_rack.scad b/mod/case_rack.scad new file mode 100644 index 0000000..a0eb8ef --- /dev/null +++ b/mod/case_rack.scad @@ -0,0 +1,799 @@ +/* + This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder + Copyright 2022,2023,2024 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 + + + NAME: case_rack + DESCRIPTION: creates a U1-U4 rack case + 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(side == "bottom") { + difference() { + union() { + difference() { + union() { + if(case_design == "rack") { + 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); + } + // rack ears + translate([-gap-wallthick, -gap+(sidethick-wallthick), 0]) + rack_end_bracket("left", rack_u_size, sidethick); + translate([width-wallthick-gap, -gap+(sidethick-wallthick), 0]) + rack_end_bracket("right", rack_u_size, sidethick); + + // case upper panel clamp + translate([150-gap-wallthick,-gap-adj-.5,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,-gap-adj-.5,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj+.5, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj+.5, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + + // case lower assembly blocks + // 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 right - left side + translate([300-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]); + // rear right - right + translate([300-gap-wallthick+rack_asm_gap,-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 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]); + // 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]); + // 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]); + } + + // 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]]); + } + } + } + } + // 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); + + for(r = [0:len(rack_bay_sbc)-1]) { + 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]; + translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { + // pcb standoff holes + if(sbc_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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") { + translate([pcbhole_x,pcbhole_y,-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)); + } + 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)); + } + 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)); + } + + } + } + // multi-pcb standoff holes + if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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)); + } + } + } + } + } + } + } } + // extended standoff holes + if(ext_bottom_standoffs == true) { + // right-rear standoff + if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size + || pcb_loc_y >= ext_bottom_standoff_support_size)) && + ext_bottom_rear_right_enable == true && ext_bottom_standoff[6] != "blind") { + translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), + ext_bottom_standoff_support_size/4,-adj]) + cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2+adj)); + } + // right-front standoff + if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && + depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size) || + (width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && + depth-pcb_loc_y-pcb_depth <= ext_bottom_standoff_support_size) || + (width-pcb_loc_x-pcb_width-(gap+2*wallthick) <= ext_bottom_standoff_support_size && + depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size)) && + ext_bottom_front_right_enable == true && ext_bottom_standoff[6] != "blind") { + translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), + depth-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)),-adj]) + cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2*adj)); + } + // left-rear standoff + if((pcb_loc_x >= ext_bottom_standoff_support_size || pcb_loc_y >= ext_bottom_standoff_support_size) && + ext_bottom_rear_left_enable == true && ext_bottom_standoff[6] != "blind") { + translate([ext_bottom_standoff_support_size/4, + ext_bottom_standoff_support_size/4,-adj]) + cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2*adj)); + } + // left-front standoff + if(((pcb_loc_x >= ext_bottom_standoff_support_size && + (depth-(pcb_loc_y+pcb_depth)) >= ext_bottom_standoff_support_size) || + (pcb_loc_x <= ext_bottom_standoff_support_size && + (depth-(pcb_loc_y+pcb_depth)) >= ext_bottom_standoff_support_size) || + (pcb_loc_x >= ext_bottom_standoff_support_size && + (depth-(pcb_loc_y+pcb_depth)) <= ext_bottom_standoff_support_size)) && + ext_bottom_front_left_enable == true && ext_bottom_standoff[6] != "blind") { + translate([ext_bottom_standoff_support_size/4, + depth-(ext_bottom_standoff_support_size/4)-(2*(wallthick+gap)),-adj]) + cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2*adj)); + } + } + // bottom cover pattern + if(bottom_cover_pattern != "solid") { + if(bottom_cover_pattern == "hex_5mm") { + translate([1,0,-floorthick+adj]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); + } + if(bottom_cover_pattern == "hex_8mm") { + translate([1,2,-floorthick+adj]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + } + if(bottom_cover_pattern == "linear_vertical") { + translate([0,-gap,-floorthick+adj]) + vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); + } + if(bottom_cover_pattern == "linear_horizontal") { + translate([-gap,-gap,-floorthick+adj]) + vent(width-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); + } + if(bottom_cover_pattern == "astroid") { + for(c=[3:12:depth-8]) { + for(r=[4:12:width-8]) { + translate([r,c,-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + } + } + } + } + } + for(r = [0:len(rack_bay_sbc)-1]) { + 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]; + translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { + // primary pcb standoffs + if(sbc_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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], + bottom_height-pcb_z+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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,0]) + standoff(pcb_standoff,[false,10,2,"default"]); + } + } + } + } + // multi-pcb standoffs + if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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"]); + } + } + } + } + } + } + } } + // extended standoffs + if(ext_bottom_standoffs == true) { + // extended right-rear standoff + if((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size || + pcb_loc_y >= ext_bottom_standoff_support_size) && ext_bottom_rear_right_enable == true) { + extended_standoff = [ext_bottom_standoff[0], + ext_bottom_standoff[1], + bottom_height+ext_bottom_rear_right_adjust, + ext_bottom_standoff[3], + ext_bottom_standoff[4], + ext_bottom_standoff[5], + ext_bottom_standoff[6], + ext_bottom_standoff[7], + ext_bottom_rear_right_support, + ext_bottom_standoff[9], + ext_bottom_standoff[10], + ext_bottom_standoff[11], + ext_bottom_standoff[12]]; + translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), + ext_bottom_standoff_support_size/4,0]) + standoff(extended_standoff,[false,10,2,"default"]); + } + // extended right-front standoff + if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && + depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size) || + (width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && + depth-pcb_loc_y-pcb_depth <= ext_bottom_standoff_support_size) || + (width-pcb_loc_x-pcb_width-(gap+2*wallthick) <= ext_bottom_standoff_support_size && + depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size)) && + ext_bottom_front_right_enable == true) { + extended_standoff = [ext_bottom_standoff[0], + ext_bottom_standoff[1], + bottom_height+ext_bottom_front_right_adjust, + ext_bottom_standoff[3], + ext_bottom_standoff[4], + ext_bottom_standoff[5], + ext_bottom_standoff[6], + ext_bottom_standoff[7], + ext_bottom_front_right_support, + ext_bottom_standoff[9], + ext_bottom_standoff[10], + ext_bottom_standoff[11], + ext_bottom_standoff[12]]; + translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), + depth-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)),0]) + standoff(extended_standoff,[false,10,2,"default"]); + } + // extended left-rear standoff + if((pcb_loc_x >= ext_bottom_standoff_support_size || pcb_loc_y >= ext_bottom_standoff_support_size) + && ext_bottom_rear_left_enable == true) { + extended_standoff = [ext_bottom_standoff[0], + ext_bottom_standoff[1], + bottom_height+ext_bottom_rear_left_adjust, + ext_bottom_standoff[3], + ext_bottom_standoff[4], + ext_bottom_standoff[5], + ext_bottom_standoff[6], + ext_bottom_standoff[7], + ext_bottom_rear_left_support, + ext_bottom_standoff[9], + ext_bottom_standoff[10], + ext_bottom_standoff[11], + ext_bottom_standoff[12]]; + translate([ext_bottom_standoff_support_size/4, ext_bottom_standoff_support_size/4,0]) + standoff(extended_standoff,[false,10,2,"default"]); + } + // extended left-front standoff + if(((pcb_loc_x >= ext_bottom_standoff_support_size && + depth-(pcb_loc_y+pcb_depth) >= ext_bottom_standoff_support_size) || + (pcb_loc_x <= ext_bottom_standoff_support_size && + depth-(pcb_loc_y+pcb_depth) >= ext_bottom_standoff_support_size) || + (pcb_loc_x >= ext_bottom_standoff_support_size && + depth-(pcb_loc_y+pcb_depth) <= ext_bottom_standoff_support_size)) && + ext_bottom_front_left_enable == true) { + extended_standoff = [ext_bottom_standoff[0], + ext_bottom_standoff[1], + bottom_height+ext_bottom_front_left_adjust, + ext_bottom_standoff[3], + ext_bottom_standoff[4], + ext_bottom_standoff[5], + ext_bottom_standoff[6], + ext_bottom_standoff[7], + ext_bottom_front_left_support, + ext_bottom_standoff[9], + ext_bottom_standoff[10], + ext_bottom_standoff[11], + ext_bottom_standoff[12]]; + translate([ext_bottom_standoff_support_size/4, + depth-(ext_bottom_standoff_support_size/4)-(2*(wallthick+gap)),0]) + standoff(extended_standoff,[false,10,2,"default"]); + } + } + } + // 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]]); + } + } + } + + } + // 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]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + } + if(access_panel_rotation == 90) { + translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + } + if(access_panel_rotation == 180) { + translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) + rotate([0,0,access_panel_rotation]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + } + if(access_panel_rotation == 270) { + translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) rotate([0,0,access_panel_rotation]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + } + } + for(i = [0:len(rack_bay_sbc)-1]) { + 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_color = sbc_data[s[0]][11][1]; + pcb_radius = sbc_data[s[0]][11][0]; + + 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]; + + // sbc openings + if(sbc_highlight == true && rack_bay_sbc[i] != "empty") { + #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); + } + if(sbc_highlight != true && rack_bay_sbc[i] != "empty") { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); + } + // indents + if(indents == 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]) { + class = sbc_data[s[0]][i+1]; + type = sbc_data[s[0]][i+2]; + id = sbc_data[s[0]][i+3]; + loc_x = sbc_data[s[0]][i+4]+pcb_loc_x+pcbloc_x; + loc_y = sbc_data[s[0]][i+5]+pcb_loc_y+pcbloc_y; + loc_z = sbc_data[s[0]][i+6]+pcb_loc_z+pcbloc_z; + side = sbc_data[s[0]][i+7]; + rotation = sbc_data[s[0]][i+8]; + if(id == pcbid) { + indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + } + } + } + } + } + // case divide + translate([150-gap-wallthick,-gap-wallthick,-adj]) cube([rack_asm_gap,depth,case_z+2*adj]); + translate([300-gap-wallthick,-gap-wallthick,-adj]) cube([rack_asm_gap,depth,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); + } + } + // 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]]); + } + } + } + // ui access port + 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]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + } + if(access_panel_rotation == 90) { + translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + } + if(access_panel_rotation == 180) { + translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) rotate([0,0,access_panel_rotation]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + } + if(access_panel_rotation == 270) { + translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) rotate([0,0,access_panel_rotation]) + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + } + } +} +} diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index 7541e78..484aa8f 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -51,6 +51,7 @@ 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>; From 6bc4920beab1faf259c2f74fe6f281b5daa16a8f Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sat, 3 May 2025 21:44:01 -0400 Subject: [PATCH 05/27] added middle floor clamp, expanded support to 6 devices, initial wall dividers --- mod/case_rack.scad | 18 +++++++++++++++--- sbc_case_builder.json | 41 +++++++++++++++++++++++++---------------- sbc_case_builder.scad | 37 +++++++++++++++++++++++++------------ 3 files changed, 65 insertions(+), 31 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index a0eb8ef..cdd501c 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -48,11 +48,17 @@ if(side == "bottom") { } // rack ears translate([-gap-wallthick, -gap+(sidethick-wallthick), 0]) - rack_end_bracket("left", rack_u_size, sidethick); + rack_end_bracket("left", rack_size, sidethick); translate([width-wallthick-gap, -gap+(sidethick-wallthick), 0]) - rack_end_bracket("right", rack_u_size, sidethick); + rack_end_bracket("right", rack_size, sidethick); - // case upper panel clamp + // bay divider walls + for(r = [0:len(rack_bay_sbc)-1]) { + if(rack_bay_wall[r] == true) { + translate([-gap-wallthick+75*(r+1),-gap-wallthick-adj,0]) cube([wallthick-1,depth,case_z-floorthick]); + } + } + // case upper panel clamps translate([150-gap-wallthick,-gap-adj-.5,case_z-13]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); translate([300-gap-wallthick,-gap-adj-.5,case_z-13]) @@ -62,6 +68,12 @@ if(side == "bottom") { translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj+.5, case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + // case floor panel clamps + translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj]) + panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj]) + panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + // case lower assembly blocks // rear left - left side translate([150-gap-wallthick-rack_asm_size,-gap-adj,floorthick-adj]) diff --git a/sbc_case_builder.json b/sbc_case_builder.json index d014143..e1986d4 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10875,9 +10875,11 @@ "c4_rack_1u": { "$fn": "90", "Rack_Bay1": "c4", - "Rack_Bay2": "empty", - "Rack_Bay3": "c2", - "Rack_Bay4": "xu4", + "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", @@ -10976,7 +10978,7 @@ "floorthick": "3", "front_cover_pattern": "solid", "gap": "1", - "gpio_opening": "default", + "gpio_opening": "none", "hd_bays": "2", "hd_center": "false", "hd_reverse": "false", @@ -11047,23 +11049,30 @@ "pcb_loc_z": "0", "rack_bay1_face": "io_shield", "rack_bay1_rotation": "270", - "rack_bay1_wall": "false", + "rack_bay1_wall": "true", "rack_bay1_xyz_loc": "[15, 0, 0]", "rack_bay2_face": "io_shield", - "rack_bay2_rotation": "0", - "rack_bay2_wall": "false", - "rack_bay2_xyz_loc": "[120, 0, 0]", + "rack_bay2_rotation": "270", + "rack_bay2_wall": "true", + "rack_bay2_xyz_loc": "[90, 0, 0]", "rack_bay3_face": "io_shield", "rack_bay3_rotation": "270", - "rack_bay3_wall": "false", - "rack_bay3_xyz_loc": "[250, 0, 0]", + "rack_bay3_wall": "true", + "rack_bay3_xyz_loc": "[161, 0, 0]", "rack_bay4_face": "io_shield", - "rack_bay4_rotation": "0", - "rack_bay4_wall": "false", - "rack_bay4_xyz_loc": "[350, 0, 0]", - "rack_bays": "1", - "rack_size": "19", - "rack_u_size": "1u", + "rack_bay4_rotation": "270", + "rack_bay4_wall": "true", + "rack_bay4_xyz_loc": "[232, 0, 0]", + "rack_bay5_face": "io_shield", + "rack_bay5_rotation": "270", + "rack_bay5_wall": "true", + "rack_bay5_xyz_loc": "[303, 0, 0]", + "rack_bay6_face": "io_shield", + "rack_bay6_rotation": "270", + "rack_bay6_wall": "false", + "rack_bay6_xyz_loc": "[374, 0, 0]", + "rack_size": "1u", + "rack_width": "19", "raise_top": "0", "rear_cooling": "fan_hex", "rear_dualfan_spacing": "6", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 2e50e61..d93ba75 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -75,33 +75,46 @@ rear_io_shield = false; /* [Rack Mount Case Adjustments] */ // size of rack 10" or 19" // -rack_size = 19; //[10,19] -// size of rack mount cases 1U-4U // -rack_u_size = "1u"; //["1u", "2u", "3u", "4u"] -// number of rack bays // -rack_bays = 1; //[1:4] +rack_width = 19; //[10,19] +// size of rack mount cases 1U or 2U // +rack_size = "1u"; //["1u", "2u"] // enable rack io plate opening for sbc Rack_Bay1 = "empty"; // ["empty", "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"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] rack_bay1_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay1_wall = false; // [true,false] + Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] rack_bay2_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay2_wall = false; // [true,false] + Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] rack_bay3_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay3_wall = false; // [true,false] + Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] rack_bay4_face = "io_shield"; //["none","blank","io_shield","vent_hex"] rack_bay4_wall = false; // [true,false] +Rack_Bay5 = "empty"; // ["empty", "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"] +rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] +rack_bay5_rotation = 0; // [0:90:270] +rack_bay5_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay5_wall = false; // [true,false] + +Rack_Bay6 = "empty"; // ["empty", "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"] +rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] +rack_bay6_rotation = 0; // [0:90:270] +rack_bay6_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay6_wall = false; // [true,false] + /* [3D Case Adjustments] */ // sbc location x axis pcb_loc_x = 0; //[0:.01:300] @@ -419,7 +432,7 @@ width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+ 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; 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)) : case_design == "rack" ? 44.45+floorthick : 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 == "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 : @@ -509,11 +522,11 @@ 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_bay_xyz_loc = [rack_bay1_xyz_loc, rack_bay2_xyz_loc, rack_bay3_xyz_loc, rack_bay4_xyz_loc]; -rack_bay_rotation = [rack_bay1_rotation, rack_bay2_rotation, rack_bay3_rotation, rack_bay4_rotation]; -rack_bay_face = [rack_bay1_face, rack_bay2_face, rack_bay3_face, rack_bay4_face]; -rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall]; +rack_bay_sbc = [Rack_Bay1,Rack_Bay2,Rack_Bay3,Rack_Bay4,Rack_Bay5,Rack_Bay6]; +rack_bay_xyz_loc = [rack_bay1_xyz_loc, rack_bay2_xyz_loc, rack_bay3_xyz_loc, rack_bay4_xyz_loc, rack_bay5_xyz_loc, rack_bay6_xyz_loc]; +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, rack_bay6_wall]; adj = .01; $fn=90; @@ -1088,7 +1101,7 @@ if (view == "model") { } } if(sbc_off == false) { - for(i = [0:3]) { + for(i = [0:len(rack_bay_sbc)-1]) { s = search([rack_bay_sbc[i]],sbc_data); pcb_loc_z = rack_bay_xyz_loc[i][2]; pcb_id = sbc_data[s[0]][4]; From b6554114ec7007068a869980d020cb7e5db3e4e5 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 4 May 2025 19:23:45 -0400 Subject: [PATCH 06/27] additional rack sizes 1u+, 1u++ and gui additions for wall, fan and conduit --- lib/rack.scad | 2 +- mod/case_rack.scad | 3 ++- sbc_case_builder.json | 24 ++++++++++++++++++------ sbc_case_builder.scad | 28 ++++++++++++++++++++-------- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/lib/rack.scad b/lib/rack.scad index 52a9b94..60f1bbf 100644 --- a/lib/rack.scad +++ b/lib/rack.scad @@ -35,7 +35,7 @@ module rack_end_bracket(side, size, thick) { - depth = size == "1u" ? 44.45 : size == "2u" ? 2*44.45 : size == "3u" ? 3*44.45 : 4*44.45; + 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; diff --git a/mod/case_rack.scad b/mod/case_rack.scad index cdd501c..557dd38 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -55,7 +55,8 @@ if(side == "bottom") { // bay divider walls for(r = [0:len(rack_bay_sbc)-1]) { if(rack_bay_wall[r] == true) { - translate([-gap-wallthick+75*(r+1),-gap-wallthick-adj,0]) cube([wallthick-1,depth,case_z-floorthick]); + translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1),-gap-wallthick-adj,0]) + cube([wallthick-1,depth,case_z-2*floorthick]); } } // case upper panel clamps diff --git a/sbc_case_builder.json b/sbc_case_builder.json index e1986d4..5d55745 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11048,29 +11048,41 @@ "pcb_loc_y": "0", "pcb_loc_z": "0", "rack_bay1_face": "io_shield", + "rack_bay1_rear_conduit": "false", + "rack_bay1_rear_fan": "false", "rack_bay1_rotation": "270", "rack_bay1_wall": "true", - "rack_bay1_xyz_loc": "[15, 0, 0]", + "rack_bay1_xyz_loc": "[13, 0, 0]", "rack_bay2_face": "io_shield", + "rack_bay2_rear_conduit": "false", + "rack_bay2_rear_fan": "false", "rack_bay2_rotation": "270", "rack_bay2_wall": "true", - "rack_bay2_xyz_loc": "[90, 0, 0]", + "rack_bay2_xyz_loc": "[88, 0, 0]", "rack_bay3_face": "io_shield", + "rack_bay3_rear_conduit": "false", + "rack_bay3_rear_fan": "false", "rack_bay3_rotation": "270", "rack_bay3_wall": "true", - "rack_bay3_xyz_loc": "[161, 0, 0]", + "rack_bay3_xyz_loc": "[162.5, 0, 0]", "rack_bay4_face": "io_shield", + "rack_bay4_rear_conduit": "false", + "rack_bay4_rear_fan": "false", "rack_bay4_rotation": "270", "rack_bay4_wall": "true", - "rack_bay4_xyz_loc": "[232, 0, 0]", + "rack_bay4_xyz_loc": "[237.5, 0, 0]", "rack_bay5_face": "io_shield", + "rack_bay5_rear_conduit": "false", + "rack_bay5_rear_fan": "false", "rack_bay5_rotation": "270", "rack_bay5_wall": "true", - "rack_bay5_xyz_loc": "[303, 0, 0]", + "rack_bay5_xyz_loc": "[313, 0, 0]", "rack_bay6_face": "io_shield", + "rack_bay6_rear_conduit": "false", + "rack_bay6_rear_fan": "false", "rack_bay6_rotation": "270", "rack_bay6_wall": "false", - "rack_bay6_xyz_loc": "[374, 0, 0]", + "rack_bay6_xyz_loc": "[385, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index d93ba75..2b48a26 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -77,43 +77,55 @@ rear_io_shield = false; // size of rack 10" or 19" // rack_width = 19; //[10,19] // size of rack mount cases 1U or 2U // -rack_size = "1u"; //["1u", "2u"] +rack_size = "1u"; //["1u","1u+","1u++","2u"] // enable rack io plate opening for sbc Rack_Bay1 = "empty"; // ["empty", "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"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] -rack_bay1_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay1_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] rack_bay1_wall = false; // [true,false] +rack_bay1_rear_fan = false; //[true,false] +rack_bay1_rear_conduit = false; //[true,false] Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] -rack_bay2_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay2_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] rack_bay2_wall = false; // [true,false] +rack_bay2_rear_fan = false; //[true,false] +rack_bay2_rear_conduit = false; //[true,false] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] -rack_bay3_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay3_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] rack_bay3_wall = false; // [true,false] +rack_bay3_rear_fan = false; //[true,false] +rack_bay3_rear_conduit = false; //[true,false] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] -rack_bay4_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay4_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] rack_bay4_wall = false; // [true,false] +rack_bay4_rear_fan = false; //[true,false] +rack_bay4_rear_conduit = false; //[true,false] Rack_Bay5 = "empty"; // ["empty", "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"] rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay5_rotation = 0; // [0:90:270] -rack_bay5_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay5_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] rack_bay5_wall = false; // [true,false] +rack_bay5_rear_fan = false; //[true,false] +rack_bay5_rear_conduit = false; //[true,false] Rack_Bay6 = "empty"; // ["empty", "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"] rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] -rack_bay6_face = "io_shield"; //["none","blank","io_shield","vent_hex"] +rack_bay6_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] rack_bay6_wall = false; // [true,false] +rack_bay6_rear_fan = false; //[true,false] +rack_bay6_rear_conduit = false; //[true,false] /* [3D Case Adjustments] */ // sbc location x axis @@ -432,7 +444,7 @@ width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+ 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; 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)) : case_design == "rack" && rack_size == "1u" ? 44.45+floorthick : case_design == "rack" && rack_size == "2u" ? 88.90+floorthick : 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 : From 63ea4bae0b5d55f4257e57faede336e87f901875 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Mon, 5 May 2025 20:43:15 -0400 Subject: [PATCH 07/27] plumbed wall, fan and conduit for 6 rack bays --- lib/grommet.scad | 109 ++++++++++++++++++++++++++++++++++ lib/panel_clamp.scad | 3 +- mod/case_rack.scad | 16 +++++ sbc_case_builder.json | 31 +++++----- sbc_case_builder.scad | 23 ++++++- sbc_case_builder_library.scad | 1 + 6 files changed, 164 insertions(+), 19 deletions(-) create mode 100644 lib/grommet.scad diff --git a/lib/grommet.scad b/lib/grommet.scad new file mode 100644 index 0000000..9477340 --- /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, height) + +*/ + + +/* + NAME: grommet + DESCRIPTION: creates different groumet styles + TODO: none + + USAGE: grommet(face, style, od, id, wall, assembly, mask) + + face = "top","bottom","front","rear","left","right" + style = "sleeve" + size[0] = od outside diameter of grommet body + size[1] = id inside hole diameter of grommet body + size[2] = wall thickness of installation + assembly = 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 index 5c673dd..930b355 100644 --- a/lib/panel_clamp.scad +++ b/lib/panel_clamp.scad @@ -38,9 +38,10 @@ module panel_clamp(face, screw, style, dia_x, dia_y, height, mask) { rotz = face == "left" ? 90 : face == "right" ? 270 : 0; if(enablemask == true && mstyle == "default") { + } if(enablemask == false) { - translate([0,0,0]) rotate([rotx,roty,rotz]) { + rotate([rotx,roty,rotz]) { difference() { cylinder(d2=dia_x, d1=dia_y, h=height); if(screw == "m2") { diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 557dd38..13191c9 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -644,6 +644,22 @@ if(side == "bottom") { } } } + // rear fan openings + for(r = [0:len(rack_bay_sbc)-1]) { + 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 + for(r = [0:len(rack_bay_sbc)-1]) { + grommet_offset = -75+11; + if(rack_bay_rear_conduit[r] == true) { + 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"]); + } + } // subtractive accessories if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 5d55745..c0d0f99 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10919,7 +10919,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "40", + "case_offset_y": "50", "cooling": "default", "corner_fillet": "3", "edge_fillet": "0", @@ -11048,50 +11048,49 @@ "pcb_loc_y": "0", "pcb_loc_z": "0", "rack_bay1_face": "io_shield", - "rack_bay1_rear_conduit": "false", - "rack_bay1_rear_fan": "false", + "rack_bay1_rear_conduit": "true", + "rack_bay1_rear_fan": "true", "rack_bay1_rotation": "270", "rack_bay1_wall": "true", "rack_bay1_xyz_loc": "[13, 0, 0]", "rack_bay2_face": "io_shield", - "rack_bay2_rear_conduit": "false", - "rack_bay2_rear_fan": "false", + "rack_bay2_rear_conduit": "true", + "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "270", "rack_bay2_wall": "true", "rack_bay2_xyz_loc": "[88, 0, 0]", "rack_bay3_face": "io_shield", - "rack_bay3_rear_conduit": "false", - "rack_bay3_rear_fan": "false", + "rack_bay3_rear_conduit": "true", + "rack_bay3_rear_fan": "true", "rack_bay3_rotation": "270", "rack_bay3_wall": "true", "rack_bay3_xyz_loc": "[162.5, 0, 0]", "rack_bay4_face": "io_shield", - "rack_bay4_rear_conduit": "false", - "rack_bay4_rear_fan": "false", + "rack_bay4_rear_conduit": "true", + "rack_bay4_rear_fan": "true", "rack_bay4_rotation": "270", "rack_bay4_wall": "true", "rack_bay4_xyz_loc": "[237.5, 0, 0]", "rack_bay5_face": "io_shield", - "rack_bay5_rear_conduit": "false", - "rack_bay5_rear_fan": "false", + "rack_bay5_rear_conduit": "true", + "rack_bay5_rear_fan": "true", "rack_bay5_rotation": "270", "rack_bay5_wall": "true", "rack_bay5_xyz_loc": "[313, 0, 0]", "rack_bay6_face": "io_shield", - "rack_bay6_rear_conduit": "false", - "rack_bay6_rear_fan": "false", + "rack_bay6_rear_conduit": "true", + "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", - "rack_bay6_wall": "false", "rack_bay6_xyz_loc": "[385, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", - "rear_cooling": "fan_hex", + "rear_cooling": "fan_1", "rear_dualfan_spacing": "6", "rear_fan": "1", "rear_fan_center": "false", "rear_fan_position": "0", - "rear_fan_size": "80", + "rear_fan_size": "40", "rear_io_shield": "false", "sbc_bottom_standoffs": "true", "sbc_highlight": "false", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 2b48a26..61cc336 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -123,7 +123,7 @@ Rack_Bay6 = "empty"; // ["empty", "c1+", "c2", "c4", "hc4", "xu4", "xu4q", "mc1 rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] rack_bay6_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] -rack_bay6_wall = false; // [true,false] +//rack_bay6_wall = false; // [true,false] rack_bay6_rear_fan = false; //[true,false] rack_bay6_rear_conduit = false; //[true,false] @@ -538,7 +538,9 @@ rack_bay_sbc = [Rack_Bay1,Rack_Bay2,Rack_Bay3,Rack_Bay4,Rack_Bay5,Rack_Bay6]; rack_bay_xyz_loc = [rack_bay1_xyz_loc, rack_bay2_xyz_loc, rack_bay3_xyz_loc, rack_bay4_xyz_loc, rack_bay5_xyz_loc, rack_bay6_xyz_loc]; 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, rack_bay6_wall]; +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]; adj = .01; $fn=90; @@ -1112,6 +1114,23 @@ if (view == "model") { } } } + // rear fan covers + for(r = [0:len(rack_bay_sbc)-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, + depth-gap,(case_z-rear_fan_size)/2]) + rotate([90,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] == true) { + 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(sbc_off == false) { for(i = [0:len(rack_bay_sbc)-1]) { s = search([rack_bay_sbc[i]],sbc_data); diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index 484aa8f..e241e2d 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -45,6 +45,7 @@ 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>; From 5b03cd94fc313292de863fc5862a9b0dbec8217a Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Tue, 6 May 2025 17:11:43 -0400 Subject: [PATCH 08/27] more rack bay work, fixes and code cleanup --- mod/case_rack.scad | 667 +++++++++++++++++++++--------------------- sbc_case_builder.json | 6 +- sbc_case_builder.scad | 55 ++-- 3 files changed, 380 insertions(+), 348 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 13191c9..55384a0 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -17,7 +17,7 @@ NAME: case_rack - DESCRIPTION: creates a U1-U4 rack case + DESCRIPTION: creates a 1u-2u rack case TODO: none USAGE: case_rack(case_design,side) @@ -177,106 +177,110 @@ if(side == "bottom") { cylinder(d=4*2/sqrt(3), h=2); for(r = [0:len(rack_bay_sbc)-1]) { - 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]; + if(rack_bay_sbc[r] != "empty") { + 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]; - translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { - // pcb standoff holes - if(sbc_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { - 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_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]; - 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)); - } - 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)); - } - 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)); - } - 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)); - } - - } - } - // multi-pcb standoff holes - if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { - 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") { + translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { + // pcb standoff holes + if(sbc_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { for (i=[1:11:len(sbc_data[s[0]])-2]) { - pcbclass = sbc_data[s[0]][i+1]; - pcbtype = sbc_data[s[0]][i+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]+pcbloc_x; - pcbhole_y = sbc_data[s[0]][i+5]+pcbloc_y; + 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_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")) { + + 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=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")) { + 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=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")) { + 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=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")) { + 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=multipcb_bottom_standoff[4]-.2, h=floorthick+(2*adj)); + cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj)); + } + + } + } + // multi-pcb standoff holes + if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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)); + } + } } } } } - } - } - } } + } + } + } // extended standoff holes if(ext_bottom_standoffs == true) { // right-rear standoff @@ -345,212 +349,216 @@ if(side == "bottom") { } } for(r = [0:len(rack_bay_sbc)-1]) { - 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]; + if(rack_bay_sbc[r] != "empty") { + 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]; - translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { - // primary pcb standoffs - if(sbc_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { - 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_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]; - 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_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]]; - translate([pcbhole_x,pcbhole_y,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_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]]; - translate([pcbhole_x,pcbhole_y,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_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]]; - translate([pcbhole_x,pcbhole_y,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_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]]; - translate([pcbhole_x,pcbhole_y,0]) - standoff(pcb_standoff,[false,10,2,"default"]); + translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) 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]; + + 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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,0]) + standoff(pcb_standoff,[false,10,2,"default"]); + } + } } } - } - } - // multi-pcb standoffs - if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { - 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") { + // multi-pcb standoffs + if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { 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]; + 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"]); + 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"]); + } + } } } } } } } - } } + } // extended standoffs if(ext_bottom_standoffs == true) { // extended right-rear standoff @@ -722,60 +730,63 @@ if(side == "bottom") { } } for(i = [0:len(rack_bay_sbc)-1]) { - 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_color = sbc_data[s[0]][11][1]; - pcb_radius = sbc_data[s[0]][11][0]; + if(rack_bay_sbc[i] != "empty") { + 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_color = sbc_data[s[0]][11][1]; + pcb_radius = sbc_data[s[0]][11][0]; - 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]; + 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]; - // sbc openings - if(sbc_highlight == true && rack_bay_sbc[i] != "empty") { - #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); - } - if(sbc_highlight != true && rack_bay_sbc[i] != "empty") { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); - } - // indents - if(indents == 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]) { - class = sbc_data[s[0]][i+1]; - type = sbc_data[s[0]][i+2]; - id = sbc_data[s[0]][i+3]; - loc_x = sbc_data[s[0]][i+4]+pcb_loc_x+pcbloc_x; - loc_y = sbc_data[s[0]][i+5]+pcb_loc_y+pcbloc_y; - loc_z = sbc_data[s[0]][i+6]+pcb_loc_z+pcbloc_z; - side = sbc_data[s[0]][i+7]; - rotation = sbc_data[s[0]][i+8]; - if(id == pcbid) { - indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + // sbc openings + if(sbc_highlight == true && rack_bay_sbc[i] != "empty") { + #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); + } + if(sbc_highlight != true && rack_bay_sbc[i] != "empty") { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); + } +/* // indents + if(indents == 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]) { + class = sbc_data[s[0]][i+1]; + type = sbc_data[s[0]][i+2]; + id = sbc_data[s[0]][i+3]; + loc_x = sbc_data[s[0]][i+4]+pcb_loc_x+pcbloc_x; + loc_y = sbc_data[s[0]][i+5]+pcb_loc_y+pcbloc_y; + loc_z = sbc_data[s[0]][i+6]+pcb_loc_z+pcbloc_z; + side = sbc_data[s[0]][i+7]; + rotation = sbc_data[s[0]][i+8]; + if(id == pcbid) { + indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + } } } } } - } - // case divide - translate([150-gap-wallthick,-gap-wallthick,-adj]) cube([rack_asm_gap,depth,case_z+2*adj]); - translate([300-gap-wallthick,-gap-wallthick,-adj]) cube([rack_asm_gap,depth,case_z+2*adj]); +*/ + // 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") { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index c0d0f99..c5991cc 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11081,7 +11081,7 @@ "rack_bay6_rear_conduit": "true", "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", - "rack_bay6_xyz_loc": "[385, 0, 0]", + "rack_bay6_xyz_loc": "[383, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", @@ -11097,7 +11097,7 @@ "sbc_information": "false", "sbc_model": "c4", "sbc_off": "false", - "sbc_top_standoffs": "true", + "sbc_top_standoffs": "false", "section_part": "false", "sidethick": "5", "standard_motherboard_thickness": "0", @@ -11129,7 +11129,7 @@ "top_standoff_support_height": "4", "top_standoff_support_size": "10", "top_standoff_type": "blind", - "uart_opening": "default", + "uart_opening": "none", "view": "model", "wallthick": "3" } diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 61cc336..8cdd34e 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -123,7 +123,6 @@ Rack_Bay6 = "empty"; // ["empty", "c1+", "c2", "c4", "hc4", "xu4", "xu4q", "mc1 rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] rack_bay6_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] -//rack_bay6_wall = false; // [true,false] rack_bay6_rear_fan = false; //[true,false] rack_bay6_rear_conduit = false; //[true,false] @@ -601,6 +600,26 @@ 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"); + // rear fan covers + for(r = [0:len(rack_bay_sbc)-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, + depth+10,(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] == true) { + translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,depth+30,0]) + color("lightgrey") grommet("bottom", "sleeve", 10, r+2, wallthick, true, [false,10,0,"default"]); + } + } + } 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(); @@ -1133,23 +1152,25 @@ if (view == "model") { } if(sbc_off == false) { for(i = [0:len(rack_bay_sbc)-1]) { - s = search([rack_bay_sbc[i]],sbc_data); - pcb_loc_z = rack_bay_xyz_loc[i][2]; - 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[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]; if(rack_bay_sbc[i] != "empty") { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) - rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); + s = search([rack_bay_sbc[i]],sbc_data); + pcb_loc_z = rack_bay_xyz_loc[i][2]; + 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[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]; + if(rack_bay_sbc[i] != "empty") { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); + } } } } From c09d444913bdf911d5876c9bf69e2b950768c915 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 7 May 2025 15:36:18 -0400 Subject: [PATCH 09/27] adjusted 2mm panel_clamps, implemented bottom cover and front vents --- lib/panel_clamp.scad | 10 +- mod/case_rack.scad | 217 ++++++++++++++++++++++++------------------ sbc_case_builder.json | 12 +-- sbc_case_builder.scad | 12 +-- 4 files changed, 142 insertions(+), 109 deletions(-) diff --git a/lib/panel_clamp.scad b/lib/panel_clamp.scad index 930b355..9519b30 100644 --- a/lib/panel_clamp.scad +++ b/lib/panel_clamp.scad @@ -38,18 +38,20 @@ module panel_clamp(face, screw, style, dia_x, dia_y, height, mask) { rotz = face == "left" ? 90 : face == "right" ? 270 : 0; if(enablemask == true && mstyle == "default") { - + rotate([rotx,roty,rotz]) { + cylinder(d=dia_y, h=height); + } } 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, 3]) rotate([0,90,0]) + 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, 3]) rotate([0,90,0]) + 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, 3]) rotate([0,90,0]) + 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") { diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 55384a0..3faa572 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -30,80 +30,94 @@ rack_asm_gap = .25; rack_asm_size = 5; rack_asm_hole = 2.25; -if(side == "bottom") { +if(case_design == "rack" && side == "bottom") { difference() { union() { difference() { union() { - if(case_design == "rack") { - 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], + 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); - 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); - } - // rack ears - 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); + // case floor panel clamp holes + translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) + panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) + panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - // 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([wallthick-1,depth,case_z-2*floorthick]); - } - } - // case upper panel clamps - translate([150-gap-wallthick,-gap-adj-.5,case_z-13]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,-gap-adj-.5,case_z-13]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj+.5, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj+.5, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + // case upper panel clamp holes + translate([150-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + translate([300-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - // case floor panel clamps - translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj]) - panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj]) - panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - - // case lower assembly blocks - // 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 right - left side - translate([300-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]); - // rear right - right - translate([300-gap-wallthick+rack_asm_gap,-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 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]); - // 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]); - // 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]); } + // 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([wallthick-1,depth,case_z-2*floorthick]); + } + } + // case upper panel clamps + translate([150-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) + panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + + // case lower assembly blocks + // 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 right - left side + translate([300-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]); + // rear right - right + translate([300-gap-wallthick+rack_asm_gap,-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 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]); + // 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]); + // 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]); // additive accessories if(accessory_name != "none") { @@ -121,7 +135,8 @@ if(side == "bottom") { 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]]); + parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric, + size, data, [false,mask[1],mask[2],mask[3]]); } } } @@ -175,7 +190,7 @@ if(side == "bottom") { 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); - + // pcb and multi-pcb standoff holes for(r = [0:len(rack_bay_sbc)-1]) { if(rack_bay_sbc[r] != "empty") { s = search([rack_bay_sbc[r]],sbc_data); @@ -188,13 +203,15 @@ if(side == "bottom") { 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_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]; translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { // pcb standoff holes - if(sbc_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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]; @@ -229,7 +246,7 @@ if(side == "bottom") { } } // multi-pcb standoff holes - if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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]; @@ -324,30 +341,42 @@ if(side == "bottom") { } } // bottom cover pattern - if(bottom_cover_pattern != "solid") { - if(bottom_cover_pattern == "hex_5mm") { - translate([1,0,-floorthick+adj]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); - } - if(bottom_cover_pattern == "hex_8mm") { - translate([1,2,-floorthick+adj]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); - } - if(bottom_cover_pattern == "linear_vertical") { - translate([0,-gap,-floorthick+adj]) - vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); - } - if(bottom_cover_pattern == "linear_horizontal") { - translate([-gap,-gap,-floorthick+adj]) - vent(width-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); - } - if(bottom_cover_pattern == "astroid") { - for(c=[3:12:depth-8]) { - for(r=[4:12:width-8]) { - translate([r,c,-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + for(r = [0:len(rack_bay_sbc)-1]) { + if(bottom_cover_pattern != "solid") { + if(bottom_cover_pattern == "hex_5mm") { + translate([rack_bay_xyz_loc[r][0]+25,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([rack_bay_xyz_loc[r][0]+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([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + vent(2,12,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,12,floorthick+4,1,1,9,"horizontal"); + } + if(bottom_cover_pattern == "linear_horizontal") { + translate([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + vent(35-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/6,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]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + } } } } + // 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"); + } } } + // pcb and multi-pcb standoffs for(r = [0:len(rack_bay_sbc)-1]) { if(rack_bay_sbc[r] != "empty") { s = search([rack_bay_sbc[r]],sbc_data); @@ -360,8 +389,10 @@ if(side == "bottom") { 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_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]; translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index c5991cc..e225ba6 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11047,37 +11047,37 @@ "pcb_loc_x": "0", "pcb_loc_y": "0", "pcb_loc_z": "0", - "rack_bay1_face": "io_shield", + "rack_bay1_face": "vent", "rack_bay1_rear_conduit": "true", "rack_bay1_rear_fan": "true", "rack_bay1_rotation": "270", "rack_bay1_wall": "true", "rack_bay1_xyz_loc": "[13, 0, 0]", - "rack_bay2_face": "io_shield", + "rack_bay2_face": "vent", "rack_bay2_rear_conduit": "true", "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "270", "rack_bay2_wall": "true", "rack_bay2_xyz_loc": "[88, 0, 0]", - "rack_bay3_face": "io_shield", + "rack_bay3_face": "vent", "rack_bay3_rear_conduit": "true", "rack_bay3_rear_fan": "true", "rack_bay3_rotation": "270", "rack_bay3_wall": "true", "rack_bay3_xyz_loc": "[162.5, 0, 0]", - "rack_bay4_face": "io_shield", + "rack_bay4_face": "vent", "rack_bay4_rear_conduit": "true", "rack_bay4_rear_fan": "true", "rack_bay4_rotation": "270", "rack_bay4_wall": "true", "rack_bay4_xyz_loc": "[237.5, 0, 0]", - "rack_bay5_face": "io_shield", + "rack_bay5_face": "vent", "rack_bay5_rear_conduit": "true", "rack_bay5_rear_fan": "true", "rack_bay5_rotation": "270", "rack_bay5_wall": "true", "rack_bay5_xyz_loc": "[313, 0, 0]", - "rack_bay6_face": "io_shield", + "rack_bay6_face": "vent", "rack_bay6_rear_conduit": "true", "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 8cdd34e..c5a1a62 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -82,7 +82,7 @@ rack_size = "1u"; //["1u","1u+","1u++","2u"] Rack_Bay1 = "empty"; // ["empty", "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"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] -rack_bay1_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] +rack_bay1_face = "vent"; //["solid","blank","io_shield","vent"] rack_bay1_wall = false; // [true,false] rack_bay1_rear_fan = false; //[true,false] rack_bay1_rear_conduit = false; //[true,false] @@ -90,7 +90,7 @@ rack_bay1_rear_conduit = false; //[true,false] Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] -rack_bay2_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] +rack_bay2_face = "vent"; //["solid","blank","io_shield","vent"] rack_bay2_wall = false; // [true,false] rack_bay2_rear_fan = false; //[true,false] rack_bay2_rear_conduit = false; //[true,false] @@ -98,7 +98,7 @@ rack_bay2_rear_conduit = false; //[true,false] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] -rack_bay3_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] +rack_bay3_face = "vent"; //["solid","blank","io_shield","vent"] rack_bay3_wall = false; // [true,false] rack_bay3_rear_fan = false; //[true,false] rack_bay3_rear_conduit = false; //[true,false] @@ -106,7 +106,7 @@ rack_bay3_rear_conduit = false; //[true,false] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] -rack_bay4_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] +rack_bay4_face = "vent"; //["solid","blank","io_shield","vent"] rack_bay4_wall = false; // [true,false] rack_bay4_rear_fan = false; //[true,false] rack_bay4_rear_conduit = false; //[true,false] @@ -114,7 +114,7 @@ rack_bay4_rear_conduit = false; //[true,false] Rack_Bay5 = "empty"; // ["empty", "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"] rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay5_rotation = 0; // [0:90:270] -rack_bay5_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] +rack_bay5_face = "vent"; //["solid","blank","io_shield","vent"] rack_bay5_wall = false; // [true,false] rack_bay5_rear_fan = false; //[true,false] rack_bay5_rear_conduit = false; //[true,false] @@ -122,7 +122,7 @@ rack_bay5_rear_conduit = false; //[true,false] Rack_Bay6 = "empty"; // ["empty", "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"] rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] -rack_bay6_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] +rack_bay6_face = "vent"; //["solid","blank","io_shield","vent"] rack_bay6_rear_fan = false; //[true,false] rack_bay6_rear_conduit = false; //[true,false] From 9f11e2884eb29b9002549a36d5f5623c12f98c36 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 7 May 2025 17:31:29 -0400 Subject: [PATCH 10/27] support for 10 inch racks and changed rack tabs to standard width --- lib/rack.scad | 7 +- mod/case_rack.scad | 63 +++++----- sbc_case_builder.json | 263 +++++++++++++++++++++++++++++++++++++++++- sbc_case_builder.scad | 2 +- 4 files changed, 304 insertions(+), 31 deletions(-) diff --git a/lib/rack.scad b/lib/rack.scad index 60f1bbf..9d20083 100644 --- a/lib/rack.scad +++ b/lib/rack.scad @@ -33,13 +33,14 @@ */ + 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 = 25; + tab_width = 15.875+thick; b_width = thick; b_depth = depth; b_height = 25; @@ -60,7 +61,7 @@ module rack_end_bracket(side, size, thick) { 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([-15,c,-adjust]) slot(rack_hole,3,thick+(adjust*2)); + translate([(3-thick)-9-(15.875-9)/2,c,-adjust]) slot(rack_hole,3,thick+(adjust*2)); } } } @@ -76,7 +77,7 @@ module rack_end_bracket(side, size, thick) { 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([-15,c,-adjust]) slot(rack_hole,3,thick+(adjust*2)); + translate([(3-thick)-9-(15.875-9)/2,c,-adjust]) slot(rack_hole,3,thick+(adjust*2)); } } } diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 3faa572..e13bb69 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -47,18 +47,21 @@ if(case_design == "rack" && side == "bottom") { // case floor panel clamp holes translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) - panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - + if(rack_width == 19) { + translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) + panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + } // case upper panel clamp holes translate([150-gap-wallthick,-gap-adj,case_z-13]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - translate([300-gap-wallthick,-gap-adj,case_z-13]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + if(rack_width == 19) { + translate([300-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + } } // rack mounting tabs @@ -77,47 +80,55 @@ if(case_design == "rack" && side == "bottom") { // case upper panel clamps translate([150-gap-wallthick,-gap-adj,case_z-13]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,-gap-adj,case_z-13]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + if(rack_width == 19) { + translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) - panel_clamp("bottom", "m2", "sloped", 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + } // case lower assembly blocks // 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 right - left side - translate([300-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]); - // rear right - right - translate([300-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 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]); // 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]); - // 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]); + 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]); + } // additive accessories if(accessory_name != "none") { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index e225ba6..06787f0 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10872,7 +10872,268 @@ "view": "model", "wallthick": "2" }, - "c4_rack_1u": { + "c4_rack10-1u": { + "$fn": "90", + "Rack_Bay1": "c4", + "Rack_Bay2": "c4", + "Rack_Bay3": "c4", + "Rack_Bay4": "empty", + "Rack_Bay5": "empty", + "Rack_Bay6": "empty", + "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": "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": "true", + "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": "true", + "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": "true", + "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": "3" + }, + "c4_rack19-1u": { "$fn": "90", "Rack_Bay1": "c4", "Rack_Bay2": "c4", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index c5a1a62..2b67a6f 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -439,7 +439,7 @@ 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 : case_design == "rack" ? 450 : pcb_width+(2*(wallthick+gap))+case_offset_x; +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 : 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; From 93b4de04449e679d3fe459250d324319f0cf7ce9 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 7 May 2025 20:38:20 -0400 Subject: [PATCH 11/27] rack case added to individual part selection as left, bottom, right --- mod/case_rack.scad | 1 + sbc_case_builder.scad | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index e13bb69..b8de776 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -201,6 +201,7 @@ if(case_design == "rack" && side == "bottom") { 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); + // pcb and multi-pcb standoff holes for(r = [0:len(rack_bay_sbc)-1]) { if(rack_bay_sbc[r] != "empty") { diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 2b67a6f..93b76ad 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -1285,8 +1285,17 @@ if (view == "part") { 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); } + if(case_design == "rack" && rack_width == 19) { + 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 == "rack" && rack_width == 10) { + } else { - if(section_part == false) { + if(section_part == false) { case_bottom(case_design); } else { @@ -1331,6 +1340,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") { @@ -1348,6 +1369,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") { From cd05ff7528f4a441a29bcf6d12201c2cad944659 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 8 May 2025 15:52:28 -0400 Subject: [PATCH 12/27] view accessory part added for rack cases --- lib/grommet.scad | 2 +- sbc_case_builder.scad | 30 +++++++++++++++++++++++++++++- tolerance_check.scad | 20 -------------------- 3 files changed, 30 insertions(+), 22 deletions(-) delete mode 100644 tolerance_check.scad diff --git a/lib/grommet.scad b/lib/grommet.scad index 9477340..e00c3b1 100644 --- a/lib/grommet.scad +++ b/lib/grommet.scad @@ -16,7 +16,7 @@ Code released under GPLv3: http://www.gnu.org/licenses/gpl.html grommet(face, style, od, id, wall, assembly, mask) - grommet_clip(style, od, id, height) + grommet_clip(style, od, id, wall) */ diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 93b76ad..4b5ef3f 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -1387,7 +1387,35 @@ 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 + for(r = [0:len(rack_bay_sbc)-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] == true) { + 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); + } + } + } + // 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/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); - From c3ec2837ed5e56a836cafdc7f428bfd1f90419f8 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 8 May 2025 16:25:11 -0400 Subject: [PATCH 13/27] setup screw mask for panel_clamp and used mask for rack case --- lib/panel_clamp.scad | 38 ++++++++++++++++++++++++++++++++++++-- mod/case_rack.scad | 18 ++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/panel_clamp.scad b/lib/panel_clamp.scad index 9519b30..50f6957 100644 --- a/lib/panel_clamp.scad +++ b/lib/panel_clamp.scad @@ -37,9 +37,43 @@ module panel_clamp(face, screw, style, dia_x, dia_y, height, mask) { roty = 0; rotz = face == "left" ? 90 : face == "right" ? 270 : 0; - if(enablemask == true && mstyle == "default") { + if(enablemask == true) { rotate([rotx,roty,rotz]) { - cylinder(d=dia_y, h=height); + 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) { diff --git a/mod/case_rack.scad b/mod/case_rack.scad index b8de776..b9ca38d 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -387,6 +387,24 @@ if(case_design == "rack" && side == "bottom") { vent(2,10,wallthick+4,2,1,9,"vertical"); } } + // case floor panel clamp holes + translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) + panel_clamp("bottom", "m2", "sloped", 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", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + } + // case upper panel clamp holes + translate([150-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + if(rack_width == 19) { + translate([300-gap-wallthick,-gap-adj,case_z-13]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, + case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + } } // pcb and multi-pcb standoffs for(r = [0:len(rack_bay_sbc)-1]) { From 0aff56b70c4e4b9f2eedcb90e2bc9831ef91d0ce Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 9 May 2025 21:57:13 -0400 Subject: [PATCH 14/27] individual bay open front or adjoining combinations based on disabled bay wall and empty adjoining bay --- mod/case_rack.scad | 81 +++++++++++++++++++++++++++---------------- sbc_case_builder.json | 2 +- sbc_case_builder.scad | 20 +++++++---- 3 files changed, 66 insertions(+), 37 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index b9ca38d..d1ce996 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -204,7 +204,7 @@ if(case_design == "rack" && side == "bottom") { // pcb and multi-pcb standoff holes for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty") { + if(rack_bay_sbc[r] != "empty" && 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]; @@ -308,7 +308,7 @@ if(case_design == "rack" && side == "bottom") { } } } - } + } } // extended standoff holes if(ext_bottom_standoffs == true) { @@ -381,11 +381,6 @@ if(case_design == "rack" && side == "bottom") { } } } - // 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"); - } } // case floor panel clamp holes translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) @@ -408,7 +403,7 @@ if(case_design == "rack" && side == "bottom") { } // pcb and multi-pcb standoffs for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty") { + if(rack_bay_sbc[r] != "empty" && 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]; @@ -515,7 +510,7 @@ if(case_design == "rack" && side == "bottom") { } } // multi-pcb standoffs - if(multipcb_bottom_standoffs == true && rack_bay_sbc[r] != "empty") { + 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]; @@ -713,21 +708,49 @@ if(case_design == "rack" && side == "bottom") { } } } - // rear fan openings + // 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"); + 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 - for(r = [0:len(rack_bay_sbc)-1]) { + // rear grommet openings grommet_offset = -75+11; if(rack_bay_rear_conduit[r] == true) { 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"]); } + // 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") { + baysize = (450-(2*wallthick))/6; + open_offset = r == 0 && rack_bay_wall[r] == true ? wallthick+gap+1 : + r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick+gap+1 : + r >= 1 && r < 5 && rack_bay_wall[r] == true ? 3 : + r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick-1 : + r == 5 ? 3 : + r == 2 && rack_width == 10 ? 3 : 3; + open_size = r == 0 && rack_bay_wall[r] == true ? 75-wallthick-gap-3 : + r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? 75-wallthick-gap-3+baysize : + 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] == "empty" && + r != 2 && rack_width == 10 ? 75-wallthick-gap-3+baysize : + r == 5 ? 75-wallthick-gap-3 : + r == 2 && rack_width == 10 ? 66 : 73; + + translate([open_offset-wallthick-gap+rack_asm_gap/2+75*(r+1)-75,-wallthick-gap-adj,floorthick+case_z+6]) + rotate([270,0,0]) slab([open_size,case_z,2*wallthick+15],6); + +#translate([-gap-wallthick+(75*(r+1))-75,-10-r,0]) rotate([0,90,0]) cylinder(d=1, h=75); + } +#translate([-gap-wallthick,0,case_z]) rotate([0,90,0]) cylinder(d=1, h=450); } // subtractive accessories if(accessory_name != "none") { @@ -790,9 +813,9 @@ if(case_design == "rack" && side == "bottom") { access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); } } - for(i = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[i] != "empty") { - s = search([rack_bay_sbc[i]],sbc_data); + for(r = [0:len(rack_bay_sbc)-1]) { + if(rack_bay_sbc[r] != "empty") { + 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]; @@ -802,20 +825,20 @@ if(case_design == "rack" && side == "bottom") { pcb_color = sbc_data[s[0]][11][1]; pcb_radius = sbc_data[s[0]][11][0]; - 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]; + 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[i] != "empty") { - #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); + if(sbc_highlight == true && rack_bay_sbc[r] != "empty") { + #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[i] != "empty") { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, true); + if(sbc_highlight != true && rack_bay_sbc[r] != "empty") { + 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); } /* // indents if(indents == true) { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 06787f0..8105cc6 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11342,7 +11342,7 @@ "rack_bay6_rear_conduit": "true", "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", - "rack_bay6_xyz_loc": "[383, 0, 0]", + "rack_bay6_xyz_loc": "[385, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 4b5ef3f..12ec255 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -82,7 +82,7 @@ rack_size = "1u"; //["1u","1u+","1u++","2u"] Rack_Bay1 = "empty"; // ["empty", "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"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] -rack_bay1_face = "vent"; //["solid","blank","io_shield","vent"] +rack_bay1_face = "vent"; //["open","solid","removable","vent"] rack_bay1_wall = false; // [true,false] rack_bay1_rear_fan = false; //[true,false] rack_bay1_rear_conduit = false; //[true,false] @@ -90,7 +90,7 @@ rack_bay1_rear_conduit = false; //[true,false] Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] -rack_bay2_face = "vent"; //["solid","blank","io_shield","vent"] +rack_bay2_face = "vent"; //["open","solid","removable","vent"] rack_bay2_wall = false; // [true,false] rack_bay2_rear_fan = false; //[true,false] rack_bay2_rear_conduit = false; //[true,false] @@ -98,7 +98,7 @@ rack_bay2_rear_conduit = false; //[true,false] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] -rack_bay3_face = "vent"; //["solid","blank","io_shield","vent"] +rack_bay3_face = "vent"; //["open","solid","removable","vent"] rack_bay3_wall = false; // [true,false] rack_bay3_rear_fan = false; //[true,false] rack_bay3_rear_conduit = false; //[true,false] @@ -106,7 +106,7 @@ rack_bay3_rear_conduit = false; //[true,false] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] -rack_bay4_face = "vent"; //["solid","blank","io_shield","vent"] +rack_bay4_face = "vent"; //["open","solid","removable","vent"] rack_bay4_wall = false; // [true,false] rack_bay4_rear_fan = false; //[true,false] rack_bay4_rear_conduit = false; //[true,false] @@ -114,7 +114,7 @@ rack_bay4_rear_conduit = false; //[true,false] Rack_Bay5 = "empty"; // ["empty", "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"] rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay5_rotation = 0; // [0:90:270] -rack_bay5_face = "vent"; //["solid","blank","io_shield","vent"] +rack_bay5_face = "vent"; //["open","solid","removable","vent"] rack_bay5_wall = false; // [true,false] rack_bay5_rear_fan = false; //[true,false] rack_bay5_rear_conduit = false; //[true,false] @@ -122,7 +122,7 @@ rack_bay5_rear_conduit = false; //[true,false] Rack_Bay6 = "empty"; // ["empty", "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"] rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] -rack_bay6_face = "vent"; //["solid","blank","io_shield","vent"] +rack_bay6_face = "vent"; //["open","solid","removable","vent"] rack_bay6_rear_fan = false; //[true,false] rack_bay6_rear_conduit = false; //[true,false] @@ -534,7 +534,13 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size, 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, rack_bay2_xyz_loc, rack_bay3_xyz_loc, rack_bay4_xyz_loc, rack_bay5_xyz_loc, rack_bay6_xyz_loc]; +rack_bay_xyz_loc = [[rack_bay1_xyz_loc[0],rack_bay1_xyz_loc[1],0], + [rack_bay2_xyz_loc[0],rack_bay2_xyz_loc[1],0], + [rack_bay3_xyz_loc[0],rack_bay3_xyz_loc[1],0], + [rack_bay4_xyz_loc[0],rack_bay4_xyz_loc[1],0], + [rack_bay5_xyz_loc[0],rack_bay5_xyz_loc[1],0], + [rack_bay6_xyz_loc[0],rack_bay6_xyz_loc[1],0]]; + 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]; From 35825add611c89cc145b5072d468e5f5fe14efb4 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 11 May 2025 22:18:14 -0400 Subject: [PATCH 15/27] removable bay tray initial work --- mod/case_rack.scad | 50 +++++++++++++++++++++++++++++++++---------- sbc_case_builder.json | 16 +++++++------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index d1ce996..c990cf2 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -15,6 +15,8 @@ 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 a 1u-2u rack case @@ -29,6 +31,8 @@ module case_rack(case_design,side) { rack_asm_gap = .25; rack_asm_size = 5; rack_asm_hole = 2.25; +baysize = (450-(2*wallthick))/6; +bay_height = rack_size == "1u" ? 44.45-floorthick : (2 * 44.45)-floorthick; if(case_design == "rack" && side == "bottom") { difference() { @@ -729,9 +733,10 @@ if(case_design == "rack" && side == "bottom") { } // open front - if(rack_bay_face[r] == "open") { - baysize = (450-(2*wallthick))/6; - open_offset = r == 0 && rack_bay_wall[r] == true ? wallthick+gap+1 : + 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+gap+.5 : r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick+gap+1 : r >= 1 && r < 5 && rack_bay_wall[r] == true ? 3 : r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick-1 : @@ -741,16 +746,17 @@ if(case_design == "rack" && side == "bottom") { r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? 75-wallthick-gap-3+baysize : 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] == "empty" && - r != 2 && rack_width == 10 ? 75-wallthick-gap-3+baysize : - r == 5 ? 75-wallthick-gap-3 : + r != 2 && rack_width == 10 ? 75-wallthick-gap-4+baysize : + r == 5 ? 75-wallthick-gap-sidethick+.125 : r == 2 && rack_width == 10 ? 66 : 73; - translate([open_offset-wallthick-gap+rack_asm_gap/2+75*(r+1)-75,-wallthick-gap-adj,floorthick+case_z+6]) - rotate([270,0,0]) slab([open_size,case_z,2*wallthick+15],6); + 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+15],open_radius); -#translate([-gap-wallthick+(75*(r+1))-75,-10-r,0]) rotate([0,90,0]) cylinder(d=1, h=75); +//#translate([-gap-wallthick+(75*(r+1))-75,-10-r,0]) rotate([0,90,0]) cylinder(d=1, h=75); } -#translate([-gap-wallthick,0,case_z]) rotate([0,90,0]) cylinder(d=1, h=450); +//#translate([-gap-wallthick,0,case_z]) rotate([0,90,0]) cylinder(d=1, h=450); } // subtractive accessories if(accessory_name != "none") { @@ -814,7 +820,7 @@ if(case_design == "rack" && side == "bottom") { } } for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty") { + if(rack_bay_sbc[r] != "empty" && 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]; @@ -919,5 +925,27 @@ if(case_design == "rack" && side == "bottom") { access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); } } + // bay inserts + for(r = [0:len(rack_bay_sbc)-1]) { + if(rack_bay_face[r] == "removable") { + bay_tray(baysize-wallthick-gap,depth-2*wallthick-gap-.5-tol,r); + } + } + } } -} + + +module bay_tray(width, depth, bay) { + +baysize = (450-(2*wallthick))/6; +bay_height = rack_size == "1u" ? 44.45-floorthick : (2 * 44.45)-floorthick; +bayadj = bay == 0 ? -74 : -75.5; + + union() { + #translate([bayadj+75*(bay+1),0,floorthick]) + slab([baysize-wallthick-gap-2,depth-.5-tol,1],3); + #translate([bayadj+75*(bay+1),0,floorthick+bay_height-floorthick-adj]) + rotate([270,0,0]) slab([baysize-wallthick-gap-2,bay_height-floorthick,1.5],1); + } + +} \ No newline at end of file diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 8105cc6..c491f85 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11308,37 +11308,37 @@ "pcb_loc_x": "0", "pcb_loc_y": "0", "pcb_loc_z": "0", - "rack_bay1_face": "vent", + "rack_bay1_face": "removable", "rack_bay1_rear_conduit": "true", "rack_bay1_rear_fan": "true", "rack_bay1_rotation": "270", "rack_bay1_wall": "true", "rack_bay1_xyz_loc": "[13, 0, 0]", - "rack_bay2_face": "vent", + "rack_bay2_face": "removable", "rack_bay2_rear_conduit": "true", "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_face": "removable", "rack_bay3_rear_conduit": "true", "rack_bay3_rear_fan": "true", "rack_bay3_rotation": "270", "rack_bay3_wall": "true", "rack_bay3_xyz_loc": "[162.5, 0, 0]", - "rack_bay4_face": "vent", + "rack_bay4_face": "removable", "rack_bay4_rear_conduit": "true", "rack_bay4_rear_fan": "true", "rack_bay4_rotation": "270", "rack_bay4_wall": "true", "rack_bay4_xyz_loc": "[237.5, 0, 0]", - "rack_bay5_face": "vent", + "rack_bay5_face": "removable", "rack_bay5_rear_conduit": "true", "rack_bay5_rear_fan": "true", "rack_bay5_rotation": "270", "rack_bay5_wall": "true", "rack_bay5_xyz_loc": "[313, 0, 0]", - "rack_bay6_face": "vent", + "rack_bay6_face": "removable", "rack_bay6_rear_conduit": "true", "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", @@ -11357,10 +11357,10 @@ "sbc_highlight": "false", "sbc_information": "false", "sbc_model": "c4", - "sbc_off": "false", + "sbc_off": "true", "sbc_top_standoffs": "false", "section_part": "false", - "sidethick": "5", + "sidethick": "4", "standard_motherboard_thickness": "0", "text_color": "Green", "text_font": "Nimbus Mono PS", From 0d28ebbc88fc9bdbeffcaaae3943de791f8d0caa Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Mon, 12 May 2025 18:31:59 -0400 Subject: [PATCH 16/27] more work for removable bays --- mod/case_rack.scad | 380 +++++++++++++++++++++++++++++++++++++++--- sbc_case_builder.json | 24 +-- sbc_case_builder.scad | 58 +++++-- 3 files changed, 414 insertions(+), 48 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index c990cf2..b43eed9 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -31,8 +31,6 @@ module case_rack(case_design,side) { rack_asm_gap = .25; rack_asm_size = 5; rack_asm_hole = 2.25; -baysize = (450-(2*wallthick))/6; -bay_height = rack_size == "1u" ? 44.45-floorthick : (2 * 44.45)-floorthick; if(case_design == "rack" && side == "bottom") { difference() { @@ -727,10 +725,9 @@ if(case_design == "rack" && side == "bottom") { grommet("front", "sleeve", 10, 4, wallthick, true, [true,10,0,"default"]); } // front vent - if(rack_bay_face[r] == "vent") { + if(rack_bay_face[r] == "vent" && rack_bay_face != "removable") { 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") { @@ -753,10 +750,7 @@ if(case_design == "rack" && side == "bottom") { 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+15],open_radius); - -//#translate([-gap-wallthick+(75*(r+1))-75,-10-r,0]) rotate([0,90,0]) cylinder(d=1, h=75); } -//#translate([-gap-wallthick,0,case_z]) rotate([0,90,0]) cylinder(d=1, h=450); } // subtractive accessories if(accessory_name != "none") { @@ -925,27 +919,367 @@ if(case_design == "rack" && side == "bottom") { access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); } } - // bay inserts - for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_face[r] == "removable") { - bay_tray(baysize-wallthick-gap,depth-2*wallthick-gap-.5-tol,r); - } - } } } -module bay_tray(width, depth, bay) { +module bay_tray(depth, bay) { -baysize = (450-(2*wallthick))/6; -bay_height = rack_size == "1u" ? 44.45-floorthick : (2 * 44.45)-floorthick; -bayadj = bay == 0 ? -74 : -75.5; + rack_asm_gap = .25; + rack_asm_size = 5; - union() { - #translate([bayadj+75*(bay+1),0,floorthick]) - slab([baysize-wallthick-gap-2,depth-.5-tol,1],3); - #translate([bayadj+75*(bay+1),0,floorthick+bay_height-floorthick-adj]) - rotate([270,0,0]) slab([baysize-wallthick-gap-2,bay_height-floorthick,1.5],1); + difference() { + union() { + slab([baysize-wallthick-gap-2,depth-.5,1],.5); + translate([0, 1.5, 0]) rotate([90,0,0]) + slab([baysize-wallthick-gap-2,bay_height-floorthick-1,1.5],.5); + } + // case floor panel clamp holes + translate([baysize,(depth/2)-gap-wallthick+3.75,-adj]) + cylinder(d=21, h=7); + translate([-gap-wallthick,(depth/2)-gap-wallthick+3.75,-adj]) + cylinder(d=21, h=7); + // left assembly block opening + translate([-rack_asm_size,depth-rack_asm_size,-adj]) + cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); + // right assembly block opening + translate([baysize-2*rack_asm_size,depth-rack_asm_size,-adj]) + cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); + + // front vent + if(rack_bay_face[bay] == "removable") { + translate([-gap-wallthick-1+(rack_asm_gap/2)+14,-gap-adj+2,bay_height-13]) + vent(2,5,wallthick+4,2,1,9,"vertical"); + translate([-gap-wallthick-1+(rack_asm_gap/2)+14,-gap-adj+2,3]) + vent(2,5,wallthick+4,2,1,9,"vertical"); + } + // pcb and multi-pcb standoff holes + if(rack_bay_sbc[bay] != "empty") { + 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_xyz_loc[bay][2]; + + translate([pcb_loc_x,pcb_loc_y+floorthick+gap,pcb_loc_z]) 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") { + translate([pcbhole_x,pcbhole_y,-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)); + } + 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)); + } + 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)); + } + + } + } + // 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] != "empty") { + #translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-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] != "empty") { + translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[bay]]) + sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true); + } + } } -} \ No newline at end of file + // pcb and multi-pcb standoffs + if(rack_bay_sbc[bay] != "empty") { + 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_xyz_loc[bay][2]; + + translate([pcb_loc_x,pcb_loc_y+floorthick+gap,pcb_loc_z]) 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], + bottom_height-pcb_z+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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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_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]]; + translate([pcbhole_x,pcbhole_y,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 c491f85..95f44f4 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11138,7 +11138,7 @@ "Rack_Bay1": "c4", "Rack_Bay2": "c4", "Rack_Bay3": "c4", - "Rack_Bay4": "c4", + "Rack_Bay4": "empty", "Rack_Bay5": "c4", "Rack_Bay6": "c4", "access_panel_location": "[10, 15]", @@ -11180,7 +11180,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "50", + "case_offset_y": "60", "cooling": "default", "corner_fillet": "3", "edge_fillet": "0", @@ -11313,36 +11313,36 @@ "rack_bay1_rear_fan": "true", "rack_bay1_rotation": "270", "rack_bay1_wall": "true", - "rack_bay1_xyz_loc": "[13, 0, 0]", - "rack_bay2_face": "removable", + "rack_bay1_xyz_loc": "[10, 0, 0]", + "rack_bay2_face": "vent", "rack_bay2_rear_conduit": "true", "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "270", "rack_bay2_wall": "true", - "rack_bay2_xyz_loc": "[88, 0, 0]", + "rack_bay2_xyz_loc": "[87, 0, 0]", "rack_bay3_face": "removable", "rack_bay3_rear_conduit": "true", "rack_bay3_rear_fan": "true", "rack_bay3_rotation": "270", - "rack_bay3_wall": "true", - "rack_bay3_xyz_loc": "[162.5, 0, 0]", + "rack_bay3_wall": "false", + "rack_bay3_xyz_loc": "[10, 0, 0]", "rack_bay4_face": "removable", "rack_bay4_rear_conduit": "true", "rack_bay4_rear_fan": "true", "rack_bay4_rotation": "270", "rack_bay4_wall": "true", - "rack_bay4_xyz_loc": "[237.5, 0, 0]", - "rack_bay5_face": "removable", + "rack_bay4_xyz_loc": "[10, 0, 0]", + "rack_bay5_face": "open", "rack_bay5_rear_conduit": "true", "rack_bay5_rear_fan": "true", "rack_bay5_rotation": "270", "rack_bay5_wall": "true", "rack_bay5_xyz_loc": "[313, 0, 0]", - "rack_bay6_face": "removable", + "rack_bay6_face": "fixed", "rack_bay6_rear_conduit": "true", "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", - "rack_bay6_xyz_loc": "[385, 0, 0]", + "rack_bay6_xyz_loc": "[386, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", @@ -11357,7 +11357,7 @@ "sbc_highlight": "false", "sbc_information": "false", "sbc_model": "c4", - "sbc_off": "true", + "sbc_off": "false", "sbc_top_standoffs": "false", "section_part": "false", "sidethick": "4", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 12ec255..2da2a09 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -82,7 +82,7 @@ rack_size = "1u"; //["1u","1u+","1u++","2u"] Rack_Bay1 = "empty"; // ["empty", "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"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] -rack_bay1_face = "vent"; //["open","solid","removable","vent"] +rack_bay1_face = "vent"; //["open","fixed","removable","vent"] rack_bay1_wall = false; // [true,false] rack_bay1_rear_fan = false; //[true,false] rack_bay1_rear_conduit = false; //[true,false] @@ -90,7 +90,7 @@ rack_bay1_rear_conduit = false; //[true,false] Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] -rack_bay2_face = "vent"; //["open","solid","removable","vent"] +rack_bay2_face = "vent"; //["open","fixed","removable","vent"] rack_bay2_wall = false; // [true,false] rack_bay2_rear_fan = false; //[true,false] rack_bay2_rear_conduit = false; //[true,false] @@ -98,7 +98,7 @@ rack_bay2_rear_conduit = false; //[true,false] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] -rack_bay3_face = "vent"; //["open","solid","removable","vent"] +rack_bay3_face = "vent"; //["open","fixed","removable","vent"] rack_bay3_wall = false; // [true,false] rack_bay3_rear_fan = false; //[true,false] rack_bay3_rear_conduit = false; //[true,false] @@ -106,7 +106,7 @@ rack_bay3_rear_conduit = false; //[true,false] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] -rack_bay4_face = "vent"; //["open","solid","removable","vent"] +rack_bay4_face = "vent"; //["open","fixed","removable","vent"] rack_bay4_wall = false; // [true,false] rack_bay4_rear_fan = false; //[true,false] rack_bay4_rear_conduit = false; //[true,false] @@ -114,7 +114,7 @@ rack_bay4_rear_conduit = false; //[true,false] Rack_Bay5 = "empty"; // ["empty", "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"] rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay5_rotation = 0; // [0:90:270] -rack_bay5_face = "vent"; //["open","solid","removable","vent"] +rack_bay5_face = "vent"; //["open","fixed","removable","vent"] rack_bay5_wall = false; // [true,false] rack_bay5_rear_fan = false; //[true,false] rack_bay5_rear_conduit = false; //[true,false] @@ -122,7 +122,7 @@ rack_bay5_rear_conduit = false; //[true,false] Rack_Bay6 = "empty"; // ["empty", "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"] rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] -rack_bay6_face = "vent"; //["open","solid","removable","vent"] +rack_bay6_face = "vent"; //["open","fixed","removable","vent"] rack_bay6_rear_fan = false; //[true,false] rack_bay6_rear_conduit = false; //[true,false] @@ -546,6 +546,8 @@ rack_bay_face = [rack_bay1_face, rack_bay2_face, rack_bay3_face, rack_bay4_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 : (2 * 44.45)-floorthick; adj = .01; $fn=90; @@ -1120,7 +1122,7 @@ if (view == "model") { } if(raise_top >= 0) { difference() { - color("grey",1) translate([0,0,raise_top]) case_rack(case_design,"bottom"); + color("grey",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]); @@ -1156,9 +1158,17 @@ if (view == "model") { color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]); } } + // bay inserts + for(r = [0:len(rack_bay_sbc)-1]) { + bayadj = r == 0 ? -74 : -75.5; + if(rack_bay_face[r] == "removable") { + color("gray") translate([bayadj+75*(r+1),0,floorthick]) + bay_tray(depth-2*wallthick-gap-.5-tol,r); + } + } if(sbc_off == false) { for(i = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[i] != "empty") { + if(rack_bay_sbc[i] != "empty" && rack_bay_face[i] != "removable") { s = search([rack_bay_sbc[i]],sbc_data); pcb_loc_z = rack_bay_xyz_loc[i][2]; pcb_id = sbc_data[s[0]][4]; @@ -1172,11 +1182,33 @@ if (view == "model") { 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]; - if(rack_bay_sbc[i] != "empty") { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) - rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); - } + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + 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] != "empty" && rack_bay_face[i] == "removable") { + bayadj = i == 0 ? -74 : -75.5; + s = search([rack_bay_sbc[i]],sbc_data); + pcb_loc_z = rack_bay_xyz_loc[i][2]; + 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[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]; + + translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap, + bottom_height-pcb_z+pcb_loc_z-adj+floorthick]) rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); } } } From 8d2ebd4f94a929d8ed19c53bc166b336d20c5a64 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Tue, 13 May 2025 21:56:58 -0400 Subject: [PATCH 17/27] final plumbing for rack removable bays --- lib/rack.scad | 2 +- mod/case_rack.scad | 138 ++++++++++++++++++++++++++---------------- sbc_case_builder.scad | 10 ++- 3 files changed, 97 insertions(+), 53 deletions(-) diff --git a/lib/rack.scad b/lib/rack.scad index 9d20083..1e78736 100644 --- a/lib/rack.scad +++ b/lib/rack.scad @@ -43,7 +43,7 @@ module rack_end_bracket(side, size, thick) { tab_width = 15.875+thick; b_width = thick; b_depth = depth; - b_height = 25; + b_height = thick; b_loc = [-thick,0,0]; adjust = .01; diff --git a/mod/case_rack.scad b/mod/case_rack.scad index b43eed9..b39f8f3 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -491,7 +491,8 @@ if(case_design == "rack" && side == "bottom") { 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"; + 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, @@ -535,7 +536,8 @@ if(case_design == "rack" && side == "bottom") { 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"; + 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, @@ -554,7 +556,8 @@ if(case_design == "rack" && side == "bottom") { } 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"; + 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, @@ -573,7 +576,8 @@ if(case_design == "rack" && side == "bottom") { } 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"; + 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, @@ -592,7 +596,8 @@ if(case_design == "rack" && side == "bottom") { } 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"; + 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, @@ -725,7 +730,7 @@ if(case_design == "rack" && side == "bottom") { grommet("front", "sleeve", 10, 4, wallthick, true, [true,10,0,"default"]); } // front vent - if(rack_bay_face[r] == "vent" && rack_bay_face != "removable") { + 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"); } @@ -733,19 +738,22 @@ if(case_design == "rack" && side == "bottom") { 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+gap+.5 : r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick+gap+1 : + r == 2 && rack_width == 10 ? 3 : r >= 1 && r < 5 && rack_bay_wall[r] == true ? 3 : - r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick-1 : - r == 5 ? 3 : - r == 2 && rack_width == 10 ? 3 : 3; - open_size = r == 0 && rack_bay_wall[r] == true ? 75-wallthick-gap-3 : + r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick : + r == 5 ? 3 : 3; + + open_size = r == 0 && rack_bay_wall[r] == true ? 75-wallthick-gap-2.5 : r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? 75-wallthick-gap-3+baysize : + r == 1 && rack_width == 10 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? 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] == "empty" && - r != 2 && rack_width == 10 ? 75-wallthick-gap-4+baysize : - r == 5 ? 75-wallthick-gap-sidethick+.125 : - r == 2 && rack_width == 10 ? 66 : 73; + r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" || + (r != 2 && rack_width == 10) ? 75-wallthick-gap-4+baysize : + r == 5 ? 75-wallthick-sidethick+.125 : 69; translate([open_offset-wallthick-gap+rack_asm_gap/2+75*(r+1)-75, -wallthick-gap-adj,floorthick+case_z+open_height]) @@ -784,10 +792,12 @@ if(case_design == "rack" && side == "bottom") { // 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]]); + 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]]); + #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]]); } } } @@ -797,20 +807,24 @@ if(case_design == "rack" && side == "bottom") { 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]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + access_panel([access_panel_size[0],access_panel_size[1],floorthick], + access_panel_orientation, [true,10,2,"default"]); } if(access_panel_rotation == 90) { - translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) + rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1],floorthick], + access_panel_orientation, [true,10,2,"default"]); } if(access_panel_rotation == 180) { translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, + [true,10,2,"default"]); } if(access_panel_rotation == 270) { - translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); + translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) + rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0], + access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); } } for(r = [0:len(rack_bay_sbc)-1]) { @@ -840,7 +854,7 @@ if(case_design == "rack" && side == "bottom") { 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); } -/* // indents + // indents if(indents == true) { for (i=[1:11:len(sbc_data[s[0]])-2]) { class = sbc_data[s[0]][i+1]; @@ -860,13 +874,14 @@ if(case_design == "rack" && side == "bottom") { side = sbc_data[s[0]][i+7]; rotation = sbc_data[s[0]][i+8]; if(id == pcbid) { - indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, + type, wallthick, gap, floorthick, pcb_z); } } } } } -*/ + // 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]); @@ -896,7 +911,8 @@ if(case_design == "rack" && side == "bottom") { 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]]); + parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric, size, data, + [false,mask[1],mask[2],mask[3]]); } } } @@ -904,19 +920,23 @@ if(case_design == "rack" && side == "bottom") { 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]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + access_panel([access_panel_size[0],access_panel_size[1],floorthick], + access_panel_orientation, [false,10,2,"default"]); } if(access_panel_rotation == 90) { - translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) + rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1], + floorthick], access_panel_orientation, [false,10,2,"default"]); } if(access_panel_rotation == 180) { - translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) + rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1],floorthick], + access_panel_orientation, [false,10,2,"default"]); } if(access_panel_rotation == 270) { - translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, [false,10,2,"default"]); + translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) + rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1], + floorthick], access_panel_orientation, [false,10,2,"default"]); } } } @@ -927,31 +947,41 @@ 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] == "empty" ? 74+baysize : + rack_width == 10 && bay == 1 && rack_bay_wall[bay] == false && + rack_bay_sbc[bay+1] == "empty" ? 70+baysize : + rack_width == 10 && bay == 2 ? 70 : + rack_bay_wall[bay] == false && bay != 0 && rack_bay_sbc[bay+1] == "empty" ? 75+baysize : baysize; difference() { union() { - slab([baysize-wallthick-gap-2,depth-.5,1],.5); + slab([reminsert-wallthick-gap-2,depth-.5,1],.5); translate([0, 1.5, 0]) rotate([90,0,0]) - slab([baysize-wallthick-gap-2,bay_height-floorthick-1,1.5],.5); + slab([reminsert-wallthick-gap-2,bay_height-floorthick-1,1.5],.5); } // case floor panel clamp holes - translate([baysize,(depth/2)-gap-wallthick+3.75,-adj]) - cylinder(d=21, h=7); - translate([-gap-wallthick,(depth/2)-gap-wallthick+3.75,-adj]) - cylinder(d=21, h=7); + 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); + } // left assembly block opening - translate([-rack_asm_size,depth-rack_asm_size,-adj]) + translate([2-2*rack_asm_size,depth-wallthick-1.25,-adj]) cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); // right assembly block opening - translate([baysize-2*rack_asm_size,depth-rack_asm_size,-adj]) + translate([2+baysize-2*rack_asm_size,depth-wallthick-1.25,-adj]) cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); // front vent if(rack_bay_face[bay] == "removable") { + vadj = reminsert/9 > 10 ? 36 : 0; translate([-gap-wallthick-1+(rack_asm_gap/2)+14,-gap-adj+2,bay_height-13]) - vent(2,5,wallthick+4,2,1,9,"vertical"); + vent(2,5,wallthick+4,2,1,(reminsert+vadj)/9,"vertical"); translate([-gap-wallthick-1+(rack_asm_gap/2)+14,-gap-adj+2,3]) - vent(2,5,wallthick+4,2,1,9,"vertical"); + vent(2,5,wallthick+4,2,1,(reminsert+vadj)/9,"vertical"); } // pcb and multi-pcb standoff holes if(rack_bay_sbc[bay] != "empty") { @@ -1060,12 +1090,14 @@ module bay_tray(depth, bay) { } // sbc openings if(sbc_highlight == true && rack_bay_sbc[bay] != "empty") { - #translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[bay]]) - sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true); + #translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-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] != "empty") { - translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[bay]]) - sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true); + translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-adj]) + rotate([0,0,rack_bay_rotation[bay]]) + sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true); } } } @@ -1201,7 +1233,8 @@ module bay_tray(depth, bay) { 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"; + 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, @@ -1220,7 +1253,8 @@ module bay_tray(depth, bay) { } 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"; + 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, @@ -1239,7 +1273,8 @@ module bay_tray(depth, bay) { } 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"; + 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, @@ -1258,7 +1293,8 @@ module bay_tray(depth, bay) { } 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"; + 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, diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 2da2a09..54536a2 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -1161,7 +1161,15 @@ if (view == "model") { // bay inserts for(r = [0:len(rack_bay_sbc)-1]) { bayadj = r == 0 ? -74 : -75.5; - if(rack_bay_face[r] == "removable") { + if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "empty") { + 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_face[r-1] == "removable") { +// 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] != "empty") { color("gray") translate([bayadj+75*(r+1),0,floorthick]) bay_tray(depth-2*wallthick-gap-.5-tol,r); } From 1b8a47361b8470f29c385c16ab41ebe7aaf4554e Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 14 May 2025 21:34:24 -0400 Subject: [PATCH 18/27] expanded rear conduit-grommet selection and tweaked removal bay trays --- mod/case_rack.scad | 231 +++++++++++++++++++++--------------------- sbc_case_builder.json | 44 ++++---- sbc_case_builder.scad | 171 ++++++++++++++++--------------- 3 files changed, 226 insertions(+), 220 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index b39f8f3..aab3551 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -1,6 +1,6 @@ /* This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder - Copyright 2022,2023,2024 Edward A. Kisiel hominoid@cablemi.com + 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 @@ -19,7 +19,7 @@ NAME: case_rack - DESCRIPTION: creates a 1u-2u rack case + DESCRIPTION: creates 1u-2u rack cases TODO: none USAGE: case_rack(case_design,side) @@ -99,39 +99,6 @@ if(case_design == "rack" && side == "bottom") { panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); } - // case lower assembly blocks - // 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]); - } - // additive accessories if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { @@ -154,56 +121,6 @@ if(case_design == "rack" && side == "bottom") { } } } - // 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); - // pcb and multi-pcb standoff holes for(r = [0:len(rack_bay_sbc)-1]) { if(rack_bay_sbc[r] != "empty" && rack_bay_face[r] != "removable") { @@ -725,10 +642,20 @@ if(case_design == "rack" && side == "bottom") { } // rear grommet openings grommet_offset = -75+11; - if(rack_bay_rear_conduit[r] == true) { + 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]) @@ -801,7 +728,6 @@ if(case_design == "rack" && side == "bottom") { } } } - } // ui access panel if(bottom_access_panel_enable == true) { @@ -854,34 +780,6 @@ if(case_design == "rack" && side == "bottom") { 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); } - // indents - if(indents == 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]) { - class = sbc_data[s[0]][i+1]; - type = sbc_data[s[0]][i+2]; - id = sbc_data[s[0]][i+3]; - loc_x = sbc_data[s[0]][i+4]+pcb_loc_x+pcbloc_x; - loc_y = sbc_data[s[0]][i+5]+pcb_loc_y+pcbloc_y; - loc_z = sbc_data[s[0]][i+6]+pcb_loc_z+pcbloc_z; - side = sbc_data[s[0]][i+7]; - rotation = sbc_data[s[0]][i+8]; - if(id == pcbid) { - indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, - type, wallthick, gap, floorthick, pcb_z); - } - } - } - } - } - // 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]); @@ -939,6 +837,90 @@ if(case_design == "rack" && side == "bottom") { floorthick], access_panel_orientation, [false,10,2,"default"]); } } + // 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); + } } } @@ -968,12 +950,27 @@ module bay_tray(depth, bay) { translate([reminsert-4,(depth/2)-gap-wallthick+3.75,-adj]) cylinder(d=20, h=7); } - // left assembly block opening + // 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]); - // right assembly block opening + // 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]); + // 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]); + // front assembly block opening + // front left + translate([2-2*rack_asm_size,-gap,-adj]) + cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); + // 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]); + // front right + translate([2+2*baysize-2*rack_asm_size+1.25-.25,-gap,-adj]) + cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); // front vent if(rack_bay_face[bay] == "removable") { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 95f44f4..3666af1 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11048,19 +11048,19 @@ "pcb_loc_y": "0", "pcb_loc_z": "0", "rack_bay1_face": "vent", - "rack_bay1_rear_conduit": "true", + "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": "true", + "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": "true", + "rack_bay3_rear_conduit": "grommet", "rack_bay3_rear_fan": "true", "rack_bay3_rotation": "270", "rack_bay3_wall": "false", @@ -11138,7 +11138,7 @@ "Rack_Bay1": "c4", "Rack_Bay2": "c4", "Rack_Bay3": "c4", - "Rack_Bay4": "empty", + "Rack_Bay4": "c4", "Rack_Bay5": "c4", "Rack_Bay6": "c4", "access_panel_location": "[10, 15]", @@ -11308,41 +11308,41 @@ "pcb_loc_x": "0", "pcb_loc_y": "0", "pcb_loc_z": "0", - "rack_bay1_face": "removable", - "rack_bay1_rear_conduit": "true", + "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": "[10, 0, 0]", + "rack_bay1_xyz_loc": "[13.5, 0, 0]", "rack_bay2_face": "vent", - "rack_bay2_rear_conduit": "true", + "rack_bay2_rear_conduit": "grommet", "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "270", "rack_bay2_wall": "true", - "rack_bay2_xyz_loc": "[87, 0, 0]", - "rack_bay3_face": "removable", - "rack_bay3_rear_conduit": "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": "false", - "rack_bay3_xyz_loc": "[10, 0, 0]", - "rack_bay4_face": "removable", - "rack_bay4_rear_conduit": "true", + "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": "[10, 0, 0]", - "rack_bay5_face": "open", - "rack_bay5_rear_conduit": "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, 0, 0]", - "rack_bay6_face": "fixed", - "rack_bay6_rear_conduit": "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, 0, 0]", + "rack_bay6_xyz_loc": "[386.5, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 54536a2..5ee4fd5 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -85,7 +85,7 @@ rack_bay1_rotation = 0; // [0:90:270] rack_bay1_face = "vent"; //["open","fixed","removable","vent"] rack_bay1_wall = false; // [true,false] rack_bay1_rear_fan = false; //[true,false] -rack_bay1_rear_conduit = false; //[true,false] +rack_bay1_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] @@ -93,7 +93,7 @@ rack_bay2_rotation = 0; // [0:90:270] rack_bay2_face = "vent"; //["open","fixed","removable","vent"] rack_bay2_wall = false; // [true,false] rack_bay2_rear_fan = false; //[true,false] -rack_bay2_rear_conduit = false; //[true,false] +rack_bay2_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] @@ -101,7 +101,7 @@ rack_bay3_rotation = 0; // [0:90:270] rack_bay3_face = "vent"; //["open","fixed","removable","vent"] rack_bay3_wall = false; // [true,false] rack_bay3_rear_fan = false; //[true,false] -rack_bay3_rear_conduit = false; //[true,false] +rack_bay3_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] @@ -109,7 +109,7 @@ rack_bay4_rotation = 0; // [0:90:270] rack_bay4_face = "vent"; //["open","fixed","removable","vent"] rack_bay4_wall = false; // [true,false] rack_bay4_rear_fan = false; //[true,false] -rack_bay4_rear_conduit = false; //[true,false] +rack_bay4_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay5 = "empty"; // ["empty", "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"] rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] @@ -117,14 +117,14 @@ rack_bay5_rotation = 0; // [0:90:270] rack_bay5_face = "vent"; //["open","fixed","removable","vent"] rack_bay5_wall = false; // [true,false] rack_bay5_rear_fan = false; //[true,false] -rack_bay5_rear_conduit = false; //[true,false] +rack_bay5_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay6 = "empty"; // ["empty", "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"] rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] rack_bay6_face = "vent"; //["open","fixed","removable","vent"] rack_bay6_rear_fan = false; //[true,false] -rack_bay6_rear_conduit = false; //[true,false] +rack_bay6_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] /* [3D Case Adjustments] */ // sbc location x axis @@ -611,22 +611,33 @@ if (view == "platter") { if(case_design == "rack") { case_rack(case_design,"bottom"); // rear fan covers - for(r = [0:len(rack_bay_sbc)-1]) { + 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, - depth+10,(case_z-rear_fan_size)/2]) + -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] == true) { - translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset,depth+30,0]) - color("lightgrey") grommet("bottom", "sleeve", 10, r+2, wallthick, true, [false,10,0,"default"]); + // 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); + } } - } } 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); @@ -1140,83 +1151,80 @@ if (view == "model") { cube([gap+wallthick+1,depth+2,case_z+2]); } } - } + } + ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1; // rear fan covers - for(r = [0: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, depth-gap,(case_z-rear_fan_size)/2]) rotate([90,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] == true) { - 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"]); - } + 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"]); } - // bay inserts - for(r = [0:len(rack_bay_sbc)-1]) { - bayadj = r == 0 ? -74 : -75.5; - if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "empty") { - 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_face[r-1] == "removable") { -// 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] != "empty") { - color("gray") translate([bayadj+75*(r+1),0,floorthick]) - bay_tray(depth-2*wallthick-gap-.5-tol,r); - } + 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"]); } - if(sbc_off == false) { - for(i = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[i] != "empty" && rack_bay_face[i] != "removable") { - s = search([rack_bay_sbc[i]],sbc_data); - pcb_loc_z = rack_bay_xyz_loc[i][2]; - 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]; + // bay inserts + bayadj = r == 0 ? -74 : -75.5; + if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "empty") { + 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] != "empty") { + color("gray") translate([bayadj+75*(r+1),0,floorthick]) + bay_tray(depth-2*wallthick-gap-.5-tol,r); + } + } + if(sbc_off == false) { + for(i = [0:len(rack_bay_sbc)-1]) { + if(rack_bay_sbc[i] != "empty" && rack_bay_face[i] != "removable") { + s = search([rack_bay_sbc[i]],sbc_data); + pcb_loc_z = rack_bay_xyz_loc[i][2]; + 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[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]; - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) - 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] != "empty" && rack_bay_face[i] == "removable") { - bayadj = i == 0 ? -74 : -75.5; - s = search([rack_bay_sbc[i]],sbc_data); - pcb_loc_z = rack_bay_xyz_loc[i][2]; - 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[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]; + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + 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] != "empty" && rack_bay_face[i] == "removable") { + bayadj = i == 0 ? -74 : -75.5; + s = search([rack_bay_sbc[i]],sbc_data); + pcb_loc_z = rack_bay_xyz_loc[i][2]; + 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[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_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]; - translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap, - bottom_height-pcb_z+pcb_loc_z-adj+floorthick]) rotate([0,0,rack_bay_rotation[i]]) - sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); + translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap, + bottom_height-pcb_z+pcb_loc_z-adj+floorthick]) rotate([0,0,rack_bay_rotation[i]]) + sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); } } } @@ -1435,7 +1443,8 @@ if (view == "part") { } if(case_design == "rack") { // rear fan covers - for(r = [0:len(rack_bay_sbc)-1]) { + 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]) @@ -1445,7 +1454,7 @@ if (view == "part") { // rear grommets for(r = [0:len(rack_bay_sbc)-1]) { grommet_offset = -75+11; - if(rack_bay_rear_conduit[r] == true) { + 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"]); From 1c643052763dc2ba7bc81fe8c56a9e274e8e1ed9 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 15 May 2025 15:49:59 -0400 Subject: [PATCH 19/27] added case top for rack cases --- mod/case_rack.scad | 356 ++++++++++++++++++++---------------------- sbc_case_builder.scad | 7 +- 2 files changed, 177 insertions(+), 186 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index aab3551..45c9bb6 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -98,7 +98,17 @@ if(case_design == "rack" && side == "bottom") { translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) panel_clamp("bottom", "m2", "sloped", 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", "m2", "sloped", 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + + translate([-gap,18-gap,case_z-floorthick]) rotate([0,0,270]) + panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([width-gap-(2*wallthick),18-gap,case_z-floorthick]) rotate([0,0,270]) + panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + // additive accessories if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { @@ -229,48 +239,6 @@ if(case_design == "rack" && side == "bottom") { } } } - // extended standoff holes - if(ext_bottom_standoffs == true) { - // right-rear standoff - if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size - || pcb_loc_y >= ext_bottom_standoff_support_size)) && - ext_bottom_rear_right_enable == true && ext_bottom_standoff[6] != "blind") { - translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), - ext_bottom_standoff_support_size/4,-adj]) - cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2+adj)); - } - // right-front standoff - if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && - depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size) || - (width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && - depth-pcb_loc_y-pcb_depth <= ext_bottom_standoff_support_size) || - (width-pcb_loc_x-pcb_width-(gap+2*wallthick) <= ext_bottom_standoff_support_size && - depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size)) && - ext_bottom_front_right_enable == true && ext_bottom_standoff[6] != "blind") { - translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), - depth-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)),-adj]) - cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2*adj)); - } - // left-rear standoff - if((pcb_loc_x >= ext_bottom_standoff_support_size || pcb_loc_y >= ext_bottom_standoff_support_size) && - ext_bottom_rear_left_enable == true && ext_bottom_standoff[6] != "blind") { - translate([ext_bottom_standoff_support_size/4, - ext_bottom_standoff_support_size/4,-adj]) - cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2*adj)); - } - // left-front standoff - if(((pcb_loc_x >= ext_bottom_standoff_support_size && - (depth-(pcb_loc_y+pcb_depth)) >= ext_bottom_standoff_support_size) || - (pcb_loc_x <= ext_bottom_standoff_support_size && - (depth-(pcb_loc_y+pcb_depth)) >= ext_bottom_standoff_support_size) || - (pcb_loc_x >= ext_bottom_standoff_support_size && - (depth-(pcb_loc_y+pcb_depth)) <= ext_bottom_standoff_support_size)) && - ext_bottom_front_left_enable == true && ext_bottom_standoff[6] != "blind") { - translate([ext_bottom_standoff_support_size/4, - depth-(ext_bottom_standoff_support_size/4)-(2*(wallthick+gap)),-adj]) - cylinder(d=ext_bottom_standoff[4]-.2, h=floorthick+(2*adj)); - } - } // bottom cover pattern for(r = [0:len(rack_bay_sbc)-1]) { if(bottom_cover_pattern != "solid") { @@ -539,98 +507,6 @@ if(case_design == "rack" && side == "bottom") { } } } - // extended standoffs - if(ext_bottom_standoffs == true) { - // extended right-rear standoff - if((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size || - pcb_loc_y >= ext_bottom_standoff_support_size) && ext_bottom_rear_right_enable == true) { - extended_standoff = [ext_bottom_standoff[0], - ext_bottom_standoff[1], - bottom_height+ext_bottom_rear_right_adjust, - ext_bottom_standoff[3], - ext_bottom_standoff[4], - ext_bottom_standoff[5], - ext_bottom_standoff[6], - ext_bottom_standoff[7], - ext_bottom_rear_right_support, - ext_bottom_standoff[9], - ext_bottom_standoff[10], - ext_bottom_standoff[11], - ext_bottom_standoff[12]]; - translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), - ext_bottom_standoff_support_size/4,0]) - standoff(extended_standoff,[false,10,2,"default"]); - } - // extended right-front standoff - if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && - depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size) || - (width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_bottom_standoff_support_size && - depth-pcb_loc_y-pcb_depth <= ext_bottom_standoff_support_size) || - (width-pcb_loc_x-pcb_width-(gap+2*wallthick) <= ext_bottom_standoff_support_size && - depth-pcb_loc_y-pcb_depth >= ext_bottom_standoff_support_size)) && - ext_bottom_front_right_enable == true) { - extended_standoff = [ext_bottom_standoff[0], - ext_bottom_standoff[1], - bottom_height+ext_bottom_front_right_adjust, - ext_bottom_standoff[3], - ext_bottom_standoff[4], - ext_bottom_standoff[5], - ext_bottom_standoff[6], - ext_bottom_standoff[7], - ext_bottom_front_right_support, - ext_bottom_standoff[9], - ext_bottom_standoff[10], - ext_bottom_standoff[11], - ext_bottom_standoff[12]]; - translate([width-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)), - depth-ext_bottom_standoff_support_size/4-(2*(wallthick+gap)),0]) - standoff(extended_standoff,[false,10,2,"default"]); - } - // extended left-rear standoff - if((pcb_loc_x >= ext_bottom_standoff_support_size || pcb_loc_y >= ext_bottom_standoff_support_size) - && ext_bottom_rear_left_enable == true) { - extended_standoff = [ext_bottom_standoff[0], - ext_bottom_standoff[1], - bottom_height+ext_bottom_rear_left_adjust, - ext_bottom_standoff[3], - ext_bottom_standoff[4], - ext_bottom_standoff[5], - ext_bottom_standoff[6], - ext_bottom_standoff[7], - ext_bottom_rear_left_support, - ext_bottom_standoff[9], - ext_bottom_standoff[10], - ext_bottom_standoff[11], - ext_bottom_standoff[12]]; - translate([ext_bottom_standoff_support_size/4, ext_bottom_standoff_support_size/4,0]) - standoff(extended_standoff,[false,10,2,"default"]); - } - // extended left-front standoff - if(((pcb_loc_x >= ext_bottom_standoff_support_size && - depth-(pcb_loc_y+pcb_depth) >= ext_bottom_standoff_support_size) || - (pcb_loc_x <= ext_bottom_standoff_support_size && - depth-(pcb_loc_y+pcb_depth) >= ext_bottom_standoff_support_size) || - (pcb_loc_x >= ext_bottom_standoff_support_size && - depth-(pcb_loc_y+pcb_depth) <= ext_bottom_standoff_support_size)) && - ext_bottom_front_left_enable == true) { - extended_standoff = [ext_bottom_standoff[0], - ext_bottom_standoff[1], - bottom_height+ext_bottom_front_left_adjust, - ext_bottom_standoff[3], - ext_bottom_standoff[4], - ext_bottom_standoff[5], - ext_bottom_standoff[6], - ext_bottom_standoff[7], - ext_bottom_front_left_support, - ext_bottom_standoff[9], - ext_bottom_standoff[10], - ext_bottom_standoff[11], - ext_bottom_standoff[12]]; - translate([ext_bottom_standoff_support_size/4, - depth-(ext_bottom_standoff_support_size/4)-(2*(wallthick+gap)),0]) - standoff(extended_standoff,[false,10,2,"default"]); - } - } } // rear fan, rear conduit and front bay openings for(r = [0:len(rack_bay_sbc)-1]) { @@ -729,30 +605,6 @@ if(case_design == "rack" && side == "bottom") { } } } - // 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]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], - access_panel_orientation, [true,10,2,"default"]); - } - if(access_panel_rotation == 90) { - translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) - rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1],floorthick], - access_panel_orientation, [true,10,2,"default"]); - } - if(access_panel_rotation == 180) { - translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) - rotate([0,0,access_panel_rotation]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation, - [true,10,2,"default"]); - } - if(access_panel_rotation == 270) { - translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) - rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0], - access_panel_size[1],floorthick], access_panel_orientation, [true,10,2,"default"]); - } - } for(r = [0:len(rack_bay_sbc)-1]) { if(rack_bay_sbc[r] != "empty" && rack_bay_face[r] != "removable") { s = search([rack_bay_sbc[r]],sbc_data); @@ -792,6 +644,11 @@ if(case_design == "rack" && side == "bottom") { 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-2*floorthick]) + slab([width-(2*wallthick),depth-(2*wallthick),floorthick+adj],corner_fillet); + translate([-gap-wallthick-adj,-gap,case_z-floorthick]) + slab([width,depth-(2*wallthick),20],corner_fillet); } // additive accessories if(accessory_name != "none") { @@ -814,29 +671,6 @@ if(case_design == "rack" && side == "bottom") { } } } - // ui access port - 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]) - access_panel([access_panel_size[0],access_panel_size[1],floorthick], - access_panel_orientation, [false,10,2,"default"]); - } - if(access_panel_rotation == 90) { - translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) - rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1], - floorthick], access_panel_orientation, [false,10,2,"default"]); - } - if(access_panel_rotation == 180) { - translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) - rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1],floorthick], - access_panel_orientation, [false,10,2,"default"]); - } - if(access_panel_rotation == 270) { - translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) - rotate([0,0,access_panel_rotation]) access_panel([access_panel_size[0],access_panel_size[1], - floorthick], access_panel_orientation, [false,10,2,"default"]); - } - } // case lower assembly blocks difference() { union() { @@ -921,9 +755,165 @@ if(case_design == "rack" && side == "bottom") { 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-2*floorthick]) + slab([width-(2*wallthick),depth-(2*wallthick),floorthick],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]) { + if(top_cover_pattern != "solid") { + if(top_cover_pattern == "hex_5mm") { + translate([rack_bay_xyz_loc[r][0]+25,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + vent_hex(15/3.75,(depth-40)/6,floorthick+4,5,1.5,"horizontal"); + } + if(top_cover_pattern == "hex_8mm") { + translate([rack_bay_xyz_loc[r][0]+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(top_cover_pattern == "linear_vertical") { + translate([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + vent(2,12,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,12,floorthick+4,1,1,9,"horizontal"); + } + if(top_cover_pattern == "linear_horizontal") { + translate([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + vent(35-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/6,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,-floorthick]) 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] != "empty" && 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] != "empty") { + #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] != "empty") { + 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 == "bottom") { + 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) { diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 5ee4fd5..99064a4 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -1133,7 +1133,7 @@ if (view == "model") { } if(raise_top >= 0) { difference() { - color("grey",1) translate([0,0,raise_top]) case_rack(case_design,"top"); + 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]); @@ -1154,7 +1154,7 @@ if (view == "model") { } ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1; // rear fan covers - for(r = [0:ucount-1]) { + 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, @@ -1171,7 +1171,8 @@ if (view == "model") { 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 + +// bay inserts bayadj = r == 0 ? -74 : -75.5; if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "empty") { color("gray") translate([bayadj+75*(r+1),0,floorthick]) From 728b8398f9524825d2670bcfabb395bb2f2f55ab Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 16 May 2025 11:56:58 -0400 Subject: [PATCH 20/27] added individual standoff control for rack case, fixed, open and removable bays --- mod/case_rack.scad | 8 ++++---- sbc_case_builder.scad | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 45c9bb6..84a7c72 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -150,7 +150,7 @@ if(case_design == "rack" && side == "bottom") { 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]; - translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { + 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]) { @@ -307,7 +307,7 @@ if(case_design == "rack" && side == "bottom") { 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]; - translate([pcb_loc_x,pcb_loc_y,pcb_loc_z]) rotate([0,0,rack_bay_rotation[r]]) union() { + 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]) { @@ -988,7 +988,7 @@ module bay_tray(depth, bay) { 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+floorthick+gap,pcb_loc_z]) rotate([0,0,rack_bay_rotation[bay]]) union() { + 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]) { @@ -1107,7 +1107,7 @@ module bay_tray(depth, bay) { 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+floorthick+gap,pcb_loc_z]) rotate([0,0,rack_bay_rotation[bay]]) union() { + 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]) { diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 99064a4..08a1e25 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -534,12 +534,12 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size, 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],0], - [rack_bay2_xyz_loc[0],rack_bay2_xyz_loc[1],0], - [rack_bay3_xyz_loc[0],rack_bay3_xyz_loc[1],0], - [rack_bay4_xyz_loc[0],rack_bay4_xyz_loc[1],0], - [rack_bay5_xyz_loc[0],rack_bay5_xyz_loc[1],0], - [rack_bay6_xyz_loc[0],rack_bay6_xyz_loc[1],0]]; +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]; @@ -1172,7 +1172,7 @@ if (view == "model") { color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]); } -// bay inserts + // bay inserts bayadj = r == 0 ? -74 : -75.5; if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "empty") { color("gray") translate([bayadj+75*(r+1),0,floorthick]) @@ -1187,7 +1187,6 @@ if (view == "model") { for(i = [0:len(rack_bay_sbc)-1]) { if(rack_bay_sbc[i] != "empty" && rack_bay_face[i] != "removable") { s = search([rack_bay_sbc[i]],sbc_data); - pcb_loc_z = rack_bay_xyz_loc[i][2]; pcb_id = sbc_data[s[0]][4]; pcb_width = sbc_data[s[0]][10][0]; pcb_depth = sbc_data[s[0]][10][1]; @@ -1199,6 +1198,8 @@ if (view == "model") { 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 ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); @@ -1206,7 +1207,6 @@ if (view == "model") { if(rack_bay_sbc[i] != "empty" && rack_bay_face[i] == "removable") { bayadj = i == 0 ? -74 : -75.5; s = search([rack_bay_sbc[i]],sbc_data); - pcb_loc_z = rack_bay_xyz_loc[i][2]; pcb_id = sbc_data[s[0]][4]; pcb_width = sbc_data[s[0]][10][0]; pcb_depth = sbc_data[s[0]][10][1]; @@ -1222,6 +1222,7 @@ if (view == "model") { 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, bottom_height-pcb_z+pcb_loc_z-adj+floorthick]) rotate([0,0,rack_bay_rotation[i]]) From b221fabed552f6d6c516cbcfc36e60360f1865bd Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 16 May 2025 19:48:00 -0400 Subject: [PATCH 21/27] fixed manifold issue with lower panel clamps and other minor changes --- mod/case_rack.scad | 12 +- sbc_case_builder.json | 522 +++++++++++++++++++++++++++++++ sbc_case_builder.scad | 18 +- sbc_case_builder_accessories.cfg | 10 + 4 files changed, 547 insertions(+), 15 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 84a7c72..e384b80 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -46,13 +46,6 @@ if(case_design == "rack" && side == "bottom") { 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 floor panel clamp holes - translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) - panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - if(rack_width == 19) { - translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) - panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); - } // case upper panel clamp holes translate([150-gap-wallthick,-gap-adj,case_z-13]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); @@ -305,7 +298,8 @@ if(case_design == "rack" && side == "bottom") { 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]; + pcb_loc_z = rack_bay_sbc[r] == "n2" ? 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 @@ -906,7 +900,7 @@ if(case_design == "rack" && side == "top") { data = accessory_data[a[0]][i+9]; mask = accessory_data[a[0]][i+10]; - if(class == "add2" && face == "bottom") { + 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]]); } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 3666af1..bd2294a 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11393,6 +11393,528 @@ "uart_opening": "none", "view": "model", "wallthick": "3" + }, + "n1_rack10-1u": { + "$fn": "90", + "Rack_Bay1": "n1", + "Rack_Bay2": "empty", + "Rack_Bay3": "empty", + "Rack_Bay4": "empty", + "Rack_Bay5": "empty", + "Rack_Bay6": "empty", + "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": "75", + "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": "3", + "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": "[120, 0, 6]", + "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": "4", + "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": "3" + }, + "n-series_rack19-1u": { + "$fn": "90", + "Rack_Bay1": "n2", + "Rack_Bay2": "empty", + "Rack_Bay3": "empty", + "Rack_Bay4": "n1", + "Rack_Bay5": "n2+", + "Rack_Bay6": "empty", + "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": "51", + "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": "3", + "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": "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, 12]", + "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, 6]", + "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": "[245, 0, 0]", + "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, 6]", + "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": "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": "4", + "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": "3" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 08a1e25..beef2f0 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -206,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", "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] @@ -610,6 +610,7 @@ if (view == "platter") { } 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]) { @@ -1152,7 +1153,7 @@ if (view == "model") { } } } - ucount = rack_width == 10 ? 3 : len(rack_bay_sbc)-1; + 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; @@ -1338,19 +1339,24 @@ 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); } - if(case_design == "rack" && rack_width == 19) { + 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 == "rack" && rack_width == 10) { - } - else { + if(case_design == "panel" || case_design == "panel_nas") { if(section_part == false) { case_bottom(case_design); } diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 176055e..6665015 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",113,10,2.99,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"], + "model","hd25",113,10,3,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,30,2,"both"], + "model","hd25",113,10,20.5,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,30,2,"default"]], + ["n1_rack10-1u", + "add2","hd_holder",213,80,2.99,"bottom",[0,0,180],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"], + "model","hd25",213,80,3,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"both"], + "model","hd25",213,80,20.5,"bottom",[0,0,180],["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"]], From 71034dee85b3986587669c1008d7bafd76e76796 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 18 May 2025 10:13:35 -0400 Subject: [PATCH 22/27] set interior walls to fixed width of 2mm --- mod/case_rack.scad | 2 +- sbc_case_builder.json | 38 ++++++++++++++++---------------- sbc_case_builder_accessories.cfg | 12 +++++----- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index e384b80..ae26d31 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -69,7 +69,7 @@ if(case_design == "rack" && side == "bottom") { 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([wallthick-1,depth,case_z-2*floorthick]); + cube([2,depth,case_z-2*floorthick]); } } // case upper panel clamps diff --git a/sbc_case_builder.json b/sbc_case_builder.json index bd2294a..1fa6a9e 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10872,7 +10872,7 @@ "view": "model", "wallthick": "2" }, - "c4_rack10-1u": { + "c-series_rack10-1u": { "$fn": "90", "Rack_Bay1": "c4", "Rack_Bay2": "c4", @@ -10975,7 +10975,7 @@ "ext_top_standoffs": "false", "fan_size": "0", "flat_blank_section": "false", - "floorthick": "3", + "floorthick": "2", "front_cover_pattern": "solid", "gap": "1", "gpio_opening": "none", @@ -11131,9 +11131,9 @@ "top_standoff_type": "blind", "uart_opening": "none", "view": "model", - "wallthick": "3" + "wallthick": "2" }, - "c4_rack19-1u": { + "c-series_rack19-1u": { "$fn": "90", "Rack_Bay1": "c4", "Rack_Bay2": "c4", @@ -11236,7 +11236,7 @@ "ext_top_standoffs": "false", "fan_size": "0", "flat_blank_section": "false", - "floorthick": "3", + "floorthick": "2", "front_cover_pattern": "solid", "gap": "1", "gpio_opening": "none", @@ -11360,7 +11360,7 @@ "sbc_off": "false", "sbc_top_standoffs": "false", "section_part": "false", - "sidethick": "4", + "sidethick": "3", "standard_motherboard_thickness": "0", "text_color": "Green", "text_font": "Nimbus Mono PS", @@ -11392,12 +11392,12 @@ "top_standoff_type": "blind", "uart_opening": "none", "view": "model", - "wallthick": "3" + "wallthick": "2" }, "n1_rack10-1u": { "$fn": "90", - "Rack_Bay1": "n1", - "Rack_Bay2": "empty", + "Rack_Bay1": "empty", + "Rack_Bay2": "n1", "Rack_Bay3": "empty", "Rack_Bay4": "empty", "Rack_Bay5": "empty", @@ -11441,7 +11441,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "75", + "case_offset_y": "50", "cooling": "vent_hex_8mm", "corner_fillet": "3", "edge_fillet": "0", @@ -11497,7 +11497,7 @@ "ext_top_standoffs": "false", "fan_size": "0", "flat_blank_section": "false", - "floorthick": "3", + "floorthick": "2", "front_cover_pattern": "solid", "gap": "1", "gpio_opening": "none", @@ -11580,7 +11580,7 @@ "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "0", "rack_bay2_wall": "false", - "rack_bay2_xyz_loc": "[120, 0, 6]", + "rack_bay2_xyz_loc": "[123.5, 0, 6]", "rack_bay3_face": "vent", "rack_bay3_rear_conduit": "grommet", "rack_bay3_rear_fan": "true", @@ -11621,7 +11621,7 @@ "sbc_off": "false", "sbc_top_standoffs": "false", "section_part": "false", - "sidethick": "4", + "sidethick": "3", "standard_motherboard_thickness": "0", "text_color": "Green", "text_font": "Nimbus Mono PS", @@ -11653,7 +11653,7 @@ "top_standoff_type": "blind", "uart_opening": "none", "view": "model", - "wallthick": "3" + "wallthick": "2" }, "n-series_rack19-1u": { "$fn": "90", @@ -11702,7 +11702,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "51", + "case_offset_y": "63", "cooling": "vent_hex_8mm", "corner_fillet": "3", "edge_fillet": "0", @@ -11758,7 +11758,7 @@ "ext_top_standoffs": "false", "fan_size": "0", "flat_blank_section": "false", - "floorthick": "3", + "floorthick": "2", "front_cover_pattern": "solid", "gap": "1", "gpio_opening": "none", @@ -11869,7 +11869,7 @@ "rack_width": "19", "raise_top": "0", "rear_cooling": "fan_1", - "rear_dualfan_spacing": "6", + "rear_dualfan_spacing": "47", "rear_fan": "1", "rear_fan_center": "false", "rear_fan_position": "0", @@ -11882,7 +11882,7 @@ "sbc_off": "false", "sbc_top_standoffs": "false", "section_part": "false", - "sidethick": "4", + "sidethick": "3", "standard_motherboard_thickness": "0", "text_color": "Green", "text_font": "Nimbus Mono PS", @@ -11914,7 +11914,7 @@ "top_standoff_type": "blind", "uart_opening": "none", "view": "model", - "wallthick": "3" + "wallthick": "2" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 6665015..90de7e0 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -257,13 +257,13 @@ accessory_data = [ // Odroid-N2 ["n-series_rack19-1u", - "add2","hd_holder",113,10,2.99,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"], - "model","hd25",113,10,3,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,30,2,"both"], - "model","hd25",113,10,20.5,"bottom",[0,0,0],["case",false,false,false],[0,0,0],["landscape",15],[true,30,2,"default"]], + "add2","hd_holder",229,102,2.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",213,80,2.99,"bottom",[0,0,180],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"], - "model","hd25",213,80,3,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"both"], - "model","hd25",213,80,20.5,"bottom",[0,0,180],["case",false,false,false],[0,0,0],["landscape",15],[true,20,2,"default"]], + "add2","hd_holder",1,10,2.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", From d254f162c1d355903922d97d6836691652dc529f Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 21 May 2025 18:20:49 -0400 Subject: [PATCH 23/27] fixed rack bay external bottom heatsink standoff mounting support, raised case wall clamps, changed rack case to initial fixed depth of 100mm --- mod/case_rack.scad | 109 +++++++++++++++++++++++++----------------- sbc_case_builder.json | 26 +++++----- sbc_case_builder.scad | 9 ++-- 3 files changed, 80 insertions(+), 64 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index ae26d31..5331ac5 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -47,15 +47,15 @@ if(case_design == "rack" && side == "bottom") { 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]) + translate([150-gap-wallthick,-gap-adj,case_z-13+4]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + case_z-13+4]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); if(rack_width == 19) { - translate([300-gap-wallthick,-gap-adj,case_z-13]) + translate([300-gap-wallthick,-gap-adj,case_z-13+4]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + case_z-13+4]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); } } @@ -73,14 +73,14 @@ if(case_design == "rack" && side == "bottom") { } } // case upper panel clamps - translate([150-gap-wallthick,-gap-adj,case_z-13]) + translate([150-gap-wallthick,-gap-adj,case_z-13+4]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + case_z-13+4]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); if(rack_width == 19) { translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); - translate([300-gap-wallthick,-gap-adj,case_z-13]) + case_z-13+4]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + translate([300-gap-wallthick,-gap-adj,case_z-13+4]) panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); } @@ -141,7 +141,6 @@ if(case_design == "rack" && side == "bottom") { 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]; translate([pcb_loc_x,pcb_loc_y,0]) rotate([0,0,rack_bay_rotation[r]]) union() { // pcb standoff holes @@ -158,22 +157,38 @@ if(case_design == "rack" && side == "bottom") { 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 = 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") { - translate([pcbhole_x,pcbhole_y,-adj]) - cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj)); + 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") { - translate([pcbhole_x,pcbhole_y,-adj]) - cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj)); + 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") { - translate([pcbhole_x,pcbhole_y,-adj]) + 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)); } @@ -269,17 +284,6 @@ if(case_design == "rack" && side == "bottom") { translate([300-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); } - // case upper panel clamp holes - translate([150-gap-wallthick,-gap-adj,case_z-13]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); - translate([150-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); - if(rack_width == 19) { - translate([300-gap-wallthick,-gap-adj,case_z-13]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); - translate([300-gap-wallthick,depth-gap-(2*wallthick)+adj, - case_z-13]) panel_clamp("front", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); - } } // pcb and multi-pcb standoffs for(r = [0:len(rack_bay_sbc)-1]) { @@ -298,7 +302,7 @@ if(case_design == "rack" && side == "bottom") { 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]-6 : + 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() { @@ -313,13 +317,14 @@ if(case_design == "rack" && side == "bottom") { 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], - bottom_height-pcb_z+pcb_loc_z+bottom_rear_left_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_rear_left_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -330,14 +335,18 @@ if(case_design == "rack" && side == "bottom") { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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], - bottom_height-pcb_z+pcb_loc_z+bottom_front_left_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_front_left_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -348,14 +357,18 @@ if(case_design == "rack" && side == "bottom") { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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], - bottom_height-pcb_z+pcb_loc_z+bottom_rear_right_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_rear_right_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -366,7 +379,11 @@ if(case_design == "rack" && side == "bottom") { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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) { @@ -374,7 +391,7 @@ if(case_design == "rack" && side == "bottom") { bottom_front_right_support : "none"; pcb_standoff = [bottom_standoff[0], bottom_standoff[1], - bottom_height-pcb_z+pcb_loc_z+bottom_front_right_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_front_right_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -385,7 +402,11 @@ if(case_design == "rack" && side == "bottom") { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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"]); } } @@ -504,7 +525,7 @@ if(case_design == "rack" && side == "bottom") { } // rear fan, rear conduit and front bay openings for(r = [0:len(rack_bay_sbc)-1]) { - // rear fan openings + // 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, @@ -608,8 +629,6 @@ if(case_design == "rack" && side == "bottom") { 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]; @@ -619,11 +638,11 @@ if(case_design == "rack" && side == "bottom") { // sbc openings if(sbc_highlight == true && rack_bay_sbc[r] != "empty") { - #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[r]]) + #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] != "empty") { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[r]]) + 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 @@ -639,10 +658,10 @@ if(case_design == "rack" && side == "bottom") { bottom=[edge_fillet,edge_fillet,edge_fillet,edge_fillet,edge_fillet], $fn=90); } // cleanup for recessed top - translate([-gap,-gap,case_z-2*floorthick]) - slab([width-(2*wallthick),depth-(2*wallthick),floorthick+adj],corner_fillet); - translate([-gap-wallthick-adj,-gap,case_z-floorthick]) - slab([width,depth-(2*wallthick),20],corner_fillet); + 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") { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 1fa6a9e..f7f1e2c 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10919,7 +10919,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "50", + "case_offset_y": "10", "cooling": "default", "corner_fillet": "3", "edge_fillet": "0", @@ -11180,7 +11180,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "60", + "case_offset_y": "10", "cooling": "default", "corner_fillet": "3", "edge_fillet": "0", @@ -11441,7 +11441,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "50", + "case_offset_y": "10", "cooling": "vent_hex_8mm", "corner_fillet": "3", "edge_fillet": "0", @@ -11580,7 +11580,7 @@ "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "0", "rack_bay2_wall": "false", - "rack_bay2_xyz_loc": "[123.5, 0, 6]", + "rack_bay2_xyz_loc": "[123.5, 0, 3]", "rack_bay3_face": "vent", "rack_bay3_rear_conduit": "grommet", "rack_bay3_rear_fan": "true", @@ -11694,7 +11694,7 @@ "bottom_standoff_insert_height": "5.1", "bottom_standoff_pillar": "hex", "bottom_standoff_reverse": "false", - "bottom_standoff_size": "m3", + "bottom_standoff_size": "m3+", "bottom_standoff_support_height": "4", "bottom_standoff_support_size": "10", "bottom_standoff_type": "countersunk", @@ -11702,8 +11702,8 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "63", - "cooling": "vent_hex_8mm", + "case_offset_y": "35", + "cooling": "none", "corner_fillet": "3", "edge_fillet": "0", "ext_bottom_front_left_adjust": "0", @@ -11760,7 +11760,7 @@ "flat_blank_section": "false", "floorthick": "2", "front_cover_pattern": "solid", - "gap": "1", + "gap": "2", "gpio_opening": "none", "hd_bays": "2", "hd_center": "false", @@ -11835,13 +11835,13 @@ "rack_bay1_rear_fan": "true", "rack_bay1_rotation": "0", "rack_bay1_wall": "false", - "rack_bay1_xyz_loc": "[13.5, 0, 12]", + "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, 6]", + "rack_bay2_xyz_loc": "[120, 0, 0]", "rack_bay3_face": "vent", "rack_bay3_rear_conduit": "none", "rack_bay3_rear_fan": "true", @@ -11853,13 +11853,13 @@ "rack_bay4_rear_fan": "true", "rack_bay4_rotation": "0", "rack_bay4_wall": "false", - "rack_bay4_xyz_loc": "[245, 0, 0]", + "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, 6]", + "rack_bay5_xyz_loc": "[345, 0, 0]", "rack_bay6_face": "fixed", "rack_bay6_rear_conduit": "grommet", "rack_bay6_rear_fan": "true", @@ -11878,7 +11878,7 @@ "sbc_bottom_standoffs": "true", "sbc_highlight": "false", "sbc_information": "false", - "sbc_model": "c4", + "sbc_model": "c1+", "sbc_off": "false", "sbc_top_standoffs": "false", "section_part": "false", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index beef2f0..c19b2f9 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -440,7 +440,7 @@ 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 : 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 : pcb_depth+2*(wallthick+gap)+case_offset_y; +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)) : 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; @@ -534,6 +534,7 @@ multipcb_bottom_standoff = [multipcb_bottom_standoff_size, 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]], @@ -1194,14 +1195,12 @@ if (view == "model") { 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[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 ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + translate([pcb_loc_x ,pcb_loc_y,pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[i]]) sbc(rack_bay_sbc[i], cooling, fan_size, gpio_opening, uart_opening, false); } @@ -1214,8 +1213,6 @@ if (view == "model") { 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[i] == 90 ? rack_bay_xyz_loc[i][0] + pcb_width : rack_bay_rotation[i] == 180 ? rack_bay_xyz_loc[i][0] + pcb_width : From 13ccfc63570c034bf73fe43718fad1d8d1b76336 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 21 May 2025 21:41:41 -0400 Subject: [PATCH 24/27] fixed bottom heatsink standoff mounting for relavent sbc --- mod/case_bottom.scad | 67 +++++++++++++++++++++++++++------ mod/case_rack.scad | 87 ++++++++++++++++++++++++++++++------------- sbc_case_builder.scad | 4 +- 3 files changed, 118 insertions(+), 40 deletions(-) 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 index 5331ac5..5abf853 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -295,8 +295,8 @@ if(case_design == "rack" && side == "bottom") { 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_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]; @@ -978,9 +978,9 @@ module bay_tray(depth, bay) { // front vent if(rack_bay_face[bay] == "removable") { vadj = reminsert/9 > 10 ? 36 : 0; - translate([-gap-wallthick-1+(rack_asm_gap/2)+14,-gap-adj+2,bay_height-13]) + 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-adj+2,3]) + translate([-gap-wallthick-1+(rack_asm_gap/2)+14,gap+wallthick-adj,3]) vent(2,5,wallthick+4,2,1,(reminsert+vadj)/9,"vertical"); } // pcb and multi-pcb standoff holes @@ -992,14 +992,15 @@ module bay_tray(depth, bay) { 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_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_xyz_loc[bay][2]; +// 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() { // pcb standoff holes @@ -1016,23 +1017,39 @@ module bay_tray(depth, bay) { 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 = 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") { - translate([pcbhole_x,pcbhole_y,-adj]) - cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj)); + 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") { - translate([pcbhole_x,pcbhole_y,-adj]) - cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj)); + 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") { - translate([pcbhole_x,pcbhole_y,-adj]) - cylinder(d=bottom_standoff[4]-.2, h=floorthick+(2*adj)); + 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)); } } @@ -1046,6 +1063,7 @@ module bay_tray(depth, bay) { 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]; @@ -1090,12 +1108,12 @@ module bay_tray(depth, bay) { } // sbc openings if(sbc_highlight == true && rack_bay_sbc[bay] != "empty") { - #translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-adj]) + #translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-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] != "empty") { - translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,bottom_height-pcb_z+pcb_loc_z-adj]) + translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-adj]) rotate([0,0,rack_bay_rotation[bay]]) sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true); } @@ -1118,7 +1136,8 @@ module bay_tray(depth, bay) { 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]; + 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 @@ -1138,7 +1157,7 @@ module bay_tray(depth, bay) { 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, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_rear_left_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1149,14 +1168,18 @@ module bay_tray(depth, bay) { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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], - bottom_height-pcb_z+pcb_loc_z+bottom_front_left_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_front_left_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1167,14 +1190,18 @@ module bay_tray(depth, bay) { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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], - bottom_height-pcb_z+pcb_loc_z+bottom_rear_right_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_rear_right_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1185,14 +1212,18 @@ module bay_tray(depth, bay) { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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], - bottom_height-pcb_z+pcb_loc_z+bottom_front_right_adjust, + pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z+bottom_front_right_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1203,7 +1234,11 @@ module bay_tray(depth, bay) { bottom_standoff[10], bottom_standoff[11], bottom_standoff[12]]; - translate([pcbhole_x,pcbhole_y,0]) + 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"]); } } diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index c19b2f9..4c0d58d 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -1200,7 +1200,7 @@ if (view == "model") { 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 ,pcb_loc_y,pcb_bmaxz+floorthick+case_offset_bz+pcb_loc_z-adj]) + 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); } @@ -1223,7 +1223,7 @@ if (view == "model") { pcb_loc_z = rack_bay_xyz_loc[i][2]; translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap, - bottom_height-pcb_z+pcb_loc_z-adj+floorthick]) rotate([0,0,rack_bay_rotation[i]]) + 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); } } From d502252d2e28ffd1a58dc9f93aabd632a6648485 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 22 May 2025 22:20:27 -0400 Subject: [PATCH 25/27] add grommet() and panel_clamp() to accessory library, readme.md updated, work on removable bay sbc positioning. --- README.md | 116 +++++++++- lib/grommet.scad | 6 +- lib/panel_clamp.scad | 18 +- mod/add.scad | 6 + mod/case_rack.scad | 50 ++-- sbc_case_builder.json | 522 ++++++++++++++++++++++++++++++++++++++++++ sbc_case_builder.scad | 72 +++--- 7 files changed, 715 insertions(+), 75 deletions(-) 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/lib/grommet.scad b/lib/grommet.scad index e00c3b1..ee7c7d8 100644 --- a/lib/grommet.scad +++ b/lib/grommet.scad @@ -28,12 +28,12 @@ USAGE: grommet(face, style, od, id, wall, assembly, mask) - face = "top","bottom","front","rear","left","right" - style = "sleeve" + 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 - assembly = false + data[3] = assembled true, false mask[0] = true enables component mask mask[1] = mask length mask[2] = mask setback diff --git a/lib/panel_clamp.scad b/lib/panel_clamp.scad index 50f6957..faaa230 100644 --- a/lib/panel_clamp.scad +++ b/lib/panel_clamp.scad @@ -3,23 +3,23 @@ DESCRIPTION: creates various clamps to join two panels TODO: none - USAGE: panel_clamp(face, screw, style, dia_x, dia_y, height, mask) + USAGE: panel_clamp(face, style, screw, dia_x, dia_y, height, mask) - face = "top","bottom","rear","front","left","right" - screw = "m2", "m2.5", "m3", "m4" - style = "sloped" - dia_x = top diameter or x size in mm - dia_y = bottom diameter or y size in mm - height = holder height in mm + 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" + mask[3] = mstyle "default", "holes" */ -module panel_clamp(face, screw, style, dia_x, dia_y, height, mask) { +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 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_rack.scad b/mod/case_rack.scad index 5abf853..ebec9b8 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -48,14 +48,14 @@ if(case_design == "rack" && side == "bottom") { 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", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [true,10,2,"default"]); + case_z-13+4]) panel_clamp("front", "sloped", "m2", 6, 18, 5, [true,10,2,"default"]); } } @@ -74,33 +74,33 @@ if(case_design == "rack" && side == "bottom") { } // case upper panel clamps translate([150-gap-wallthick,-gap-adj,case_z-13+4]) - panel_clamp("rear", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + 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", "m2", "sloped", 6, 18, 5, [false,10,2,"default"]); + panel_clamp("front", "sloped", "m2", 6, 18, 5, [false,10,2,"default"]); // additive accessories if(accessory_name != "none") { @@ -279,10 +279,10 @@ if(case_design == "rack" && side == "bottom") { } // case floor panel clamp holes translate([150-gap-wallthick,(depth/2)-gap-wallthick,floorthick-adj-.5]) - panel_clamp("bottom", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + 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", "m2", "sloped", 6, 18, 5, [true,10,2,"holes"]); + panel_clamp("bottom", "sloped", "m2", 6, 18, 5, [true,10,2,"holes"]); } } // pcb and multi-pcb standoffs @@ -295,8 +295,6 @@ if(case_design == "rack" && side == "bottom") { 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]; @@ -570,7 +568,7 @@ if(case_design == "rack" && side == "bottom") { 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] == "empty" || - (r != 2 && rack_width == 10) ? 75-wallthick-gap-4+baysize : + (r != 2 && rack_width == 10) ? 75-wallthick-gap+baysize : r == 5 ? 75-wallthick-sidethick+.125 : 69; translate([open_offset-wallthick-gap+rack_asm_gap/2+75*(r+1)-75, @@ -773,8 +771,8 @@ if(case_design == "rack" && side == "top") { difference() { union() { difference() { - translate([-gap,-gap,case_z-2*floorthick]) - slab([width-(2*wallthick),depth-(2*wallthick),floorthick],corner_fillet); + 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]); @@ -992,15 +990,13 @@ module bay_tray(depth, bay) { 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]; + 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() { // pcb standoff holes @@ -1108,12 +1104,12 @@ module bay_tray(depth, bay) { } // sbc openings if(sbc_highlight == true && rack_bay_sbc[bay] != "empty") { - #translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-adj]) + #translate([pcb_loc_x, pcb_loc_y+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-pcb_z-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] != "empty") { - translate([pcb_loc_x ,pcb_loc_y+floorthick+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-adj]) + translate([pcb_loc_x, pcb_loc_y+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-pcb_z-adj]) rotate([0,0,rack_bay_rotation[bay]]) sbc(rack_bay_sbc[bay], cooling, fan_size, gpio_opening, uart_opening, true); } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index f7f1e2c..802f856 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -11915,6 +11915,528 @@ "uart_opening": "none", "view": "model", "wallthick": "2" + }, + "h4_rack19-1u+": { + "$fn": "90", + "Rack_Bay1": "h4_ultra", + "Rack_Bay2": "empty", + "Rack_Bay3": "h4_ultra", + "Rack_Bay4": "empty", + "Rack_Bay5": "h4_ultra", + "Rack_Bay6": "empty", + "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": "false", + "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": "false", + "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" + }, + "test": { + "$fn": "90", + "Rack_Bay1": "n2", + "Rack_Bay2": "empty", + "Rack_Bay3": "n2+", + "Rack_Bay4": "empty", + "Rack_Bay5": "h4_ultra", + "Rack_Bay6": "empty", + "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": "-1", + "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": "removable", + "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": "none", + "rack_bay2_rear_fan": "false", + "rack_bay2_rotation": "0", + "rack_bay2_wall": "false", + "rack_bay2_xyz_loc": "[0, 0, 0]", + "rack_bay3_face": "removable", + "rack_bay3_rear_conduit": "none", + "rack_bay3_rear_fan": "false", + "rack_bay3_rotation": "0", + "rack_bay3_wall": "false", + "rack_bay3_xyz_loc": "[10, 0, 0]", + "rack_bay4_face": "fixed", + "rack_bay4_rear_conduit": "none", + "rack_bay4_rear_fan": "false", + "rack_bay4_rotation": "0", + "rack_bay4_wall": "false", + "rack_bay4_xyz_loc": "[0, 0, 0]", + "rack_bay5_face": "removable", + "rack_bay5_rear_conduit": "none", + "rack_bay5_rear_fan": "false", + "rack_bay5_rotation": "0", + "rack_bay5_wall": "false", + "rack_bay5_xyz_loc": "[10, 0, 0]", + "rack_bay6_face": "fixed", + "rack_bay6_rear_conduit": "none", + "rack_bay6_rear_fan": "false", + "rack_bay6_rotation": "0", + "rack_bay6_xyz_loc": "[0, 0, 0]", + "rack_size": "1u+", + "rack_width": "19", + "raise_top": "-1", + "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" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 4c0d58d..0efcb11 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -82,49 +82,49 @@ rack_size = "1u"; //["1u","1u+","1u++","2u"] Rack_Bay1 = "empty"; // ["empty", "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"] rack_bay1_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay1_rotation = 0; // [0:90:270] -rack_bay1_face = "vent"; //["open","fixed","removable","vent"] +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 = "grommet"; //["none","conduit","grommet","grommets-vertical"] +rack_bay1_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay2 = "empty"; // ["empty", "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"] rack_bay2_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay2_rotation = 0; // [0:90:270] -rack_bay2_face = "vent"; //["open","fixed","removable","vent"] +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 = "grommet"; //["none","conduit","grommet","grommets-vertical"] +rack_bay2_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay3 = "empty"; // ["empty", "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"] rack_bay3_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay3_rotation = 0; // [0:90:270] -rack_bay3_face = "vent"; //["open","fixed","removable","vent"] +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 = "grommet"; //["none","conduit","grommet","grommets-vertical"] +rack_bay3_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay4 = "empty"; // ["empty", "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"] rack_bay4_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay4_rotation = 0; // [0:90:270] -rack_bay4_face = "vent"; //["open","fixed","removable","vent"] +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 = "grommet"; //["none","conduit","grommet","grommets-vertical"] +rack_bay4_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay5 = "empty"; // ["empty", "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"] rack_bay5_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay5_rotation = 0; // [0:90:270] -rack_bay5_face = "vent"; //["open","fixed","removable","vent"] +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 = "grommet"; //["none","conduit","grommet","grommets-vertical"] +rack_bay5_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"] Rack_Bay6 = "empty"; // ["empty", "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"] rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] -rack_bay6_face = "vent"; //["open","fixed","removable","vent"] +rack_bay6_face = "fixed"; //["open","fixed","removable","vent"] rack_bay6_rear_fan = false; //[true,false] -rack_bay6_rear_conduit = "grommet"; //["none","conduit","grommet","grommets-vertical"] +rack_bay6_rear_conduit = "none"; //["none","conduit","grommet","grommets-vertical"] /* [3D Case Adjustments] */ // sbc location x axis @@ -548,7 +548,9 @@ rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall, 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 : (2 * 44.45)-floorthick; +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; @@ -622,24 +624,29 @@ if (view == "platter") { 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); + // 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); @@ -1220,6 +1227,8 @@ if (view == "model") { 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_sbc[i] == "m1" ? rack_bay_xyz_loc[i][2]+6 : +// rack_bay_sbc[i] == "n2+" ? rack_bay_xyz_loc[i][2]+4.5 : rack_bay_xyz_loc[i][2]; pcb_loc_z = rack_bay_xyz_loc[i][2]; translate([pcb_loc_x+bayadj+75*(i+1) ,pcb_loc_y+wallthick+gap, @@ -1474,6 +1483,11 @@ if (view == "part") { 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) { From f5dd71ec29adaa3dc4eab2082734fed204b8541d Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 23 May 2025 19:37:51 -0400 Subject: [PATCH 26/27] repositioned top and bottom cover patterns, alignment adjustments for removable bay and other changes --- mod/case_rack.scad | 132 +- sbc_case_builder.json | 3277 ++++++++++++++---------------- sbc_case_builder.scad | 26 +- sbc_case_builder_accessories.cfg | 4 +- 4 files changed, 1589 insertions(+), 1850 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index ebec9b8..3ae8f6b 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -126,7 +126,7 @@ if(case_design == "rack" && side == "bottom") { } // pcb and multi-pcb standoff holes for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty" && rack_bay_face[r] != "removable") { + 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]; @@ -249,29 +249,30 @@ if(case_design == "rack" && side == "bottom") { } // 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([rack_bay_xyz_loc[r][0]+25,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + 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([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+5,-floorthick+adj]) + 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([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) - vent(2,12,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]+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,12,floorthick+4,1,1,9,"horizontal"); + vent(2,25,floorthick+4,1,1,9,"horizontal"); } if(bottom_cover_pattern == "linear_horizontal") { - translate([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) - vent(35-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/6,1,"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]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + translate([r,c,-floorthick-adj]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); } } } @@ -287,7 +288,7 @@ if(case_design == "rack" && side == "bottom") { } // pcb and multi-pcb standoffs for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty" && rack_bay_face[r] != "removable") { + 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]; @@ -555,25 +556,25 @@ if(case_design == "rack" && side == "bottom") { 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+gap+.5 : - r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick+gap+1 : + 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 ? 3 : - r >= 1 && r < 5 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? wallthick : + 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.5 : - r == 0 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? 75-wallthick-gap-3+baysize : - r == 1 && rack_width == 10 && rack_bay_wall[r] == false && rack_bay_sbc[r+1] == "empty" ? 70-wallthick-gap+baysize : + 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] == "empty" || - (r != 2 && rack_width == 10) ? 75-wallthick-gap+baysize : - r == 5 ? 75-wallthick-sidethick+.125 : 69; + 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+15],open_radius); + rotate([270,0,0]) slab([open_size,case_z,2*wallthick+8],open_radius); } } // subtractive accessories @@ -619,7 +620,7 @@ if(case_design == "rack" && side == "bottom") { } } for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty" && rack_bay_face[r] != "removable") { + 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]; @@ -635,18 +636,18 @@ if(case_design == "rack" && side == "bottom") { pcb_loc_z = rack_bay_xyz_loc[r][2]; // sbc openings - if(sbc_highlight == true && rack_bay_sbc[r] != "empty") { + 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] != "empty") { + 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]); } + // 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") { @@ -802,29 +803,30 @@ if(case_design == "rack" && side == "top") { } // 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([rack_bay_xyz_loc[r][0]+25,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) + 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([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+5,-floorthick+adj]) + 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([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) - vent(2,12,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,12,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]+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([rack_bay_xyz_loc[r][0]+10,rack_bay_xyz_loc[r][1]+10,-floorthick+adj]) - vent(35-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/6,1,"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,-floorthick]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + translate([r,c,case_z-floorthick-4+adj]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); } } } @@ -873,7 +875,7 @@ if(case_design == "rack" && side == "top") { } // sbc openings for(r = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[r] != "empty" && rack_bay_face[r] != "removable") { + 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]; @@ -891,11 +893,11 @@ if(case_design == "rack" && side == "top") { pcb_loc_z = rack_bay_xyz_loc[r][2]; // sbc openings - if(sbc_highlight == true && rack_bay_sbc[r] != "empty") { + 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] != "empty") { + 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); } @@ -930,11 +932,11 @@ 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] == "empty" ? 74+baysize : + 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] == "empty" ? 70+baysize : + 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] == "empty" ? 75+baysize : baysize; + rack_bay_wall[bay] == false && bay != 0 && rack_bay_sbc[bay+1] == "none" ? 75+baysize : baysize; difference() { union() { @@ -954,35 +956,35 @@ module bay_tray(depth, bay) { // 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]); + 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]); + 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]); + 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,-gap,-adj]) - cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); + 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]); + cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size+.25]); // front right - translate([2+2*baysize-2*rack_asm_size+1.25-.25,-gap,-adj]) - cube([.125+(2*rack_asm_size),rack_asm_size,rack_asm_size]); + 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,3]) +// 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] != "empty") { + 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]; @@ -995,9 +997,7 @@ module bay_tray(depth, bay) { 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]; - + 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) { @@ -1103,13 +1103,13 @@ module bay_tray(depth, bay) { } } // sbc openings - if(sbc_highlight == true && rack_bay_sbc[bay] != "empty") { - #translate([pcb_loc_x, pcb_loc_y+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-pcb_z-adj]) + 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] != "empty") { - translate([pcb_loc_x, pcb_loc_y+gap,pcb_bmaxz+case_offset_bz+pcb_loc_z-pcb_z-adj]) + 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); } @@ -1117,7 +1117,7 @@ module bay_tray(depth, bay) { } // pcb and multi-pcb standoffs - if(rack_bay_sbc[bay] != "empty") { + 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]; @@ -1153,7 +1153,7 @@ module bay_tray(depth, bay) { 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, + pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_rear_left_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1175,7 +1175,7 @@ module bay_tray(depth, bay) { 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, + pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_front_left_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1197,7 +1197,7 @@ module bay_tray(depth, bay) { 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, + pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_rear_right_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], @@ -1219,7 +1219,7 @@ module bay_tray(depth, bay) { 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, + pcb_bmaxz+1+case_offset_bz+pcb_loc_z+bottom_front_right_adjust, bottom_standoff[3], bottom_standoff[4], bottom_standoff[5], diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 802f856..2216376 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, 0]", + "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]", @@ -5974,6 +7221,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]", @@ -8436,209 +9944,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]", @@ -10871,1572 +12176,6 @@ "uart_opening": "default", "view": "model", "wallthick": "2" - }, - "c-series_rack10-1u": { - "$fn": "90", - "Rack_Bay1": "c4", - "Rack_Bay2": "c4", - "Rack_Bay3": "c4", - "Rack_Bay4": "empty", - "Rack_Bay5": "empty", - "Rack_Bay6": "empty", - "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" - }, - "n1_rack10-1u": { - "$fn": "90", - "Rack_Bay1": "empty", - "Rack_Bay2": "n1", - "Rack_Bay3": "empty", - "Rack_Bay4": "empty", - "Rack_Bay5": "empty", - "Rack_Bay6": "empty", - "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" - }, - "n-series_rack19-1u": { - "$fn": "90", - "Rack_Bay1": "n2", - "Rack_Bay2": "empty", - "Rack_Bay3": "empty", - "Rack_Bay4": "n1", - "Rack_Bay5": "n2+", - "Rack_Bay6": "empty", - "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, 0]", - "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" - }, - "h4_rack19-1u+": { - "$fn": "90", - "Rack_Bay1": "h4_ultra", - "Rack_Bay2": "empty", - "Rack_Bay3": "h4_ultra", - "Rack_Bay4": "empty", - "Rack_Bay5": "h4_ultra", - "Rack_Bay6": "empty", - "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": "false", - "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": "false", - "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" - }, - "test": { - "$fn": "90", - "Rack_Bay1": "n2", - "Rack_Bay2": "empty", - "Rack_Bay3": "n2+", - "Rack_Bay4": "empty", - "Rack_Bay5": "h4_ultra", - "Rack_Bay6": "empty", - "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": "-1", - "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": "removable", - "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": "none", - "rack_bay2_rear_fan": "false", - "rack_bay2_rotation": "0", - "rack_bay2_wall": "false", - "rack_bay2_xyz_loc": "[0, 0, 0]", - "rack_bay3_face": "removable", - "rack_bay3_rear_conduit": "none", - "rack_bay3_rear_fan": "false", - "rack_bay3_rotation": "0", - "rack_bay3_wall": "false", - "rack_bay3_xyz_loc": "[10, 0, 0]", - "rack_bay4_face": "fixed", - "rack_bay4_rear_conduit": "none", - "rack_bay4_rear_fan": "false", - "rack_bay4_rotation": "0", - "rack_bay4_wall": "false", - "rack_bay4_xyz_loc": "[0, 0, 0]", - "rack_bay5_face": "removable", - "rack_bay5_rear_conduit": "none", - "rack_bay5_rear_fan": "false", - "rack_bay5_rotation": "0", - "rack_bay5_wall": "false", - "rack_bay5_xyz_loc": "[10, 0, 0]", - "rack_bay6_face": "fixed", - "rack_bay6_rear_conduit": "none", - "rack_bay6_rear_fan": "false", - "rack_bay6_rotation": "0", - "rack_bay6_xyz_loc": "[0, 0, 0]", - "rack_size": "1u+", - "rack_width": "19", - "raise_top": "-1", - "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" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 0efcb11..ebe4db3 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -79,7 +79,7 @@ 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 = "empty"; // ["empty", "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"] +Rack_Bay1 = "none"; // ["none", "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"] 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"] @@ -87,7 +87,7 @@ 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 = "empty"; // ["empty", "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"] +Rack_Bay2 = "none"; // ["none", "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"] 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"] @@ -95,7 +95,7 @@ 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 = "empty"; // ["empty", "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"] +Rack_Bay3 = "none"; // ["none", "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"] 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"] @@ -103,7 +103,7 @@ 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 = "empty"; // ["empty", "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"] +Rack_Bay4 = "none"; // ["none", "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"] 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"] @@ -111,7 +111,7 @@ 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 = "empty"; // ["empty", "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"] +Rack_Bay5 = "none"; // ["none", "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"] 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"] @@ -119,7 +119,7 @@ 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 = "empty"; // ["empty", "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"] +Rack_Bay6 = "none"; // ["none", "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"] 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"] @@ -1182,19 +1182,19 @@ if (view == "model") { } // bay inserts - bayadj = r == 0 ? -74 : -75.5; - if(rack_bay_face[r] == "removable" && r ==0 && rack_bay_sbc[r] != "empty") { + 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] != "empty") { + 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(sbc_off == false) { for(i = [0:len(rack_bay_sbc)-1]) { - if(rack_bay_sbc[i] != "empty" && rack_bay_face[i] != "removable") { + 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]; @@ -1211,8 +1211,8 @@ if (view == "model") { 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] != "empty" && rack_bay_face[i] == "removable") { - bayadj = i == 0 ? -74 : -75.5; + 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]; @@ -1232,7 +1232,7 @@ if (view == "model") { 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]) rotate([0,0,rack_bay_rotation[i]]) + 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); } } diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 90de7e0..105518b 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -257,11 +257,11 @@ accessory_data = [ // Odroid-N2 ["n-series_rack19-1u", - "add2","hd_holder",229,102,2.99,"bottom",[0,0,180],["case",false,false,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"], + "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,2.99,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[2.5,"landscape"],[false,10,2,"default"], + "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"]], From d5d63e54a2c871818df48734022271d7865b1233 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 25 May 2025 12:02:04 -0400 Subject: [PATCH 27/27] adjusted n2, n2+ openings and sbc placement for rack case --- mod/case_rack.scad | 2 +- sbc_case_builder.json | 2 +- sbc_case_builder.scad | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 3ae8f6b..9e1db35 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -633,7 +633,7 @@ if(case_design == "rack" && side == "bottom") { 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]; + 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") { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 2216376..f88e825 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -5812,7 +5812,7 @@ "rack_bay5_rear_fan": "true", "rack_bay5_rotation": "0", "rack_bay5_wall": "false", - "rack_bay5_xyz_loc": "[345, 0, 0]", + "rack_bay5_xyz_loc": "[345, 0, 1.5]", "rack_bay6_face": "fixed", "rack_bay6_rear_conduit": "grommet", "rack_bay6_rear_fan": "true", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index ebe4db3..9296a4a 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -1192,6 +1192,7 @@ if (view == "model") { 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") { @@ -1205,7 +1206,8 @@ if (view == "model") { 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]; + pcb_loc_z = rack_bay_sbc[i] == "n2+" ? rack_bay_xyz_loc[i][2]+1.5 : rack_bay_xyz_loc[i][2]; +// pcb_loc_z = 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]])