From a032839b3b5493392eb46782612b1cbf9fed8028 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Mon, 7 Apr 2025 17:33:32 -0400 Subject: [PATCH] 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