From cd2e77acc9244306c891f1ffe1d4505d236a8069 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 6 Apr 2025 12:40:01 -0400 Subject: [PATCH 01/17] new case panel_nas initial work --- lib/hd.scad | 2 +- mod/case_bottom.scad | 14 +++ mod/case_side.scad | 100 +++++++++++++++ mod/case_top.scad | 42 +++++-- sbc_case_builder.json | 205 +++++++++++++++++++++++++++++++ sbc_case_builder.scad | 36 +++++- sbc_case_builder_accessories.cfg | 3 + 7 files changed, 389 insertions(+), 13 deletions(-) diff --git a/lib/hd.scad b/lib/hd.scad index bdd0a98..96cce3e 100644 --- a/lib/hd.scad +++ b/lib/hd.scad @@ -614,7 +614,7 @@ module hd35_vtab(side) { DESCRIPTION: creates 2.5" and 3.5" hard drive hole mask for mounting TODO: none - USAGE: hd_bottom_holes(hd, orientation, side, thick) + USAGE: hd_holes(hd, orientation, side, thick) hd = 2.5, 3.5 orientation = "portrait", "landscape" diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index 097ab6c..fb2b5bc 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -62,6 +62,20 @@ module case_bottom(case_design) { cube([8,wallthick+2*adj,floorthick]); } } + if(case_design == "panel_nas") { + union() { + translate([-gap,-gap,0]) + cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(2*wallthick),floorthick]); + translate([(width*(1/5))-8-(wallthick+gap),depth-(2*wallthick)-gap-adj,0]) + cube([8,wallthick+2*adj,floorthick]); + translate([width-(width*(1/5))-(wallthick+gap),depth-(2*wallthick)-gap-adj,0]) + cube([8,wallthick+2*adj,floorthick]); + translate([(width*(1/5))-8-(wallthick+gap),-wallthick-gap+adj,0]) + cube([8,wallthick+2*adj,floorthick]); + translate([width-(width*(1/5))-(wallthick+gap),-wallthick-gap+adj,0]) + cube([8,wallthick+2*adj,floorthick]); + } + } if(case_design == "stacked") { translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap,floorthick/2]) cube_fillet_inside([width-(2*wallthick),depth-(2*wallthick),floorthick], diff --git a/mod/case_side.scad b/mod/case_side.scad index 71256cf..4c2d87c 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -128,6 +128,106 @@ module case_side(case_design, side) { } } } + if(case_design == "panel_nas") { + if(side == "rear") { + difference() { + union() { + translate([-gap,-wallthick-gap,-floorthick]) + cube([width-2*wallthick+(101.6-width+(2*(wallthick+gap))),wallthick,case_z+2*floorthick]); + // right hook + difference() { + translate([width-(2*wallthick)-gap-adj,-wallthick-gap, + ((case_z)/2)-4]) + cube([(2*wallthick)+.5,wallthick,8]); + translate([width-(2*wallthick)-gap-adj,-wallthick-gap-adj, + ((case_z)/2)-4-adj]) + cube([wallthick+.25,wallthick+(2*adj),4.25]); + } + // left hook + difference() { + translate([-(2*wallthick)-gap-adj-.25,-wallthick-gap, + ((case_z)/2)-4]) + cube([(2*wallthick)+.5,wallthick,8]); + translate([-wallthick-gap-adj-.25,-wallthick-gap-adj, + ((case_z)/2)-4-adj]) + cube([wallthick+.25,wallthick+(2*adj),4.25]); + } + } + // top slots + translate([(width*(1/5))-8.25-(wallthick+gap),-wallthick-gap-adj, + case_z-floorthick-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj, + case_z-floorthick-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + // bottom slots + translate([(width*(1/5))-8.25-(wallthick+gap),-wallthick-gap-adj,-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj,-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + } + } + if(side == "front") { + difference() { + union() { + translate([-gap,depth-2*(wallthick)-gap,-floorthick]) + cube([width-2*wallthick+(101.6-width+(2*(wallthick+gap))),wallthick,case_z+2*floorthick]); + // right hook + difference() { + translate([width-(2*wallthick)-gap-adj,depth-2*(wallthick)-gap-adj, + ((case_z)/2)-4]) + cube([(2*wallthick)+.5,wallthick,8]); + translate([width-(2*wallthick)-gap-adj, + depth-2*(wallthick)-adj-gap-adj,((case_z)/2)-4-adj]) + cube([wallthick+.25,wallthick+(2*adj),4.25]); + } + // left hook + difference() { + translate([-(2*wallthick)-gap-adj-.25,depth-2*(wallthick)-gap-adj,( + (case_z)/2)-4]) + cube([(2*wallthick)+.5,wallthick,8]); + translate([-wallthick-gap-adj-.25,depth-2*(wallthick)-adj-gap-adj, + ((case_z)/2)-4-adj]) + cube([wallthick+.25,wallthick+(2*adj),4.25]); + } + } + // top slots + translate([(width*(1/5))-8.25-(wallthick+gap),depth-2*wallthick-gap-adj, + case_z-floorthick-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + translate([width-(width*(1/5))-(wallthick+gap)-.25,depth-2*wallthick-gap-adj, + case_z-floorthick-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + // bottom slots + translate([(width*(1/5))-8.25-(wallthick+gap),depth-2*wallthick-gap-adj,-.25]) + cube([8.5,wallthick+2*adj,floorthick+.5]); + translate([width-(width*(1/5))-(wallthick+gap)-.25, + depth-2*wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); + } + } + if(side == "right") { + difference() { + translate([width-(2*wallthick)-gap+(101.6-width+(2*wallthick)),-(2*wallthick)-gap,-wallthick]) + cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); + translate([width-(2*wallthick)-gap-adj,-wallthick-gap-.25, + ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); + translate([width-(2*wallthick)-gap-adj,depth-2*(wallthick)-gap-.25, + ((case_z)/2)]) + cube([wallthick+2*adj,wallthick+.5,8.5]); + } + } + if(side == "left") { + difference() { + translate([-wallthick-gap,-(2*wallthick)-gap,-wallthick]) + cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); + translate([-wallthick-gap-adj,-wallthick-gap-.25,((case_z)/2)]) + cube([wallthick+2*adj,wallthick+.5,8.5]); + translate([-wallthick-gap-adj,depth-2*(wallthick)-gap-.25, + ((case_z)/2)]) + cube([wallthick+2*adj,wallthick+.5,8.5]); + } + } + } if(case_design == "tray_sides") { if(side == "right") { difference() { diff --git a/mod/case_top.scad b/mod/case_top.scad index e0d4d6c..e5690e4 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -70,6 +70,24 @@ module case_top(case_design) { cube([8,wallthick+2*adj,floorthick]); } } + if(case_design == "panel_nas") { + union() { + translate([-gap,-gap,case_z-floorthick]) + cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(2*wallthick),floorthick]); + translate([(width*(1/5))-8-(wallthick+gap),depth-(2*wallthick)-gap-adj, + case_z-floorthick]) + cube([8,wallthick+2*adj,floorthick]); + translate([width-(width*(1/5))-(wallthick+gap),depth-(2*wallthick)-gap-adj, + case_z-floorthick]) + cube([8,wallthick+2*adj,floorthick]); + translate([(width*(1/5))-8-(wallthick+gap),-wallthick-gap+adj, + case_z-floorthick]) + cube([8,wallthick+2*adj,floorthick]); + translate([width-(width*(1/5))-(wallthick+gap),-wallthick-gap+adj, + case_z-floorthick]) + cube([8,wallthick+2*adj,floorthick]); + } + } if(case_design == "stacked") { translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap, case_z-(floorthick/2)]) @@ -316,19 +334,23 @@ module case_top(case_design) { if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_rear" && top_rear_left_enable == true && top_standoff[6] != "blind") { - translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); + translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) + cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); } if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_front" && top_front_left_enable == true && top_standoff[6] != "blind") { - translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); + translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) + cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); } if (class == "pcbhole" && id == 0 && pcbhole_pos == "right_rear" && top_rear_right_enable == true && top_standoff[6] != "blind") { - translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); + translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) + cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); } if (class == "pcbhole" && id == 0 && pcbhole_pos == "right_front" && top_front_right_enable == true && top_standoff[6] != "blind") { - translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); + translate([pcbhole_x,pcbhole_y,case_z-(floorthick+adj)]) + cylinder(d=top_standoff[4]-.2, h=floorthick+(2*adj)); } } } @@ -800,10 +822,12 @@ module case_top(case_design) { // 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); + 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); + #parametric_move_add(type,loc_x,loc_y,loc_z,face,rotation, + parametric,[size_x,size_y,size_z],data,mask); } } } @@ -837,7 +861,8 @@ module case_top(case_design) { 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); } } } @@ -869,7 +894,8 @@ module case_top(case_design) { mask = accessory_data[a[0]][i+10]; if (class == "add2" && face == "top") { - parametric_move_add(type,loc_x,loc_y,loc_z,face,rotation,parametric,size,data,[false,mask[1],mask[2],mask[3]]); + 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 f9463ab..c439de2 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9583,6 +9583,211 @@ "uart_opening": "default", "view": "model", "wallthick": "2" + }, + "m2_panel_nas": { + "$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": "nas", + "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "171", + "case_offset_x": "0", + "case_offset_y": "138", + "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", + "gap": "1", + "gpio_opening": "default", + "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_bays": "2", + "nas_sbc_location": "top", + "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": "m2", + "sbc_off": "false", + "sbc_top_standoffs": "false", + "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": "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 fadce3e..d22aaae 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -40,7 +40,7 @@ sbc_highlight = false; // enable highlight for accessory subtractive geometry accessory_highlight = false; // base case design -case_design = "shell"; // [shell,panel,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,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] @@ -83,9 +83,9 @@ case_offset_x = 0; //[0:.01:300] // additional y axis case size case_offset_y = 0; //[0:.01:300] // additional z axis case top size -case_offset_tz = 0; //[-10:.01:100] +case_offset_tz = 0; //[-10:.01:300] // additional z axis case bottom size -case_offset_bz = 0; //[0:.01:100] +case_offset_bz = 0; //[0:.01:300] // case wall thickness wallthick = 2; //[1:.01:5] // case floor thickness @@ -124,8 +124,12 @@ gpio_opening = "default"; // [default,none,open,block,knockout,vent] uart_opening = "default"; // [default,none,open,knockout] // enable indentations around io openings indents = true; +// nas sbc location +nas_sbc_location = "top"; // ["top","bottom"] +// number of nas bays +nas_bays = 2; // [0:5] // 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_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_ultimate", "h3_ultimate2", "show2_shell", "rpi5_m2hat", "rock5b", "adapter_mini-stx_m1s", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"] +accessory_name = "none"; // ["none", "hk_uart", "nas", "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_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_ultimate", "h3_ultimate2", "show2_shell", "rpi5_m2hat", "rock5b", "adapter_mini-stx_m1s", "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] // sbc information text font @@ -634,6 +638,30 @@ if (view == "model") { sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } } + if(case_design == "panel_nas") { + if(lower_bottom >= 0) { + color("dimgrey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); + } + if(raise_top >= 0) { + color("grey",1) translate([0,0,raise_top])case_top(case_design); + } + if(move_front >= 0) { + color("grey",1) translate([0,move_front,0]) case_side(case_design,"front"); + } + if(move_rear >= 0) { + color("grey",1) translate([0,-move_rear,0]) case_side(case_design,"rear"); + } + if(move_rightside >= 0) { + color("grey",1) translate([move_rightside,0,0]) case_side(case_design,"right"); + } + if(move_leftside >= 0) { + color("grey",1) translate([-move_leftside,0,0]) case_side(case_design,"left"); + } + if(sbc_off == false) { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); + } + } if(case_design == "stacked") { if(lower_bottom >= 0) { color("grey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 0addf09..0d4ca1e 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -491,6 +491,9 @@ accessory_data = [ "add2","standoff",113,125,0,"bottom",[0,0,0],["sbc",false,false,false],[0,0,0],[["custom",5.75,5,3.6,10,4,"countersunk","hex",false,false,4.5,5.1]],[true,10,2,"default"], "model","hk_m1s_ups",2,97,5,"bottom",[0,0,0],["sbc",false,false,false],[0,0,0],[0],[true,110,2,"default"]], + // NAS Case + ["nas", + "model","hd35",-1,-67,200,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"]], // circuitsetup solar energy meter ["cs_solarmeter", From 6f26ab2f04bbd635eb8c72d00cdd87d811513f80 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sun, 6 Apr 2025 19:06:29 -0400 Subject: [PATCH 02/17] more wip for panel_nas case --- mod/case_side.scad | 53 ++++++++++++++++++++++---------- mod/case_top.scad | 8 ++--- sbc_case_builder.json | 6 ++-- sbc_case_builder_accessories.cfg | 5 ++- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/mod/case_side.scad b/mod/case_side.scad index 4c2d87c..e4eb7c8 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -26,6 +26,9 @@ module case_side(case_design, side) { + hd_space = 36; + hd_height = 40; + difference() { union() { if(case_design == "panel") { @@ -132,14 +135,14 @@ module case_side(case_design, side) { if(side == "rear") { difference() { union() { - translate([-gap,-wallthick-gap,-floorthick]) - cube([width-2*wallthick+(101.6-width+(2*(wallthick+gap))),wallthick,case_z+2*floorthick]); + translate([-gap,-wallthick-gap,floorthick]) + cube([width-2*wallthick+(101.6-width+(2*wallthick)),wallthick,case_z-2*floorthick]); // right hook difference() { - translate([width-(2*wallthick)-gap-adj,-wallthick-gap, + translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),-wallthick-gap, ((case_z)/2)-4]) cube([(2*wallthick)+.5,wallthick,8]); - translate([width-(2*wallthick)-gap-adj,-wallthick-gap-adj, + translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),-wallthick-gap-adj, ((case_z)/2)-4-adj]) cube([wallthick+.25,wallthick+(2*adj),4.25]); } @@ -165,28 +168,30 @@ module case_side(case_design, side) { cube([8.5,wallthick+2*adj,floorthick+.5]); translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); + translate([(101.6-80)/2,-1,bottom_height+98]) rotate([90,0,0]) fan_mask(80, wallthick+2, "fan_hex"); + translate([(101.6-80)/2,-1,bottom_height+17]) rotate([90,0,0]) fan_mask(80, wallthick+2, "fan_hex"); } } if(side == "front") { difference() { union() { - translate([-gap,depth-2*(wallthick)-gap,-floorthick]) - cube([width-2*wallthick+(101.6-width+(2*(wallthick+gap))),wallthick,case_z+2*floorthick]); + translate([-gap,depth-4*(wallthick)-gap,floorthick]) + cube([width-2*wallthick+(101.6-width+(2*wallthick)),wallthick,case_z-2*wallthick]); // right hook difference() { - translate([width-(2*wallthick)-gap-adj,depth-2*(wallthick)-gap-adj, + translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),depth-3*(wallthick)-gap-adj, ((case_z)/2)-4]) cube([(2*wallthick)+.5,wallthick,8]); - translate([width-(2*wallthick)-gap-adj, - depth-2*(wallthick)-adj-gap-adj,((case_z)/2)-4-adj]) + translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)), + depth-3*(wallthick)-adj-gap-adj,((case_z)/2)-4-adj]) cube([wallthick+.25,wallthick+(2*adj),4.25]); } // left hook difference() { - translate([-(2*wallthick)-gap-adj-.25,depth-2*(wallthick)-gap-adj,( + translate([-(2*wallthick)-gap-adj-.25,depth-3*(wallthick)-gap-adj,( (case_z)/2)-4]) cube([(2*wallthick)+.5,wallthick,8]); - translate([-wallthick-gap-adj-.25,depth-2*(wallthick)-adj-gap-adj, + translate([-wallthick-gap-adj-.25,depth-3*(wallthick)-adj-gap-adj, ((case_z)/2)-4-adj]) cube([wallthick+.25,wallthick+(2*adj),4.25]); } @@ -203,28 +208,42 @@ module case_side(case_design, side) { cube([8.5,wallthick+2*adj,floorthick+.5]); translate([width-(width*(1/5))-(wallthick+gap)-.25, depth-2*wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); + translate([-gap+6,depth-4*(wallthick)-gap,case_z-6]) rotate([-90,0,0]) + vent_hex((width)/3.5,(depth)/7,wallthick+4,5,1.5,"horizontal"); } } if(side == "right") { difference() { - translate([width-(2*wallthick)-gap+(101.6-width+(2*wallthick)),-(2*wallthick)-gap,-wallthick]) - cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); - translate([width-(2*wallthick)-gap-adj,-wallthick-gap-.25, +// translate([width-(2*wallthick)-gap+(101.6-width+(2*wallthick)),-(3*wallthick)-gap,-wallthick]) +// cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); + translate([width-gap+(101.6-width+sidethick),-(3*wallthick)-gap,-wallthick]) + rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+2*wallthick,sidethick],corner_fillet); + translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),-wallthick-gap-.25, ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); - translate([width-(2*wallthick)-gap-adj,depth-2*(wallthick)-gap-.25, + translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),depth-2*(wallthick)-gap-.25, ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); + for( i=[0:1:nas_bays-1]) { + translate([-gap,-(3*wallthick)-gap+78.25,hd_height+hd_space*i]) + rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); + } } } if(side == "left") { difference() { - translate([-wallthick-gap,-(2*wallthick)-gap,-wallthick]) - cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); +// translate([-sidethick-gap,-(2*wallthick)-gap,-wallthick]) +// cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); + translate([-gap,-(3*wallthick)-gap,-wallthick]) + rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+2*wallthick,sidethick],corner_fillet); translate([-wallthick-gap-adj,-wallthick-gap-.25,((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); translate([-wallthick-gap-adj,depth-2*(wallthick)-gap-.25, ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); + for( i=[0:1:nas_bays-1]) { + translate([-gap,-(3*wallthick)-gap+78.25,hd_height+hd_space*i]) + rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); + } } } } diff --git a/mod/case_top.scad b/mod/case_top.scad index e5690e4..fa4273c 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -72,9 +72,9 @@ module case_top(case_design) { } if(case_design == "panel_nas") { union() { - translate([-gap,-gap,case_z-floorthick]) - cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(2*wallthick),floorthick]); - translate([(width*(1/5))-8-(wallthick+gap),depth-(2*wallthick)-gap-adj, + translate([-gap,-gap,case_z-2*wallthick]) + cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(3*wallthick),wallthick]); +/* translate([(width*(1/5))-8-(wallthick+gap),depth-(2*wallthick)-gap-adj, case_z-floorthick]) cube([8,wallthick+2*adj,floorthick]); translate([width-(width*(1/5))-(wallthick+gap),depth-(2*wallthick)-gap-adj, @@ -86,7 +86,7 @@ module case_top(case_design) { translate([width-(width*(1/5))-(wallthick+gap),-wallthick-gap+adj, case_z-floorthick]) cube([8,wallthick+2*adj,floorthick]); - } +*/ } } if(case_design == "stacked") { translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap, diff --git a/sbc_case_builder.json b/sbc_case_builder.json index c439de2..28f5541 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9623,11 +9623,11 @@ "bottom_standoff_type": "countersunk", "case_design": "panel_nas", "case_offset_bz": "0", - "case_offset_tz": "171", + "case_offset_tz": "165", "case_offset_x": "0", "case_offset_y": "138", "cooling": "default", - "corner_fillet": "3", + "corner_fillet": "9", "edge_fillet": "0", "ext_bottom_front_left_adjust": "0", "ext_bottom_front_left_enable": "true", @@ -9755,7 +9755,7 @@ "sbc_model": "m2", "sbc_off": "false", "sbc_top_standoffs": "false", - "sidethick": "2", + "sidethick": "3", "standard_motherboard_thickness": "0", "text_color": "Green", "text_font": "Nimbus Mono PS", diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 0d4ca1e..186e565 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -493,7 +493,10 @@ accessory_data = [ // NAS Case ["nas", - "model","hd35",-1,-67,200,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"]], + "model","hd35",-1,-67,148,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"], + "model","hd35",-1,-67,112,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"], + "model","hd35",-1,-67,76,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"], + "model","hd35",-1,-67,40,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"]], // circuitsetup solar energy meter ["cs_solarmeter", From a032839b3b5493392eb46782612b1cbf9fed8028 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Mon, 7 Apr 2025 17:33:32 -0400 Subject: [PATCH 03/17] work on parametrics for drive(s), fan and case size, other gui and misc work --- mod/case_bottom.scad | 6 ++-- mod/case_side.scad | 25 +++++++++-------- mod/case_top.scad | 18 ++++++++---- sbc_case_builder.json | 23 ++++++++++------ sbc_case_builder.scad | 47 ++++++++++++++++++-------------- sbc_case_builder_accessories.cfg | 3 -- 6 files changed, 70 insertions(+), 52 deletions(-) diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index fb2b5bc..15afb3e 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -65,10 +65,10 @@ module case_bottom(case_design) { if(case_design == "panel_nas") { union() { translate([-gap,-gap,0]) - cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(2*wallthick),floorthick]); - translate([(width*(1/5))-8-(wallthick+gap),depth-(2*wallthick)-gap-adj,0]) + cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(3*wallthick),floorthick]); + translate([(width*(1/5))-8-(wallthick+gap),depth-(3*wallthick)-gap-adj,0]) cube([8,wallthick+2*adj,floorthick]); - translate([width-(width*(1/5))-(wallthick+gap),depth-(2*wallthick)-gap-adj,0]) + translate([width-(width*(1/5))-(wallthick+gap),depth-(3*wallthick)-gap-adj,0]) cube([8,wallthick+2*adj,floorthick]); translate([(width*(1/5))-8-(wallthick+gap),-wallthick-gap+adj,0]) cube([8,wallthick+2*adj,floorthick]); diff --git a/mod/case_side.scad b/mod/case_side.scad index e4eb7c8..2f59664 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -26,9 +26,6 @@ module case_side(case_design, side) { - hd_space = 36; - hd_height = 40; - difference() { union() { if(case_design == "panel") { @@ -168,8 +165,14 @@ module case_side(case_design, side) { cube([8.5,wallthick+2*adj,floorthick+.5]); translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([(101.6-80)/2,-1,bottom_height+98]) rotate([90,0,0]) fan_mask(80, wallthick+2, "fan_hex"); - translate([(101.6-80)/2,-1,bottom_height+17]) rotate([90,0,0]) fan_mask(80, wallthick+2, "fan_hex"); + if(hd_fan == 1 || hd_fan == 2) { + translate([-1+(101.6-hd_fan_size)/2,-1,bottom_height+pcb_tmaxz+hd_fan_position]) + rotate([90,0,0]) fan_mask(hd_fan_size, wallthick+2, hd_cooling); + } + if(hd_fan == 2) { + translate([-1+(101.6-hd_fan_size)/2,-1,bottom_height+pcb_tmaxz+hd_fan_position+3+hd_fan_size]) + rotate([90,0,0]) fan_mask(hd_fan_size, wallthick+2, hd_cooling); + } } } if(side == "front") { @@ -208,8 +211,8 @@ module case_side(case_design, side) { cube([8.5,wallthick+2*adj,floorthick+.5]); translate([width-(width*(1/5))-(wallthick+gap)-.25, depth-2*wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([-gap+6,depth-4*(wallthick)-gap,case_z-6]) rotate([-90,0,0]) - vent_hex((width)/3.5,(depth)/7,wallthick+4,5,1.5,"horizontal"); + translate([-gap+8,depth-4*(wallthick)-gap,case_z-8]) rotate([-90,0,0]) + vent_hex((width)/3.5,(case_z-8)/6,wallthick+4,5,1.5,"horizontal"); } } if(side == "right") { @@ -223,8 +226,8 @@ module case_side(case_design, side) { translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),depth-2*(wallthick)-gap-.25, ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); - for( i=[0:1:nas_bays-1]) { - translate([-gap,-(3*wallthick)-gap+78.25,hd_height+hd_space*i]) + for( i=[0:1:hd_bays-1]) { + translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } } @@ -240,8 +243,8 @@ module case_side(case_design, side) { translate([-wallthick-gap-adj,depth-2*(wallthick)-gap-.25, ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); - for( i=[0:1:nas_bays-1]) { - translate([-gap,-(3*wallthick)-gap+78.25,hd_height+hd_space*i]) + for( i=[0:1:hd_bays-1]) { + translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } } diff --git a/mod/case_top.scad b/mod/case_top.scad index fa4273c..827b1ea 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -330,7 +330,8 @@ module case_top(case_design) { pcbhole_pos = sbc_data[s[0]][i+10][4]; case_z = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? case_z+floorthick : - case_design == "snap" ? case_z+(2 * floorthick) : case_z; + case_design == "snap" ? case_z+(2 * floorthick) : + case_design == "panel_nas" ? case_z-floorthick : case_z; if (class == "pcbhole" && id == 0 && pcbhole_pos == "left_rear" && top_rear_left_enable == true && top_standoff[6] != "blind") { @@ -376,7 +377,8 @@ module case_top(case_design) { pcbhole_pos = sbc_data[s[0]][i+10][4]; case_z = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? case_z+floorthick : - case_design == "snap" ? case_z+(2 * floorthick) : case_z; + case_design == "snap" ? case_z+(2 * floorthick) : + case_design == "panel_nas" ? case_z-floorthick : case_z; if(id == pcbid && id != 0 && pcbclass == "pcbhole") { if (pcbclass == "pcbhole" && pcbhole_pos == "left_rear" && @@ -413,7 +415,8 @@ module case_top(case_design) { case_z = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? case_z+floorthick : - case_design == "snap" ? case_z+(2 * floorthick) : case_z; + case_design == "snap" ? case_z+(2 * floorthick) : + case_design == "panel_nas" ? case_z-floorthick : case_z; // right-rear standoff if((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= ext_top_standoff_support_size || @@ -507,7 +510,8 @@ module case_top(case_design) { pcbhole_pos = sbc_data[s[0]][i+10][4]; case_z = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? case_z+floorthick : - case_design == "snap" ? case_z+(2 * floorthick) : case_z; + case_design == "snap" ? case_z+(2 * floorthick) : + case_design == "panel_nas" ? case_z-floorthick : case_z; stand_off_adj = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? floorthick : case_design == "snap" ? 2 * floorthick : 0; @@ -608,7 +612,8 @@ module case_top(case_design) { pcbhole_pos = sbc_data[s[0]][i+10][4]; case_z = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? case_z+floorthick : - case_design == "snap" ? case_z+(2 * floorthick) : case_z; + case_design == "snap" ? case_z+(2 * floorthick) : + case_design == "panel_nas" ? case_z-floorthick : case_z; stand_off_adj = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? floorthick : case_design == "snap" ? 2 * floorthick : 0; @@ -696,7 +701,8 @@ module case_top(case_design) { case_z = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? case_z+floorthick : - case_design == "snap" ? case_z+(2 * floorthick) : case_z; + case_design == "snap" ? case_z+(2 * floorthick) : + case_design == "panel_nas" ? case_z-floorthick : case_z; stand_off_adj = case_design == "fitted" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7" ? floorthick : case_design == "snap" ? 2 * floorthick : 0; diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 28f5541..dc30fbc 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9591,7 +9591,7 @@ "access_panel_rotation": "0", "access_panel_size": "[70, 30]", "accessory_highlight": "false", - "accessory_name": "nas", + "accessory_name": "none", "adj": "0.01", "bend_allowance": "1", "bottom_access_panel_enable": "false", @@ -9623,11 +9623,11 @@ "bottom_standoff_type": "countersunk", "case_design": "panel_nas", "case_offset_bz": "0", - "case_offset_tz": "165", + "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "138", + "case_offset_y": "0", "cooling": "default", - "corner_fillet": "9", + "corner_fillet": "3", "edge_fillet": "0", "ext_bottom_front_left_adjust": "0", "ext_bottom_front_left_enable": "true", @@ -9684,6 +9684,14 @@ "floorthick": "2", "gap": "1", "gpio_opening": "default", + "hd_bays": "2", + "hd_cooling": "fan_hex", + "hd_fan": "1", + "hd_fan_position": "0", + "hd_fan_size": "80", + "hd_space": "10", + "hd_y_position": "25", + "hd_z_position": "40", "indents": "true", "individual_part": "bottom", "lower_bottom": "0", @@ -9742,9 +9750,8 @@ "multipcb_top_standoff_support_size": "7", "multipcb_top_standoff_type": "blind", "multipcb_top_standoffs": "false", - "nas_bays": "2", "nas_sbc_location": "top", - "pcb_loc_x": "0", + "pcb_loc_x": "8", "pcb_loc_y": "0", "pcb_loc_z": "0", "raise_top": "0", @@ -9754,7 +9761,7 @@ "sbc_information": "false", "sbc_model": "m2", "sbc_off": "false", - "sbc_top_standoffs": "false", + "sbc_top_standoffs": "true", "sidethick": "3", "standard_motherboard_thickness": "0", "text_color": "Green", @@ -9784,7 +9791,7 @@ "top_standoff_size": "m3", "top_standoff_support_height": "4", "top_standoff_support_size": "10", - "top_standoff_type": "blind", + "top_standoff_type": "countersunk", "uart_opening": "default", "view": "model", "wallthick": "2" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index d22aaae..601fc18 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -126,8 +126,16 @@ uart_opening = "default"; // [default,none,open,knockout] indents = true; // nas sbc location nas_sbc_location = "top"; // ["top","bottom"] -// number of nas bays -nas_bays = 2; // [0:5] +// number of nas drive bays +hd_bays = 2; // [1:6] +hd_y_position = 25; // [1:300] +hd_z_position = 40; // [1:300] +hd_space = 10; // [1:50] +hd_fan = 1; // [1,2] +hd_cooling = "fan_hex"; // [fan_open,fan_1,fan_2,fan_hex,custom] +hd_fan_size = 80; // [0,25,30,40,50,60,70,80,92] +hd_fan_position = 0; // [-50:300] + // case accessory group to load accessory_name = "none"; // ["none", "hk_uart", "nas", "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_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_ultimate", "h3_ultimate2", "show2_shell", "rpi5_m2hat", "rock5b", "adapter_mini-stx_m1s", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"] // sbc information text color @@ -359,10 +367,10 @@ 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 = pcb_width+2*(wallthick+gap)+case_offset_x; -depth = 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 : 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 = bottom_height+top_height; +case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position + (hd_bays * (hd_space + 26.1)-hd_space) : 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)); @@ -549,12 +557,6 @@ if (view == "platter") { if(case_design == "paper_split-top" || case_design == "paper_full-top") { case_folded(case_design); } - if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { - echo(Case_Width=width+2*sidethick,Depth=depth,Top=top_height,Bottom=bottom_height); - } - else { - echo(Case_Width=width,Depth=depth,Top=top_height,Bottom=bottom_height); - } } // model view @@ -661,6 +663,10 @@ if (view == "model") { translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } + for( i=[0:1:hd_bays-1]) { + translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,0]) hd35("portrait", [false,0,0,"default"]); + } } if(case_design == "stacked") { if(lower_bottom >= 0) { @@ -897,12 +903,6 @@ if (view == "model") { rotate([90, 0, 0]) text(str(sbc_data[s[0]][1][i]), 5, font = text_font); } } - if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { - echo(Case_Width=width+2*sidethick,Depth=depth,Top=top_height,Bottom=bottom_height); - } - else { - echo(Case_Width=width,Depth=depth,Top=top_height,Bottom=bottom_height); - } } //} // part @@ -1030,10 +1030,15 @@ if (view == "part") { } } } - if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { - echo(width=width+2*sidethick,depth=depth,top=top_height,bottom=bottom_height); +} +if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { + echo(width=width+2*sidethick,depth=depth,top=top_height,bottom=bottom_height); +} +else { + if(case_design == "panel_nas") { + echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height); } else { - echo(width=width,depth=depth,top=top_height,bottom=bottom_height); - } -} \ No newline at end of file + echo(width=width,depth=depth,top=top_height,bottom=bottom_height); + } +} diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 186e565..94f88cc 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -493,9 +493,6 @@ accessory_data = [ // NAS Case ["nas", - "model","hd35",-1,-67,148,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"], - "model","hd35",-1,-67,112,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"], - "model","hd35",-1,-67,76,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"], "model","hd35",-1,-67,40,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait"],[true,20,2,"both"]], // circuitsetup solar energy meter From 2e797dd1fbc0794c33d38dba94ae860038a12c19 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Tue, 8 Apr 2025 17:18:01 -0400 Subject: [PATCH 04/17] added top or bottom sbc mount with indents for panel_nas, other misc additions and changes --- mod/case_side.scad | 55 +++++++++++++++++++++++++++++++++---------- mod/case_top.scad | 34 ++++++++++++++++++++++---- sbc_case_builder.json | 14 +++++------ sbc_case_builder.scad | 22 ++++++++++------- 4 files changed, 93 insertions(+), 32 deletions(-) diff --git a/mod/case_side.scad b/mod/case_side.scad index 2f59664..9726e3e 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -165,13 +165,13 @@ module case_side(case_design, side) { cube([8.5,wallthick+2*adj,floorthick+.5]); translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); - if(hd_fan == 1 || hd_fan == 2) { - translate([-1+(101.6-hd_fan_size)/2,-1,bottom_height+pcb_tmaxz+hd_fan_position]) - rotate([90,0,0]) fan_mask(hd_fan_size, wallthick+2, hd_cooling); + if(rear_fan == 1 || rear_fan == 2) { + translate([-1+(101.6-rear_fan_size)/2,-1,bottom_height+pcb_tmaxz+rear_fan_position]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); } - if(hd_fan == 2) { - translate([-1+(101.6-hd_fan_size)/2,-1,bottom_height+pcb_tmaxz+hd_fan_position+3+hd_fan_size]) - rotate([90,0,0]) fan_mask(hd_fan_size, wallthick+2, hd_cooling); + if(rear_fan == 2) { + translate([-1+(101.6-rear_fan_size)/2,-1,bottom_height+pcb_tmaxz+rear_fan_position+3+rear_fan_size]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); } } } @@ -378,13 +378,37 @@ module case_side(case_design, side) { } } // sbc openings - if(sbc_highlight == true) { - #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj-adj]) - sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + if(case_design != "panel_nas") { + if(sbc_highlight == true) { + #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj-adj]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + else { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj-adj]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } } else { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj-adj]) - sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + if(nas_sbc_location == "top") { + if(sbc_highlight == true) { + #translate([pcb_loc_x ,pcb_loc_y,case_z-(top_height+pcb_loc_z+(2*floorthick))]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + else { + translate([pcb_loc_x ,pcb_loc_y,case_z-(top_height+pcb_loc_z+(2*floorthick))]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + } + if(nas_sbc_location == "bottom") { + if(sbc_highlight == true) { + #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + else { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + } } // indents if(indents == true) { @@ -405,9 +429,16 @@ module case_side(case_design, side) { 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) { + if(id == pcbid && case_design != "panel_nas") { indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); } + if(id == pcbid && case_design == "panel_nas" && nas_sbc_location == "bottom") { + indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + + } + if(id == pcbid && case_design == "panel_nas" && nas_sbc_location == "top") { + indent(loc_x, loc_y, case_z-(top_height+pcb_loc_z+(2*floorthick))+.5, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + } } } } diff --git a/mod/case_top.scad b/mod/case_top.scad index 827b1ea..e0352e0 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -839,13 +839,37 @@ module case_top(case_design) { } } // sbc openings - if(sbc_highlight == true) { - #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) - sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + if(case_design != "panel_nas") { + if(sbc_highlight == true) { + #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + else { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } } else { - translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) - sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + if(nas_sbc_location == "top") { + if(sbc_highlight == true) { + #translate([pcb_loc_x ,pcb_loc_y,case_z-(top_height+pcb_loc_z+(2*floorthick))]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + else { + translate([pcb_loc_x ,pcb_loc_y,case_z-(top_height+pcb_loc_z+(2*floorthick))]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + } + if(nas_sbc_location == "bottom") { + if(sbc_highlight == true) { + #translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, true); + } + else { + translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) + sbc(sbc_model, 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 dc30fbc..35efad8 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9685,13 +9685,9 @@ "gap": "1", "gpio_opening": "default", "hd_bays": "2", - "hd_cooling": "fan_hex", - "hd_fan": "1", - "hd_fan_position": "0", - "hd_fan_size": "80", "hd_space": "10", "hd_y_position": "25", - "hd_z_position": "40", + "hd_z_position": "10", "indents": "true", "individual_part": "bottom", "lower_bottom": "0", @@ -9751,12 +9747,16 @@ "multipcb_top_standoff_type": "blind", "multipcb_top_standoffs": "false", "nas_sbc_location": "top", - "pcb_loc_x": "8", + "pcb_loc_x": "0", "pcb_loc_y": "0", "pcb_loc_z": "0", "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_fan": "1", + "rear_fan_position": "-20", + "rear_fan_size": "80", "rear_io_shield": "false", - "sbc_bottom_standoffs": "true", + "sbc_bottom_standoffs": "false", "sbc_highlight": "false", "sbc_information": "false", "sbc_model": "m2", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 601fc18..192bfc1 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -83,7 +83,7 @@ case_offset_x = 0; //[0:.01:300] // additional y axis case size case_offset_y = 0; //[0:.01:300] // additional z axis case top size -case_offset_tz = 0; //[-10:.01:300] +case_offset_tz = 0; //[-30:.01:300] // additional z axis case bottom size case_offset_bz = 0; //[0:.01:300] // case wall thickness @@ -109,6 +109,12 @@ bottom_cover_pattern = "solid"; //[solid,hex_5mm,hex_8mm,linear_vertical,linear_ // heatsink opening cooling = "default"; // [default,none,open,fan_open,fan_1,fan_2,fan_hex,vent,vent_hex_5mm,vent_hex_8mm,custom] fan_size = 0; // [0,25,30,40,50,60,70,80,92] +// rear fan number for nas cases +rear_fan = 1; // [1,2] +// rear fan opening +rear_cooling = "fan_hex"; // [fan_open,fan_1,fan_2,fan_hex,custom] +rear_fan_size = 80; // [0,25,30,40,50,60,70,80,92] +rear_fan_position = 0; // [-50:300] /* [Bottom Access Panel] */ bottom_access_panel_enable = false; @@ -131,10 +137,6 @@ hd_bays = 2; // [1:6] hd_y_position = 25; // [1:300] hd_z_position = 40; // [1:300] hd_space = 10; // [1:50] -hd_fan = 1; // [1,2] -hd_cooling = "fan_hex"; // [fan_open,fan_1,fan_2,fan_hex,custom] -hd_fan_size = 80; // [0,25,30,40,50,60,70,80,92] -hd_fan_position = 0; // [-50:300] // case accessory group to load accessory_name = "none"; // ["none", "hk_uart", "nas", "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_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_ultimate", "h3_ultimate2", "show2_shell", "rpi5_m2hat", "rock5b", "adapter_mini-stx_m1s", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"] @@ -370,7 +372,7 @@ width = 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)-hd_space) : bottom_height+top_height; +case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position + (hd_bays * (hd_space + 26.1)) : 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)); @@ -659,9 +661,13 @@ if (view == "model") { if(move_leftside >= 0) { color("grey",1) translate([-move_leftside,0,0]) case_side(case_design,"left"); } - if(sbc_off == false) { + if(sbc_off == false && nas_sbc_location == "bottom") { translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); + } + if(sbc_off == false && nas_sbc_location == "top") { + translate([pcb_loc_x ,pcb_loc_y,case_z-(top_height+pcb_loc_z+(2*floorthick))+.5]) + sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } for( i=[0:1:hd_bays-1]) { translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) @@ -1036,7 +1042,7 @@ if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu } else { if(case_design == "panel_nas") { - echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height); + echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height, height=case_z+(2*wallthick)); } else { echo(width=width,depth=depth,top=top_height,bottom=bottom_height); From a999585197a248df975a7d7d8c3120a195e606c3 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 10 Apr 2025 21:59:03 -0400 Subject: [PATCH 05/17] added panel tabs and cutouts for case assembly --- mod/case_bottom.scad | 20 ++--- mod/case_side.scad | 190 ++++++++++++++++++++++++------------------ mod/case_top.scad | 30 +++---- sbc_case_builder.json | 4 +- sbc_case_builder.scad | 8 +- 5 files changed, 139 insertions(+), 113 deletions(-) diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index 15afb3e..e38f4de 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -64,16 +64,16 @@ module case_bottom(case_design) { } if(case_design == "panel_nas") { union() { - translate([-gap,-gap,0]) - cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(3*wallthick),floorthick]); - translate([(width*(1/5))-8-(wallthick+gap),depth-(3*wallthick)-gap-adj,0]) - cube([8,wallthick+2*adj,floorthick]); - translate([width-(width*(1/5))-(wallthick+gap),depth-(3*wallthick)-gap-adj,0]) - cube([8,wallthick+2*adj,floorthick]); - translate([(width*(1/5))-8-(wallthick+gap),-wallthick-gap+adj,0]) - cube([8,wallthick+2*adj,floorthick]); - translate([width-(width*(1/5))-(wallthick+gap),-wallthick-gap+adj,0]) - cube([8,wallthick+2*adj,floorthick]); + translate([-gap,-2*wallthick,0]) + cube([width-2*(gap+sidethick),depth-wallthick,wallthick]); + #translate([-gap-sidethick+(2*adj),depth-(3*wallthick)-gap-adj-20,0]) + cube([sidethick+(2*adj),10,floorthick]); + #translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-20,0]) + cube([sidethick+2*adj,10,floorthick]); + #translate([-gap-sidethick+(2*adj),40-wallthick-gap+adj,0]) + cube([sidethick+2*adj,10,floorthick]); + #translate([width-(3*sidethick)-adj,40-wallthick-gap+adj,0]) + cube([sidethick+2*adj,10,floorthick]); } } if(case_design == "stacked") { diff --git a/mod/case_side.scad b/mod/case_side.scad index 9726e3e..0ce74d7 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -132,39 +132,21 @@ module case_side(case_design, side) { if(side == "rear") { difference() { union() { - translate([-gap,-wallthick-gap,floorthick]) - cube([width-2*wallthick+(101.6-width+(2*wallthick)),wallthick,case_z-2*floorthick]); - // right hook - difference() { - translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),-wallthick-gap, - ((case_z)/2)-4]) - cube([(2*wallthick)+.5,wallthick,8]); - translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),-wallthick-gap-adj, - ((case_z)/2)-4-adj]) - cube([wallthick+.25,wallthick+(2*adj),4.25]); - } - // left hook - difference() { - translate([-(2*wallthick)-gap-adj-.25,-wallthick-gap, - ((case_z)/2)-4]) - cube([(2*wallthick)+.5,wallthick,8]); - translate([-wallthick-gap-adj-.25,-wallthick-gap-adj, - ((case_z)/2)-4-adj]) - cube([wallthick+.25,wallthick+(2*adj),4.25]); - } + translate([-gap,-(2*wallthick),floorthick]) + cube([width-2*sidethick,wallthick,case_z-2*wallthick]); + // bottom right tab + translate([width-(3*sidethick)-adj,-(2*wallthick),20]) + cube([sidethick+(2*adj),wallthick,10]); + // top right tab + translate([width-(3*sidethick)-adj,-(2*wallthick),case_z-30]) + cube([sidethick+(2*adj),wallthick,10]); + // bottom left tab + translate([-sidethick-gap-adj,-(2*wallthick),20]) + cube([sidethick+(2*adj),wallthick,10]); + // top left tab + translate([-sidethick-gap-adj,-(2*wallthick),case_z-30]) + cube([sidethick+(2*adj),wallthick,10]); } - // top slots - translate([(width*(1/5))-8.25-(wallthick+gap),-wallthick-gap-adj, - case_z-floorthick-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj, - case_z-floorthick-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); - // bottom slots - translate([(width*(1/5))-8.25-(wallthick+gap),-wallthick-gap-adj,-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([width-(width*(1/5))-(wallthick+gap)-.25,-wallthick-gap-adj,-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); if(rear_fan == 1 || rear_fan == 2) { translate([-1+(101.6-rear_fan_size)/2,-1,bottom_height+pcb_tmaxz+rear_fan_position]) rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); @@ -178,75 +160,119 @@ module case_side(case_design, side) { if(side == "front") { difference() { union() { - translate([-gap,depth-4*(wallthick)-gap,floorthick]) - cube([width-2*wallthick+(101.6-width+(2*wallthick)),wallthick,case_z-2*wallthick]); - // right hook - difference() { - translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),depth-3*(wallthick)-gap-adj, - ((case_z)/2)-4]) - cube([(2*wallthick)+.5,wallthick,8]); - translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)), - depth-3*(wallthick)-adj-gap-adj,((case_z)/2)-4-adj]) - cube([wallthick+.25,wallthick+(2*adj),4.25]); - } - // left hook - difference() { - translate([-(2*wallthick)-gap-adj-.25,depth-3*(wallthick)-gap-adj,( - (case_z)/2)-4]) - cube([(2*wallthick)+.5,wallthick,8]); - translate([-wallthick-gap-adj-.25,depth-3*(wallthick)-adj-gap-adj, - ((case_z)/2)-4-adj]) - cube([wallthick+.25,wallthick+(2*adj),4.25]); - } + translate([-gap,depth-(4*wallthick),floorthick]) + cube([width-2*wallthick+(101.6-width+(2*wallthick)),wallthick,case_z-3*wallthick]); + // bottom right tab + translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) + cube([sidethick+(2*adj),wallthick,10]); + // top right tab + translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-30]) + cube([sidethick+(2*adj),wallthick,10]); + // bottom left tab + translate([-sidethick-gap-adj,depth-(4*wallthick),20]) + cube([sidethick+(2*adj),wallthick,10]); + // top left tab + translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-30]) + cube([sidethick+(2*adj),wallthick,10]); } - // top slots - translate([(width*(1/5))-8.25-(wallthick+gap),depth-2*wallthick-gap-adj, - case_z-floorthick-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([width-(width*(1/5))-(wallthick+gap)-.25,depth-2*wallthick-gap-adj, - case_z-floorthick-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); - // bottom slots - translate([(width*(1/5))-8.25-(wallthick+gap),depth-2*wallthick-gap-adj,-.25]) - cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([width-(width*(1/5))-(wallthick+gap)-.25, - depth-2*wallthick-gap-adj,-.25]) cube([8.5,wallthick+2*adj,floorthick+.5]); - translate([-gap+8,depth-4*(wallthick)-gap,case_z-8]) rotate([-90,0,0]) - vent_hex((width)/3.5,(case_z-8)/6,wallthick+4,5,1.5,"horizontal"); + // hex vent + translate([-gap+3,depth-3*(wallthick)+gap,5]) + vent_hex(width/3.85,(case_z-6)/6,wallthick+4,5,1.5,"vertical"); } } if(side == "right") { difference() { -// translate([width-(2*wallthick)-gap+(101.6-width+(2*wallthick)),-(3*wallthick)-gap,-wallthick]) -// cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); - translate([width-gap+(101.6-width+sidethick),-(3*wallthick)-gap,-wallthick]) + translate([width-2*sidethick,-(3*wallthick)-gap,-wallthick]) rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+2*wallthick,sidethick],corner_fillet); - translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),-wallthick-gap-.25, - ((case_z)/2)]) cube([wallthick+2*adj,wallthick+.5,8.5]); - translate([width-(2*wallthick)-gap-adj+(101.6-width+(2*wallthick)),depth-2*(wallthick)-gap-.25, - ((case_z)/2)]) - cube([wallthick+2*adj,wallthick+.5,8.5]); + // rear edge top tab openings + translate([width-adj-(3*sidethick),-2*wallthick,case_z-30]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([width-adj-(3*sidethick),-(4*wallthick),case_z-20-tol]) + cube([sidethick+(2*adj),2*wallthick,10+tol]); + // rear edge bottom tab openings + translate([width-adj-(3*sidethick),-2*wallthick,20]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([width-adj-(3*sidethick),-(4*wallthick),30-tol]) + cube([sidethick+(2*adj),2*wallthick,10+tol]); + // front edge top tab openings + translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-30]) + cube([sidethick+(2*adj),wallthick,20]); + translate([width-(3*sidethick),depth-(4*wallthick),case_z-20-tol]) + cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + // front edge bottom tab openings + translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) + cube([sidethick+(2*adj),wallthick,20]); + translate([width-(3*sidethick),depth-(4*wallthick),30-tol]) + cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + + // hd holes for bays for( i=[0:1:hd_bays-1]) { translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } + + // top edge front tab openings + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),20,floorthick+tol]); + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30, + case_z-(2*floorthick)]) + cube([sidethick+2*adj,10+tol,(3*floorthick)+adj]); + // top edge rear tab openings + translate([width-(3*sidethick)-adj,40-wallthick-gap+adj, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),10,floorthick+tol]); + translate([width-(3*sidethick)-adj,30-wallthick-gap+adj, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); } } if(side == "left") { difference() { -// translate([-sidethick-gap,-(2*wallthick)-gap,-wallthick]) -// cube([wallthick,depth+2*wallthick,case_z+(2*wallthick)]); translate([-gap,-(3*wallthick)-gap,-wallthick]) - rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+2*wallthick,sidethick],corner_fillet); - translate([-wallthick-gap-adj,-wallthick-gap-.25,((case_z)/2)]) - cube([wallthick+2*adj,wallthick+.5,8.5]); - translate([-wallthick-gap-adj,depth-2*(wallthick)-gap-.25, - ((case_z)/2)]) - cube([wallthick+2*adj,wallthick+.5,8.5]); + rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+(2*wallthick),sidethick],corner_fillet); + // rear edge top tab openings + translate([-sidethick-gap-adj,-2*wallthick,case_z-30]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([-sidethick-gap-adj,-(4*wallthick),case_z-20-tol]) + cube([sidethick+(2*adj),2*wallthick,10+tol]); + // rear edge botom tab openings + translate([-sidethick-gap-adj,-2*wallthick,20]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([-sidethick-gap-adj,-(4*wallthick),30-tol]) + cube([sidethick+(2*adj),2*wallthick,10+tol]); + // front edge top tab openings + translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-30]) + cube([sidethick+(2*adj),wallthick,20]); + translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-20-tol]) + cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + // front edge bottom tab openings + translate([-sidethick-gap-adj,depth-(4*wallthick),20]) + cube([sidethick+(2*adj),wallthick,20]); + translate([-sidethick-gap-adj,depth-(4*wallthick),30-tol]) + cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + + // hd holes for bays for( i=[0:1:hd_bays-1]) { translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } + + // top edge front tab openings + translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),20,floorthick+tol]); + translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + // top edge rear tab openings + translate([-gap-sidethick-adj,40-wallthick-gap+adj, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),10,floorthick+tol]); + translate([-gap-sidethick-adj,30-wallthick-gap+adj, + case_z-(2*floorthick)]) + cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + } } } diff --git a/mod/case_top.scad b/mod/case_top.scad index e0352e0..328e4f0 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -72,21 +72,21 @@ module case_top(case_design) { } if(case_design == "panel_nas") { union() { - translate([-gap,-gap,case_z-2*wallthick]) - cube([width-(2*wallthick)+(101.6-width+(2*wallthick)),depth-(3*wallthick),wallthick]); -/* translate([(width*(1/5))-8-(wallthick+gap),depth-(2*wallthick)-gap-adj, - case_z-floorthick]) - cube([8,wallthick+2*adj,floorthick]); - translate([width-(width*(1/5))-(wallthick+gap),depth-(2*wallthick)-gap-adj, - case_z-floorthick]) - cube([8,wallthick+2*adj,floorthick]); - translate([(width*(1/5))-8-(wallthick+gap),-wallthick-gap+adj, - case_z-floorthick]) - cube([8,wallthick+2*adj,floorthick]); - translate([width-(width*(1/5))-(wallthick+gap),-wallthick-gap+adj, - case_z-floorthick]) - cube([8,wallthick+2*adj,floorthick]); -*/ } + translate([-gap,-wallthick,case_z-2*wallthick]) + cube([width-2*(gap+sidethick),depth-(2*wallthick),wallthick]); + translate([-gap-sidethick+(2*adj),depth-(3*wallthick)-gap-adj-20, + case_z-2*floorthick]) + cube([sidethick+(2*adj),10,floorthick]); + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-20, + case_z-2*floorthick]) + cube([sidethick+2*adj,10,floorthick]); + translate([-gap-sidethick+(2*adj),40-wallthick-gap+adj, + case_z-2*floorthick]) + cube([sidethick+2*adj,10,floorthick]); + translate([width-(3*sidethick)-adj,40-wallthick-gap+adj, + case_z-2*floorthick]) + cube([sidethick+2*adj,10,floorthick]); + } } if(case_design == "stacked") { translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap, diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 35efad8..9162578 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9688,7 +9688,7 @@ "hd_space": "10", "hd_y_position": "25", "hd_z_position": "10", - "indents": "true", + "indents": "false", "individual_part": "bottom", "lower_bottom": "0", "material_thickness": "0.5", @@ -9747,7 +9747,7 @@ "multipcb_top_standoff_type": "blind", "multipcb_top_standoffs": "false", "nas_sbc_location": "top", - "pcb_loc_x": "0", + "pcb_loc_x": "8", "pcb_loc_y": "0", "pcb_loc_z": "0", "raise_top": "0", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 192bfc1..ecb595e 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -368,11 +368,11 @@ 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 = 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) : 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)) : 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)); @@ -656,10 +656,10 @@ if (view == "model") { color("grey",1) translate([0,-move_rear,0]) case_side(case_design,"rear"); } if(move_rightside >= 0) { - color("grey",1) translate([move_rightside,0,0]) case_side(case_design,"right"); + color("dimgrey",1) translate([move_rightside,0,0]) case_side(case_design,"right"); } if(move_leftside >= 0) { - color("grey",1) translate([-move_leftside,0,0]) case_side(case_design,"left"); + color("dimgrey",1) translate([-move_leftside,0,0]) case_side(case_design,"left"); } if(sbc_off == false && nas_sbc_location == "bottom") { translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) From 3ce75a345b5185f6502c81028bbab8f3b3387e15 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sat, 12 Apr 2025 15:08:07 -0400 Subject: [PATCH 06/17] more case panel fastening work --- mod/case_bottom.scad | 12 +++++------ mod/case_side.scad | 50 ++++++++++++++++++++++++++++++++----------- sbc_case_builder.json | 2 +- sbc_case_builder.scad | 4 ++-- 4 files changed, 47 insertions(+), 21 deletions(-) diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index e38f4de..bcb891f 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -64,15 +64,15 @@ module case_bottom(case_design) { } if(case_design == "panel_nas") { union() { - translate([-gap,-2*wallthick,0]) - cube([width-2*(gap+sidethick),depth-wallthick,wallthick]); - #translate([-gap-sidethick+(2*adj),depth-(3*wallthick)-gap-adj-20,0]) + translate([-gap,-wallthick,0]) + cube([width-2*(gap+sidethick),depth-(2*wallthick),wallthick]); + translate([-gap-sidethick-(2*adj),depth-(3*wallthick)-gap-adj-20,0]) cube([sidethick+(2*adj),10,floorthick]); - #translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-20,0]) + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-20,0]) cube([sidethick+2*adj,10,floorthick]); - #translate([-gap-sidethick+(2*adj),40-wallthick-gap+adj,0]) + translate([-gap-sidethick-(2*adj),40-wallthick-gap+adj,0]) cube([sidethick+2*adj,10,floorthick]); - #translate([width-(3*sidethick)-adj,40-wallthick-gap+adj,0]) + translate([width-(3*sidethick)-adj,40-wallthick-gap+adj,0]) cube([sidethick+2*adj,10,floorthick]); } } diff --git a/mod/case_side.scad b/mod/case_side.scad index 0ce74d7..809fe02 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -132,8 +132,8 @@ module case_side(case_design, side) { if(side == "rear") { difference() { union() { - translate([-gap,-(2*wallthick),floorthick]) - cube([width-2*sidethick,wallthick,case_z-2*wallthick]); + translate([-gap,-(2*wallthick),0]) + cube([width-2*sidethick,wallthick,case_z-wallthick]); // bottom right tab translate([width-(3*sidethick)-adj,-(2*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); @@ -182,8 +182,8 @@ module case_side(case_design, side) { } if(side == "right") { difference() { - translate([width-2*sidethick,-(3*wallthick)-gap,-wallthick]) - rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+2*wallthick,sidethick],corner_fillet); + translate([width-2*sidethick,-(3*wallthick)-gap,-2*wallthick]) + rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+2*wallthick,sidethick],corner_fillet); // rear edge top tab openings translate([width-adj-(3*sidethick),-2*wallthick,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); @@ -211,26 +211,40 @@ module case_side(case_design, side) { rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } - // top edge front tab openings + // top edge front tab opening translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30, case_z-(2*floorthick)]) cube([sidethick+(2*adj),20,floorthick+tol]); - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30, + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30-tol, case_z-(2*floorthick)]) cube([sidethick+2*adj,10+tol,(3*floorthick)+adj]); - // top edge rear tab openings + + // top edge rear tab opening translate([width-(3*sidethick)-adj,40-wallthick-gap+adj, case_z-(2*floorthick)]) cube([sidethick+(2*adj),10,floorthick+tol]); - translate([width-(3*sidethick)-adj,30-wallthick-gap+adj, + translate([width-(3*sidethick)-adj,30-wallthick-gap+adj-tol, case_z-(2*floorthick)]) cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + + // bottom edge front tab opening + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30-tol,-tol]) + cube([sidethick+2*adj,20+tol,floorthick+tol]); + translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30-tol,-(3*floorthick)+adj]) + cube([sidethick+2*adj,10+tol,(3*floorthick)+adj]); + + // bottom edge rear tab opening + translate([width-(3*sidethick)-adj,30-wallthick-gap+adj-tol,-tol]) + cube([sidethick+2*adj,20+tol,floorthick+tol]); + translate([width-(3*sidethick)-adj,30-wallthick-gap+adj-tol,-(3*floorthick)+adj]) + cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + } } if(side == "left") { difference() { - translate([-gap,-(3*wallthick)-gap,-wallthick]) - rotate([0,-90,0]) slab([case_z+(2*wallthick),depth+(2*wallthick),sidethick],corner_fillet); + translate([-gap,-(3*wallthick)-gap,-2*wallthick]) + rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+(2*wallthick),sidethick],corner_fillet); // rear edge top tab openings translate([-sidethick-gap-adj,-2*wallthick,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); @@ -262,17 +276,29 @@ module case_side(case_design, side) { translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30, case_z-(2*floorthick)]) cube([sidethick+(2*adj),20,floorthick+tol]); - translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30, + translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30-tol, case_z-(2*floorthick)]) cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); // top edge rear tab openings translate([-gap-sidethick-adj,40-wallthick-gap+adj, case_z-(2*floorthick)]) cube([sidethick+(2*adj),10,floorthick+tol]); - translate([-gap-sidethick-adj,30-wallthick-gap+adj, + translate([-gap-sidethick-adj,30-wallthick-gap+adj-tol, case_z-(2*floorthick)]) cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + // bottom edge front tab openings + translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30,-tol]) + cube([sidethick+(2*adj),20,floorthick+tol]); + translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30-tol,-(2*floorthick)-adj]) + cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + + // bottom edge rear tab openings + translate([-gap-sidethick-adj,30-wallthick-gap+adj,-tol]) + cube([sidethick+(2*adj),20,floorthick+tol]); + translate([-gap-sidethick-adj,30-wallthick-gap+adj-tol,-(2*floorthick)-adj]) + cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + } } } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 9162578..f5d2288 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9748,7 +9748,7 @@ "multipcb_top_standoffs": "false", "nas_sbc_location": "top", "pcb_loc_x": "8", - "pcb_loc_y": "0", + "pcb_loc_y": "1", "pcb_loc_z": "0", "raise_top": "0", "rear_cooling": "fan_hex", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index ecb595e..7941791 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -644,7 +644,7 @@ if (view == "model") { } if(case_design == "panel_nas") { if(lower_bottom >= 0) { - color("dimgrey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); + color("grey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); } if(raise_top >= 0) { color("grey",1) translate([0,0,raise_top])case_top(case_design); @@ -1042,7 +1042,7 @@ if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu } else { if(case_design == "panel_nas") { - echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height, height=case_z+(2*wallthick)); + echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height, height=case_z+(3*wallthick)); } else { echo(width=width,depth=depth,top=top_height,bottom=bottom_height); From c151a9047bf012d7d3402206acf31d938eb0158d Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Sat, 12 Apr 2025 21:56:28 -0400 Subject: [PATCH 07/17] wide format sbc support and other changes --- lib/cable_holder.scad | 8 +- mod/case_bottom.scad | 10 +- mod/case_side.scad | 4 +- mod/case_top.scad | 10 +- sbc_case_builder.json | 212 ++++++++++++++++++++++++++++++++++++++++++ sbc_case_builder.scad | 8 +- 6 files changed, 233 insertions(+), 19 deletions(-) diff --git a/lib/cable_holder.scad b/lib/cable_holder.scad index fd0b78b..a2361ec 100644 --- a/lib/cable_holder.scad +++ b/lib/cable_holder.scad @@ -28,16 +28,16 @@ */ -module cableholder_spacer() { +module cableholder_spacer(size = [9.4,20,6]) { - size = [9.4,16,6]; +// size = [9.4,16,6]; $fn = 90; translate([0,size[2]/2,-5]) rotate([90,0,0]) difference() { translate([size[0]/2,size[0]/2,0]) rotate([0,0,90]) slot(size[0],size[1],size[2]); - translate([-1,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=12); + #translate([-1,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=12); translate([-1,7.5,-1]) cube([2,20,9]); - translate([5,9.5,-1]) rotate([0,0,90]) slot(4.5,11,9); + translate([5,9.5,-1]) rotate([0,0,90]) slot(4.5,13,9); translate([3,20,-1]) rotate([0,0,45]) cube([2,6,9]); } } diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index bcb891f..6c8f04f 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -512,21 +512,21 @@ echo(pcb_depth+case_offset_y-10); // bottom cover pattern if(bottom_cover_pattern != "solid") { if(bottom_cover_pattern == "hex_5mm") { - translate([1,0,-2]) vent_hex((width)/3.75,(depth)/6,floorthick+4,5,1.5,"horizontal"); + translate([1,0,-floorthick]) vent_hex((width)/3.75,(depth)/6,floorthick+4,5,1.5,"horizontal"); } if(bottom_cover_pattern == "hex_8mm") { - translate([1,2,-2]) vent_hex((width)/5.5,(depth)/9.5,floorthick+4,8,1.5,"horizontal"); + translate([1,2,-floorthick]) vent_hex((width)/5.5,(depth)/9.5,floorthick+4,8,1.5,"horizontal"); } if(bottom_cover_pattern == "linear_vertical") { - translate([0,-gap,-2]) vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); + translate([0,-gap,-floorthick]) 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,-2]) vent(width-2*wallthick-gap,wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); + translate([-gap,-gap,-floorthick]) 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,-4]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + translate([r,c,-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); } } } diff --git a/mod/case_side.scad b/mod/case_side.scad index 809fe02..dd608f4 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -161,7 +161,7 @@ module case_side(case_design, side) { difference() { union() { translate([-gap,depth-(4*wallthick),floorthick]) - cube([width-2*wallthick+(101.6-width+(2*wallthick)),wallthick,case_z-3*wallthick]); + cube([width-2*(gap+sidethick),wallthick,case_z-3*wallthick]); // bottom right tab translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); @@ -207,7 +207,7 @@ module case_side(case_design, side) { // hd holes for bays for( i=[0:1:hd_bays-1]) { - translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + translate([(width-101.6)-(3*sidethick)-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } diff --git a/mod/case_top.scad b/mod/case_top.scad index 328e4f0..ff3eed5 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -460,23 +460,23 @@ module case_top(case_design) { // top cover pattern if(top_cover_pattern != "solid") { if(top_cover_pattern == "hex_5mm") { - translate([1,0,case_z-2]) vent_hex((width)/3.75,(depth)/6,floorthick+4,5,1.5,"horizontal"); + translate([1,0,case_z-(2*floorthick)]) vent_hex((width)/3.75,(depth)/6,floorthick+4,5,1.5,"horizontal"); } if(top_cover_pattern == "hex_8mm") { - translate([1,2,case_z-2]) vent_hex((width)/5.5,(depth)/9.5,floorthick+4,8,1.5,"horizontal"); + translate([1,2,case_z-(2*floorthick)]) vent_hex((width)/5.5,(depth)/9.5,floorthick+4,8,1.5,"horizontal"); } if(top_cover_pattern == "linear_vertical") { - translate([0,-gap,case_z-2]) + translate([0,-gap,case_z-(2*floorthick)]) vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); } if(top_cover_pattern == "linear_horizontal") { - translate([-gap,-gap,case_z-2]) + translate([-gap,-gap,case_z-(2*floorthick)]) vent(width-2*wallthick-gap,wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); } if(top_cover_pattern == "astroid") { for(c=[3:12:depth-8]) { for(r=[4:12:width-8]) { - translate([r,c,case_z-4]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + translate([r,c,case_z-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); } } } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index f5d2288..6fe26f7 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9795,6 +9795,218 @@ "uart_opening": "default", "view": "model", "wallthick": "2" + }, + "h3_panel_nas": { + "$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": "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "0", + "case_offset_x": "0", + "case_offset_y": "10", + "cooling": "fan_hex", + "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": "80", + "flat_blank_section": "false", + "floorthick": "2", + "gap": "1", + "gpio_opening": "default", + "hd_bays": "2", + "hd_space": "10", + "hd_y_position": "25", + "hd_z_position": "10", + "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", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_fan": "1", + "rear_fan_position": "-50", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "false", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "h3+", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "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": "25", + "top_standoff_support_size": "10", + "top_standoff_type": "recessed", + "uart_opening": "default", + "view": "model", + "wallthick": "2" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 7941791..9ce23e9 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -368,7 +368,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) : 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+(3*gap) : 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; @@ -670,8 +670,10 @@ if (view == "model") { sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } for( i=[0:1:hd_bays-1]) { - translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,0]) hd35("portrait", [false,0,0,"default"]); +// translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) +// rotate([0,0,0]) hd35("portrait", [false,0,0,"default"]); + translate([-gap,-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,0]) cableholder_spacer(); } } if(case_design == "stacked") { From 53b242440fba9cf797b7951f50d1add1f368ba3f Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Mon, 14 Apr 2025 20:49:57 -0400 Subject: [PATCH 08/17] hd cableholder_spacer work, top cover adjustments, other changes --- lib/cable_holder.scad | 16 ++++++++++------ mod/case_bottom.scad | 6 +++--- mod/case_side.scad | 2 +- mod/case_top.scad | 15 +++++++++++++-- sbc_case_builder.scad | 16 ++++++++++++---- 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/lib/cable_holder.scad b/lib/cable_holder.scad index a2361ec..8ca9597 100644 --- a/lib/cable_holder.scad +++ b/lib/cable_holder.scad @@ -28,16 +28,20 @@ */ -module cableholder_spacer(size = [9.4,20,6]) { +module cableholder_spacer(length) { -// size = [9.4,16,6]; + size = [9.4,16,6]; + adj = .01; $fn = 90; translate([0,size[2]/2,-5]) rotate([90,0,0]) difference() { - translate([size[0]/2,size[0]/2,0]) rotate([0,0,90]) slot(size[0],size[1],size[2]); - #translate([-1,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=12); - translate([-1,7.5,-1]) cube([2,20,9]); - translate([5,9.5,-1]) rotate([0,0,90]) slot(4.5,13,9); + union() { + translate([size[0]/2,size[0]/2,0]) rotate([0,0,90]) long_slot(size[0],size[1],size[2]); + translate([-length,5,3]) rotate([0,90,0]) cylinder(d=6, h=length+1); + } + #translate([-length-adj,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=length+size[0]+adj); + translate([-1,8,-1]) cube([2,20,9]); + translate([5,9.5,-1]) rotate([0,0,90]) long_slot(4.5,11,9); translate([3,20,-1]) rotate([0,0,45]) cube([2,6,9]); } } diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index 6c8f04f..44f940e 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -512,13 +512,13 @@ echo(pcb_depth+case_offset_y-10); // bottom cover pattern if(bottom_cover_pattern != "solid") { if(bottom_cover_pattern == "hex_5mm") { - translate([1,0,-floorthick]) vent_hex((width)/3.75,(depth)/6,floorthick+4,5,1.5,"horizontal"); + translate([1,0,-floorthick]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); } if(bottom_cover_pattern == "hex_8mm") { - translate([1,2,-floorthick]) vent_hex((width)/5.5,(depth)/9.5,floorthick+4,8,1.5,"horizontal"); + translate([1,2,-floorthick]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); } if(bottom_cover_pattern == "linear_vertical") { - translate([0,-gap,-floorthick]) vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); + #translate([0,-gap,-floorthick]) 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]) vent(width-2*wallthick-gap,wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); diff --git a/mod/case_side.scad b/mod/case_side.scad index dd608f4..68a1fc2 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -268,7 +268,7 @@ module case_side(case_design, side) { // hd holes for bays for( i=[0:1:hd_bays-1]) { - translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + translate([-gap+adj,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); } diff --git a/mod/case_top.scad b/mod/case_top.scad index ff3eed5..25849de 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -460,10 +460,21 @@ module case_top(case_design) { // top cover pattern if(top_cover_pattern != "solid") { if(top_cover_pattern == "hex_5mm") { - translate([1,0,case_z-(2*floorthick)]) vent_hex((width)/3.75,(depth)/6,floorthick+4,5,1.5,"horizontal"); + if(case_design == "panel_nas") { + translate([6,5,case_z-(2*floorthick)]) vent_hex((width-10)/3.75,(depth-10)/6,floorthick+4,5,1.5,"horizontal"); + } + else { + translate([1,0,case_z-(2*floorthick)]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); + } } if(top_cover_pattern == "hex_8mm") { - translate([1,2,case_z-(2*floorthick)]) vent_hex((width)/5.5,(depth)/9.5,floorthick+4,8,1.5,"horizontal"); + + if(case_design == "panel_nas") { + translate([2,5,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + } + else { + translate([1,2,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + } } if(top_cover_pattern == "linear_vertical") { translate([0,-gap,case_z-(2*floorthick)]) diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 9ce23e9..e66633f 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -670,10 +670,18 @@ if (view == "model") { sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } for( i=[0:1:hd_bays-1]) { -// translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) -// rotate([0,0,0]) hd35("portrait", [false,0,0,"default"]); - translate([-gap,-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,0]) cableholder_spacer(); + translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,0]) hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4,28.5-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+6+(hd_space+27.1)*i]) + rotate([0,0,0]) cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4,-31-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+6+(hd_space+27.1)*i]) + rotate([0,0,0]) cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4,-73-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+6+(hd_space+27.1)*i]) + rotate([0,0,0]) cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + } } } if(case_design == "stacked") { From f5793ea453b55e1250c99e76445bc55ee8dc8e88 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 17 Apr 2025 15:53:56 -0400 Subject: [PATCH 09/17] variable length spacer placement and hd reverse, 180 z rotation, implemented --- lib/cable_holder.scad | 2 +- mod/case_side.scad | 85 +++++++++++--- sbc_case_builder.json | 251 +++++++++++++++++++++++++++++++++++++++--- sbc_case_builder.scad | 65 ++++++++--- 4 files changed, 352 insertions(+), 51 deletions(-) diff --git a/lib/cable_holder.scad b/lib/cable_holder.scad index 8ca9597..77a6be0 100644 --- a/lib/cable_holder.scad +++ b/lib/cable_holder.scad @@ -39,7 +39,7 @@ module cableholder_spacer(length) { translate([size[0]/2,size[0]/2,0]) rotate([0,0,90]) long_slot(size[0],size[1],size[2]); translate([-length,5,3]) rotate([0,90,0]) cylinder(d=6, h=length+1); } - #translate([-length-adj,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=length+size[0]+adj); + translate([-length-adj,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=length+size[0]+adj); translate([-1,8,-1]) cube([2,20,9]); translate([5,9.5,-1]) rotate([0,0,90]) long_slot(4.5,11,9); translate([3,20,-1]) rotate([0,0,45]) cube([2,6,9]); diff --git a/mod/case_side.scad b/mod/case_side.scad index 68a1fc2..cd695d6 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -148,11 +148,11 @@ module case_side(case_design, side) { cube([sidethick+(2*adj),wallthick,10]); } if(rear_fan == 1 || rear_fan == 2) { - translate([-1+(101.6-rear_fan_size)/2,-1,bottom_height+pcb_tmaxz+rear_fan_position]) + translate([-1+(101.6-rear_fan_size)/2,-1,rear_fan_position]) rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); } if(rear_fan == 2) { - translate([-1+(101.6-rear_fan_size)/2,-1,bottom_height+pcb_tmaxz+rear_fan_position+3+rear_fan_size]) + translate([-1+(101.6-rear_fan_size)/2,-1,rear_fan_position+3+rear_fan_size]) rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); } } @@ -175,42 +175,80 @@ module case_side(case_design, side) { translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,10]); } - // hex vent - translate([-gap+3,depth-3*(wallthick)+gap,5]) - vent_hex(width/3.85,(case_z-6)/6,wallthick+4,5,1.5,"vertical"); + + // front cover pattern + if(front_cover_pattern != "solid" && case_design == "panel_nas") { + if(front_cover_pattern == "hex_5mm") { + translate([-gap+4,depth-3*(wallthick)+gap,5]) + vent_hex(width/3.85,(case_z-6)/6,wallthick+4,5,1.5,"vertical"); + } + if(front_cover_pattern == "hex_8mm") { + translate([-gap+5,depth-3*(wallthick)+gap,5]) + vent_hex(width/5.5,(case_z-6)/9,floorthick+4,8,1.5,"vertical"); + } +// vent(width, length, height, gap, rows, columns, orientation) + if(front_cover_pattern == "linear_vertical") { + translate([-gap+4,depth-3*(wallthick)+gap,5]) + vent(wallthick,(case_z-2*(wallthick+gap)-20)/2,floorthick+4,1,2,(width-2*(wallthick+gap+sidethick))/4.2,"vertical"); + } + if(front_cover_pattern == "linear_horizontal") { + translate([-gap+4,depth-3*(wallthick)+gap,5]) + vent(width-2*(wallthick+gap+sidethick)-4,wallthick,floorthick+4,1,(case_z-2*(wallthick+gap)-10)/3,1,"vertical"); + } + if(front_cover_pattern == "astroid") { + for(c=[3:12:depth-8]) { + for(r=[4:12:width-8]) { + translate([r,c,case_z-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + } + } + } + } } } if(side == "right") { difference() { translate([width-2*sidethick,-(3*wallthick)-gap,-2*wallthick]) rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+2*wallthick,sidethick],corner_fillet); + // rear edge top tab openings translate([width-adj-(3*sidethick),-2*wallthick,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); translate([width-adj-(3*sidethick),-(4*wallthick),case_z-20-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); + // rear edge bottom tab openings translate([width-adj-(3*sidethick),-2*wallthick,20]) cube([sidethick+2*adj,wallthick+tol,20]); translate([width-adj-(3*sidethick),-(4*wallthick),30-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); + // front edge top tab openings translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,20]); translate([width-(3*sidethick),depth-(4*wallthick),case_z-20-tol]) - cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick,10+tol]); + // front edge bottom tab openings translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) cube([sidethick+(2*adj),wallthick,20]); translate([width-(3*sidethick),depth-(4*wallthick),30-tol]) - cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick,10+tol]); // hd holes for bays - for( i=[0:1:hd_bays-1]) { - translate([(width-101.6)-(3*sidethick)-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); + if(hd_reverse == false) { + for( i=[0:1:hd_bays-1]) { + translate([(width-101.6)-(3*sidethick)-gap, + -(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + hd_holes(3.5, "portrait", "both", sidethick+2); + } + } + else { + for( i=[0:1:hd_bays-1]) { + translate([width-(3*sidethick)-adj,-(3*wallthick)-gap+hd_y_position+147, + hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,180]) hd_holes(3.5, "portrait", "both", sidethick+2); + } } - // top edge front tab opening translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30, case_z-(2*floorthick)]) @@ -245,33 +283,46 @@ module case_side(case_design, side) { difference() { translate([-gap,-(3*wallthick)-gap,-2*wallthick]) rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+(2*wallthick),sidethick],corner_fillet); + // rear edge top tab openings translate([-sidethick-gap-adj,-2*wallthick,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),case_z-20-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); + // rear edge botom tab openings translate([-sidethick-gap-adj,-2*wallthick,20]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),30-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); + // front edge top tab openings translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,20]); translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-20-tol]) - cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick,10+tol]); + // front edge bottom tab openings translate([-sidethick-gap-adj,depth-(4*wallthick),20]) cube([sidethick+(2*adj),wallthick,20]); translate([-sidethick-gap-adj,depth-(4*wallthick),30-tol]) - cube([sidethick+(2*adj)-adj,3*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick,10+tol]); // hd holes for bays - for( i=[0:1:hd_bays-1]) { - translate([-gap+adj,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); + if(hd_reverse == false) { + for( i=[0:1:hd_bays-1]) { + translate([-gap+adj,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); + } } - + else { + for( i=[0:1:hd_bays-1]) { + translate([101.6-gap+adj,-(3*wallthick)-gap+hd_y_position+147, + hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,180]) hd_holes(3.5, "portrait", "both", sidethick+2); + } + } + // top edge front tab openings translate([-gap-sidethick-adj,depth-(3*wallthick)-gap-adj-30, case_z-(2*floorthick)]) diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 6fe26f7..7678a74 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9584,7 +9584,7 @@ "view": "model", "wallthick": "2" }, - "m2_panel_nas": { + "hc4_panel_nas": { "$fn": "90", "access_panel_location": "[10, 15]", "access_panel_orientation": "landscape", @@ -9623,7 +9623,7 @@ "bottom_standoff_type": "countersunk", "case_design": "panel_nas", "case_offset_bz": "0", - "case_offset_tz": "0", + "case_offset_tz": "-30", "case_offset_x": "0", "case_offset_y": "0", "cooling": "default", @@ -9682,12 +9682,13 @@ "fan_size": "0", "flat_blank_section": "false", "floorthick": "2", + "front_cover_pattern": "hex_5mm", "gap": "1", "gpio_opening": "default", "hd_bays": "2", "hd_space": "10", - "hd_y_position": "25", - "hd_z_position": "10", + "hd_y_position": "40", + "hd_z_position": "55", "indents": "false", "individual_part": "bottom", "lower_bottom": "0", @@ -9746,22 +9747,22 @@ "multipcb_top_standoff_support_size": "7", "multipcb_top_standoff_type": "blind", "multipcb_top_standoffs": "false", - "nas_sbc_location": "top", - "pcb_loc_x": "8", - "pcb_loc_y": "1", + "nas_sbc_location": "bottom", + "pcb_loc_x": "0", + "pcb_loc_y": "0", "pcb_loc_z": "0", "raise_top": "0", "rear_cooling": "fan_hex", "rear_fan": "1", - "rear_fan_position": "-20", + "rear_fan_position": "42", "rear_fan_size": "80", "rear_io_shield": "false", - "sbc_bottom_standoffs": "false", + "sbc_bottom_standoffs": "true", "sbc_highlight": "false", "sbc_information": "false", - "sbc_model": "m2", + "sbc_model": "hc4", "sbc_off": "false", - "sbc_top_standoffs": "true", + "sbc_top_standoffs": "false", "sidethick": "3", "standard_motherboard_thickness": "0", "text_color": "Green", @@ -9792,7 +9793,7 @@ "top_standoff_support_height": "4", "top_standoff_support_size": "10", "top_standoff_type": "countersunk", - "uart_opening": "default", + "uart_opening": "none", "view": "model", "wallthick": "2" }, @@ -9837,7 +9838,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "10", + "case_offset_y": "25", "cooling": "fan_hex", "corner_fillet": "3", "edge_fillet": "0", @@ -9894,12 +9895,14 @@ "fan_size": "80", "flat_blank_section": "false", "floorthick": "2", + "front_cover_pattern": "hex_5mm", "gap": "1", - "gpio_opening": "default", + "gpio_opening": "none", "hd_bays": "2", + "hd_reverse": "true", "hd_space": "10", - "hd_y_position": "25", - "hd_z_position": "10", + "hd_y_position": "16", + "hd_z_position": "7", "indents": "false", "individual_part": "bottom", "lower_bottom": "0", @@ -9965,7 +9968,7 @@ "raise_top": "0", "rear_cooling": "fan_hex", "rear_fan": "1", - "rear_fan_position": "-50", + "rear_fan_position": "4", "rear_fan_size": "80", "rear_io_shield": "false", "sbc_bottom_standoffs": "false", @@ -10007,6 +10010,220 @@ "uart_opening": "default", "view": "model", "wallthick": "2" + }, + "h4_panel_nas": { + "$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": "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": "panel_nas", + "case_offset_bz": "6", + "case_offset_tz": "0", + "case_offset_x": "0", + "case_offset_y": "20", + "cooling": "fan_hex", + "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": "80", + "flat_blank_section": "false", + "floorthick": "2", + "front_cover_pattern": "hex_5mm", + "gap": "1", + "gpio_opening": "none", + "hd_bays": "4", + "hd_reverse": "true", + "hd_space": "10", + "hd_y_position": "16", + "hd_z_position": "10", + "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", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_fan": "2", + "rear_fan_position": "4", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "false", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "h4+", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "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": "10", + "top_standoff_support_size": "10", + "top_standoff_type": "recessed", + "uart_opening": "default", + "view": "model", + "wallthick": "2" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index e66633f..b8499ce 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -88,9 +88,9 @@ case_offset_tz = 0; //[-30:.01:300] case_offset_bz = 0; //[0:.01:300] // case wall thickness wallthick = 2; //[1:.01:5] -// case floor thickness +// case floor and ceiling thickness floorthick = 2; //[1:.01:5] -// side wall thickness for tray_side cases only +// side wall thickness for tray_side and panel_nas cases only sidethick = 2; //[1:.01:5] // distance between pcb and case gap = 1; //[.5:.01:5] @@ -104,17 +104,19 @@ tol = .25; //[-.5:.0625:.5] /* [Fan and Vent Openings] */ // top cover pattern top_cover_pattern = "solid"; //[solid,hex_5mm,hex_8mm,linear_vertical,linear_horizontal,astroid] +// front cover pattern for nas cases +front_cover_pattern = "solid"; //[solid,hex_5mm,hex_8mm,linear_vertical,linear_horizontal,astroid] // bottom cover pattern bottom_cover_pattern = "solid"; //[solid,hex_5mm,hex_8mm,linear_vertical,linear_horizontal,astroid] // heatsink opening cooling = "default"; // [default,none,open,fan_open,fan_1,fan_2,fan_hex,vent,vent_hex_5mm,vent_hex_8mm,custom] fan_size = 0; // [0,25,30,40,50,60,70,80,92] // rear fan number for nas cases -rear_fan = 1; // [1,2] +rear_fan = 1; // [1:2] // rear fan opening rear_cooling = "fan_hex"; // [fan_open,fan_1,fan_2,fan_hex,custom] rear_fan_size = 80; // [0,25,30,40,50,60,70,80,92] -rear_fan_position = 0; // [-50:300] +rear_fan_position = 0; // [0:1:300] /* [Bottom Access Panel] */ bottom_access_panel_enable = false; @@ -132,10 +134,12 @@ uart_opening = "default"; // [default,none,open,knockout] indents = true; // nas sbc location nas_sbc_location = "top"; // ["top","bottom"] +// rotate hd 180 degrees in the z-axis +hd_reverse = false; // [true, false] // number of nas drive bays hd_bays = 2; // [1:6] -hd_y_position = 25; // [1:300] -hd_z_position = 40; // [1:300] +hd_y_position = 25; // [0:300] +hd_z_position = 40; // [0:300] hd_space = 10; // [1:50] // case accessory group to load @@ -665,22 +669,51 @@ if (view == "model") { translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } - if(sbc_off == false && nas_sbc_location == "top") { + if(sbc_off == false && nas_sbc_location == "top") { translate([pcb_loc_x ,pcb_loc_y,case_z-(top_height+pcb_loc_z+(2*floorthick))+.5]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } for( i=[0:1:hd_bays-1]) { - translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,0]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4,28.5-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+6+(hd_space+27.1)*i]) - rotate([0,0,0]) cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + if(hd_reverse == false) { + translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, + 28.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4,-31-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+6+(hd_space+27.1)*i]) - rotate([0,0,0]) cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, + -31-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4,-73-(3*wallthick)-gap+hd_y_position+101.6,hd_z_position+6+(hd_space+27.1)*i]) - rotate([0,0,0]) cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, + -73-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + } + } + else { + translate([-gap+101.6,-(3*wallthick)-gap+hd_y_position+147, + hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, + 17-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, + -25-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + + translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, + -84.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + } } } } From 2eea918f4f297a9812763083859fd3a9c2e434aa Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 17 Apr 2025 17:16:48 -0400 Subject: [PATCH 10/17] implemented hd_holes() hole or slot openings for 2.5 and 3.5 drives --- README.md | 1 + lib/hd.scad | 200 +++++++++++++++++++++++++++++++++++++++------------ mod/sub.scad | 2 +- 3 files changed, 157 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 8339301..b51012b 100644 --- a/README.md +++ b/README.md @@ -1076,6 +1076,7 @@ DESCRIPTION: creates hard drive holes for 2.5 and 3.5 drives in various orientat data[1] = "portrait", "landscape" data[2] = "left", "right", "both", "bottom", "all" data[3] = floor thickness + data[4] = "hole", "slot" mask[0] = false, not used mask[1] = length mask[2] = set back diff --git a/lib/hd.scad b/lib/hd.scad index 96cce3e..2fc10b6 100644 --- a/lib/hd.scad +++ b/lib/hd.scad @@ -22,7 +22,7 @@ hdd35_25holder(length) hd35_tab(side) hd35_vtab(side) - hd_bottom_holes(hd, orientation, side, thick) + hd_bottom_holes(hd, orientation, side, thick, holetype) hd_mount(hd, orientation, position, side) */ @@ -614,21 +614,25 @@ module hd35_vtab(side) { DESCRIPTION: creates 2.5" and 3.5" hard drive hole mask for mounting TODO: none - USAGE: hd_holes(hd, orientation, side, thick) + USAGE: hd_holes(hd, orientation, side, thick, holetype) hd = 2.5, 3.5 orientation = "portrait", "landscape" side = "left", "right", "both", "bottom", "all" thick = floor thickness + holetype = "hole", "slot" */ -module hd_holes(hd, orientation, side, thick) { +module hd_holes(hd=3.5, orientation="portrait", side="all", thick=2, holetype="slot") { hd25_x = 100; hd25_y = 69.85; hd35_x = 147; hd35_y = 101.6; hd35_z = 26.1; + hole_size = 3.2; + hole_len = 3 * hole_size; + slot_size = [hole_size, hole_len, thick]; adj = .01; $fn = 90; @@ -636,35 +640,83 @@ module hd_holes(hd, orientation, side, thick) { if(orientation == "portrait") { translate([0,hd25_x,0]) rotate([0,0,270]) union() { if(side == "left" || side == "both" || side == "all") { - translate([9.4,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); - translate([86,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([9.4,-thick,3]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + translate([86,-thick,3]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([9.4-(1.5*hole_size),-thick,3]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),-thick,3]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "right" || side == "both" || side == "all") { - translate([9.4,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); - translate([86,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([9.4,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + translate([86,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([9.4-(1.5*hole_size),hd25_y+thick,3]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),hd25_y+thick,3]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "bottom" || side == "all") { - translate([9.4,4.07,0]) cylinder(d=3.6,h=thick); - translate([86,4.07,0]) cylinder(d=3.6,h=thick); - translate([86,65.79,0]) cylinder(d=3.6,h=thick); - translate([9.4,65.79,0]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([9.4,4.07,0]) cylinder(d=hole_size,h=thick); + translate([86,4.07,0]) cylinder(d=hole_size,h=thick); + translate([86,65.79,0]) cylinder(d=hole_size,h=thick); + translate([9.4,65.79,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([9.4-(1.5*hole_size),4.07,0]) slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),4.07,0]) slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),65.79,0]) slot(hole_size, hole_len, thick); + translate([9.4-(1.5*hole_size),65.79,0]) slot(hole_size, hole_len, thick); + } } } } if(orientation == "landscape") { if(side == "left" || side == "both" || side == "all") { - translate([9.4,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); - translate([86,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([9.4,-thick,3]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + translate([86,-thick,3]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([9.4-(1.5*hole_size),-thick,3]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),-thick,3]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "right" || side == "both" || side == "all") { - translate([9.4,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); - translate([86,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([9.4,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + translate([86,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([9.4-(1.5*hole_size),hd25_y+thick,3]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),hd25_y+thick,3]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "bottom" || side == "all") { - translate([9.4,4.07,-thick]) cylinder(d=3.6,h=thick); - translate([86,4.07,-thick]) cylinder(d=3.6,h=thick); - translate([86,65.79,-thick]) cylinder(d=3.6,h=thick); - translate([9.4,65.79,-thick]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([9.4,4.07,-thick]) cylinder(d=hole_size,h=thick); + translate([86,4.07,-thick]) cylinder(d=hole_size,h=thick); + translate([86,65.79,-thick]) cylinder(d=hole_size,h=thick); + translate([9.4,65.79,-thick]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([9.4-(1.5*hole_size),4.07,-thick]) slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),4.07,-thick]) slot(hole_size, hole_len, thick); + translate([86-(1.5*hole_size),65.79,-thick]) slot(hole_size, hole_len, thick); + translate([9.4-(1.5*hole_size),65.79,-thick]) slot(hole_size, hole_len, thick); + } } } } @@ -672,45 +724,103 @@ module hd_holes(hd, orientation, side, thick) { if(orientation == "portrait") { translate([0,hd35_x,0]) rotate([0,0,270]) union() { if(side == "left" || side == "both" || side == "all") { - translate([16.9,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); - translate([76.6,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); - translate([118.5,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + if(holetype == "hole") { + translate([16.9,-thick,6.35]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + translate([76.6,-thick,6.35]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + translate([118.5,-thick,6.35]) rotate([270,0,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([16.9-(1.5*hole_size),-thick,6.35]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + translate([76.6-(1.5*hole_size),-thick,6.35]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + translate([118.5-(1.5*hole_size),-thick,6.35]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "right" || side == "both" || side == "all") { - translate([118.5,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); - translate([76.6,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); - translate([16.9,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + if(holetype == "hole") { + translate([118.5,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + translate([76.6,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + translate([16.9,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([118.5-(1.5*hole_size),hd35_y+thick,6.35]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + translate([76.6-(1.5*hole_size),hd35_y+thick,6.35]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + translate([16.9-(1.5*hole_size),hd35_y+thick,6.35]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "bottom" || side == "all") { - // landscape 3.5" bottom screw holes - translate([29.52,3.18,0]) cylinder(d=3.6,h=thick); - translate([61.27,3.18,0]) cylinder(d=3.6,h=thick); - translate([105.72,3.18,0]) cylinder(d=3.6,h=thick); - translate([29.52,98.43,0]) cylinder(d=3.6,h=thick); - translate([61.27,98.43,0]) cylinder(d=3.6,h=thick); - translate([105.72,98.43,0]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([29.52,3.18,0]) cylinder(d=hole_size,h=thick); + translate([61.27,3.18,0]) cylinder(d=hole_size,h=thick); + translate([105.72,3.18,0]) cylinder(d=hole_size,h=thick); + translate([29.52,98.43,0]) cylinder(d=hole_size,h=thick); + translate([61.27,98.43,0]) cylinder(d=hole_size,h=thick); + translate([105.72,98.43,0]) cylinder(d=hole_size,h=thick); + } + if(holetype == "slot") { + translate([29.52-(1.5*hole_size),3.18,0]) slot(hole_size, hole_len, thick); + translate([61.27-(1.5*hole_size),3.18,0]) slot(hole_size, hole_len, thick); + translate([105.72-(1.5*hole_size),3.18,0]) slot(hole_size, hole_len, thick); + translate([29.52-(1.5*hole_size),98.43,0]) slot(hole_size, hole_len, thick); + translate([61.27-(1.5*hole_size),98.43,0]) slot(hole_size, hole_len, thick); + translate([105.72-(1.5*hole_size),98.43,0]) slot(hole_size, hole_len, thick); + } } } } if(orientation == "landscape") { if(side == "left" || side == "both" || side == "all") { - translate([16.9,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); - translate([76.6,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); - translate([118.5,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + if(holetype == "hole") { + translate([16.9,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + translate([76.6,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + translate([118.5,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + } + if(holetype == "slot") { + translate([16.9-(1.5*hole_size),-thick,6.35]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + translate([76.6-(1.5*hole_size),-thick,6.35]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + translate([118.5-(1.5*hole_size),-thick,6.35]) rotate([270,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "right" || side == "both" || side == "all") { - translate([118.5,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); - translate([76.6,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); - translate([16.9,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + if(holetype == "hole") { + translate([118.5,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + translate([76.6,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + translate([16.9,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + } + if(holetype == "slot") { + translate([118.5-(1.5*hole_size),hd35_y+thick,6.35]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + translate([76.6-(1.5*hole_size),hd35_y+thick,6.35]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + translate([16.9-(1.5*hole_size),hd35_y+thick,6.35]) rotate([90,0,0]) + slot(hole_size, hole_len, thick); + } } if(side == "bottom" || side == "all") { - // landscape 3.5" bottom screw holes - translate([29.52,3.18,-thick]) cylinder(d=3.6,h=thick); - translate([61.27,3.18,-thick]) cylinder(d=3.6,h=thick); - translate([105.72,3.18,-thick]) cylinder(d=3.6,h=thick); - translate([29.52,98.43,-thick]) cylinder(d=3.6,h=thick); - translate([61.27,98.43,-thick]) cylinder(d=3.6,h=thick); - translate([105.72,98.43,-thick]) cylinder(d=3.6,h=thick); + if(holetype == "hole") { + translate([29.52,3.18,-thick]) cylinder(d=3.6,h=thick); + translate([61.27,3.18,-thick]) cylinder(d=3.6,h=thick); + translate([105.72,3.18,-thick]) cylinder(d=3.6,h=thick); + translate([29.52,98.43,-thick]) cylinder(d=3.6,h=thick); + translate([61.27,98.43,-thick]) cylinder(d=3.6,h=thick); + translate([105.72,98.43,-thick]) cylinder(d=3.6,h=thick); + } + if(holetype == "slot") { + translate([29.52-(1.5*hole_size),3.18,-thick]) slot(hole_size, hole_len, thick); + translate([61.27-(1.5*hole_size),3.18,-thick]) slot(hole_size, hole_len, thick); + translate([105.72-(1.5*hole_size),3.18,-thick]) slot(hole_size, hole_len, thick); + translate([29.52-(1.5*hole_size),98.43,-thick]) slot(hole_size, hole_len, thick); + translate([61.27-(1.5*hole_size),98.43,-thick]) slot(hole_size, hole_len, thick); + translate([105.72-(1.5*hole_size),98.43,-thick]) slot(hole_size, hole_len, thick); + } } } } diff --git a/mod/sub.scad b/mod/sub.scad index d54e731..61bfe4c 100644 --- a/mod/sub.scad +++ b/mod/sub.scad @@ -55,7 +55,7 @@ module sub(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) { translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_mask(size_x, size_z, data[0]); } if(type == "hd_holes") { - translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[1],data[2],data[3]); + translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[1],data[2],data[3],data[4]); } if(type == "knockout") { translate([loc_x,loc_y,loc_z]) rotate(rotation) knockout(size_x,size_y,data[0],size_z,data[1],data[2]); From 5d0242ff1c9de68f561fc4f780c8072a33eac793 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 17 Apr 2025 21:40:52 -0400 Subject: [PATCH 11/17] for sbc wider then 100mm, added option to center hd positions on x axis using dual spacers --- mod/case_side.scad | 21 +++++-- sbc_case_builder.json | 8 +++ sbc_case_builder.scad | 132 ++++++++++++++++++++++++++++++++---------- 3 files changed, 126 insertions(+), 35 deletions(-) diff --git a/mod/case_side.scad b/mod/case_side.scad index cd695d6..c71947d 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -148,12 +148,25 @@ module case_side(case_design, side) { cube([sidethick+(2*adj),wallthick,10]); } if(rear_fan == 1 || rear_fan == 2) { - translate([-1+(101.6-rear_fan_size)/2,-1,rear_fan_position]) - rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); + if(rear_fan_center == false) { + translate([-1+(101.6-rear_fan_size)/2,-1,rear_fan_position]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); + } + if(rear_fan_center == true) { + translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2,-1,rear_fan_position]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); + } } if(rear_fan == 2) { - translate([-1+(101.6-rear_fan_size)/2,-1,rear_fan_position+3+rear_fan_size]) - rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); + if(rear_fan_center == false) { + translate([-1+(101.6-rear_fan_size)/2,-1,rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); + } + if(rear_fan_center == true) { + translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, + -1,rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick+2, rear_cooling); + } } } } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 7678a74..2731676 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9686,6 +9686,7 @@ "gap": "1", "gpio_opening": "default", "hd_bays": "2", + "hd_reverse": "false", "hd_space": "10", "hd_y_position": "40", "hd_z_position": "55", @@ -9753,7 +9754,9 @@ "pcb_loc_z": "0", "raise_top": "0", "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", "rear_fan": "1", + "rear_fan_center": "false", "rear_fan_position": "42", "rear_fan_size": "80", "rear_io_shield": "false", @@ -9967,7 +9970,9 @@ "pcb_loc_z": "0", "raise_top": "0", "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", "rear_fan": "1", + "rear_fan_center": "false", "rear_fan_position": "4", "rear_fan_size": "80", "rear_io_shield": "false", @@ -10113,6 +10118,7 @@ "gap": "1", "gpio_opening": "none", "hd_bays": "4", + "hd_center": "true", "hd_reverse": "true", "hd_space": "10", "hd_y_position": "16", @@ -10181,7 +10187,9 @@ "pcb_loc_z": "0", "raise_top": "0", "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "4", "rear_fan": "2", + "rear_fan_center": "true", "rear_fan_position": "4", "rear_fan_size": "80", "rear_io_shield": "false", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index b8499ce..49af5bd 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -113,10 +113,13 @@ cooling = "default"; // [default,none,open,fan_open,fan_1,fan_2,fan_hex,vent,ven fan_size = 0; // [0,25,30,40,50,60,70,80,92] // rear fan number for nas cases rear_fan = 1; // [1:2] +// rear fan x-axis center +rear_fan_center = false; // [true,false] // rear fan opening rear_cooling = "fan_hex"; // [fan_open,fan_1,fan_2,fan_hex,custom] rear_fan_size = 80; // [0,25,30,40,50,60,70,80,92] rear_fan_position = 0; // [0:1:300] +rear_dualfan_spacing = 6; // [0:1:50] /* [Bottom Access Panel] */ bottom_access_panel_enable = false; @@ -136,6 +139,8 @@ indents = true; nas_sbc_location = "top"; // ["top","bottom"] // rotate hd 180 degrees in the z-axis hd_reverse = false; // [true, false] +// center hd in the x-axis +hd_center = false; // [true, false] // number of nas drive bays hd_bays = 2; // [1:6] hd_y_position = 25; // [0:300] @@ -379,6 +384,7 @@ bottom_height = (case_design == "tray" || case_design == "tray_vu5" || case_desi case_z = case_design == "panel_nas" ? bottom_height+top_height+hd_z_position+(hd_bays * (hd_space + 26.1)) : 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" ? (width-2*(sidethick+gap)-101.6) : 0; /* [Hidden] */ top_standoff = [top_standoff_size, @@ -675,44 +681,107 @@ if (view == "model") { } for( i=[0:1:hd_bays-1]) { if(hd_reverse == false) { - translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, - 28.5-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6+(hd_space+27.1)*i]) - cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + if(hd_center == false) { + translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + translate([101.6-gap+wallthick+hd_spacer-11.4, + 28.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, - -31-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6+(hd_space+27.1)*i]) - cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + translate([101.6-gap+wallthick+hd_spacer-11.4, + -31-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, - -73-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6+(hd_space+27.1)*i]) - cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + translate([101.6-gap+wallthick+hd_spacer-11.4, + -73-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); + } + } + if(hd_center == true) { + translate([-gap+hd_spacer/2, + -(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) + hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + translate([101.6-gap+wallthick+hd_spacer-11.4, + 28.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); + + translate([101.6-gap+wallthick+hd_spacer-11.4, + -31-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); + + translate([101.6-gap+wallthick+hd_spacer-11.4, + -73-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); + } } } else { - translate([-gap+101.6,-(3*wallthick)-gap+hd_y_position+147, - hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, - 17-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6.5+(hd_space+27.1)*i]) - cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + if(hd_center == false) { + translate([-gap+101.6,-(3*wallthick)-gap+hd_y_position+147, + hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + translate([101.6-gap+wallthick+hd_spacer-11.4, + 17-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, - -25-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6.5+(hd_space+27.1)*i]) - cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + translate([101.6-gap+wallthick+hd_spacer-11.4, + -25-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+(width-2*(sidethick+gap)-101.6)-11.4, - -84.5-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6.5+(hd_space+27.1)*i]) - cableholder_spacer((width-2*(sidethick+gap)-101.6)-9.4); + translate([101.6-gap+wallthick+hd_spacer-11.4, + -84.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer-9.4); + } + } + if(hd_center == true) { + translate([-gap+101.6+hd_spacer/2, + -(3*wallthick)-gap+hd_y_position+147, + hd_z_position+(hd_space+27.1)*i]) + rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); + if(pcb_width > 100) { + // right side spacers + translate([101.6-gap+wallthick+hd_spacer-11.4, + 17-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer/2-9.4); + + translate([101.6-gap+wallthick+hd_spacer-11.4, + -25-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer/2-9.4); + + translate([101.6-gap+wallthick+hd_spacer-11.4, + -84.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer/2-9.4); + // left side spacers + translate([-(hd_spacer/2-9.4)-gap+hd_spacer/2, + 17-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) rotate([0,0,180]) + cableholder_spacer(hd_spacer/2-9.4); + + translate([-(hd_spacer/2-9.4)-gap+hd_spacer/2, + -25-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) rotate([0,0,180]) + cableholder_spacer(hd_spacer/2-9.4); + + translate([-(hd_spacer/2-9.4)-gap+hd_spacer/2, + -84.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) rotate([0,0,180]) + cableholder_spacer(hd_spacer/2-9.4); + } } } } @@ -1086,6 +1155,7 @@ if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu else { if(case_design == "panel_nas") { echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height, height=case_z+(3*wallthick)); + echo(drive_spacer=hd_spacer); } else { echo(width=width,depth=depth,top=top_height,bottom=bottom_height); From 5a56f3d4fc0ecc29386ae07f9cb78b41e0411535 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 18 Apr 2025 11:55:11 -0400 Subject: [PATCH 12/17] additional tab support for 4+ hd bays --- mod/case_side.scad | 56 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/mod/case_side.scad b/mod/case_side.scad index c71947d..8851249 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -146,6 +146,14 @@ module case_side(case_design, side) { // top left tab translate([-sidethick-gap-adj,-(2*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,10]); + if(hd_bays > 3) { + // middle right tab + translate([width-(3*sidethick)-adj,-(2*wallthick),(case_z/2)-5]) + cube([sidethick+(2*adj),wallthick,10]); + // middle left tab + translate([-sidethick-gap-adj,-(2*wallthick),(case_z/2)-5]) + cube([sidethick+(2*adj),wallthick,10]); + } } if(rear_fan == 1 || rear_fan == 2) { if(rear_fan_center == false) { @@ -187,6 +195,14 @@ module case_side(case_design, side) { // top left tab translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,10]); + if(hd_bays > 3) { + // middle right tab + translate([width-(3*sidethick)-adj,depth-(4*wallthick),(case_z/2)-5]) + cube([sidethick+(2*adj),wallthick,10]); + // middle left tab + translate([-sidethick-gap-adj,depth-(4*wallthick),(case_z/2)-5]) + cube([sidethick+(2*adj),wallthick,10]); + } } // front cover pattern @@ -224,13 +240,13 @@ module case_side(case_design, side) { rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+2*wallthick,sidethick],corner_fillet); // rear edge top tab openings - translate([width-adj-(3*sidethick),-2*wallthick,case_z-30]) + translate([width-adj-(3*sidethick),-2*wallthick+adj,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); translate([width-adj-(3*sidethick),-(4*wallthick),case_z-20-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); // rear edge bottom tab openings - translate([width-adj-(3*sidethick),-2*wallthick,20]) + translate([width-adj-(3*sidethick),-2*wallthick+adj,20]) cube([sidethick+2*adj,wallthick+tol,20]); translate([width-adj-(3*sidethick),-(4*wallthick),30-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); @@ -238,15 +254,29 @@ module case_side(case_design, side) { // front edge top tab openings translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,20]); - translate([width-(3*sidethick),depth-(4*wallthick),case_z-20-tol]) + translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-20-tol]) cube([sidethick+(2*adj),3*wallthick,10+tol]); // front edge bottom tab openings translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) cube([sidethick+(2*adj),wallthick,20]); - translate([width-(3*sidethick),depth-(4*wallthick),30-tol]) + translate([width-(3*sidethick)-adj,depth-(4*wallthick),30-tol]) cube([sidethick+(2*adj),3*wallthick,10+tol]); + if(hd_bays > 3) { + // front edge middle tab openings + translate([width-adj-(3*sidethick),depth-(4*wallthick),(case_z/2)-5]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([width-adj-(3*sidethick),depth-(4*wallthick),(case_z/2)-5+10]) + cube([sidethick+(2*adj),3*wallthick,10+tol]); + + // rear edge middle tab openings + translate([width-adj-(3*sidethick),-2*wallthick+adj,(case_z/2)-5]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([width-adj-(3*sidethick),-(4*wallthick),(case_z/2)-5+10]) + cube([sidethick+(2*adj),2*wallthick,10+tol]); + } + // hd holes for bays if(hd_reverse == false) { for( i=[0:1:hd_bays-1]) { @@ -298,13 +328,13 @@ module case_side(case_design, side) { rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+(2*wallthick),sidethick],corner_fillet); // rear edge top tab openings - translate([-sidethick-gap-adj,-2*wallthick,case_z-30]) + translate([-sidethick-gap-adj,-2*wallthick+adj,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),case_z-20-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); // rear edge botom tab openings - translate([-sidethick-gap-adj,-2*wallthick,20]) + translate([-sidethick-gap-adj,-2*wallthick+adj,20]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),30-tol]) cube([sidethick+(2*adj),2*wallthick,10+tol]); @@ -321,6 +351,20 @@ module case_side(case_design, side) { translate([-sidethick-gap-adj,depth-(4*wallthick),30-tol]) cube([sidethick+(2*adj),3*wallthick,10+tol]); + if(hd_bays > 3) { + // rear edge middle tab openings + translate([-sidethick-gap-adj,-2*wallthick+adj,(case_z/2)-5]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([-sidethick-gap-adj,-(4*wallthick),(case_z/2)-5+10]) + cube([sidethick+(2*adj),2*wallthick,10+tol]); + + // front edge middle tab openings + translate([-sidethick-gap-adj,depth-(4*wallthick),(case_z/2)-5]) + cube([sidethick+2*adj,wallthick+tol,20]); + translate([-sidethick-gap-adj,depth-(4*wallthick),(case_z/2)-5+10]) + cube([sidethick+(2*adj),3*wallthick,10+tol]); + } + // hd holes for bays if(hd_reverse == false) { for( i=[0:1:hd_bays-1]) { From db43558f9c1679520765867711ea5305b72ade42 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 18 Apr 2025 16:29:32 -0400 Subject: [PATCH 13/17] front, top and bottom cover vent adjustments --- lib/vent.scad | 63 ----------------------------------- mod/case_bottom.scad | 43 +++++++++++++++++++++--- mod/case_side.scad | 36 +++++++++++++------- mod/case_top.scad | 48 +++++++++++++++++++------- sbc_case_builder_library.scad | 1 - 5 files changed, 98 insertions(+), 93 deletions(-) delete mode 100644 lib/vent.scad diff --git a/lib/vent.scad b/lib/vent.scad deleted file mode 100644 index 906d43a..0000000 --- a/lib/vent.scad +++ /dev/null @@ -1,63 +0,0 @@ -/* - 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 - - vent_panel_hex(x, y, thick, cell_size, cell_spacing, border, borders); - -*/ - - -/* - NAME: vent_panel_hex - DESCRIPTION: creates hex vent panel - TODO: none - - USAGE: vent_panel_hex(x, y, thick, cell_size=8, cell_spacing=3, border=3, borders="default") - - x = #rows - y = #columns - thick = pattern thickness - cell_size = size of hex - cell_spacing = space between hex - border = size of borber - borders = "none", "default" - -*/ - -module vent_panel_hex(x, y, thick, cell_size=8, cell_spacing=3, border=3, borders="default") { - hole = 3.2; - xb = (borders == "y" || borders == "none") ? cell_spacing : border; - yb = (borders == "x" || borders == "none") ? cell_spacing : border; - hxb = max(yb/2, cell_spacing + hole); - hyb = max(xb/2, cell_spacing + hole); - - cells_x = floor((2*(x-2*xb-cell_size)/(cell_size+cell_spacing))+1); - cells_y = floor(((sqrt(12)*(y-2*yb)-4*cell_size)/(3*(cell_size+cell_spacing)))+1); - csx = cell_size + (cells_x-1)*(cell_size+cell_spacing)/2; - csy = sqrt(4/3)*cell_size + ((cell_size+cell_spacing)*sqrt(3/4)*(cells_y-1)); - - difference() { - color("grey",1) slab([x,y,thick],2); - color("grey",1) translate([(x-csx)/2,(y-csy)/2,-1]) - vent_hex(cells_x, cells_y, thick+3, cell_size, cell_spacing, "horizontal"); - if (borders != "none") { - color("grey",1) translate([ hxb, hyb, -1]) cylinder(d=hole, h=thick+3); - color("grey",1) translate([x - hxb, hyb, -1]) cylinder(d=hole, h=thick+3); - color("grey",1) translate([ hxb, y - hyb, -1]) cylinder(d=hole, h=thick+3); - color("grey",1) translate([x - hxb, y - hyb, -1]) cylinder(d=hole, h=thick+3); - } - } -} \ No newline at end of file diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index 44f940e..d78c4d5 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -512,23 +512,56 @@ echo(pcb_depth+case_offset_y-10); // bottom cover pattern if(bottom_cover_pattern != "solid") { if(bottom_cover_pattern == "hex_5mm") { - translate([1,0,-floorthick]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); + if(case_design == "panel_nas") { + translate([5,5,-floorthick]) vent_hex((width-10)/3.75,(depth-10)/7,floorthick+4,5,1.5,"horizontal"); + } + else { + translate([1,0,-floorthick]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); + } } if(bottom_cover_pattern == "hex_8mm") { - translate([1,2,-floorthick]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + if(case_design == "panel_nas") { + translate([5,6,-floorthick]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + } + else { + translate([1,2,-floorthick]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + } } if(bottom_cover_pattern == "linear_vertical") { - #translate([0,-gap,-floorthick]) vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); + if(case_design == "panel_nas") { + translate([6,5,-floorthick]) + vent(wallthick,depth-8*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4.5,"horizontal"); + } + else { + translate([0,-gap,-floorthick]) + 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]) vent(width-2*wallthick-gap,wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); + if(case_design == "panel_nas") { + translate([6,5,-floorthick]) + vent(width-6*(sidethick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3.25,1,"horizontal"); + } + else { + translate([-gap,-gap,-floorthick]) + vent(width-2*(wallthick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); + } } if(bottom_cover_pattern == "astroid") { + if(case_design == "panel_nas") { + for(c=[12:12:depth-16]) { + for(r=[12:12:width-16]) { + translate([r,c,-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + } + } + } + else { 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"); + } } - } + } } } // rear io shield opening for standard form motherboards diff --git a/mod/case_side.scad b/mod/case_side.scad index 8851249..057cea8 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -207,27 +207,39 @@ module case_side(case_design, side) { // front cover pattern if(front_cover_pattern != "solid" && case_design == "panel_nas") { - if(front_cover_pattern == "hex_5mm") { - translate([-gap+4,depth-3*(wallthick)+gap,5]) - vent_hex(width/3.85,(case_z-6)/6,wallthick+4,5,1.5,"vertical"); + if(front_cover_pattern == "hex_5mm" && hd_bays < 6) { + translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) + vent_hex(width/3.85,hd_bays*(27.1+hd_space)/5.75,wallthick+4,5,1.5,"vertical"); + } + if(front_cover_pattern == "hex_5mm" && hd_bays == 6) { + translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) + vent_hex(width/3.85,hd_bays*(27.1+hd_space)/7,wallthick+4,5,1.5,"vertical"); } if(front_cover_pattern == "hex_8mm") { translate([-gap+5,depth-3*(wallthick)+gap,5]) - vent_hex(width/5.5,(case_z-6)/9,floorthick+4,8,1.5,"vertical"); + vent_hex(width/5.5,(case_z-6)/10,floorthick+4,8,1.5,"vertical"); } -// vent(width, length, height, gap, rows, columns, orientation) if(front_cover_pattern == "linear_vertical") { - translate([-gap+4,depth-3*(wallthick)+gap,5]) - vent(wallthick,(case_z-2*(wallthick+gap)-20)/2,floorthick+4,1,2,(width-2*(wallthick+gap+sidethick))/4.2,"vertical"); + translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) + vent(wallthick,(case_z-2*(wallthick+gap)-20)/8,floorthick+4,1,1, + (width-2*(wallthick+gap+sidethick))/4.2,"vertical"); + translate([-gap+4,depth-3*(wallthick)+gap,case_z-(top_height+bottom_height+4*floorthick)]) + vent(wallthick,(case_z-2*(wallthick+gap)-20)/8,floorthick+4,1,1, + (width-2*(wallthick+gap+sidethick))/4.2,"vertical"); } if(front_cover_pattern == "linear_horizontal") { - translate([-gap+4,depth-3*(wallthick)+gap,5]) - vent(width-2*(wallthick+gap+sidethick)-4,wallthick,floorthick+4,1,(case_z-2*(wallthick+gap)-10)/3,1,"vertical"); + translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) + vent(width-2*(wallthick+gap+sidethick)-4,wallthick,floorthick+4,2, + (case_z-2*(wallthick+gap)-20)/20,1,"vertical"); + translate([-gap+4,depth-3*(wallthick)+gap,case_z-(top_height+bottom_height+4*floorthick)-20]) + vent(width-2*(wallthick+gap+sidethick)-4,wallthick,floorthick+4,2, + (case_z-2*(wallthick+gap)-20)/20,1,"vertical"); } if(front_cover_pattern == "astroid") { - for(c=[3:12:depth-8]) { - for(r=[4:12:width-8]) { - translate([r,c,case_z-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + for(c=[10:12:case_z-20]) { + for(r=[6:12:width-8]) { + translate([r,depth-wallthick,c]) rotate([90,0,0]) + linear_extrude(wallthick+5) import("./dxf/astroid_8mm.dxf"); } } } diff --git a/mod/case_top.scad b/mod/case_top.scad index 25849de..94aa531 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -461,35 +461,59 @@ module case_top(case_design) { if(top_cover_pattern != "solid") { if(top_cover_pattern == "hex_5mm") { if(case_design == "panel_nas") { - translate([6,5,case_z-(2*floorthick)]) vent_hex((width-10)/3.75,(depth-10)/6,floorthick+4,5,1.5,"horizontal"); + translate([6,5,case_z-(2*floorthick)]) + vent_hex((width-10)/3.75,(depth-10)/7,floorthick+4,5,1.5,"horizontal"); } else { translate([1,0,case_z-(2*floorthick)]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); } } - if(top_cover_pattern == "hex_8mm") { - + if(top_cover_pattern == "hex_8mm") { if(case_design == "panel_nas") { - translate([2,5,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + translate([5,6,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); } else { translate([1,2,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); } } if(top_cover_pattern == "linear_vertical") { - translate([0,-gap,case_z-(2*floorthick)]) - vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); + if(case_design == "panel_nas") { + translate([wallthick+gap,wallthick,case_z-(2*floorthick)]) + vent(wallthick,depth-6*wallthick-gap,floorthick+4,1,1,(width-2*(sidethick+gap))/4.25,"horizontal"); + } + else { + translate([0,-gap,case_z-(2*floorthick)]) + vent(wallthick,depth-2*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4,"horizontal"); + } } if(top_cover_pattern == "linear_horizontal") { - translate([-gap,-gap,case_z-(2*floorthick)]) - vent(width-2*wallthick-gap,wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); + if(case_design == "panel_nas") { + translate([wallthick+gap,wallthick,case_z-(2*floorthick)]) + vent((width-4*(sidethick+gap)),wallthick,floorthick+4,1, + (depth-2*(wallthick-gap))/3.25,1,"horizontal"); + } + else { + translate([-gap,-gap,case_z-(2*floorthick)]) + vent(width-2*wallthick-gap,wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3,1,"horizontal"); + } } if(top_cover_pattern == "astroid") { - for(c=[3:12:depth-8]) { - for(r=[4:12:width-8]) { - translate([r,c,case_z-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + if(case_design == "panel_nas") { + for(c=[12:12:depth-16]) { + for(r=[12:12:width-16]) { + translate([r,c,case_z-(2*floorthick)-adj]) + linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + } } - } + } + else { + for(c=[3:12:depth-8]) { + for(r=[4:12:width-8]) { + translate([r,c,case_z-(2*floorthick)-adj]) + linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + } + } + } } } // rear io shield opening for standard form motherboards diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index 34e9cef..dc89dcb 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -51,4 +51,3 @@ include <./lib/oem_adafruit.scad>; include <./lib/oem_hk.scad>; include <./lib/oem_rpi.scad>; include <./lib/standoff.scad>; -include <./lib/vent.scad>; From b3696650494fc2eeb3f8bae4e8e276f926ac2451 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 18 Apr 2025 18:08:03 -0400 Subject: [PATCH 14/17] added fan models for rear panel in model view --- sbc_case_builder.json | 223 +++++++++++++++++++++++++++++++++++++++++- sbc_case_builder.scad | 24 +++++ 2 files changed, 245 insertions(+), 2 deletions(-) diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 2731676..4e43130 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -9686,6 +9686,7 @@ "gap": "1", "gpio_opening": "default", "hd_bays": "2", + "hd_center": "false", "hd_reverse": "false", "hd_space": "10", "hd_y_position": "40", @@ -9902,9 +9903,10 @@ "gap": "1", "gpio_opening": "none", "hd_bays": "2", + "hd_center": "false", "hd_reverse": "true", "hd_space": "10", - "hd_y_position": "16", + "hd_y_position": "20", "hd_z_position": "7", "indents": "false", "individual_part": "bottom", @@ -10121,7 +10123,7 @@ "hd_center": "true", "hd_reverse": "true", "hd_space": "10", - "hd_y_position": "16", + "hd_y_position": "25", "hd_z_position": "10", "indents": "false", "individual_part": "bottom", @@ -10232,6 +10234,223 @@ "uart_opening": "default", "view": "model", "wallthick": "2" + }, + "rpi5_panel_nas": { + "$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": "rpi5_m2hat", + "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "-25", + "case_offset_x": "0", + "case_offset_y": "0", + "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": "hex_5mm", + "gap": "1", + "gpio_opening": "default", + "hd_bays": "2", + "hd_center": "false", + "hd_reverse": "false", + "hd_space": "10", + "hd_y_position": "50", + "hd_z_position": "45", + "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": "bottom", + "pcb_loc_x": "13", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", + "rear_fan": "1", + "rear_fan_center": "false", + "rear_fan_position": "33", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "rpi5", + "sbc_off": "false", + "sbc_top_standoffs": "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": "countersunk", + "uart_opening": "none", + "view": "model", + "wallthick": "2" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 49af5bd..4152386 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -785,6 +785,30 @@ if (view == "model") { } } } + fan_model = rear_fan_size == 92 ? "box92x10" : rear_fan_size == 80 ? "box80x10" : rear_fan_size == 60 ? "box60x10" : "box40x10"; + if(rear_fan == 1 || rear_fan == 2) { + if(rear_fan_center == false) { + translate([-1+(101.6-rear_fan_size)/2,10-wallthick,rear_fan_position]) + rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + } + if(rear_fan_center == true) { + translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, + 10-wallthick,rear_fan_position]) rotate([90,0,0]) + fans(fan_model,[false,0,0,"default"]); + } + } + if(rear_fan == 2) { + if(rear_fan_center == false) { + translate([-1+(101.6-rear_fan_size)/2,10-wallthick, + rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + } + if(rear_fan_center == true) { + translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, + 10-wallthick,rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + } + } } if(case_design == "stacked") { if(lower_bottom >= 0) { From 1c2cf8e00f2752cd1614b92d30c81daf1bf09e70 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Fri, 18 Apr 2025 21:12:11 -0400 Subject: [PATCH 15/17] platter and part view plumbed and indent adjusted --- mod/case_side.scad | 8 +++++--- sbc_case_builder.scad | 25 +++++++++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/mod/case_side.scad b/mod/case_side.scad index 057cea8..e7dddae 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -133,7 +133,7 @@ module case_side(case_design, side) { difference() { union() { translate([-gap,-(2*wallthick),0]) - cube([width-2*sidethick,wallthick,case_z-wallthick]); + cube([width-2*(gap+sidethick),wallthick,case_z-wallthick]); // bottom right tab translate([width-(3*sidethick)-adj,-(2*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); @@ -605,11 +605,13 @@ module case_side(case_design, side) { indent(loc_x, loc_y, bottom_height+loc_z-adj, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); } if(id == pcbid && case_design == "panel_nas" && nas_sbc_location == "bottom") { - 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, 2*wallthick, gap, floorthick, pcb_z); } if(id == pcbid && case_design == "panel_nas" && nas_sbc_location == "top") { - indent(loc_x, loc_y, case_z-(top_height+pcb_loc_z+(2*floorthick))+.5, rotation[2], side, class, type, wallthick, gap, floorthick, pcb_z); + indent(loc_x, loc_y, case_z-(top_height+pcb_loc_z+(2*floorthick))+.5, rotation[2], + side, class, type, 2*wallthick, gap, floorthick, pcb_z); } } } diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 4152386..df91604 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -480,7 +480,7 @@ if (view == "platter") { case_bottom(case_design); translate([0,(2*depth)+20,case_z]) rotate([180,0,0]) case_top(case_design); } - if(case_design == "panel") { + if(case_design == "panel" || case_design == "panel_nas") { case_bottom(case_design); translate([0,(2*depth)+5,case_z]) rotate([180,0,0]) case_top(case_design); translate([width+25,0,-gap]) rotate([-90,0,0]) case_side(case_design,"rear"); @@ -490,6 +490,15 @@ if (view == "platter") { case_side(case_design,"right"); translate([-20,0,-gap]) rotate([0,90,90]) case_side(case_design,"left"); + // nas hd spacers + if(case_design == "panel_nas" && pcb_width > 100) { + if(hd_center == false) { + translate([0,-35,0]) rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4); + } + else { + translate([0,-35,0]) rotate([270,0,0]) cableholder_spacer(hd_spacer/2-9.4); + } + } } if(case_design == "stacked") { case_bottom(case_design); @@ -1053,7 +1062,7 @@ if (view == "part") { if(case_design == "shell") { translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design); } - if(case_design == "panel") { + if(case_design == "panel" || case_design == "panel_nas") { translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design); } if(case_design == "stacked") { @@ -1084,18 +1093,18 @@ if (view == "part") { } } if(individual_part == "front") { - if(case_design == "panel") { + if(case_design == "panel" || case_design == "panel_nas") { translate([0,case_z,-depth+wallthick+gap+floorthick]) rotate([90,0,0]) case_side(case_design,"front"); } } if(individual_part == "rear") { - if(case_design == "panel") { + if(case_design == "panel" || case_design == "panel_nas") { translate([0,0,-gap]) rotate([-90,0,0]) case_side(case_design,"rear"); } } if(individual_part == "right") { - if(case_design == "panel") { + if(case_design == "panel" || case_design == "panel_nas") { translate([gap,0,-width+(2*wallthick)+gap]) rotate([0,-90,-90]) case_side(case_design,"right"); } @@ -1104,7 +1113,7 @@ if (view == "part") { } } if(individual_part == "left") { - if(case_design == "panel") { + if(case_design == "panel" || case_design == "panel_nas") { translate([depth,0,-gap]) rotate([0,90,90]) case_side(case_design,"left"); } @@ -1119,6 +1128,10 @@ if (view == "part") { } } if(individual_part == "accessories") { + // nas hd spacers + if(case_design == "panel_nas" && pcb_width > 100) { + rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4); + } // ui access panel if(bottom_access_panel_enable == true) { if(access_panel_rotation == 0) { From 86eb912784f8fc731a3fc8aa1968e3edd8b28469 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Mon, 21 Apr 2025 17:30:50 -0400 Subject: [PATCH 16/17] fixed spacer and right side placment issue, updated readme.md, code cleanup and example case accessories --- README.md | 11 +- mod/case_bottom.scad | 18 +- mod/case_side.scad | 119 +- mod/case_top.scad | 10 +- sbc_case_builder.json | 1736 +++++++++++++++--------------- sbc_case_builder.scad | 145 +-- sbc_case_builder_accessories.cfg | 11 + 7 files changed, 1051 insertions(+), 999 deletions(-) diff --git a/README.md b/README.md index b51012b..af048ee 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ The *3D Case Adjustments* tab makes up the bulk of the possible case adjustments ### Fan and Vent Openings Tab -This tab handles the fan and cooling options for case designs. The *top cover pattern* and *bottom cover pattern* contain several options for the creation of vent patterns that cover the complete top and bottom respectively, including a solid covering. The *cooling* pickbox selects fan and vent openings exclusively for the heatsink associated with the device in SBC Model Framework. +This tab handles the fan and cooling options for case designs. The *top cover pattern*, *bottom cover pattern* and *front cover pattern* contain several options for the creation of vent patterns that cover the complete panel, including a solid covering. The *cooling* pickbox selects fan and vent openings exclusively for the heatsink associated with the device in SBC Model Framework. ``` disable - turns off the heatsink model and mask off - heatsink model is off, mask is on and default will be used @@ -102,7 +102,7 @@ none - heatsink model is on and mask is off. fan and vent pattern selections - open, fan_open, fan_1, fan_2, fan_hex, vent, vent_hex_5mm, vent_hex_8mm custom - uses the file ./SBC_Model_Framework/customfan.dxf ``` -The *fan size* allows the selection of different fan size masks over the default size selected by 0. +The *fan size* allows the selection of different fan size masks over the default size selected by 0. The rear fan entries are for the *panel_nas* case design and allow for the same types of fan adjustments as the heatsink. There is also the choice of one or two rear fans as well as additional adjustments for the position and spacing of them. ### Bottom Access Panel Tab @@ -110,7 +110,7 @@ This tab allows the creation of a bottom access panel and its entries are self e ### Options and Accessories -The entrys in this tab allow for the enablement and selection of different GPIO and UART openings based on their type identifier in SBC_Model_Framework. +The entrys in this tab allow for the enablement and selection of different options and accessories. It includes case indents, GPIO, and UART openings based on their type identifier in SBC_Model_Framework. It also contains hard drive options for the panel_nas case. #### GPIO Selections ``` @@ -130,6 +130,11 @@ mask opening selections - open, knockout The *indent* checkbox enables indents for a select group of components defined in SBC Model Framework. The currently support components are - video-hmdi_a, video-hdmi_micro, video-hdmi_mini, power-pwr5.5_7.5x11.5, power-pwr2.5_5x7.5, usb2-micro, usbc-single_horizontal, audio-jack_3.5. The *accessory name* pickbox uses the unique accessory group name to associate a given accessory set with a case design. Entries are stored in the file sbc_case_builder_accessories.cfg which is covered in detail with the Accessory Subsystem in this document. The remaining two entries select the color and proportional font used with the *sbc information* display when enabled in the *View* tab. +#### NAS HD Options +The *nas sbc location* pickbox allows the positioning of the SBC at the top or bottom of a NAS case. *hd bays* sets the number of drive bays, *hd reverse* checkbox rotates the drives 180 degrees while *hd center* centers the drives in the x-axis. The next entry, *hd space* determines the spacing between drives and *hd y position* and *hd z position* sets the respective axis locations. + +#### Accessory Group Name +The *accessory name* allows the selection of an accessory group to be associated with the current case. These groups are located in the file sbc_case_builder_accessories.cfg and provide a means to add or subtract geometry, models and add items to the print platter. See the *Accessory Subsystem* area below for further details and use. ### Standoff Tabs There are 3 types of standoffs available in the user interface, SBC Standoffs, Extended Case Standoffs and Multi-PCB Standoffs. The SBC standoffs control adjustments for the SBC or pcbid 0 as defined by the entry in SBC Model Framework file ./SBC_Model_Framework/sbc_models.cfg. The Extended Case Standoffs control case corner standoffs when the case exceeds the SBC size by the *SBC Standoff Support Size*. The Multi-PCB standoffs are used for additional PCB in multi-PCB configurations as defined in ./SBC_Model_Framework/sbc_models.cfg e.g. pcbid 1, pcbid 2, etc. All three standoff types have similar controls made up of a global tab and individual Settings tab in the GUI. diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index d78c4d5..c8eafc2 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -63,16 +63,18 @@ module case_bottom(case_design) { } } if(case_design == "panel_nas") { + x_adj = pcb_width > 100 ? width-2*sidethick : width-2*(gap+sidethick); + xtab_adj = pcb_width > 100 ? width-gap-2*sidethick-adj : width-gap-2*(gap+sidethick)-adj; union() { translate([-gap,-wallthick,0]) - cube([width-2*(gap+sidethick),depth-(2*wallthick),wallthick]); + cube([x_adj,depth-(2*wallthick),floorthick]); translate([-gap-sidethick-(2*adj),depth-(3*wallthick)-gap-adj-20,0]) cube([sidethick+(2*adj),10,floorthick]); - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-20,0]) + translate([xtab_adj,depth-(3*wallthick)-gap-adj-20,0]) cube([sidethick+2*adj,10,floorthick]); translate([-gap-sidethick-(2*adj),40-wallthick-gap+adj,0]) cube([sidethick+2*adj,10,floorthick]); - translate([width-(3*sidethick)-adj,40-wallthick-gap+adj,0]) + translate([xtab_adj,40-wallthick-gap+adj,0]) cube([sidethick+2*adj,10,floorthick]); } } @@ -140,12 +142,14 @@ module case_bottom(case_design) { if(class == "pcbhole" && id == pcb_id && pcbhole_pos == "right_front") { if((pcbhole_y >= pcb_depth+case_offset_y-10 && pcbhole_x >= width-10) || (ext_bottom_standoffs == true && ext_bottom_front_right_enable == true)) { - translate([width-wallthick-gap-wallthick-4+adj,wallthick-gap+pcb_depth+case_offset_y-14,floorthick+3.4]) - rotate([90,0,90]) cylinder(d=10, h=4, $fn=6); + translate([width-wallthick-gap-wallthick-4+adj, + wallthick-gap+pcb_depth+case_offset_y-14,floorthick+3.4]) + rotate([90,0,90]) cylinder(d=10, h=4, $fn=6); } else { - translate([width-wallthick-gap-wallthick-4+adj,wallthick+gap+pcb_depth+case_offset_y-8,floorthick+3.4]) - rotate([90,0,90]) cylinder(d=10, h=4, $fn=6); + translate([width-wallthick-gap-wallthick-4+adj, + wallthick+gap+pcb_depth+case_offset_y-8,floorthick+3.4]) + rotate([90,0,90]) cylinder(d=10, h=4, $fn=6); } } } diff --git a/mod/case_side.scad b/mod/case_side.scad index e7dddae..d6f94fd 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -129,16 +129,18 @@ module case_side(case_design, side) { } } if(case_design == "panel_nas") { + x_adj = pcb_width > 100 ? width-2*sidethick : width-2*(gap+sidethick); + xtab_adj = pcb_width > 100 ? width-gap-2*sidethick-adj : width-gap-2*(gap+sidethick)-adj; if(side == "rear") { difference() { union() { translate([-gap,-(2*wallthick),0]) - cube([width-2*(gap+sidethick),wallthick,case_z-wallthick]); + cube([x_adj,wallthick,case_z-wallthick]); // bottom right tab - translate([width-(3*sidethick)-adj,-(2*wallthick),20]) + translate([xtab_adj,-(2*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); // top right tab - translate([width-(3*sidethick)-adj,-(2*wallthick),case_z-30]) + translate([xtab_adj,-(2*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,10]); // bottom left tab translate([-sidethick-gap-adj,-(2*wallthick),20]) @@ -148,7 +150,7 @@ module case_side(case_design, side) { cube([sidethick+(2*adj),wallthick,10]); if(hd_bays > 3) { // middle right tab - translate([width-(3*sidethick)-adj,-(2*wallthick),(case_z/2)-5]) + translate([xtab_adj,-(2*wallthick),(case_z/2)-5]) cube([sidethick+(2*adj),wallthick,10]); // middle left tab translate([-sidethick-gap-adj,-(2*wallthick),(case_z/2)-5]) @@ -182,12 +184,12 @@ module case_side(case_design, side) { difference() { union() { translate([-gap,depth-(4*wallthick),floorthick]) - cube([width-2*(gap+sidethick),wallthick,case_z-3*wallthick]); + cube([x_adj,wallthick,case_z-3*wallthick]); // bottom right tab - translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) + translate([xtab_adj,depth-(4*wallthick),20]) cube([sidethick+(2*adj),wallthick,10]); // top right tab - translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-30]) + translate([xtab_adj,depth-(4*wallthick),case_z-30]) cube([sidethick+(2*adj),wallthick,10]); // bottom left tab translate([-sidethick-gap-adj,depth-(4*wallthick),20]) @@ -197,14 +199,13 @@ module case_side(case_design, side) { cube([sidethick+(2*adj),wallthick,10]); if(hd_bays > 3) { // middle right tab - translate([width-(3*sidethick)-adj,depth-(4*wallthick),(case_z/2)-5]) + translate([xtab_adj,depth-(4*wallthick),(case_z/2)-5]) cube([sidethick+(2*adj),wallthick,10]); // middle left tab translate([-sidethick-gap-adj,depth-(4*wallthick),(case_z/2)-5]) cube([sidethick+(2*adj),wallthick,10]); } } - // front cover pattern if(front_cover_pattern != "solid" && case_design == "panel_nas") { if(front_cover_pattern == "hex_5mm" && hd_bays < 6) { @@ -248,89 +249,95 @@ module case_side(case_design, side) { } if(side == "right") { difference() { - translate([width-2*sidethick,-(3*wallthick)-gap,-2*wallthick]) - rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+2*wallthick,sidethick],corner_fillet); + if(case_design == "panel_nas" && pcb_width > 100) { + translate([pcb_width+sidethick+gap+case_offset_x,-(3*wallthick)-gap,-2*wallthick]) + rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+2*wallthick,sidethick],corner_fillet); + } + else { + translate([width-2*sidethick+gap,-(3*wallthick)-gap,-2*wallthick]) + rotate([0,-90,0]) slab([case_z+(3*wallthick),depth+2*wallthick,sidethick],corner_fillet); + } // rear edge top tab openings - translate([width-adj-(3*sidethick),-2*wallthick+adj,case_z-30]) - cube([sidethick+2*adj,wallthick+tol,20]); - translate([width-adj-(3*sidethick),-(4*wallthick),case_z-20-tol]) - cube([sidethick+(2*adj),2*wallthick,10+tol]); + translate([width-3*sidethick+gap-adj,-2*wallthick+adj,case_z-30]) + cube([2*sidethick+2*adj,wallthick+tol,20]); + translate([width-3*sidethick+gap-adj,-(4*wallthick)+2*adj,case_z-20-tol]) + cube([2*sidethick+(2*adj),2*wallthick,10+tol]); // rear edge bottom tab openings - translate([width-adj-(3*sidethick),-2*wallthick+adj,20]) - cube([sidethick+2*adj,wallthick+tol,20]); - translate([width-adj-(3*sidethick),-(4*wallthick),30-tol]) - cube([sidethick+(2*adj),2*wallthick,10+tol]); + translate([width-3*sidethick+gap-adj,-2*wallthick+adj,20]) + cube([2*sidethick+2*adj,wallthick+tol,20]); + translate([width-3*sidethick+gap-adj,-(4*wallthick)+2*adj,30-tol]) + cube([2*sidethick+(2*adj),3*wallthick,10+tol]); // front edge top tab openings - translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-30]) - cube([sidethick+(2*adj),wallthick,20]); - translate([width-(3*sidethick)-adj,depth-(4*wallthick),case_z-20-tol]) - cube([sidethick+(2*adj),3*wallthick,10+tol]); + translate([width-3*sidethick+gap-adj,depth-(4*wallthick),case_z-30]) + cube([2*sidethick+(2*adj),wallthick,20]); + translate([width-3*sidethick+gap-adj,depth-(4*wallthick),case_z-20-tol]) + cube([2*sidethick+(2*adj),3*wallthick,10+tol]); // front edge bottom tab openings - translate([width-(3*sidethick)-adj,depth-(4*wallthick),20]) - cube([sidethick+(2*adj),wallthick,20]); - translate([width-(3*sidethick)-adj,depth-(4*wallthick),30-tol]) - cube([sidethick+(2*adj),3*wallthick,10+tol]); + translate([width-3*sidethick+gap-adj,depth-(4*wallthick),20]) + cube([2*sidethick+(2*adj),wallthick,20]); + translate([width-3*sidethick+gap-adj,depth-(4*wallthick),30-tol]) + cube([2*sidethick+(2*adj),3*wallthick,10+tol]); if(hd_bays > 3) { // front edge middle tab openings - translate([width-adj-(3*sidethick),depth-(4*wallthick),(case_z/2)-5]) - cube([sidethick+2*adj,wallthick+tol,20]); - translate([width-adj-(3*sidethick),depth-(4*wallthick),(case_z/2)-5+10]) - cube([sidethick+(2*adj),3*wallthick,10+tol]); + translate([width-3*sidethick+gap-adj,depth-(4*wallthick),(case_z/2)-5]) + cube([2*sidethick+2*adj,wallthick+tol,20]); + translate([width-3*sidethick+gap-adj,depth-(4*wallthick),(case_z/2)-5+10]) + cube([2*sidethick+(2*adj),2*wallthick,10+tol]); // rear edge middle tab openings - translate([width-adj-(3*sidethick),-2*wallthick+adj,(case_z/2)-5]) - cube([sidethick+2*adj,wallthick+tol,20]); - translate([width-adj-(3*sidethick),-(4*wallthick),(case_z/2)-5+10]) - cube([sidethick+(2*adj),2*wallthick,10+tol]); + translate([width-3*sidethick+gap-adj,-2*wallthick+adj,(case_z/2)-5]) + cube([2*sidethick+2*adj,wallthick+tol,20]); + translate([width-3*sidethick+gap-adj,-(4*wallthick),(case_z/2)-5+10]) + cube([2*sidethick+(2*adj),2*wallthick,10+tol]); } // hd holes for bays if(hd_reverse == false) { for( i=[0:1:hd_bays-1]) { - translate([(width-101.6)-(3*sidethick)-gap, + translate([(width-101.6)-(3*sidethick)-gap+adj, -(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - hd_holes(3.5, "portrait", "both", sidethick+2); + hd_holes(3.5, "portrait", "both", 2*sidethick+2); } } else { for( i=[0:1:hd_bays-1]) { translate([width-(3*sidethick)-adj,-(3*wallthick)-gap+hd_y_position+147, hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,180]) hd_holes(3.5, "portrait", "both", sidethick+2); + rotate([0,0,180]) hd_holes(3.5, "portrait", "both", 2*sidethick+2); } } // top edge front tab opening - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30, + translate([width-3*sidethick+gap-adj,depth-(3*wallthick)-gap-adj-30, case_z-(2*floorthick)]) - cube([sidethick+(2*adj),20,floorthick+tol]); - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30-tol, + cube([2*sidethick+(2*adj),20,floorthick+tol]); + translate([width-3*sidethick+gap-adj,depth-(3*wallthick)-gap-adj-30-tol, case_z-(2*floorthick)]) - cube([sidethick+2*adj,10+tol,(3*floorthick)+adj]); + cube([2*sidethick+(2*adj),10+tol,(3*floorthick)+adj]); // top edge rear tab opening - translate([width-(3*sidethick)-adj,40-wallthick-gap+adj, + translate([width-3*sidethick+gap-adj,40-wallthick-gap-adj, case_z-(2*floorthick)]) - cube([sidethick+(2*adj),10,floorthick+tol]); - translate([width-(3*sidethick)-adj,30-wallthick-gap+adj-tol, + cube([2*sidethick+(2*adj),10+adj,floorthick+tol]); + translate([width-3*sidethick+gap-adj,30-wallthick-gap+adj-tol, case_z-(2*floorthick)]) - cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + cube([2*sidethick+(2*adj),10+tol,(3*floorthick)+adj]); // bottom edge front tab opening - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30-tol,-tol]) - cube([sidethick+2*adj,20+tol,floorthick+tol]); - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-30-tol,-(3*floorthick)+adj]) - cube([sidethick+2*adj,10+tol,(3*floorthick)+adj]); + translate([width-3*sidethick+gap-adj,depth-(3*wallthick)-gap-adj-30-tol,-tol]) + cube([2*sidethick+2*adj,20+tol,floorthick+tol]); + translate([width-3*sidethick+gap-adj,depth-(3*wallthick)-gap-adj-30-tol,-(3*floorthick)+adj]) + cube([2*sidethick+2*adj,10+tol,(3*floorthick)+adj]); // bottom edge rear tab opening - translate([width-(3*sidethick)-adj,30-wallthick-gap+adj-tol,-tol]) - cube([sidethick+2*adj,20+tol,floorthick+tol]); - translate([width-(3*sidethick)-adj,30-wallthick-gap+adj-tol,-(3*floorthick)+adj]) - cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); + translate([width-3*sidethick+gap-adj,30-wallthick-gap+adj-tol,-tol]) + cube([2*sidethick+2*adj,20+tol,floorthick+tol]); + translate([width-3*sidethick+gap-adj,30-wallthick-gap+adj-tol,-(3*floorthick)+adj]) + cube([2*sidethick+(2*adj),10+tol,(3*floorthick)+adj]); } } @@ -400,9 +407,9 @@ module case_side(case_design, side) { case_z-(2*floorthick)]) cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); // top edge rear tab openings - translate([-gap-sidethick-adj,40-wallthick-gap+adj, + translate([-gap-sidethick-adj,30-wallthick-gap+adj, case_z-(2*floorthick)]) - cube([sidethick+(2*adj),10,floorthick+tol]); + cube([sidethick+(2*adj),20,floorthick+tol]); translate([-gap-sidethick-adj,30-wallthick-gap+adj-tol, case_z-(2*floorthick)]) cube([sidethick+(2*adj),10+tol,(3*floorthick)+adj]); diff --git a/mod/case_top.scad b/mod/case_top.scad index 94aa531..2179459 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -71,19 +71,21 @@ module case_top(case_design) { } } if(case_design == "panel_nas") { + x_adj = pcb_width > 100 ? width-2*sidethick : width-2*(gap+sidethick); + xtab_adj = pcb_width > 100 ? width-gap-2*sidethick-adj : width-gap-2*(gap+sidethick)-adj; union() { - translate([-gap,-wallthick,case_z-2*wallthick]) - cube([width-2*(gap+sidethick),depth-(2*wallthick),wallthick]); + translate([-gap,-wallthick,case_z-2*floorthick]) + cube([x_adj,depth-(2*wallthick),floorthick]); translate([-gap-sidethick+(2*adj),depth-(3*wallthick)-gap-adj-20, case_z-2*floorthick]) cube([sidethick+(2*adj),10,floorthick]); - translate([width-(3*sidethick)-adj,depth-(3*wallthick)-gap-adj-20, + translate([xtab_adj,depth-(3*wallthick)-gap-adj-20, case_z-2*floorthick]) cube([sidethick+2*adj,10,floorthick]); translate([-gap-sidethick+(2*adj),40-wallthick-gap+adj, case_z-2*floorthick]) cube([sidethick+2*adj,10,floorthick]); - translate([width-(3*sidethick)-adj,40-wallthick-gap+adj, + translate([xtab_adj,40-wallthick-gap+adj, case_z-2*floorthick]) cube([sidethick+2*adj,10,floorthick]); } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 4e43130..2098484 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -2098,6 +2098,223 @@ "view": "model", "wallthick": "2" }, + "hc4_panel_nas": { + "$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": "hc4_panel_nas", + "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "-30", + "case_offset_x": "0", + "case_offset_y": "0", + "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": "hex_5mm", + "gap": "1", + "gpio_opening": "default", + "hd_bays": "2", + "hd_center": "false", + "hd_reverse": "false", + "hd_space": "10", + "hd_y_position": "40", + "hd_z_position": "55", + "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": "bottom", + "pcb_loc_x": "0", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", + "rear_fan": "1", + "rear_fan_center": "false", + "rear_fan_position": "42", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "hc4", + "sbc_off": "false", + "sbc_top_standoffs": "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": "countersunk", + "uart_opening": "none", + "view": "model", + "wallthick": "3" + }, "xu4_keyhole": { "$fn": "90", "access_panel_location": "[10, 15]", @@ -4800,6 +5017,223 @@ "view": "model", "wallthick": "2" }, + "h3_panel_nas": { + "$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": "h3_panel_nas", + "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "0", + "case_offset_x": "0", + "case_offset_y": "25", + "cooling": "fan_hex", + "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": "80", + "flat_blank_section": "false", + "floorthick": "3", + "front_cover_pattern": "hex_5mm", + "gap": "1", + "gpio_opening": "none", + "hd_bays": "2", + "hd_center": "false", + "hd_reverse": "true", + "hd_space": "10", + "hd_y_position": "20", + "hd_z_position": "7", + "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", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", + "rear_fan": "1", + "rear_fan_center": "false", + "rear_fan_position": "4", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "false", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "h3+", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "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": "25", + "top_standoff_support_size": "10", + "top_standoff_type": "recessed", + "uart_opening": "default", + "view": "model", + "wallthick": "3" + }, "h3_ultimate": { "$fn": "90", "access_panel_location": "[5, 30]", @@ -5106,6 +5540,223 @@ "view": "model", "wallthick": "2.5" }, + "h4_panel_nas": { + "$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": "h4_panel_nas", + "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": "panel_nas", + "case_offset_bz": "6", + "case_offset_tz": "0", + "case_offset_x": "0", + "case_offset_y": "20", + "cooling": "fan_hex", + "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": "80", + "flat_blank_section": "false", + "floorthick": "3", + "front_cover_pattern": "hex_5mm", + "gap": "1", + "gpio_opening": "none", + "hd_bays": "4", + "hd_center": "true", + "hd_reverse": "true", + "hd_space": "10", + "hd_y_position": "25", + "hd_z_position": "10", + "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", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "4", + "rear_fan": "2", + "rear_fan_center": "true", + "rear_fan_position": "4", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "false", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "h4+", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "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": "10", + "top_standoff_support_size": "10", + "top_standoff_type": "recessed", + "uart_opening": "default", + "view": "model", + "wallthick": "3" + }, "show2_shell": { "$fn": "90", "access_panel_location": "[10, 15]", @@ -6182,6 +6833,223 @@ "view": "model", "wallthick": "2" }, + "rpi5_panel_nas": { + "$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": "rpi5_m2hat", + "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "-25", + "case_offset_x": "0", + "case_offset_y": "0", + "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": "hex_5mm", + "gap": "1", + "gpio_opening": "default", + "hd_bays": "2", + "hd_center": "false", + "hd_reverse": "false", + "hd_space": "10", + "hd_y_position": "50", + "hd_z_position": "45", + "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": "bottom", + "pcb_loc_x": "13", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", + "rear_fan": "1", + "rear_fan_center": "false", + "rear_fan_position": "33", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "rpi5", + "sbc_off": "false", + "sbc_top_standoffs": "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": "countersunk", + "uart_opening": "none", + "view": "model", + "wallthick": "3" + }, "rock5b_shell": { "$fn": "90", "access_panel_location": "[10, 0]", @@ -9583,874 +10451,6 @@ "uart_opening": "default", "view": "model", "wallthick": "2" - }, - "hc4_panel_nas": { - "$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": "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": "panel_nas", - "case_offset_bz": "0", - "case_offset_tz": "-30", - "case_offset_x": "0", - "case_offset_y": "0", - "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": "hex_5mm", - "gap": "1", - "gpio_opening": "default", - "hd_bays": "2", - "hd_center": "false", - "hd_reverse": "false", - "hd_space": "10", - "hd_y_position": "40", - "hd_z_position": "55", - "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": "bottom", - "pcb_loc_x": "0", - "pcb_loc_y": "0", - "pcb_loc_z": "0", - "raise_top": "0", - "rear_cooling": "fan_hex", - "rear_dualfan_spacing": "6", - "rear_fan": "1", - "rear_fan_center": "false", - "rear_fan_position": "42", - "rear_fan_size": "80", - "rear_io_shield": "false", - "sbc_bottom_standoffs": "true", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "hc4", - "sbc_off": "false", - "sbc_top_standoffs": "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": "countersunk", - "uart_opening": "none", - "view": "model", - "wallthick": "2" - }, - "h3_panel_nas": { - "$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": "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": "panel_nas", - "case_offset_bz": "0", - "case_offset_tz": "0", - "case_offset_x": "0", - "case_offset_y": "25", - "cooling": "fan_hex", - "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": "80", - "flat_blank_section": "false", - "floorthick": "2", - "front_cover_pattern": "hex_5mm", - "gap": "1", - "gpio_opening": "none", - "hd_bays": "2", - "hd_center": "false", - "hd_reverse": "true", - "hd_space": "10", - "hd_y_position": "20", - "hd_z_position": "7", - "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", - "raise_top": "0", - "rear_cooling": "fan_hex", - "rear_dualfan_spacing": "6", - "rear_fan": "1", - "rear_fan_center": "false", - "rear_fan_position": "4", - "rear_fan_size": "80", - "rear_io_shield": "false", - "sbc_bottom_standoffs": "false", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "h3+", - "sbc_off": "false", - "sbc_top_standoffs": "true", - "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": "25", - "top_standoff_support_size": "10", - "top_standoff_type": "recessed", - "uart_opening": "default", - "view": "model", - "wallthick": "2" - }, - "h4_panel_nas": { - "$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": "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": "panel_nas", - "case_offset_bz": "6", - "case_offset_tz": "0", - "case_offset_x": "0", - "case_offset_y": "20", - "cooling": "fan_hex", - "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": "80", - "flat_blank_section": "false", - "floorthick": "2", - "front_cover_pattern": "hex_5mm", - "gap": "1", - "gpio_opening": "none", - "hd_bays": "4", - "hd_center": "true", - "hd_reverse": "true", - "hd_space": "10", - "hd_y_position": "25", - "hd_z_position": "10", - "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", - "raise_top": "0", - "rear_cooling": "fan_hex", - "rear_dualfan_spacing": "4", - "rear_fan": "2", - "rear_fan_center": "true", - "rear_fan_position": "4", - "rear_fan_size": "80", - "rear_io_shield": "false", - "sbc_bottom_standoffs": "false", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "h4+", - "sbc_off": "false", - "sbc_top_standoffs": "true", - "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": "10", - "top_standoff_support_size": "10", - "top_standoff_type": "recessed", - "uart_opening": "default", - "view": "model", - "wallthick": "2" - }, - "rpi5_panel_nas": { - "$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": "rpi5_m2hat", - "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": "panel_nas", - "case_offset_bz": "0", - "case_offset_tz": "-25", - "case_offset_x": "0", - "case_offset_y": "0", - "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": "hex_5mm", - "gap": "1", - "gpio_opening": "default", - "hd_bays": "2", - "hd_center": "false", - "hd_reverse": "false", - "hd_space": "10", - "hd_y_position": "50", - "hd_z_position": "45", - "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": "bottom", - "pcb_loc_x": "13", - "pcb_loc_y": "0", - "pcb_loc_z": "0", - "raise_top": "0", - "rear_cooling": "fan_hex", - "rear_dualfan_spacing": "6", - "rear_fan": "1", - "rear_fan_center": "false", - "rear_fan_position": "33", - "rear_fan_size": "80", - "rear_io_shield": "false", - "sbc_bottom_standoffs": "true", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "rpi5", - "sbc_off": "false", - "sbc_top_standoffs": "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": "countersunk", - "uart_opening": "none", - "view": "model", - "wallthick": "2" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index df91604..bf42770 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -87,13 +87,13 @@ case_offset_tz = 0; //[-30:.01:300] // additional z axis case bottom size case_offset_bz = 0; //[0:.01:300] // case wall thickness -wallthick = 2; //[1:.01:5] +wallthick = 2; //[1:.25:5] // case floor and ceiling thickness -floorthick = 2; //[1:.01:5] +floorthick = 2; //[1:.25:5] // side wall thickness for tray_side and panel_nas cases only -sidethick = 2; //[1:.01:5] +sidethick = 2; //[1:.25:5] // distance between pcb and case -gap = 1; //[.5:.01:5] +gap = 1; //[.5:.25:5] // corner fillets corner_fillet = 3; //[0:.5:9] // edge fillets @@ -111,14 +111,16 @@ bottom_cover_pattern = "solid"; //[solid,hex_5mm,hex_8mm,linear_vertical,linear_ // heatsink opening cooling = "default"; // [default,none,open,fan_open,fan_1,fan_2,fan_hex,vent,vent_hex_5mm,vent_hex_8mm,custom] fan_size = 0; // [0,25,30,40,50,60,70,80,92] -// rear fan number for nas cases +// number of rear fans for nas cases rear_fan = 1; // [1:2] // rear fan x-axis center rear_fan_center = false; // [true,false] // rear fan opening rear_cooling = "fan_hex"; // [fan_open,fan_1,fan_2,fan_hex,custom] rear_fan_size = 80; // [0,25,30,40,50,60,70,80,92] +// rear fan z-axis position rear_fan_position = 0; // [0:1:300] +// space between dual rear fans rear_dualfan_spacing = 6; // [0:1:50] /* [Bottom Access Panel] */ @@ -137,18 +139,19 @@ uart_opening = "default"; // [default,none,open,knockout] indents = true; // nas sbc location nas_sbc_location = "top"; // ["top","bottom"] +// number of nas drive bays +hd_bays = 2; // [1:6] // rotate hd 180 degrees in the z-axis hd_reverse = false; // [true, false] // center hd in the x-axis hd_center = false; // [true, false] -// number of nas drive bays -hd_bays = 2; // [1:6] +// distance between drives +hd_space = 10; // [1:50] hd_y_position = 25; // [0:300] hd_z_position = 40; // [0:300] -hd_space = 10; // [1:50] // case accessory group to load -accessory_name = "none"; // ["none", "hk_uart", "nas", "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_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_ultimate", "h3_ultimate2", "show2_shell", "rpi5_m2hat", "rock5b", "adapter_mini-stx_m1s", "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", "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", "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] // sbc information text font @@ -377,14 +380,17 @@ 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+(3*gap) : 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 : 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_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" ? (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; +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, @@ -486,12 +492,12 @@ if (view == "platter") { translate([width+25,0,-gap]) rotate([-90,0,0]) case_side(case_design,"rear"); translate([width+25,2*(case_z)+10,-depth+wallthick+gap+floorthick]) rotate([90,0,0]) case_side(case_design,"front"); - translate([2.5*width,0,-width+(2*wallthick)+gap]) rotate([0,-90,-90]) + translate([2.5*width,0,-width+(3*sidethick)+gap]) rotate([0,-90,-90]) case_side(case_design,"right"); translate([-20,0,-gap]) rotate([0,90,90]) case_side(case_design,"left"); // nas hd spacers - if(case_design == "panel_nas" && pcb_width > 100) { + if(case_design == "panel_nas" && (pcb_width > 100 || width > 101.6)) { if(hd_center == false) { translate([0,-35,0]) rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4); } @@ -693,18 +699,18 @@ if (view == "model") { if(hd_center == false) { translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { - translate([101.6-gap+wallthick+hd_spacer-11.4, + if(pcb_width > 100 || width > 101.6) { + translate([101.6-gap+hd_spacer-9.4, 28.5-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -31-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -73-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer-9.4); @@ -714,64 +720,79 @@ if (view == "model") { translate([-gap+hd_spacer/2, -(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { - translate([101.6-gap+wallthick+hd_spacer-11.4, + if(pcb_width > 100 || width > 101.6) { + // right side spacers + translate([101.6-gap+hd_spacer-9.4, 28.5-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6+(hd_space+27.1)*i]) - cableholder_spacer(hd_spacer-9.4); + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer/2-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -31-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6+(hd_space+27.1)*i]) - cableholder_spacer(hd_spacer-9.4); + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer/2-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -73-(3*wallthick)-gap+hd_y_position+101.6, - hd_z_position+6+(hd_space+27.1)*i]) - cableholder_spacer(hd_spacer-9.4); + hd_z_position+6.5+(hd_space+27.1)*i]) + cableholder_spacer(hd_spacer/2-9.4); + // left side spacers + translate([-(hd_spacer/2-9.4)-gap+hd_spacer/2, + 28.5-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) rotate([0,0,180]) + cableholder_spacer(hd_spacer/2-9.4); + + translate([-(hd_spacer/2-9.4)-gap+hd_spacer/2, + -31-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) rotate([0,0,180]) + cableholder_spacer(hd_spacer/2-9.4); + + translate([-(hd_spacer/2-9.4)-gap+hd_spacer/2, + -73-(3*wallthick)-gap+hd_y_position+101.6, + hd_z_position+6.5+(hd_space+27.1)*i]) rotate([0,0,180]) + cableholder_spacer(hd_spacer/2-9.4); } } } - else { + if(hd_reverse == true) { if(hd_center == false) { - translate([-gap+101.6,-(3*wallthick)-gap+hd_y_position+147, + translate([101.6-gap,-(3*wallthick)-gap+hd_y_position+147, hd_z_position+(hd_space+27.1)*i]) rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { - translate([101.6-gap+wallthick+hd_spacer-11.4, + if(pcb_width > 100 || width > 101.6) { + translate([101.6-gap+hd_spacer-9.4, 17-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -25-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer-9.4); - - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -84.5-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer-9.4); } } if(hd_center == true) { - translate([-gap+101.6+hd_spacer/2, + translate([101.6-gap+hd_spacer/2, -(3*wallthick)-gap+hd_y_position+147, hd_z_position+(hd_space+27.1)*i]) rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100) { + if(pcb_width > 100 || width > 101.6) { // right side spacers - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, 17-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer/2-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -25-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer/2-9.4); - translate([101.6-gap+wallthick+hd_spacer-11.4, + translate([101.6-gap+hd_spacer-9.4, -84.5-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer/2-9.4); @@ -794,28 +815,30 @@ if (view == "model") { } } } - fan_model = rear_fan_size == 92 ? "box92x10" : rear_fan_size == 80 ? "box80x10" : rear_fan_size == 60 ? "box60x10" : "box40x10"; - if(rear_fan == 1 || rear_fan == 2) { - if(rear_fan_center == false) { - translate([-1+(101.6-rear_fan_size)/2,10-wallthick,rear_fan_position]) - rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); - } - if(rear_fan_center == true) { - translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, - 10-wallthick,rear_fan_position]) rotate([90,0,0]) - fans(fan_model,[false,0,0,"default"]); - } - } - if(rear_fan == 2) { - if(rear_fan_center == false) { - translate([-1+(101.6-rear_fan_size)/2,10-wallthick, - rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + if(move_rear >= 0) { + fan_model = rear_fan_size == 92 ? "box92x10" : rear_fan_size == 80 ? "box80x10" : rear_fan_size == 60 ? "box60x10" : "box40x10"; + if(rear_fan == 1 || rear_fan == 2) { + if(rear_fan_center == false) { + translate([-1+(101.6-rear_fan_size)/2,10-wallthick,rear_fan_position]) rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + } + if(rear_fan_center == true) { + translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, + 10-wallthick,rear_fan_position]) rotate([90,0,0]) + fans(fan_model,[false,0,0,"default"]); + } } - if(rear_fan_center == true) { - translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, - 10-wallthick,rear_fan_position+rear_dualfan_spacing+rear_fan_size]) - rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + if(rear_fan == 2) { + if(rear_fan_center == false) { + translate([-1+(101.6-rear_fan_size)/2,10-wallthick, + rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + } + if(rear_fan_center == true) { + translate([-1+(101.6-rear_fan_size)/2+(width-2*(sidethick+gap)-101.6)/2, + 10-wallthick,rear_fan_position+rear_dualfan_spacing+rear_fan_size]) + rotate([90,0,0]) fans(fan_model,[false,0,0,"default"]); + } } } } @@ -1129,7 +1152,7 @@ if (view == "part") { } if(individual_part == "accessories") { // nas hd spacers - if(case_design == "panel_nas" && pcb_width > 100) { + if(case_design == "panel_nas" && (pcb_width > 100 || width > 101.6)) { rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4); } // ui access panel @@ -1191,7 +1214,7 @@ if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu } else { if(case_design == "panel_nas") { - echo(width=width+(101.6-width+(2*sidethick)),depth=depth,top=top_height,bottom=bottom_height, height=case_z+(3*wallthick)); + echo(width=width+hd_spacer,depth=depth,top=top_height,bottom=bottom_height, height=case_z+(3*wallthick)); echo(drive_spacer=hd_spacer); } else { diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 94f88cc..f733bcb 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -190,6 +190,10 @@ accessory_data = [ "add1","keyhole",40,30,0,"bottom",[0,0,0],["case",false,false,false],[0,0,0],[[7,3.2,6,2]],[true,10,2,"default"]], // Odroid-HC4 + ["hc4_panel_nas", + "add2","hk_hc4_oled_holder",35,178,2.99,"bottom",[0,0,0],["case",true,true,false],[0,0,2],[0],[true,10,2,"default"], + "model","hk_hc4_oled",35,178,2.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[0],[true,10,2,"default"]], + ["hc4_shell_drivebox2.5", "add2","hk_hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"], "model","hk_hc4_oled",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"], @@ -407,6 +411,9 @@ accessory_data = [ "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"], "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"]], + ["h3_panel_nas", + "model","hk_pwr_button",20,175,133.45,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[0],[true,10,2,"default"]], + ["h3_ultimate", "sub","vent",-3.5,30,58,"top",[0,0,90],["case",false,false,false],[2,12,4],[1,17,"vertical",1],[false,10,2,"default"], "sub","vent",111.5,30,58,"top",[0,0,90],["case",true,false,false],[2,12,4],[1,17,"vertical",1],[false,10,2,"default"], @@ -459,6 +466,10 @@ accessory_data = [ "model","hk_pwr_button",18,113,55.25,"top",[0,0,180],["case",false,false,true],[0,0,0],[0],[true,10,2,"default"], "model","dsub",18,-1,46,"top",[90,90,0],["case",false,false,false],[0,0,0],["db9","female"],[true,10,2,"default"]], + // Odroid-H4 + ["h4_panel_nas", + "model","hk_pwr_button",20,175,206,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[0],[true,10,2,"default"]], + ["show2_shell", "model","hk_wb2",6.25,24.675,16,"bottom",[0,0,180],["sbc",true,true,true],[0,0,0],[0],[false,10,2,"default"], "sub","rectangle",.5,8,8.5,"top",[0,0,0],["case",false,false,false],[6,16.5,8],[[.5,.5,.5,.5]],[false,10,2,"default"]], From 2f318b1ccebb51af582d3019784b4f3b839ccec2 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Wed, 23 Apr 2025 15:07:23 -0400 Subject: [PATCH 17/17] cable_holder improvement, more front, top and bottom vent cover adjustments, other code cleanup and example cases --- lib/cable_holder.scad | 4 +- mod/case_bottom.scad | 34 +- mod/case_side.scad | 50 +-- mod/case_top.scad | 35 +- sbc_case_builder.json | 651 ++++++++++++++++++++----------- sbc_case_builder.scad | 14 +- sbc_case_builder_accessories.cfg | 2 +- 7 files changed, 509 insertions(+), 281 deletions(-) diff --git a/lib/cable_holder.scad b/lib/cable_holder.scad index 77a6be0..b7f22ff 100644 --- a/lib/cable_holder.scad +++ b/lib/cable_holder.scad @@ -37,9 +37,9 @@ module cableholder_spacer(length) { difference() { union() { translate([size[0]/2,size[0]/2,0]) rotate([0,0,90]) long_slot(size[0],size[1],size[2]); - translate([-length,5,3]) rotate([0,90,0]) cylinder(d=6, h=length+1); + translate([-length,5,3]) rotate([0,90,0]) cylinder(d=6, h=length+9.4); } - translate([-length-adj,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=length+size[0]+adj); + translate([-length-adj,5,3]) rotate([0,90,0]) cylinder(d=3.2, h=length+size[0]+2*adj); translate([-1,8,-1]) cube([2,20,9]); translate([5,9.5,-1]) rotate([0,0,90]) long_slot(4.5,11,9); translate([3,20,-1]) rotate([0,0,45]) cube([2,6,9]); diff --git a/mod/case_bottom.scad b/mod/case_bottom.scad index c8eafc2..808f182 100644 --- a/mod/case_bottom.scad +++ b/mod/case_bottom.scad @@ -157,11 +157,11 @@ module case_bottom(case_design) { // front panel if(case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { translate([-wallthick-gap,depth-(2*wallthick)-gap,bottom_height-adj]) - rotate([0,0,0]) cube([width,wallthick,top_height]); + cube([width,wallthick,top_height]); } else { translate([-wallthick-gap,depth-(2*wallthick)-gap,bottom_height-adj]) - rotate([0,0,0]) cube([width,wallthick,top_height-floorthick]); + cube([width,wallthick,top_height-floorthick]); } // rear panel @@ -236,21 +236,21 @@ module case_bottom(case_design) { } else { difference() { - translate([pcb_width/2,pcb_depth/2,bottom_height/2]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,bottom_height/2]) cylinder_fillet_inside(h=bottom_height, r=hex_diameter/2, top=0, bottom=edge_fillet, $fn=6, fillet_fn=case_ffn, center=true); - translate([pcb_width/2,pcb_depth/2,(bottom_height/2)+floorthick]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,(bottom_height/2)+floorthick]) cylinder_fillet_inside(h=bottom_height+adj,r=(hex_diameter/2)-lip/2,top=0, bottom=edge_fillet-1,$fn=6,fillet_fn=case_ffn, center=true); difference() { - translate([pcb_width/2,pcb_depth/2,bottom_height-lip]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,bottom_height-lip]) cylinder(h=lip+adj,r=(hex_diameter/2)+1, $fn=6); - translate([pcb_width/2,pcb_depth/2,bottom_height-lip]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,bottom_height-lip]) cylinder(h=lip+2*adj,r=(hex_diameter/2)-lip/4, $fn=6); } } difference() { - translate([pcb_width/2,pcb_depth/2,(bottom_height/2)+2*floorthick]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,(bottom_height/2)+2*floorthick]) cylinder_fillet_inside(h=bottom_height+adj+floorthick+lip, r=(hex_diameter/2)-lip/2,top=0, bottom=edge_fillet-1, $fn=6, fillet_fn=case_ffn, center=true); @@ -515,9 +515,11 @@ echo(pcb_depth+case_offset_y-10); } // bottom cover pattern if(bottom_cover_pattern != "solid") { + xvent8_adj = pcb_width > 100 ? width/5.5 : width/6; if(bottom_cover_pattern == "hex_5mm") { if(case_design == "panel_nas") { - translate([5,5,-floorthick]) vent_hex((width-10)/3.75,(depth-10)/7,floorthick+4,5,1.5,"horizontal"); + translate([6,5,-floorthick+adj]) + vent_hex((width-10)/3.75,(depth-10)/7,floorthick+4,5,1.5,"horizontal"); } else { translate([1,0,-floorthick]) vent_hex(width/3.75,depth/6,floorthick+4,5,1.5,"horizontal"); @@ -525,7 +527,7 @@ echo(pcb_depth+case_offset_y-10); } if(bottom_cover_pattern == "hex_8mm") { if(case_design == "panel_nas") { - translate([5,6,-floorthick]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + translate([-gap+5,6,-floorthick+adj]) vent_hex(xvent8_adj,depth/9.5,floorthick+4,8,1.5,"horizontal"); } else { translate([1,2,-floorthick]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); @@ -533,8 +535,8 @@ echo(pcb_depth+case_offset_y-10); } if(bottom_cover_pattern == "linear_vertical") { if(case_design == "panel_nas") { - translate([6,5,-floorthick]) - vent(wallthick,depth-8*wallthick-gap,floorthick+4,1,1,(width-2*wallthick-gap)/4.5,"horizontal"); + translate([wallthick+gap,wallthick,-floorthick+adj]) + vent(wallthick,depth-6*wallthick-gap,floorthick+4,1,1,(width-2*(sidethick+gap))/5.35,"horizontal"); } else { translate([0,-gap,-floorthick]) @@ -543,8 +545,9 @@ echo(pcb_depth+case_offset_y-10); } if(bottom_cover_pattern == "linear_horizontal") { if(case_design == "panel_nas") { - translate([6,5,-floorthick]) - vent(width-6*(sidethick+gap),wallthick,floorthick+4,1,(depth-2*wallthick-gap)/3.25,1,"horizontal"); + translate([wallthick+gap,wallthick,-floorthick+adj]) + vent(width-4*(sidethick+gap),wallthick,floorthick+4,1, + (depth-2*(wallthick-gap))/4.35,1,"horizontal"); } else { translate([-gap,-gap,-floorthick]) @@ -553,9 +556,10 @@ echo(pcb_depth+case_offset_y-10); } if(bottom_cover_pattern == "astroid") { if(case_design == "panel_nas") { - for(c=[12:12:depth-16]) { + xast_adj = pcb_width <= 100 ? 8 : 6; + for(c=[xast_adj:12:depth-16]) { for(r=[12:12:width-16]) { - translate([r,c,-(2*floorthick)]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); + translate([r,c,-floorthick]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); } } } diff --git a/mod/case_side.scad b/mod/case_side.scad index d6f94fd..040701b 100644 --- a/mod/case_side.scad +++ b/mod/case_side.scad @@ -131,6 +131,7 @@ module case_side(case_design, side) { if(case_design == "panel_nas") { x_adj = pcb_width > 100 ? width-2*sidethick : width-2*(gap+sidethick); xtab_adj = pcb_width > 100 ? width-gap-2*sidethick-adj : width-gap-2*(gap+sidethick)-adj; + xvent8_adj = pcb_width > 100 ? width/5.5 : width/6; if(side == "rear") { difference() { union() { @@ -208,38 +209,41 @@ module case_side(case_design, side) { } // front cover pattern if(front_cover_pattern != "solid" && case_design == "panel_nas") { + xvent_pos = pcb_width <= 100 ? -gap+3 : -gap+6; if(front_cover_pattern == "hex_5mm" && hd_bays < 6) { - translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) - vent_hex(width/3.85,hd_bays*(27.1+hd_space)/5.75,wallthick+4,5,1.5,"vertical"); + translate([xvent_pos,depth-3*(wallthick)+gap,hd_z_position-5]) + vent_hex(round(width/3.85),round(hd_bays*(27.1+hd_space)/5.75),wallthick+4,5,1.5,"vertical"); } if(front_cover_pattern == "hex_5mm" && hd_bays == 6) { - translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) - vent_hex(width/3.85,hd_bays*(27.1+hd_space)/7,wallthick+4,5,1.5,"vertical"); + translate([xvent_pos,depth-3*(wallthick)+gap,hd_z_position]) + vent_hex(round(width/3.85),round(hd_bays*(27.1+hd_space)/5.75),wallthick+4,5,1.5,"vertical"); } if(front_cover_pattern == "hex_8mm") { - translate([-gap+5,depth-3*(wallthick)+gap,5]) - vent_hex(width/5.5,(case_z-6)/10,floorthick+4,8,1.5,"vertical"); + translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) + vent_hex(xvent8_adj,round(hd_bays*(27.1+hd_space)/5.75)-5,floorthick+4,8,1.5,"vertical"); } if(front_cover_pattern == "linear_vertical") { translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) vent(wallthick,(case_z-2*(wallthick+gap)-20)/8,floorthick+4,1,1, - (width-2*(wallthick+gap+sidethick))/4.2,"vertical"); - translate([-gap+4,depth-3*(wallthick)+gap,case_z-(top_height+bottom_height+4*floorthick)]) + (width-2*(sidethick+gap))/5.35,"vertical"); + translate([-gap+4,depth-3*(wallthick)+gap,case_z-(top_height+bottom_height+4*floorthick)-5]) vent(wallthick,(case_z-2*(wallthick+gap)-20)/8,floorthick+4,1,1, - (width-2*(wallthick+gap+sidethick))/4.2,"vertical"); + (width-2*(sidethick+gap))/5.35,"vertical"); } if(front_cover_pattern == "linear_horizontal") { - translate([-gap+4,depth-3*(wallthick)+gap,hd_z_position]) - vent(width-2*(wallthick+gap+sidethick)-4,wallthick,floorthick+4,2, - (case_z-2*(wallthick+gap)-20)/20,1,"vertical"); - translate([-gap+4,depth-3*(wallthick)+gap,case_z-(top_height+bottom_height+4*floorthick)-20]) + translate([wallthick+gap,depth-3*(wallthick)+gap,hd_z_position]) vent(width-2*(wallthick+gap+sidethick)-4,wallthick,floorthick+4,2, (case_z-2*(wallthick+gap)-20)/20,1,"vertical"); + translate([wallthick+gap,depth-3*(wallthick)+gap, + case_z-(top_height+bottom_height+4*floorthick)-20]) + vent(width-4*(sidethick+gap),,wallthick,floorthick+4,2, + (case_z-2*(wallthick+gap)-20)/20,1,"vertical"); } if(front_cover_pattern == "astroid") { - for(c=[10:12:case_z-20]) { - for(r=[6:12:width-8]) { - translate([r,depth-wallthick,c]) rotate([90,0,0]) + xast_adj = pcb_width <= 100 ? 8 : 6; + for(c=[xast_adj:12:case_z-20]) { + for(r=[8:12:width-8]) { + translate([r,depth-2*wallthick,c]) rotate([90,0,0]) linear_extrude(wallthick+5) import("./dxf/astroid_8mm.dxf"); } } @@ -287,13 +291,13 @@ module case_side(case_design, side) { translate([width-3*sidethick+gap-adj,depth-(4*wallthick),(case_z/2)-5]) cube([2*sidethick+2*adj,wallthick+tol,20]); translate([width-3*sidethick+gap-adj,depth-(4*wallthick),(case_z/2)-5+10]) - cube([2*sidethick+(2*adj),2*wallthick,10+tol]); + cube([2*sidethick+(2*adj),3*wallthick,10+tol]); // rear edge middle tab openings translate([width-3*sidethick+gap-adj,-2*wallthick+adj,(case_z/2)-5]) cube([2*sidethick+2*adj,wallthick+tol,20]); translate([width-3*sidethick+gap-adj,-(4*wallthick),(case_z/2)-5+10]) - cube([2*sidethick+(2*adj),2*wallthick,10+tol]); + cube([2*sidethick+(2*adj),3*wallthick,10+tol]); } // hd holes for bays @@ -350,13 +354,13 @@ module case_side(case_design, side) { translate([-sidethick-gap-adj,-2*wallthick+adj,case_z-30]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),case_z-20-tol]) - cube([sidethick+(2*adj),2*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick+adj,10+tol]); - // rear edge botom tab openings + // rear edge bottom tab openings translate([-sidethick-gap-adj,-2*wallthick+adj,20]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),30-tol]) - cube([sidethick+(2*adj),2*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick,10+tol]); // front edge top tab openings translate([-sidethick-gap-adj,depth-(4*wallthick),case_z-30]) @@ -375,7 +379,7 @@ module case_side(case_design, side) { translate([-sidethick-gap-adj,-2*wallthick+adj,(case_z/2)-5]) cube([sidethick+2*adj,wallthick+tol,20]); translate([-sidethick-gap-adj,-(4*wallthick),(case_z/2)-5+10]) - cube([sidethick+(2*adj),2*wallthick,10+tol]); + cube([sidethick+(2*adj),3*wallthick,10+tol]); // front edge middle tab openings translate([-sidethick-gap-adj,depth-(4*wallthick),(case_z/2)-5]) @@ -388,7 +392,7 @@ module case_side(case_design, side) { if(hd_reverse == false) { for( i=[0:1:hd_bays-1]) { translate([-gap+adj,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) - rotate([0,0,0]) hd_holes(3.5, "portrait", "both", sidethick+2); + hd_holes(3.5, "portrait", "both", sidethick+2); } } else { diff --git a/mod/case_top.scad b/mod/case_top.scad index 2179459..6332a97 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -111,8 +111,8 @@ module case_top(case_design) { bottom=[0,0,0,0], $fn=90); translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap,(case_z/2)-floorthick+.25]) cube_fillet_inside([width+1,depth+(wallthick*2),case_z], - vertical=[corner_fillet-wallthick,corner_fillet-wallthick,corner_fillet-wallthick,corner_fillet-wallthick], - top=[0,0,0,0],bottom=[0,0,0,0], $fn=90); + vertical=[corner_fillet-wallthick,corner_fillet-wallthick,corner_fillet-wallthick, + corner_fillet-wallthick],top=[0,0,0,0],bottom=[0,0,0,0], $fn=90); for (i=[1:11:len(sbc_data[s[0]])-2]) { class = sbc_data[s[0]][i+1]; type = sbc_data[s[0]][i+2]; @@ -228,13 +228,13 @@ module case_top(case_design) { } else { difference() { - translate([pcb_width/2,pcb_depth/2,bottom_height+(top_height/2)-lip/2]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,bottom_height+(top_height/2)-lip/2]) cylinder_fillet_inside(h=top_height+lip, r=hex_diameter/2, top=edge_fillet, bottom=0, $fn=6, fillet_fn=case_ffn, center=true); translate([pcb_width/2,pcb_depth/2,bottom_height+(top_height/2)-floorthick-lip/2]) - rotate([0,0,0]) cylinder_fillet_inside(h=top_height+lip, r=(hex_diameter/2)-wallthick, + cylinder_fillet_inside(h=top_height+lip, r=(hex_diameter/2)-wallthick, top=edge_fillet-1, bottom=0, $fn=6, fillet_fn=case_ffn, center=true); - translate([pcb_width/2,pcb_depth/2,bottom_height-adj-lip/2]) rotate([0,0,0]) + translate([pcb_width/2,pcb_depth/2,bottom_height-adj-lip/2]) cylinder_fillet_inside(h=lip+2*adj, r=(hex_diameter/2)-wallthick/2+tol/2, top=edge_fillet-1, bottom=0, $fn=6, fillet_fn=case_ffn, center=true); // io cutout @@ -267,21 +267,22 @@ module case_top(case_design) { translate([(width/2)-wallthick-gap,(depth/2)-wallthick-gap,case_z-adj]) cube_fillet_inside([width-(3*wallthick),depth-(3*wallthick),2*floorthick+1.5+adj], - vertical=[corner_fillet-wallthick,corner_fillet-wallthick,corner_fillet-wallthick,corner_fillet-wallthick],top=[0,0,0,0], - bottom=[edge_fillet,edge_fillet,edge_fillet,edge_fillet,edge_fillet], $fn=90); + vertical=[corner_fillet-wallthick,corner_fillet-wallthick,corner_fillet-wallthick, + corner_fillet-wallthick],top=[0,0,0,0], + bottom=[edge_fillet,edge_fillet,edge_fillet,edge_fillet,edge_fillet], $fn=90); } // snap top outdent difference() { translate([-wallthick-gap+1.25+tol,(depth/2)-((depth*.75)/2)+2.5-gap-wallthick,case_z-.5]) rotate([0,45,0]) cube([4,(depth*.75)-5,4]); translate([-wallthick-gap+3,(depth/2)-((depth*.75)/2)+1.25-gap-wallthick,case_z+floorthick-5.75]) - rotate([0,0,0]) cube([6,(depth*.75)-2,6]); + cube([6,(depth*.75)-2,6]); } difference() { translate([width-wallthick-gap-6.8-tol,(depth/2)-((depth*.75)/2)+2.5-gap-wallthick,case_z-.5]) rotate([0,45,0]) cube([4,(depth*.75)-5,4]); - translate([width-wallthick-gap-8.5,(depth/2)-((depth*.75)/2)+1.25-gap-wallthick,case_z+floorthick-5.75]) - rotate([0,0,0]) cube([6,(depth*.75)-2,6]); + translate([width-wallthick-gap-8.5,(depth/2)-((depth*.75)/2)+1.25-gap-wallthick, + case_z+floorthick-5.75]) cube([6,(depth*.75)-2,6]); } } if(case_design == "fitted") { @@ -461,6 +462,7 @@ module case_top(case_design) { } // top cover pattern if(top_cover_pattern != "solid") { + xvent8_adj = pcb_width > 100 ? width/5.5 : width/6; if(top_cover_pattern == "hex_5mm") { if(case_design == "panel_nas") { translate([6,5,case_z-(2*floorthick)]) @@ -472,7 +474,7 @@ module case_top(case_design) { } if(top_cover_pattern == "hex_8mm") { if(case_design == "panel_nas") { - translate([5,6,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); + translate([-gap+5,6,case_z-(2*floorthick)]) vent_hex(xvent8_adj,depth/9.5,floorthick+4,8,1.5,"horizontal"); } else { translate([1,2,case_z-(2*floorthick)]) vent_hex(width/5.5,depth/9.5,floorthick+4,8,1.5,"horizontal"); @@ -481,7 +483,7 @@ module case_top(case_design) { if(top_cover_pattern == "linear_vertical") { if(case_design == "panel_nas") { translate([wallthick+gap,wallthick,case_z-(2*floorthick)]) - vent(wallthick,depth-6*wallthick-gap,floorthick+4,1,1,(width-2*(sidethick+gap))/4.25,"horizontal"); + vent(wallthick,depth-6*wallthick-gap,floorthick+4,1,1,(width-2*(sidethick+gap))/5.35,"horizontal"); } else { translate([0,-gap,case_z-(2*floorthick)]) @@ -491,8 +493,8 @@ module case_top(case_design) { if(top_cover_pattern == "linear_horizontal") { if(case_design == "panel_nas") { translate([wallthick+gap,wallthick,case_z-(2*floorthick)]) - vent((width-4*(sidethick+gap)),wallthick,floorthick+4,1, - (depth-2*(wallthick-gap))/3.25,1,"horizontal"); + vent(width-4*(sidethick+gap),wallthick,floorthick+4,1, + (depth-2*(wallthick-gap))/4.35,1,"horizontal"); } else { translate([-gap,-gap,case_z-(2*floorthick)]) @@ -500,9 +502,10 @@ module case_top(case_design) { } } if(top_cover_pattern == "astroid") { + xast_adj = pcb_width <= 100 ? 8 : 6; if(case_design == "panel_nas") { - for(c=[12:12:depth-16]) { - for(r=[12:12:width-16]) { + for(c=[xast_adj:12:depth-16]) { + for(r=[8:12:width-16]) { translate([r,c,case_z-(2*floorthick)-adj]) linear_extrude(floorthick+5) import("./dxf/astroid_8mm.dxf"); } diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 2098484..499ae11 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -3131,6 +3131,223 @@ "view": "model", "wallthick": "2.5" }, + "m1_panel_nas": { + "$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": "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": "panel_nas", + "case_offset_bz": "-5", + "case_offset_tz": "-15", + "case_offset_x": "10", + "case_offset_y": "20", + "cooling": "open", + "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": "hex_5mm", + "gap": "1", + "gpio_opening": "default", + "hd_bays": "1", + "hd_center": "false", + "hd_reverse": "true", + "hd_space": "10", + "hd_y_position": "25", + "hd_z_position": "45", + "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": "bottom", + "pcb_loc_x": "9", + "pcb_loc_y": "2", + "pcb_loc_z": "0", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", + "rear_fan": "1", + "rear_fan_center": "false", + "rear_fan_position": "30", + "rear_fan_size": "60", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "false", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "m1", + "sbc_off": "false", + "sbc_top_standoffs": "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": "countersunk", + "uart_opening": "none", + "view": "model", + "wallthick": "2" + }, "m1s_shell_nvme": { "$fn": "90", "access_panel_location": "[0, 28]", @@ -5017,223 +5234,6 @@ "view": "model", "wallthick": "2" }, - "h3_panel_nas": { - "$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": "h3_panel_nas", - "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": "panel_nas", - "case_offset_bz": "0", - "case_offset_tz": "0", - "case_offset_x": "0", - "case_offset_y": "25", - "cooling": "fan_hex", - "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": "80", - "flat_blank_section": "false", - "floorthick": "3", - "front_cover_pattern": "hex_5mm", - "gap": "1", - "gpio_opening": "none", - "hd_bays": "2", - "hd_center": "false", - "hd_reverse": "true", - "hd_space": "10", - "hd_y_position": "20", - "hd_z_position": "7", - "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", - "raise_top": "0", - "rear_cooling": "fan_hex", - "rear_dualfan_spacing": "6", - "rear_fan": "1", - "rear_fan_center": "false", - "rear_fan_position": "4", - "rear_fan_size": "80", - "rear_io_shield": "false", - "sbc_bottom_standoffs": "false", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "h3+", - "sbc_off": "false", - "sbc_top_standoffs": "true", - "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": "25", - "top_standoff_support_size": "10", - "top_standoff_type": "recessed", - "uart_opening": "default", - "view": "model", - "wallthick": "3" - }, "h3_ultimate": { "$fn": "90", "access_panel_location": "[5, 30]", @@ -5540,6 +5540,223 @@ "view": "model", "wallthick": "2.5" }, + "h3_panel_nas": { + "$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": "h3_panel_nas", + "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": "panel_nas", + "case_offset_bz": "0", + "case_offset_tz": "0", + "case_offset_x": "0", + "case_offset_y": "25", + "cooling": "fan_hex", + "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": "80", + "flat_blank_section": "false", + "floorthick": "3", + "front_cover_pattern": "hex_5mm", + "gap": "1", + "gpio_opening": "none", + "hd_bays": "2", + "hd_center": "false", + "hd_reverse": "true", + "hd_space": "10", + "hd_y_position": "20", + "hd_z_position": "10", + "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", + "raise_top": "0", + "rear_cooling": "fan_hex", + "rear_dualfan_spacing": "6", + "rear_fan": "1", + "rear_fan_center": "false", + "rear_fan_position": "4", + "rear_fan_size": "80", + "rear_io_shield": "false", + "sbc_bottom_standoffs": "false", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "h3+", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "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": "25", + "top_standoff_support_size": "10", + "top_standoff_type": "recessed", + "uart_opening": "default", + "view": "model", + "wallthick": "3" + }, "h4_panel_nas": { "$fn": "90", "access_panel_location": "[10, 15]", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index bf42770..e47b616 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -83,9 +83,9 @@ case_offset_x = 0; //[0:.01:300] // additional y axis case size case_offset_y = 0; //[0:.01:300] // additional z axis case top size -case_offset_tz = 0; //[-30:.01:300] +case_offset_tz = 0; //[-50:.01:300] // additional z axis case bottom size -case_offset_bz = 0; //[0:.01:300] +case_offset_bz = 0; //[-50:.01:300] // case wall thickness wallthick = 2; //[1:.25:5] // case floor and ceiling thickness @@ -497,7 +497,7 @@ if (view == "platter") { translate([-20,0,-gap]) rotate([0,90,90]) case_side(case_design,"left"); // nas hd spacers - if(case_design == "panel_nas" && (pcb_width > 100 || width > 101.6)) { + if(case_design == "panel_nas" && (pcb_width > 100 || width > 112)) { if(hd_center == false) { translate([0,-35,0]) rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4); } @@ -699,7 +699,7 @@ if (view == "model") { if(hd_center == false) { translate([-gap,-(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100 || width > 101.6) { + if(pcb_width > 100 || width-2*(sidethick+gap) > 101.6) { translate([101.6-gap+hd_spacer-9.4, 28.5-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6+(hd_space+27.1)*i]) @@ -720,7 +720,7 @@ if (view == "model") { translate([-gap+hd_spacer/2, -(3*wallthick)-gap+hd_y_position,hd_z_position+(hd_space+27.1)*i]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100 || width > 101.6) { + if(pcb_width > 100 || width-2*(sidethick+gap) > 101.6) { // right side spacers translate([101.6-gap+hd_spacer-9.4, 28.5-(3*wallthick)-gap+hd_y_position+101.6, @@ -759,7 +759,7 @@ if (view == "model") { translate([101.6-gap,-(3*wallthick)-gap+hd_y_position+147, hd_z_position+(hd_space+27.1)*i]) rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100 || width > 101.6) { + if(pcb_width > 100 || width-2*(sidethick+gap) > 101.6) { translate([101.6-gap+hd_spacer-9.4, 17-(3*wallthick)-gap+hd_y_position+101.6, hd_z_position+6.5+(hd_space+27.1)*i]) @@ -780,7 +780,7 @@ if (view == "model") { -(3*wallthick)-gap+hd_y_position+147, hd_z_position+(hd_space+27.1)*i]) rotate([0,0,180]) hd35("portrait", [false,0,0,"default"]); - if(pcb_width > 100 || width > 101.6) { + if(pcb_width > 100 || width-2*(sidethick+gap) > 101.6) { // right side spacers translate([101.6-gap+hd_spacer-9.4, 17-(3*wallthick)-gap+hd_y_position+101.6, diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index f733bcb..7a7e177 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -468,7 +468,7 @@ accessory_data = [ // Odroid-H4 ["h4_panel_nas", - "model","hk_pwr_button",20,175,206,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[0],[true,10,2,"default"]], + "model","hk_pwr_button",20,175,206,"top",[0,0,0],["case",true,true,true],[0,0,0],[0],[true,10,2,"default"]], ["show2_shell", "model","hk_wb2",6.25,24.675,16,"bottom",[0,0,180],["sbc",true,true,true],[0,0,0],[0],[false,10,2,"default"],