/* 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 20220202 Version 1.0.0 sbc case builder using sbc model framework. see https://github.com/hominoids/SBC_Case_Builder */ use <./SBC_Model_Framework/sbc_models.scad>; include <./sbc_case_builder_library.scad>; include <./SBC_Model_Framework/sbc_models.cfg>; include <./sbc_case_builder_accessories.cfg>; /* [View] */ // viewing mode "model", "platter", "part" view = "model"; // [model, platter, part] individual_part = "bottom"; // [top, bottom, right, left, front, rear, io_shield, accessories] // single board computer model sbc_model = "c1+"; // ["c1+", "c2", "c4", "hc4", "xu4", "xu4q", "mc1", "hc1", "n1", "n2", "n2+", "n2l", "n2lq", "m1", "m1s", "m2", "h2", "h2+", "h3", "h3+", "h4", "h4+", "h4_ultra", "show2", "rpipico", "rpipicow", "rpicm4+ioboard", "rpicm1", "rpicm3", "rpicm3l", "rpicm3+", "rpicm4s", "rpicm4", "rpicm4l", "rpizero", "rpizerow", "rpizero2w", "rpi1a+", "rpi1b+", "rpi2b", "rpi3a+", "rpi3b", "rpi3b+", "rpi4b", "rpi5", "a64", "a64lts", "rock64", "rockpro64", "quartz64a", "quartz64b", "h64b", "star64", "soedge_a-baseboard", "soedge_rk1808", "rock4a", "rock4b", "rock4a+", "rock4b+", "rock4c", "rock4c+", "rock5b-v1.3", "rock5b", "rock5bq", "rock5b+", "nio12l", "vim1", "vim2", "vim3", "vim3l", "vim4", "tinkerboard", "tinkerboard-s", "tinkerboard-2", "tinkerboard-2s", "tinkerboard-r2", "tinkerboard-r2s", "opizero", "opizero2", "opir1plus_lts", "opir1", "opi5", "opi5max", "jetsonnano", "lepotato", "sweetpotato", "tritium-h2+", "tritium-h3", "tritium-h5", "solitude", "alta", "atomicpi", "visionfive2", "visionfive2q", "bpif3", "milk-v_duos", "licheerv+dock", "rak19007", "cnano-avr128da48", "nodemcu-32s", "cs-solarmeter", "feather-m0_express", "feather-m0_wifi", "feather-m4_express", "ssi-eeb", "ssi-ceb", "atx", "micro-atx", "dtx", "flex-atx", "mini-dtx", "mini-itx", "mini-itx_thin", "mini-stx", "mini-stx_thin", "nano-itx", "nuc", "pico-itx"] // sbc off in model view sbc_off = false; // sbc information display sbc_information = false; // enable highlight for sbc component subtractive geometry sbc_highlight = false; // enable highlight for accessory subtractive geometry accessory_highlight = false; // base case design case_design = "shell"; // [shell,panel,panel_nas,stacked,tray,tray_sides,tray_vu5,tray_vu7,round,hex,snap,fitted,paper_split-top,paper_full-top,adapter_ssi-eeb,adapter_ssi-ceb,adapter_atx,adapter_micro-atx,adapter_dtx,adapter_flex-atx,adapter_mini-dtx,adapter_mini-itx,adapter_mini-itx_thin,adapter_mini-stx,adapter_mini-stx_thin] // raises top mm in model view or < 0 = off raise_top = 0; // [-1:100] // lowers bottom mm in model view or < 0 = off lower_bottom = 0; // [-1:100] // move left side mm in model view or < 0 = off move_leftside = 0; // [-1:100] // move right side mm in model view or < 0 = off move_rightside = 0; // [-1:100] // move front mm in model view or < 0 = off move_front = 0; // [-1:100] // move rear mm in model view or < 0 = off move_rear = 0; // [-1:100] /* [Folded Case Adjustments] */ // material thickness in mm material_thickness = .5; //[.1:.01:3] // bend allowance bend_allowance = 1; //[0:.01:5] // bottom clearence bottom_clearence = 3.5; //[-10:.01:10] // enable flat blank section for export flat_blank_section = false; /* [Standard Motherboard Case Adjustments] */ // adjustment for ssi-eeb, ssi-ceb, atx, micro-atx, dtx, flex-atx, mini-dtx, mini-itx, mini-stx, nano-itx,nuc, pico-itx PCB thickness from 2mm default// standard_motherboard_thickness = 0; //[-3:.01:3] // rear io plate opening for standard form motherboards rear_io_shield = false; /* [3D Case Adjustments] */ // sbc location x axis pcb_loc_x = 0; //[0:.01:300] // sbc location y axis pcb_loc_y = 0; //[0:.01:300] // sbc location z axis pcb_loc_z = 0; //[0:.01:100] // additional x axis case size 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; //[-50:.01:300] // additional z axis case bottom size case_offset_bz = 0; //[-50:.01:300] // case wall thickness wallthick = 2; //[1:.25:5] // case floor and ceiling thickness floorthick = 2; //[1:.25:5] // side wall thickness for tray_side and panel_nas cases only sidethick = 2; //[1:.25:5] // distance between pcb and case gap = 1; //[.5:.25:5] // corner fillets corner_fillet = 3; //[0:.5:9] // edge fillets edge_fillet = 0; //[0:.5:6] // tolerance for fitted surfaces 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] // 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] */ bottom_access_panel_enable = false; access_panel_size = [70,30]; //[10:.01:120] access_panel_orientation = "landscape"; //[landscape,portrait] access_panel_location = [10,15]; //[-10:.01:200] access_panel_rotation = 0; //[0:90:270] /* [Options and Accessories] */ // gpio opening gpio_opening = "default"; // [default,none,open,block,knockout,vent] // uart opening 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 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] // distance between drives hd_space = 10; // [1:50] hd_y_position = 25; // [0:300] hd_z_position = 40; // [0:300] // case accessory group to load accessory_name = "none"; // ["none", "hk_uart", "c4_shell_boombox", "c4_desktop_lcd3.5", "c4_deskboom_lcd3.5", "c4_panel_boombox", "c4_panel_lcd3.5", "c4_tray_boombox", "c4_round", "c4_hex", "xu4_shifter_shield", "xu4_keyhole", "hc4_panel_nas", "hc4_shell_drivebox2.5", "hc4_shell_drivebox2.5v", "hc4_shell_drivebox3.5", "hc4_tray_drivebox2.5", "m2_shell", "m2_eyespi_eink1.54", "m2_eyespi_lcd2.8", "m1s_shell_nvme", "m1s_shell_ups", "m1s_tray_nvme", "m1_tray_ssd", "m1_fitted_pizzabox2.5", "m1_fitted_pizzabox3.5", "h3_shell", "h3_shell_router", "h3_lowboy", "h3_lowboy_router", "h3_panel_nas", "h3_ultimate", "h3_ultimate2", "h4_panel_nas", "show2_shell", "rpi5_m2hat", "rpi5_bottom_m2hat", "rock5b", "adapter_mini-stx_m1s", "nas", "cs_solarmeter", "n2l_env_sensors", "avr_env_sensors", "adafruit_solar_charger"] // sbc information text color text_color = "Green"; // [Green, Black, Dimgrey, White, Yellow, Orange, Red, DarkbBlue] // sbc information text font text_font = "Nimbus Mono PS"; // [Nimbus Mono PS, Liberation Mono, Noto Sans Mono] /* [SBC Top Standoff Global Settings] */ // enable case top standoffs sbc_top_standoffs = true; // reverse standoff vertical orientation top_standoff_reverse = true; // enable wall support for standoffs top_sidewall_support = false; top_standoff_size = "m3"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] top_standoff_pillar = "hex"; //[hex, round] top_standoff_diameter = 5.75; //[0:.01:10] top_standoff_hole_size = 2.75; //[0:.01:5] top_standoff_support_size = 10; //[0:.01:25] top_standoff_support_height = 4; //[0:.01:50] top_standoff_insert = false; top_standoff_insert_dia = 4.2; //.01 top_standoff_insert_height = 5.1; //.01 /* [SBC Top Standoff Individual Settings] */ // case top - lower left standoff settings top_rear_left_enable = true; top_rear_left_adjust = 0; //[-30:.01:30] top_rear_left_support = "rear"; //[none,left,rear,front,right] // case top - upper left standoff settings top_front_left_enable = true; top_front_left_adjust = 0; //[-30:.01:30] top_front_left_support = "front"; //[none,left,rear,front,right] // case top - lower right standoff settings top_rear_right_enable = true; top_rear_right_adjust = 0; //[-30:.01:30] top_rear_right_support = "rear"; //[none,left,rear,front,right] // case top - upper right standoff settings top_front_right_enable = true; top_front_right_adjust = 0; //[-30:.01:30] top_front_right_support = "front"; //[none,left,rear,front,right] /* [SBC Bottom Standoff Global Settings] */ // enable case bottom standoffs sbc_bottom_standoffs = true; // reverse standoff vertical orientation bottom_standoff_reverse = false; // enable wall support for standoffs bottom_sidewall_support = false; bottom_standoff_size = "m3"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] bottom_standoff_type = "countersunk"; //[none, countersunk, recessed, nut holder, blind] bottom_standoff_pillar = "hex"; //[hex, round] bottom_standoff_diameter = 5.75; //[2:.01:10] bottom_standoff_hole_size = 3.4; //[0:.01:5] bottom_standoff_support_size = 10; //[1:.01:25] bottom_standoff_support_height = 4; //[0:.01:50] bottom_standoff_insert = false; bottom_standoff_insert_dia = 4.2; //.01 bottom_standoff_insert_height = 5.1; //.01 /* [SBC Bottom Standoff Individual Settings] */ // case bottom - rear left standoff settings bottom_rear_left_enable = true; bottom_rear_left_adjust = 0; //[-30:.01:30] bottom_rear_left_support = "rear"; //[none,left,rear,front,right] // case bottom - upper left standoff settings bottom_front_left_enable = true; bottom_front_left_adjust = 0; //[-30:.01:30] bottom_front_left_support = "front"; //[none,left,rear,front,right] // case bottom - lower right standoff settings bottom_rear_right_enable = true; bottom_rear_right_adjust = 0; //[-30:.01:30] bottom_rear_right_support = "rear"; //[none,left,rear,front,right] // case bottom - upper right standoff settings bottom_front_right_enable = true; bottom_front_right_adjust = 0; //[-30:.01:30] bottom_front_right_support = "front"; //[none,left,rear,front,right] /* [Extended Case Top Standoffs] */ // enable case extended standoffs ext_top_standoffs = false; ext_top_standoff_reverse = true; // enable wall support for extended standoffs ext_top_sidewall_support = true; ext_top_standoff_size = "m3"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] ext_top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] ext_top_standoff_pillar = "hex"; //[hex, round] ext_top_standoff_diameter = 5.75; //[0:.01:10] ext_top_standoff_hole_size = 2.75; //[0:.01:5] ext_top_standoff_support_size = 10; //[0:.01:25] ext_top_standoff_support_height = 4; //[0:.01:50] ext_top_standoff_insert = false; ext_top_standoff_insert_dia = 4.2; //.01 ext_top_standoff_insert_height = 5.1; //.01 /* [Extended Case Top Standoff Individual Settings] */ // extended case top - lower left standoff settings ext_top_rear_left_enable = true; ext_top_rear_left_adjust = 0; //[-20:.01:20] ext_top_rear_left_support = "rear"; //[none,left,rear,front,right] // extended case top - upper left standoff settings ext_top_front_left_enable = true; ext_top_front_left_adjust = 0; //[-20:.01:20] ext_top_front_left_support = "front"; //[none,left,rear,front,right] // extended case top - lower right standoff settings ext_top_rear_right_enable = true; ext_top_rear_right_adjust = 0; //[-20:.01:20] ext_top_rear_right_support = "rear"; //[none,left,rear,front,right] // extended case top - upper right standoff settings ext_top_front_right_enable = true; ext_top_front_right_adjust = 0; //[-20:.01:20] ext_top_front_right_support = "front"; //[none,left,rear,front,right] /* [Extended Case Bottom Standoffs] */ // enable case bottom extended standoffs ext_bottom_standoffs = false; ext_bottom_standoff_reverse = false; // enable wall support for extended standoffs ext_bottom_sidewall_support = true; ext_bottom_standoff_size = "m3"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] ext_bottom_standoff_type = "countersunk"; //[none, countersunk, recessed, nut holder, blind] ext_bottom_standoff_pillar = "hex"; //[hex, round] ext_bottom_standoff_diameter = 5.75; //[2:.01:10] ext_bottom_standoff_hole_size = 3.4; //[0:.01:5] ext_bottom_standoff_support_size = 10; //[1:.01:25] ext_bottom_standoff_support_height = 4; //[0:.01:50] ext_bottom_standoff_insert = false; ext_bottom_standoff_insert_dia = 4.2; //.01 ext_bottom_standoff_insert_height = 5.1; //.01 /* [Extended Case Bottom Standoff Individual Settings] */ // extended case bottom - rear left standoff settings ext_bottom_rear_left_enable = true; ext_bottom_rear_left_adjust = 0; //[-20:.01:20] ext_bottom_rear_left_support = "rear"; //[none,left,rear,front,right] // extended case bottom - upper left standoff settings ext_bottom_front_left_enable = true; ext_bottom_front_left_adjust = 0; //[-20:.01:20] ext_bottom_front_left_support = "front"; //[none,left,rear,front,right] // extended case bottom - lower right standoff settings ext_bottom_rear_right_enable = true; ext_bottom_rear_right_adjust = 0; //[-20:.01:20] ext_bottom_rear_right_support = "rear"; //[none,left,rear,front,right] // extended case bottom - upper right standoff settings ext_bottom_front_right_enable = true; ext_bottom_front_right_adjust = 0; //[-20:.01:20] ext_bottom_front_right_support = "front"; //[none,left,rear,front,right] /* [Multiple PCB Top Standoffs] */ // enable multiple pcb standoffs multipcb_top_standoffs = false; multipcb_top_standoff_reverse = true; // enable wall support for multiple pcb multipcb_top_sidewall_support = false; multipcb_top_standoff_size = "m2.5"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] multipcb_top_standoff_type = "blind"; //[none, countersunk, recessed, nut holder, blind] multipcb_top_standoff_pillar = "hex"; //[hex, round] multipcb_top_standoff_diameter = 5.75; //[0:.01:10] multipcb_top_standoff_hole_size = 2.75; //[0:.01:5] multipcb_top_standoff_support_size = 7; //[0:.01:25] multipcb_top_standoff_support_height = 4; //[0:.01:50] multipcb_top_standoff_insert = false; multipcb_top_standoff_insert_dia = 4.2; //.01 multipcb_top_standoff_insert_height = 5.1; //.01 /* [Multiple PCB Top Standoff Individual Settings] */ // multiple pcb top - lower left standoff settings multipcb_top_rear_left_enable = true; multipcb_top_rear_left_adjust = 0; //[-20:.01:20] multipcb_top_rear_left_support = "rear"; //[none,left,rear,front,right] // multiple pcb - upper left standoff settings multipcb_top_front_left_enable = true; multipcb_top_front_left_adjust = 0; //[-20:.01:20] multipcb_top_front_left_support = "front"; //[none,left,rear,front,right] // multiple pcb top - lower right standoff settings multipcb_top_rear_right_enable = true; multipcb_top_rear_right_adjust = 0; //[-20:.01:20] multipcb_top_rear_right_support = "rear"; //[none,left,rear,front,right] // multiple pcb top - upper right standoff settings multipcb_top_front_right_enable = true; multipcb_top_front_right_adjust = 0; //[-20:.01:20] multipcb_top_front_right_support = "front"; //[none,left,rear,front,right] /* [Multiple PCB Bottom Standoffs] */ // enable multiple pcb extended standoffs multipcb_bottom_standoffs = false; multipcb_bottom_standoff_reverse = false; // enable wall support for multiple pcb standoffs multipcb_bottom_sidewall_support = false; multipcb_bottom_standoff_size = "m2.5"; //[m2_tap, m2, m2+, m2.5_tap, m2.5, m2.5+, m3_tap, m3, m3+, m4_tap, m4, m4+, custom] multipcb_bottom_standoff_type = "countersunk"; //[none, countersunk, recessed, nut holder, blind] multipcb_bottom_standoff_pillar = "hex"; //[hex, round] multipcb_bottom_standoff_diameter = 5.75; //[2:.01:10] multipcb_bottom_standoff_hole_size = 3.4; //[0:.01:5] multipcb_bottom_standoff_support_size = 7; //[1:.01:25] multipcb_bottom_standoff_support_height = 4; //[0:.01:50] multipcb_bottom_standoff_insert = false; multipcb_bottom_standoff_insert_dia = 4.2; //.01 multipcb_bottom_standoff_insert_height = 5.1; //.01 /* [Multiple PCB Bottom Standoff Individual Settings] */ // multiple pcb bottom - rear left standoff settings multipcb_bottom_rear_left_enable = true; multipcb_bottom_rear_left_adjust = 0; //[-20:.01:20] multipcb_bottom_rear_left_support = "rear"; //[none,left,rear,front,right] // multiple pcb bottom - upper left standoff settings multipcb_bottom_front_left_enable = true; multipcb_bottom_front_left_adjust = 0; //[-20:.01:20] multipcb_bottom_front_left_support = "front"; //[none,left,rear,front,right] // multiple pcb bottom - lower right standoff settings multipcb_bottom_rear_right_enable = true; multipcb_bottom_rear_right_adjust = 0; //[-20:.01:20] multipcb_bottom_rear_right_support = "rear"; //[none,left,rear,front,right] // multiple pcb bottom - upper right standoff settings multipcb_bottom_front_right_enable = true; multipcb_bottom_front_right_adjust = 0; //[-20:.01:20] multipcb_bottom_front_right_support = "front"; //[none,left,rear,front,right] a = search([accessory_name],accessory_data); s = search([sbc_model],sbc_data); pcb_id = sbc_data[s[0]][4]; pcb_width = sbc_data[s[0]][10][0]; pcb_depth = sbc_data[s[0]][10][1]; pcb_z_orig = sbc_data[s[0]][10][2]; pcb_tmaxz = sbc_data[s[0]][11][5]; pcb_bmaxz = sbc_data[s[0]][11][6]; pcb_color = sbc_data[s[0]][11][1]; pcb_radius = sbc_data[s[0]][11][0]; pcb_z = sbc_model == "ssi-eeb" || sbc_model == "ssi-ceb" || sbc_model == "atx" || sbc_model == "micro-atx" || sbc_model == "dtx" || sbc_model == "flex-atx" || sbc_model == "mini-dtx" || sbc_model == "mini-itx" || sbc_model == "mini-itx_thin" || sbc_model == "mini-stx" || sbc_model == "mini-stx_thin" || sbc_model == "nano-itx" || sbc_model == "nuc" || sbc_model == "pico-itx" ? pcb_z_orig + standard_motherboard_thickness : pcb_z_orig; width = case_design == "panel_nas" && pcb_width <= 100 ? pcb_width+2*(sidethick+gap)+case_offset_x+(101.6-pcb_width) : case_design == "panel_nas" && pcb_width > 100 ? pcb_width+2*(sidethick+gap)+case_offset_x : pcb_width+(2*(wallthick+gap))+case_offset_x; depth = case_design == "panel_nas" ? pcb_depth+2*(wallthick+gap)+case_offset_y + 147-pcb_depth+hd_y_position : pcb_depth+2*(wallthick+gap)+case_offset_y; 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" && pcb_width > 100 ? (pcb_width+case_offset_x+2*gap)-101.6 : // case_design == "panel_nas" && pcb_width <= 100 ? (width-2*(sidethick+gap)-101.6) : 0; hd_spacer = case_design == "panel_nas" && pcb_width > 100 ? (pcb_width+case_offset_x+2*gap)-101.6 : case_design == "panel_nas" && pcb_width <= 100 ? (width-2*(sidethick+gap)-101.6) : 0; /* [Hidden] */ top_standoff = [top_standoff_size, top_standoff_diameter, 18, top_standoff_hole_size, top_standoff_support_size, top_standoff_support_height, top_standoff_type, top_standoff_pillar, top_rear_left_support, top_standoff_reverse, top_standoff_insert, top_standoff_insert_dia, top_standoff_insert_height]; bottom_standoff = [bottom_standoff_size, bottom_standoff_diameter, 6, bottom_standoff_hole_size, bottom_standoff_support_size, bottom_standoff_support_height, bottom_standoff_type, bottom_standoff_pillar, bottom_rear_left_support, bottom_standoff_reverse, bottom_standoff_insert, bottom_standoff_insert_dia, bottom_standoff_insert_height]; ext_top_standoff = [ext_top_standoff_size, ext_top_standoff_diameter, 18, ext_top_standoff_hole_size, ext_top_standoff_support_size, ext_top_standoff_support_height, ext_top_standoff_type, ext_top_standoff_pillar, ext_top_rear_left_support, ext_top_standoff_reverse, ext_top_standoff_insert, ext_top_standoff_insert_dia, ext_top_standoff_insert_height]; ext_bottom_standoff = [ext_bottom_standoff_size, ext_bottom_standoff_diameter, 6, ext_bottom_standoff_hole_size, ext_bottom_standoff_support_size, ext_bottom_standoff_support_height, ext_bottom_standoff_type, ext_bottom_standoff_pillar, ext_bottom_rear_left_support, ext_bottom_standoff_reverse, ext_bottom_standoff_insert, ext_bottom_standoff_insert_dia, ext_bottom_standoff_insert_height]; multipcb_top_standoff = [multipcb_top_standoff_size, multipcb_top_standoff_diameter, 18, multipcb_top_standoff_hole_size, multipcb_top_standoff_support_size, multipcb_top_standoff_support_height, multipcb_top_standoff_type, multipcb_top_standoff_pillar, multipcb_top_rear_left_support, multipcb_top_standoff_reverse, multipcb_top_standoff_insert, multipcb_top_standoff_insert_dia, multipcb_top_standoff_insert_height]; multipcb_bottom_standoff = [multipcb_bottom_standoff_size, multipcb_bottom_standoff_diameter, 6, multipcb_bottom_standoff_hole_size, multipcb_bottom_standoff_support_size, multipcb_bottom_standoff_support_height, multipcb_bottom_standoff_type, multipcb_bottom_standoff_pillar, multipcb_bottom_rear_left_support, multipcb_bottom_standoff_reverse, multipcb_bottom_standoff_insert, multipcb_bottom_standoff_insert_dia, multipcb_bottom_standoff_insert_height]; adj = .01; $fn=90; // platter view if (view == "platter") { if(case_design == "shell") { case_bottom(case_design); translate([0,(2*depth)+20,case_z]) rotate([180,0,0]) case_top(case_design); } 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"); 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+(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 || width > 112)) { 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); translate([0,(2*depth)+20,case_z]) rotate([180,0,0]) case_top(case_design); } if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { case_bottom(case_design); translate([0,(2*depth)+10,case_z]) rotate([180,0,0]) case_top(case_design); if(case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { translate([3.5*width,0,width]) rotate([0,90,90]) case_side(case_design,"right"); translate([width+15,0,2*sidethick]) rotate([0,-90,-90]) case_side(case_design,"left"); } } if(case_design == "round") { case_bottom(case_design); translate([width+30,depth,case_z-floorthick-gap]) rotate([180,0,0]) case_top(case_design); } if(case_design == "hex") { case_bottom(case_design); translate([2*width,depth,case_z]) rotate([180,0,0]) case_top(case_design); } if(case_design == "snap") { case_bottom(case_design); translate([0,(2*depth)+20,case_z+2*floorthick]) rotate([180,0,0]) case_top(case_design); } if(case_design == "fitted") { case_bottom(case_design); translate([0,(2*depth)+20,case_z+floorthick]) rotate([180,0,0]) case_top(case_design); } if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") { color("dimgrey",1) case_adapter(case_design); color("dimgrey",1) translate([-180, 0, 4]) rotate([270,0,0]) io_shield(); } // ui access panel if(bottom_access_panel_enable == true) { if(access_panel_rotation == 0) { translate([0,-1.25*depth, 0]) rotate([0,0,access_panel_rotation]) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } } // platter accessories if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { class = accessory_data[a[0]][i]; type = accessory_data[a[0]][i+1]; loc_x = accessory_data[a[0]][i+2]; loc_y = accessory_data[a[0]][i+3]; loc_z = accessory_data[a[0]][i+4]; face = accessory_data[a[0]][i+5]; rotation = accessory_data[a[0]][i+6]; parametric = accessory_data[a[0]][i+7]; size_x = accessory_data[a[0]][i+8][0]; size_y = accessory_data[a[0]][i+8][1]; size_z = accessory_data[a[0]][i+8][2]; data_1 = accessory_data[a[0]][i+9][0]; data_2 = accessory_data[a[0]][i+9][1]; data_3 = accessory_data[a[0]][i+9][2]; data_4 = accessory_data[a[0]][i+9][3]; mask = accessory_data[a[0]][i+10]; if (class == "platter" && type != "button_assembly") { add(type, loc_x, loc_y, loc_z, face, rotation, [size_x, size_y, size_z], [data_1, data_2, data_3, data_4], mask); } if (class == "platter" && type == "button_assembly") { translate([loc_x,loc_y,loc_z+1.25]) rotate([-90,0,0]) button_plunger(data_1, size_x, size_z); translate([loc_x-20,loc_y-10,loc_z+3]) rotate([0,0,0]) button_top(data_1, size_x, size_z); translate([loc_x-20,loc_y-20,loc_z]) rotate([0,0,0]) button_clip(data_1); } if (class == "platter" && type == "h3_port_extender_holder") { translate([loc_x,loc_y,loc_z]) rotate([0,0,0]) h3_port_extender_holder("bottom"); translate([loc_x-20,loc_y+40,loc_z+36.5]) rotate([180,0,0]) h3_port_extender_holder("top"); } } } if(case_design == "paper_split-top" || case_design == "paper_full-top") { case_folded(case_design); } } // model view if (view == "model") { // translate([(-width+(gap+wallthick))/2,(-depth+(gap+wallthick))/2,0]) rotate([0,0,0]){ text_offset = 25; text_height = case_z + (len(sbc_data[s[0]][1]) * 7); text_indent = [0,-32.5,4,0,-20.5,-8,4,4,4,4,-12,-16,-4,-12.5,-8,-4,-12,0,4,0,4,8,-.5,-12.5,-4.5,-8.5,0,-8]; ctext_offset = 15; ctext_height = 130; if(case_design == "shell") { if(lower_bottom >= 0) { difference() { color("dimgrey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); if(move_rear < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_front < 0) { translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_leftside < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1.01,depth+2,case_z+2]); } if(move_rightside < 0) { translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1,depth+2,case_z+2]); } } } if(raise_top >= 0) { difference() { color("grey",1) translate([0,0,raise_top]) case_top(case_design); if(move_rear < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_front < 0) { translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_leftside < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1.01,depth+2,case_z+2]); } if(move_rightside < 0) { translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1,depth+2,case_z+2]); } } } if(sbc_off == false) { translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } } if(case_design == "panel") { 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 == "panel_nas") { if(lower_bottom >= 0) { 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); } 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("dimgrey",1) translate([move_rightside,0,0]) case_side(case_design,"right"); } if(move_leftside >= 0) { 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]) 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]) { if(hd_reverse == false) { 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-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]) cableholder_spacer(hd_spacer-9.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+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); } } 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 || 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, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer/2-9.4); translate([101.6-gap+hd_spacer-9.4, -31-(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+hd_spacer-9.4, -73-(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, 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); } } } if(hd_reverse == true) { if(hd_center == false) { 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-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]) cableholder_spacer(hd_spacer-9.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+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([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 || 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, hd_z_position+6.5+(hd_space+27.1)*i]) cableholder_spacer(hd_spacer/2-9.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+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); // 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); } } } } 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 == 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) { 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); } 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 == "tray" || case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7") { if(lower_bottom >= 0) { difference() { color("dimgrey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); if(move_rear < 0) { translate([-gap-wallthick-sidethick-1,-gap-wallthick-1,-lower_bottom-1]) cube([width+2*sidethick+2,gap+wallthick+1.01,case_z+5]); } if(move_front < 0) { translate([-gap-wallthick-sidethick-1,depth-2*(gap+wallthick),-lower_bottom-1]) cube([width+2*sidethick+2,gap+wallthick+1.01,case_z+5]); } if(move_leftside < 0) { translate([-gap-wallthick-sidethick-1,-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+2*sidethick+1.01,depth+2,case_z+5]); } if(move_rightside < 0) { translate([width-sidethick-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+2*sidethick+1,depth+2,case_z+5]); } } } if(raise_top >= 0) { difference() { color("grey",1) translate([0,0,raise_top]) case_top(case_design); if(move_rear < 0) { translate([-gap-wallthick-sidethick-1,-gap-wallthick-1,-lower_bottom-1]) cube([width+2*sidethick+2,gap+wallthick+1.01,case_z+5]); } if(move_front < 0) { translate([-gap-wallthick-sidethick-1,depth-2*(gap+wallthick),-lower_bottom-1]) cube([width+2*sidethick+2,gap+wallthick+1.01,case_z+5]); } if(move_leftside < 0) { translate([-gap-wallthick-sidethick-1,-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+2*sidethick+1.01,depth+2,case_z+5]); } if(move_rightside < 0) { translate([width-sidethick-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+2*sidethick+1,depth+2,case_z+5]); } } } if(case_design == "tray_sides" || case_design == "tray_vu5" || case_design == "tray_vu7") { 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(case_design == "tray_vu5") { color("darkgrey",.5) translate([width+((127.5-width)/2)-6.5-wallthick-gap, depth-1,case_z+15.5]) rotate([-15,0,180]) import(file = "stl/Vu5a_Case.stl"); // right speaker and bracket color("darkgrey",.5) translate([((127.5-75)/2)+(width/2)-wallthick-gap+30.5,depth-1, case_z+15]) rotate([75,0,180]) import(file = "stl/Vu5_Speaker_Bracket_Left.stl"); color("darkgrey",.5) translate([((127.5-75)/2)+(width/2)-wallthick-gap+85,depth+15, case_z+12.5]) rotate([-15,0,180]) hk_speaker(); // left speaker and bracket color("darkgrey",.5) translate([-((127.5-75)/2)+(width/2)-wallthick-gap-30.5,depth-1, case_z+15]) rotate([75,0,180]) import(file = "stl/Vu5_Speaker_Bracket_Right.stl"); color("darkgrey",.5) translate([-((127.5-75)/2)+(width/2)-wallthick-gap-40.5,depth+15, case_z+12.5]) rotate([-15,0,180]) hk_speaker(); } if(case_design == "tray_vu7") { color("darkgrey",.5) translate([width+((192.90-width)/2)-wallthick-gap-20, depth-1,case_z+15.5]) rotate([-15,0,180]) import(file = "stl/Vu7a_Case.stl"); // right speaker and bracket color("darkgrey",.5) translate([((192.90-100)/2)+(width/2)-wallthick-gap+57.5,depth-4, case_z+27]) rotate([75,0,180]) import(file = "stl/Vu7_Speaker_Bracket_Left.stl"); color("darkgrey",.5) translate([((192.90-100)/2)+(width/2)-wallthick-gap+97,depth+11.5, case_z+27]) rotate([-15,0,180]) hk_speaker(); // left speaker and bracket color("darkgrey",.5) translate([-((192.90-100)/2)+(width/2)-wallthick-gap-58,depth-4, case_z+27]) rotate([75,0,180]) import(file = "stl/Vu7_Speaker_Bracket_Right.stl"); color("darkgrey",.5) translate([-((192.90-100)/2)+(width/2)-wallthick-gap-53.5,depth+11.5, case_z+27]) rotate([-15,0,180]) hk_speaker(); } if(sbc_off == false) { 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, false); } } if(case_design == "round" || case_design == "hex") { 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(sbc_off == false) { 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, false); } } if(case_design == "snap" || case_design == "fitted") { if(lower_bottom >= 0) { difference() { color("dimgrey",1) translate([0,0,-lower_bottom]) case_bottom(case_design); if(move_rear < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_front < 0) { translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_leftside < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1.01,depth+2,case_z+2]); } if(move_rightside < 0) { translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1,depth+2,case_z+2]); } } } if(raise_top >= 0) { difference() { color("grey",1) translate([0,0,raise_top]) case_top(case_design); if(move_rear < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_front < 0) { translate([-gap-wallthick-1,depth-2*(gap+wallthick),-lower_bottom-1]) cube([width+2,gap+wallthick+1.01,case_z+2]); } if(move_leftside < 0) { translate([-gap-wallthick-1,-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1.01,depth+2,case_z+2]); } if(move_rightside < 0) { translate([width-2*(gap+wallthick),-gap-wallthick-1,-lower_bottom-1]) cube([gap+wallthick+1,depth+2,case_z+2]); } } } if(sbc_off == false) { translate([pcb_loc_x ,pcb_loc_y,bottom_height-pcb_z+pcb_loc_z-adj]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } } if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") { color("dimgrey",1) case_adapter(case_design); if(sbc_off == false) { translate([pcb_loc_x ,pcb_loc_y,bottom_height-case_offset_bz-pcb_z+pcb_loc_z]) sbc(sbc_model, cooling, fan_size, gpio_opening, uart_opening, false); } if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx") { color("dimgrey",1) translate([-1.2,-4.5,-2]) io_shield(); } else { color("dimgrey",1) translate([-10.79,-4.5,-2]) io_shield(); } } // ui access panel if(bottom_access_panel_enable == true) { if(access_panel_rotation == 0) { translate([access_panel_location[0],access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) color("grey",1) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } if(access_panel_rotation == 90) { translate([access_panel_location[0]+access_panel_size[1],access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) color("grey",1) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } if(access_panel_rotation == 180) { translate([access_panel_location[0]+access_panel_size[0],access_panel_location[1]+access_panel_size[1],0]) rotate([0,0,access_panel_rotation]) color("grey",1) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } if(access_panel_rotation == 270) { translate([access_panel_location[0],access_panel_location[1]+access_panel_size[0], 0]) rotate([0,0,access_panel_rotation]) color("grey",1) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } } // model accessories if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { class = accessory_data[a[0]][i]; type = accessory_data[a[0]][i+1]; loc_x = accessory_data[a[0]][i+2]; loc_y = accessory_data[a[0]][i+3]; loc_z = accessory_data[a[0]][i+4]; face = accessory_data[a[0]][i+5]; rotation = accessory_data[a[0]][i+6]; parametric = accessory_data[a[0]][i+7]; size = accessory_data[a[0]][i+8]; data = accessory_data[a[0]][i+9]; mask = accessory_data[a[0]][i+10]; if (class == "model" && face == "top" && raise_top > -1) { parametric_move_add(type, loc_x, loc_y, loc_z+raise_top, face, rotation, parametric, size, data, [false,mask[1],mask[2],mask[3]]); } else { if (class == "model" && face != "top" ) { parametric_move_add(type, loc_x, loc_y, loc_z, face, rotation, parametric, size, data, [false,mask[1],mask[2],mask[3]]); } } } } if((case_design == "paper_split-top" || case_design == "paper_full-top") && flat_blank_section == false) { case_folded(case_design); } if((case_design == "paper_split-top" || case_design == "paper_full-top") && flat_blank_section == true) { projection() case_folded(case_design); } // create sbc information text if(sbc_information == true) { for (i=[0:1:len(sbc_data[s[0]][1])-1]) { color(text_color) translate([text_offset + text_indent[i], depth, (text_height-i*7)+raise_top]) rotate([90, 0, 0]) text(str(sbc_data[s[0]][1][i]), 5, font = text_font); } } } //} // part if (view == "part") { if(individual_part == "top") { if(case_design == "shell") { translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design); } 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") { translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design); } if(case_design == "tray" || case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { translate([0,depth,case_z]) rotate([180,0,0]) case_top(case_design); } if(case_design == "round") { translate([width+30,depth,case_z-floorthick-gap]) rotate([180,0,0]) case_top(case_design); } if(case_design == "hex") { translate([2*width,depth,case_z]) rotate([180,0,0]) case_top(case_design); } if(case_design == "snap") { translate([0,depth,case_z+2*floorthick]) rotate([180,0,0]) case_top(case_design); } if(case_design == "fitted") { translate([0,depth,case_z+floorthick]) rotate([180,0,0]) case_top(case_design); } } if(individual_part == "bottom") { if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") { case_adapter(case_design); } else { case_bottom(case_design); } } if(individual_part == "front") { 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" || 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" || case_design == "panel_nas") { translate([gap,0,-width+(2*wallthick)+gap]) rotate([0,-90,-90]) case_side(case_design,"right"); } if(case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { translate([depth,0,width-gap]) rotate([0,90,90]) case_side(case_design,"right"); } } if(individual_part == "left") { if(case_design == "panel" || case_design == "panel_nas") { translate([depth,0,-gap]) rotate([0,90,90]) case_side(case_design,"left"); } if(case_design == "tray_vu5" || case_design == "tray_vu7" || case_design == "tray_sides") { translate([gap,0,2*sidethick+gap]) rotate([0,-90,-90]) case_side(case_design,"left"); } } if(individual_part == "io_shield") { if(case_design == "adapter_mini-stx_thin" || case_design == "adapter_mini-stx" || case_design == "adapter_mini-itx_thin" || case_design == "adapter_mini-itx" || case_design == "adapter_flex-atx" || case_design == "adapter_mini-dtx" || case_design == "adapter_dtx" || case_design == "adapter_micro-atx" || case_design == "adapter_atx" || case_design == "adapter_ssi-ceb" || case_design == "adapter_ssi-eeb") { translate([0, 0, 4]) rotate([270,0,0]) io_shield(); } } if(individual_part == "accessories") { // nas hd spacers if(case_design == "panel_nas" && (pcb_width > 100 || width > 101.6)) { rotate([270,0,0]) cableholder_spacer(hd_spacer-9.4); } // ui access panel if(bottom_access_panel_enable == true) { if(access_panel_rotation == 0) { translate([access_panel_location[0],-access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } if(access_panel_rotation == 90) { translate([access_panel_location[0]+access_panel_size[1],-access_panel_location[1], 0]) rotate([0,0,access_panel_rotation]) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } if(access_panel_rotation == 180) { translate([access_panel_location[0]+access_panel_size[0],-access_panel_location[1]+access_panel_size[1],0]) rotate([0,0,access_panel_rotation]) access_cover([access_panel_size[0],-access_panel_size[1],floorthick], access_panel_orientation); } if(access_panel_rotation == 270) { translate([access_panel_location[0],-access_panel_location[1]+access_panel_size[0], 0]) rotate([0,0,access_panel_rotation]) access_cover([access_panel_size[0],access_panel_size[1],floorthick], access_panel_orientation); } } if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { class = accessory_data[a[0]][i]; type = accessory_data[a[0]][i+1]; loc_x = accessory_data[a[0]][i+2]; loc_y = accessory_data[a[0]][i+3]; loc_z = accessory_data[a[0]][i+4]; face = accessory_data[a[0]][i+5]; rotation = accessory_data[a[0]][i+6]; parametric = accessory_data[a[0]][i+7]; size_x = accessory_data[a[0]][i+8][0]; size_y = accessory_data[a[0]][i+8][1]; size_z = accessory_data[a[0]][i+8][2]; data_1 = accessory_data[a[0]][i+9][0]; data_2 = accessory_data[a[0]][i+9][1]; data_3 = accessory_data[a[0]][i+9][2]; data_4 = accessory_data[a[0]][i+9][3]; mask = accessory_data[a[0]][i+10]; if (class == "platter" && type != "button_assembly") { add(type, loc_x, loc_y, loc_z, face, rotation, [size_x, size_y, size_z], [data_1, data_2, data_3, data_4], mask); } if (class == "platter" && type == "button_assembly") { translate([loc_x,loc_y,loc_z+1.25]) rotate([-90,0,0]) button_plunger(data_1, size_x, size_z); translate([loc_x-20,loc_y-10,loc_z+3]) rotate([0,0,0]) button_top(data_1, size_x, size_z); translate([loc_x-20,loc_y-20,loc_z]) rotate([0,0,0]) button_clip(data_1); } if (class == "platter" && type == "h3_port_extender_holder") { translate([loc_x,loc_y,loc_z]) rotate([0,0,0]) h3_port_extender_holder("bottom"); translate([loc_x-20,loc_y+40,loc_z+36.5]) rotate([180,0,0]) h3_port_extender_holder("top"); } } } } } 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+hd_spacer,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); } }