fixed spacer and right side placment issue, updated readme.md, code cleanup and example case accessories

This commit is contained in:
Edward Kisiel
2025-04-21 17:30:50 -04:00
parent 1c2cf8e00f
commit 86eb912784
7 changed files with 1051 additions and 999 deletions

View File

@@ -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.

View File

@@ -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);
}
}
}

View File

@@ -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]);

View File

@@ -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]);
}

File diff suppressed because it is too large Load Diff

View File

@@ -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 {

View File

@@ -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"]],