From 861c2231fc9c7e561c080654868f16f5c6e377d2 Mon Sep 17 00:00:00 2001 From: David Long Date: Thu, 15 Sep 2022 16:54:37 -0400 Subject: [PATCH] Update fan logic to handle larger fan sizes better. Improved positioning and placement of fan parts. --- sbc_case_builder.json | 171 ++++++++++++++++++++----------- sbc_case_builder.scad | 4 +- sbc_case_builder_accessories.cfg | 8 +- sbc_case_builder_library.scad | 75 +++++--------- tests/fan_mask.scad | 8 +- 5 files changed, 157 insertions(+), 109 deletions(-) diff --git a/sbc_case_builder.json b/sbc_case_builder.json index f65e999..2369880 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -12939,63 +12939,6 @@ "vu_rotation": "[15, 0, 0]", "wallthick": "2" }, - "rpi4b_shell_geeekpi_poe_hat": { - "$fn": "90", - "accessory_highlight": "false", - "accessory_name": "rpi4b_shell_geeekpi_poe_hat", - "adjust": "0.01", - "bottom_ext_standoff": "[6.75, 5, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", - "bottom_front_left": "0", - "bottom_front_right": "0", - "bottom_rear_left": "0", - "bottom_rear_right": "0", - "bottom_standoff": "[6.75, 7, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", - "c_fillet": "3", - "case_design": "shell", - "case_ext_standoffs": "false", - "case_ffn": "90", - "case_fn": "360", - "case_offset_bz": "0", - "case_offset_tz": "15", - "case_offset_x": "0", - "case_offset_y": "0", - "case_style": "none", - "cooling": "fan", - "exhaust_vents": "vent", - "fillet": "0", - "floorthick": "2", - "gap": "1", - "gpio_opening": "none", - "indents": "true", - "lip": "5", - "lower_bottom": "0", - "move_front": "0", - "move_leftside": "0", - "move_rear": "0", - "move_rightside": "0", - "pcb_loc_x": "0", - "pcb_loc_y": "0", - "pcb_loc_z": "0", - "raise_top": "0", - "sata_punchout": "false", - "sbc_bottom_standoffs": "true", - "sbc_highlight": "false", - "sbc_model": "rpi4b", - "sbc_off": "false", - "sbc_top_standoffs": "true", - "sidethick": "2", - "sidewall_support": "true", - "tol": "0.25", - "top_ext_standoff": "[6.75, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", - "top_front_left": "-11", - "top_front_right": "-11", - "top_rear_left": "-11", - "top_rear_right": "0", - "top_standoff": "[6.75, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", - "view": "model", - "vu_rotation": "[15, 0, 0]", - "wallthick": "2" - }, "rpi4b_panel": { "$fn": "90", "accessory_highlight": "false", @@ -20804,6 +20747,120 @@ "view": "model", "vu_rotation": "[15, 0, 0]", "wallthick": "2" + }, + "rpi4b_shell_geeekpi_poe_hat": { + "$fn": "90", + "accessory_highlight": "false", + "accessory_name": "rpi4b_shell_geeekpi_poe_hat", + "adjust": "0.01", + "bottom_ext_standoff": "[6.75, 5, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", + "bottom_front_left": "0", + "bottom_front_right": "0", + "bottom_rear_left": "0", + "bottom_rear_right": "0", + "bottom_standoff": "[6.75, 7, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", + "c_fillet": "3", + "case_design": "shell", + "case_ext_standoffs": "false", + "case_ffn": "90", + "case_fn": "360", + "case_offset_bz": "0", + "case_offset_tz": "15", + "case_offset_x": "0", + "case_offset_y": "0", + "case_style": "none", + "cooling": "fan", + "exhaust_vents": "vent", + "fillet": "0", + "floorthick": "2", + "gap": "1", + "gpio_opening": "none", + "indents": "true", + "lip": "5", + "lower_bottom": "0", + "move_front": "0", + "move_leftside": "0", + "move_rear": "0", + "move_rightside": "0", + "pcb_loc_x": "0", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "sata_punchout": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_model": "rpi4b", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "sidethick": "2", + "sidewall_support": "true", + "tol": "0.25", + "top_ext_standoff": "[6.75, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", + "top_front_left": "-11", + "top_front_right": "-11", + "top_rear_left": "-11", + "top_rear_right": "0", + "top_standoff": "[6.75, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", + "view": "model", + "vu_rotation": "[15, 0, 0]", + "wallthick": "2" + }, + "rpi4b_stacked_geeekpi_poe_hat": { + "$fn": "90", + "accessory_highlight": "false", + "accessory_name": "rpi4b_shell_geeekpi_poe_hat", + "adjust": "0.01", + "bottom_ext_standoff": "[6.75, 5, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", + "bottom_front_left": "0", + "bottom_front_right": "0", + "bottom_rear_left": "0", + "bottom_rear_right": "0", + "bottom_standoff": "[6.75, 7, 3.6, 10, 4, 1, 0, 0, 0, 4.5, 5.1]", + "c_fillet": "3", + "case_design": "stacked", + "case_ext_standoffs": "false", + "case_ffn": "90", + "case_fn": "360", + "case_offset_bz": "0", + "case_offset_tz": "15", + "case_offset_x": "0", + "case_offset_y": "0", + "case_style": "none", + "cooling": "fan", + "exhaust_vents": "vent", + "fillet": "0", + "floorthick": "2", + "gap": "1", + "gpio_opening": "none", + "indents": "true", + "lip": "5", + "lower_bottom": "0", + "move_front": "0", + "move_leftside": "0", + "move_rear": "0", + "move_rightside": "0", + "pcb_loc_x": "0", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "sata_punchout": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_model": "rpi4b", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "sidethick": "2", + "sidewall_support": "true", + "tol": "0.25", + "top_ext_standoff": "[6.75, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", + "top_front_left": "-11", + "top_front_right": "-11", + "top_rear_left": "-11", + "top_rear_right": "0", + "top_standoff": "[6.75, 18, 2.5, 10, 4, 4, 0, 1, 0, 4.5, 5.1]", + "view": "model", + "vu_rotation": "[15, 0, 0]", + "wallthick": "2" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index af1fad3..0b178e9 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -77,7 +77,7 @@ case_design = "shell"; // [shell,panel,stacked,tray,round,hex,snap,fitted] // base case style case_style = "none"; // ["none","vu5","vu7","sides"] // single board computer model -sbc_model = "c1+"; // ["c1+", "c2", "c4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2+_noheatsink", "m1", "m1_noheatsink", "h2", "hc4", "show2", "rpizero", "rpizero2w", "rpi1a+", "rpi1b+", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "a64", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "atomicpi", "jetsonnano", "rockpi4b+", "rockpi4c", "rockpi4c+", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-r2", "opizero", "opizero2", "opir1plus_lts", "test"] +sbc_model = "c1+"; // ["c1+", "c2", "c4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2+_noheatsink", "m1", "m1_noheatsink", "h2", "hc4", "show2", "rpizero", "rpizero2w", "rpi1a+", "rpi1b+", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "a64", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "atomicpi", "jetsonnano", "rockpi4b+", "rockpi4c", "rockpi4c+", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-r2", "opizero", "opizero2", "opir1plus_lts", "test"] // sbc location x axis pcb_loc_x = 0; //[0:.5:200] // sbc location y axis @@ -158,7 +158,7 @@ cooling = "fan"; // [none,vents,fan,custom] exhaust_vents = "vent"; // [none,vent] // case accessory group to load -accessory_name = "none"; // ["none", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_drive", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_panel", "rpi4b_stacked", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rockpi4b+_shell", "rockpi4b+_panel", "rockpi4b+_stacked", "rockpi4b+_tray", "rockpi4b+_tray_sides", "rockpi4b+_round", "rockpi4b+_hex", "rockpi4b+_snap", "rockpi4b+_fitted", "rockpi4c_shell", "rockpi4c_panel", "rockpi4c_stacked", "rockpi4c_tray", "rockpi4c_tray_sides", "rockpi4c_round", "rockpi4c_hex", "rockpi4c_snap", "rockpi4c_fitted", "rockpi4c+_shell", "rockpi4c+_panel", "rockpi4c+_stacked", "rockpi4c+_tray", "rockpi4c+_tray_sides", "rockpi4c+_round", "rockpi4c+_hex", "rockpi4c+_snap", "rockpi4c+_fitted", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "hk_uart"] +accessory_name = "none"; // ["none", "c1+_shell_boombox", "c1+_panel_boombox", "c1+_panel_lcd3.5", "c1+_desktop_lcd3.5", "c1+_deskboom_lcd3.5", "c1+_tray_boombox", "c1+_round", "c1+_hex", "c2_shell_boombox", "c2_panel_boombox", "c2_panel_lcd3.5", "c2_desktop_lcd3.5", "c2_deskboom_lcd3.5", "c2_tray_boombox", "c2_round", "c2_hex", "c4_shell_boombox", "c4_panel_lcd3.5", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_tray_boombox", "c4_round", "c4_hex", "hc4_tray_drivebox2.5", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "n1_round", "n1_hex", "n2+_tray_vu7_fan", "m1_panel", "m1_tray", "m1_tray_drive", "m1_tray_sides", "m1_tray_vu5", "m1_tray_vu7", "h2_shell", "h2_shell_router", "h2_shell_router-ssd", "h2_lowboy", "h2_lowboy_router", "h2_tray", "h2_tray_sides", "h2_tray_router", "h2_router_station", "h2_round", "h2_hex", "jetsonnano_shell", "jetsonnano_panel", "jetsonnano_stacked", "jetsonnano_tray", "jetsonnano_tray_sides", "jetsonnano_round", "jetsonnano_hex", "jetsonnano_snap", "jetsonnano_fitted", "rock64_shell", "rock64_panel", "rock64_stacked", "rock64_tray", "rock64_tray_sides", "rock64_round", "rock64_hex", "rock64_snap", "rock64_fitted", "rockpro64_shell", "rockpro64_panel", "rockpro64_stacked", "rockpro64_tray", "rockpro64_tray_sides", "rockpro64_round", "rockpro64_hex", "rockpro64_snap", "rockpro64_fitted", "quartz64b_stacked_poe_hat", "show2_shell", "rpi1a+_shell", "rpi1a+_panel", "rpi1a+_stacked", "rpi1a+_tray", "rpi1a+_tray_sides", "rpi1a+_round", "rpi1a+_hex", "rpi1a+_snap", "rpi1a+_fitted", "rpi1b+_shell", "rpi1b+_panel", "rpi1b+_stacked", "rpi1b+_tray", "rpi1b+_tray_sides", "rpi1b+_round", "rpi1b+_hex", "rpi1b+_snap", "rpi1b+_fitted", "rpi3a+_shell", "rpi3a+_panel", "rpi3a+_stacked", "rpi3a+_tray", "rpi3a+_tray_sides", "rpi3a+_round", "rpi3a+_hex", "rpi3a+_snap", "rpi3a+_fitted", "rpi3b_shell", "rpi3b_panel", "rpi3b_stacked", "rpi3b_tray", "rpi3b_tray_sides", "rpi3b_round", "rpi3b_hex", "rpi3b_snap", "rpi3b_fitted", "rpi3b+_shell", "rpi3b+_panel", "rpi3b+_stacked", "rpi3b+_tray", "rpi3b+_tray_sides", "rpi3b+_round", "rpi3b+_hex", "rpi3b+_snap", "rpi3b+_fitted", "rpi4b_shell", "rpi4b_shell_geeekpi_poe_hat", "rpi4b_panel", "rpi4b_stacked", "rpi4b_stacked_geeekpi_poe_hat", "rpi4b_tray", "rpi4b_tray_sides", "rpi4b_round", "rpi4b_hex", "rpi4b_snap", "rpi4b_fitted", "rockpi4b+_shell", "rockpi4b+_panel", "rockpi4b+_stacked", "rockpi4b+_tray", "rockpi4b+_tray_sides", "rockpi4b+_round", "rockpi4b+_hex", "rockpi4b+_snap", "rockpi4b+_fitted", "rockpi4c_shell", "rockpi4c_panel", "rockpi4c_stacked", "rockpi4c_tray", "rockpi4c_tray_sides", "rockpi4c_round", "rockpi4c_hex", "rockpi4c_snap", "rockpi4c_fitted", "rockpi4c+_shell", "rockpi4c+_panel", "rockpi4c+_stacked", "rockpi4c+_tray", "rockpi4c+_tray_sides", "rockpi4c+_round", "rockpi4c+_hex", "rockpi4c+_snap", "rockpi4c+_fitted", "vim1_shell", "vim1_panel", "vim1_stacked", "vim1_tray", "vim1_tray_sides", "vim1_round", "vim1_hex", "vim1_snap", "vim1_fitted", "vim2_shell", "vim2_panel", "vim2_stacked", "vim2_tray", "vim2_tray_sides", "vim2_round", "vim2_hex", "vim2_snap", "vim2_fitted", "vim3l_shell", "vim3l_panel", "vim3l_stacked", "vim3l_tray", "vim3l_tray_sides", "vim3l_round", "vim3l_hex", "vim3l_snap", "vim3l_fitted", "vim3_shell", "vim3_panel", "vim3_stacked", "vim3_tray", "vim3_tray_sides", "vim3_round", "vim3_hex", "vim3_snap", "vim3_fitted", "vim4_shell", "vim4_panel", "vim4_stacked", "vim4_tray", "vim4_tray_sides", "vim4_round", "vim4_hex", "vim4_snap", "vim4_fitted", "tinkerboard_shell", "tinkerboard_panel", "tinkerboard_stacked", "tinkerboard_tray", "tinkerboard_tray_sides", "tinkerboard_round", "tinkerboard_hex", "tinkerboard_snap", "tinkerboard_fitted", "tinkerboard-s_shell", "tinkerboard-s_panel", "tinkerboard-s_stacked", "tinkerboard-s_tray", "tinkerboard-s_tray_sides", "tinkerboard-s_round", "tinkerboard-s_hex", "tinkerboard-s_snap", "tinkerboard-s_fitted", "tinkerboard-2_shell", "tinkerboard-2_panel", "tinkerboard-2_stacked", "tinkerboard-2_tray", "tinkerboard-2_tray_sides", "tinkerboard-2_round", "tinkerboard-2_hex", "tinkerboard-2_snap", "tinkerboard-2_fitted", "tinkerboard-r2_shell", "tinkerboard-r2_panel", "tinkerboard-r2_stacked", "tinkerboard-r2_tray", "tinkerboard-r2_tray_sides", "tinkerboard-r2_round", "tinkerboard-r2_hex", "tinkerboard-r2_snap", "tinkerboard-r2_fitted", "hk_uart"] a = search([accessory_name],accessory_data); s = search([sbc_model],sbc_data); diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 908aaa3..4c78e15 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -818,6 +818,9 @@ accessory_data = [ "sub","fan",43,28,28,"top",[0,0,0],["sbc",true,true,true],40,0,6,2,0,"",0, // sub fan opening "sub","rectangle",43,0,28,"top",[0,0,0],["sbc",true,true,true],40,10,6,0,0,"",[1,1,1,1]], // sub pcie opening + ["quartz64b_stacked_poe_hat", + "sub","fan",20,0,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening + ["show2_shell", "model","hk_wb2",6.25,24.675,16,"top",[0,0,180],["sbc",true,true,true],0,0,0,0,0,"",0, // hk weatherboard2 "suball","round",48.75,0,6,"top",[90,0,0],["sbc",true,true,true],4,0,4,0,0,"",0, // sub button access hole @@ -979,13 +982,16 @@ accessory_data = [ "sub","fan",10,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening ["rpi4b_shell_geeekpi_poe_hat", - "sub","fan",12,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening + "sub","fan",12,10,24.5,"top",[0,0,0],["case",true,true,true],30,0,6,2,0,"",0], // sub fan opening ["rpi4b_panel", "sub","fan",10,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening ["rpi4b_stacked", "sub","fan",10,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening + + ["rpi4b_stacked_geeekpi_poe_hat", + "sub","fan",12,10,24.5,"top",[0,0,0],["case",true,true,true],30,0,6,2,0,"",0], // sub fan opening ["rpi4b_tray", "sub","fan",10,10,24.5,"top",[0,0,0],["case",true,true,true],40,0,6,2,0,"",0], // sub fan opening diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index c91d779..7daf123 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -2421,61 +2421,40 @@ module fan_mask(size, thick, style) { size == 70 ? 61.9 : size == 80 ? 71.5 : size * 0.8; // Use 80% as default - bar_width = size < 40 ? 2 : 3; - ring_width = size <= 40 ? 3 : 8; - screw_offset = (size - inner) / 2; - translate_xy = size * 0.5; - rings = 5; - base_ring_size = (size * 0.9) / rings; - ring_height = thick + 2; - ring_diff_height = ring_height + 2; + rings = size <= 40 ? 4 : 6; + bar_size = size <= 40 ? 2 : 3; - translate([0, 0, -1]) difference() { + screw_offset = inner / 2; + center_point = size * 0.5; + base_ring_size = size * 0.9; + rings_spacing = size / rings; + + translate([size/2, size/2, -1]) + union() { + translate([screw_offset, screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true); + translate([-screw_offset, screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true); + translate([screw_offset, -screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true); + translate([-screw_offset, -screw_offset, (thick+2)/2]) cylinder(d=3, h=thick+2, center=true); + + difference() { union() { - // screw holes - translate([screw_offset, screw_offset, 0]) cylinder(d=3, h=thick+2); - translate([size-screw_offset, screw_offset, 0]) cylinder(d=3, h=thick+2); - translate([screw_offset, size-screw_offset, 0]) cylinder(d=3, h=thick+2); - translate([size-screw_offset, size-screw_offset, 0]) cylinder(d=3, h=thick+2); - - // fan grates; - for(i=[0:rings]) { - difference() { - translate([translate_xy, translate_xy, 0]) cylinder(d=base_ring_size * i, h=ring_height); - translate([translate_xy, translate_xy, -1]) cylinder(d=base_ring_size * i - ring_width, h=ring_diff_height); - } - } + for(i=[inner:-rings_spacing:0]) { difference() { - translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-10); - translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-14); + echo("Ring", base_ring_size - i); + echo("Ring Cut", base_ring_size - i - (rings_spacing/2)); + cylinder(d=base_ring_size - i, h=thick+2); + translate([0, 0, -1]) cylinder(d=base_ring_size - i - (rings_spacing/2), h=thick+4); } - difference() { - translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-18); - translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-22); } - difference() { - translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-26); - translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-30); - } - difference() { - translate ([size/2,size/2,-1]) cylinder(h=thick+2, d=size-34); - translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-38); - } -// translate ([size/2,size/2,-2]) cylinder(h=thick+4, d=size-34); - // mount holes - translate ([size-4,size-4,-1]) cylinder(h=thick+2, d=3); - translate ([size-4,4,-1]) cylinder(h=thick+2, d=3); - translate ([4,size-4,-1]) cylinder(h=thick+2, d=3); - translate ([4,4,-1]) cylinder(h=thick+2, d=3); } - - // cross bars - // NOTE: The math could be better here to figure out the bar's offset, but it works - // okay until you get up to a bar width of 6mm. - bar_offset = inner / 7; - translate([sqrt((bar_width*bar_width)/2) + bar_offset, bar_offset, -1]) rotate([0, 0, 45]) cube([size, bar_width, 12]); - translate([bar_offset, -sqrt((bar_width*bar_width)/2)+size - bar_offset, -1]) rotate([0, 0, -45]) cube([size, bar_width, 12]); + + translate([0, 0, -1]) union() { + cylinder(d=bar_size*2+0.1, thick+6); // Add a circle to prevent any tiny holes around cross bar + rotate([0, 0, 45]) cube([size, bar_size, 12], center=true); + rotate([0, 0, 45]) cube([bar_size, size, 12], center=true); + } + } } } } diff --git a/tests/fan_mask.scad b/tests/fan_mask.scad index 09e2c61..f37af7b 100644 --- a/tests/fan_mask.scad +++ b/tests/fan_mask.scad @@ -1,9 +1,11 @@ use <../sbc_case_builder_library.scad>; // 30mm Mask Solid +echo("30mm Mask Solid"); fan_mask(30, 2, 2); // 30mm Mask Punchout +echo("30mm Mask Punchout"); translate([0, 40, 0]) difference() { cube([30, 30, 2]); @@ -11,10 +13,12 @@ translate([0, 40, 0]) } // 40mm Mask Solid +echo("40mm Mask Solid"); translate([40, 0, 0]) fan_mask(40, 2, 2); -// // 40mm Mask Punchout +// 40mm Mask Punchout +echo("40mm Mask Punchout"); translate([40, 50, 0]) difference() { cube([40, 40, 2]); @@ -22,10 +26,12 @@ translate([40, 50, 0]) } // 80mm Mask Solid +echo("80mm Mask Solid"); translate([90, 0, 0]) fan_mask(80, 2, 2); // 80mm Mask Punchout +echo("80mm Mask Punchout"); translate([90, 90, 0]) difference() { cube([80, 80, 2]);