diff --git a/lib/grommet.scad b/lib/grommet.scad new file mode 100644 index 0000000..9477340 --- /dev/null +++ b/lib/grommet.scad @@ -0,0 +1,109 @@ +/* + This file is part of SBC Case Builder https://github.com/hominoids/SBC_Case_Builder + Copyright 2022,2023,2024,2025 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 + + grommet(face, style, od, id, wall, assembly, mask) + grommet_clip(style, od, id, height) + +*/ + + +/* + NAME: grommet + DESCRIPTION: creates different groumet styles + TODO: none + + USAGE: grommet(face, style, od, id, wall, assembly, mask) + + face = "top","bottom","front","rear","left","right" + style = "sleeve" + size[0] = od outside diameter of grommet body + size[1] = id inside hole diameter of grommet body + size[2] = wall thickness of installation + assembly = false + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" +*/ + + +module grommet(face = "bottom", style = "sleeve", od, id, wall, assembly, mask) { + + height = 4.5+(2*wall); + enablemask = mask[0]; + mlength = height+mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + cut = .25; + lip_od = od+4; + lip_thick = 2.5; + + adj = .01; + $fn = 90; + + rotx = face == "rear" ? 270 : face == "front" || face == "left" || face == "right" ? 90 : face == "top" ? 180 : 0; + roty = 0; + rotz = face == "left" ? 90 : face == "right" ? 270 : 0; + + rx = face == "left" ? -lip_thick : face == "right" ? lip_thick : 0; + ry = face == "front" ? lip_thick : face == "rear" ? -lip_thick : 0; + rz = face == "bottom" ? -lip_thick : face == "top" ? lip_thick : 0; + + translate([rx,ry,rz]) rotate([rotx,roty,rotz]) { + if(enablemask == true && mstyle == "default") { + if(style == "sleeve") { + translate([0, 0, -adj-msetback]) cylinder(d = od+.5, h = mlength); + } + } + if(enablemask == false) { + if(style == "sleeve") { + difference() { + union() { + cylinder(d=od, h=height); + cylinder(d=lip_od, h=2.5); + } + translate([0,0,-adj]) cylinder(d=id, h=height+(2*adj)); + translate([-lip_od/2,-cut/2,-adj]) cube([lip_od+(2*adj),cut,height+(2*adj)]); + translate([0,0,2.5+wall]) grommet_clip(style,od,id,wall); + } + if(assembly == true) { + translate([0,0,2.5+wall]) grommet_clip(style,od,id,wall); + } + } + } + } +} + +module grommet_clip(style,od,id,wall) { + + height = 2.5+wall; + lip_od = od+4; + adj = .01; + $fn = 90; + + if(style == "sleeve") { + difference() { + cylinder(d=lip_od, h=2.5); + difference() { + translate([0,0,-adj]) cylinder(d=od, h=wall+2*adj); + translate([-lip_od/2,-od/2,-adj]) cube([lip_od+(2*adj),2,height-2]); + translate([-lip_od/2,-2+od/2,-adj]) cube([lip_od+(2*adj),2,height-2]); + } + translate([-lip_od,-(od-6)/2,-adj]) cube([lip_od+(2*adj),od-6,wall+(2*adj)]); + } + } +} diff --git a/lib/panel_clamp.scad b/lib/panel_clamp.scad index 5c673dd..930b355 100644 --- a/lib/panel_clamp.scad +++ b/lib/panel_clamp.scad @@ -38,9 +38,10 @@ module panel_clamp(face, screw, style, dia_x, dia_y, height, mask) { rotz = face == "left" ? 90 : face == "right" ? 270 : 0; if(enablemask == true && mstyle == "default") { + } if(enablemask == false) { - translate([0,0,0]) rotate([rotx,roty,rotz]) { + rotate([rotx,roty,rotz]) { difference() { cylinder(d2=dia_x, d1=dia_y, h=height); if(screw == "m2") { diff --git a/mod/case_rack.scad b/mod/case_rack.scad index 557dd38..13191c9 100644 --- a/mod/case_rack.scad +++ b/mod/case_rack.scad @@ -644,6 +644,22 @@ if(side == "bottom") { } } } + // rear fan openings + for(r = [0:len(rack_bay_sbc)-1]) { + fan_offset = -75+(75-rear_fan_size)/2; + if(rack_bay_rear_fan[r] == true) { + translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+fan_offset+8,depth-gap-wallthick-adj,(case_z-rear_fan_size)/2]) + rotate([90,0,0]) fan_mask(rear_fan_size, wallthick, "fan_open"); + } + } + // rear grommet openings + for(r = [0:len(rack_bay_sbc)-1]) { + grommet_offset = -75+11; + if(rack_bay_rear_conduit[r] == true) { + translate([-gap-wallthick-1+rack_asm_gap/2+75*(r+1)+grommet_offset+4,depth-wallthick-gap,13]) + grommet("front", "sleeve", 10, 4, wallthick, true, [true,10,0,"default"]); + } + } // subtractive accessories if(accessory_name != "none") { for (i=[1:11:len(accessory_data[a[0]])-1]) { diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 5d55745..c0d0f99 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -10919,7 +10919,7 @@ "case_offset_bz": "0", "case_offset_tz": "0", "case_offset_x": "0", - "case_offset_y": "40", + "case_offset_y": "50", "cooling": "default", "corner_fillet": "3", "edge_fillet": "0", @@ -11048,50 +11048,49 @@ "pcb_loc_y": "0", "pcb_loc_z": "0", "rack_bay1_face": "io_shield", - "rack_bay1_rear_conduit": "false", - "rack_bay1_rear_fan": "false", + "rack_bay1_rear_conduit": "true", + "rack_bay1_rear_fan": "true", "rack_bay1_rotation": "270", "rack_bay1_wall": "true", "rack_bay1_xyz_loc": "[13, 0, 0]", "rack_bay2_face": "io_shield", - "rack_bay2_rear_conduit": "false", - "rack_bay2_rear_fan": "false", + "rack_bay2_rear_conduit": "true", + "rack_bay2_rear_fan": "true", "rack_bay2_rotation": "270", "rack_bay2_wall": "true", "rack_bay2_xyz_loc": "[88, 0, 0]", "rack_bay3_face": "io_shield", - "rack_bay3_rear_conduit": "false", - "rack_bay3_rear_fan": "false", + "rack_bay3_rear_conduit": "true", + "rack_bay3_rear_fan": "true", "rack_bay3_rotation": "270", "rack_bay3_wall": "true", "rack_bay3_xyz_loc": "[162.5, 0, 0]", "rack_bay4_face": "io_shield", - "rack_bay4_rear_conduit": "false", - "rack_bay4_rear_fan": "false", + "rack_bay4_rear_conduit": "true", + "rack_bay4_rear_fan": "true", "rack_bay4_rotation": "270", "rack_bay4_wall": "true", "rack_bay4_xyz_loc": "[237.5, 0, 0]", "rack_bay5_face": "io_shield", - "rack_bay5_rear_conduit": "false", - "rack_bay5_rear_fan": "false", + "rack_bay5_rear_conduit": "true", + "rack_bay5_rear_fan": "true", "rack_bay5_rotation": "270", "rack_bay5_wall": "true", "rack_bay5_xyz_loc": "[313, 0, 0]", "rack_bay6_face": "io_shield", - "rack_bay6_rear_conduit": "false", - "rack_bay6_rear_fan": "false", + "rack_bay6_rear_conduit": "true", + "rack_bay6_rear_fan": "true", "rack_bay6_rotation": "270", - "rack_bay6_wall": "false", "rack_bay6_xyz_loc": "[385, 0, 0]", "rack_size": "1u", "rack_width": "19", "raise_top": "0", - "rear_cooling": "fan_hex", + "rear_cooling": "fan_1", "rear_dualfan_spacing": "6", "rear_fan": "1", "rear_fan_center": "false", "rear_fan_position": "0", - "rear_fan_size": "80", + "rear_fan_size": "40", "rear_io_shield": "false", "sbc_bottom_standoffs": "true", "sbc_highlight": "false", diff --git a/sbc_case_builder.scad b/sbc_case_builder.scad index 2b48a26..61cc336 100644 --- a/sbc_case_builder.scad +++ b/sbc_case_builder.scad @@ -123,7 +123,7 @@ Rack_Bay6 = "empty"; // ["empty", "c1+", "c2", "c4", "hc4", "xu4", "xu4q", "mc1 rack_bay6_xyz_loc = [0,0,0]; // [0:.5:450] rack_bay6_rotation = 0; // [0:90:270] rack_bay6_face = "io_shield"; //["solid","blank","io_shield","vent_hex"] -rack_bay6_wall = false; // [true,false] +//rack_bay6_wall = false; // [true,false] rack_bay6_rear_fan = false; //[true,false] rack_bay6_rear_conduit = false; //[true,false] @@ -538,7 +538,9 @@ rack_bay_sbc = [Rack_Bay1,Rack_Bay2,Rack_Bay3,Rack_Bay4,Rack_Bay5,Rack_Bay6]; rack_bay_xyz_loc = [rack_bay1_xyz_loc, rack_bay2_xyz_loc, rack_bay3_xyz_loc, rack_bay4_xyz_loc, rack_bay5_xyz_loc, rack_bay6_xyz_loc]; rack_bay_rotation = [rack_bay1_rotation, rack_bay2_rotation, rack_bay3_rotation, rack_bay4_rotation, rack_bay5_rotation, rack_bay6_rotation]; rack_bay_face = [rack_bay1_face, rack_bay2_face, rack_bay3_face, rack_bay4_face, rack_bay5_face, rack_bay6_face]; -rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall, rack_bay5_wall, rack_bay6_wall]; +rack_bay_wall = [rack_bay1_wall, rack_bay2_wall, rack_bay3_wall, rack_bay4_wall, rack_bay5_wall, false]; +rack_bay_rear_fan = [rack_bay1_rear_fan, rack_bay2_rear_fan, rack_bay3_rear_fan, rack_bay4_rear_fan, rack_bay5_rear_fan, rack_bay6_rear_fan]; +rack_bay_rear_conduit = [rack_bay1_rear_conduit, rack_bay2_rear_conduit, rack_bay3_rear_conduit, rack_bay4_rear_conduit, rack_bay5_rear_conduit, rack_bay6_rear_conduit]; adj = .01; $fn=90; @@ -1112,6 +1114,23 @@ if (view == "model") { } } } + // rear fan covers + for(r = [0:len(rack_bay_sbc)-1]) { + fan_offset = -75+(75-rear_fan_size)/2; + if(rack_bay_rear_fan[r] == true) { + translate([-gap-wallthick-1+.125+75*(r+1)+fan_offset+8, + depth-gap,(case_z-rear_fan_size)/2]) + rotate([90,0,0]) fan_cover(rear_fan_size, wallthick, rear_cooling); + } + } + // rear grommets + for(r = [0:len(rack_bay_sbc)-1]) { + grommet_offset = -75+11; + if(rack_bay_rear_conduit[r] == true) { + translate([-gap-wallthick-1+.125+75*(r+1)+grommet_offset+4,depth-wallthick-gap,13]) + color("lightgrey") grommet("front", "sleeve", 10, 4, wallthick, true, [false,10,0,"default"]); + } + } if(sbc_off == false) { for(i = [0:len(rack_bay_sbc)-1]) { s = search([rack_bay_sbc[i]],sbc_data); diff --git a/sbc_case_builder_library.scad b/sbc_case_builder_library.scad index 484aa8f..e241e2d 100644 --- a/sbc_case_builder_library.scad +++ b/sbc_case_builder_library.scad @@ -45,6 +45,7 @@ include <./lib/dsub.scad>; include <./lib/fans.scad>; include <./lib/fastener.scad>; include <./lib/feet.scad>; +include <./lib/grommet.scad>; include <./lib/hd.scad>; include <./lib/holder.scad>; include <./lib/keyhole.scad>;