From 2eef11f03f6e6b93fc1c8fee12c0bfc514a137e8 Mon Sep 17 00:00:00 2001 From: Edward Kisiel Date: Thu, 18 Apr 2024 19:47:42 -0400 Subject: [PATCH] finished library documentation update, added fan and hd masks and other fixes --- README.md | 18 +- lib/access_panel.scad | 123 +- lib/art.scad | 28 +- lib/batteries.scad | 3 +- lib/buttons.scad | 59 +- lib/cable_holder.scad | 7 +- lib/custom.scad | 17 +- lib/dsub.scad | 14 +- lib/fans.scad | 65 +- lib/fastener.scad | 1 + lib/feet.scad | 6 + lib/hd.scad | 748 ++++++------ lib/holder.scad | 235 ++-- lib/keyhole.scad | 9 +- lib/oem_adafruit.scad | 18 +- lib/oem_hk.scad | 1813 +++++++++++++++--------------- lib/standoff.scad | 6 +- lib/vent.scad | 7 +- mod/add.scad | 4 +- mod/case_top.scad | 18 +- mod/sub.scad | 2 +- sbc_case_builder.json | 598 +++++----- sbc_case_builder_accessories.cfg | 82 +- 23 files changed, 2027 insertions(+), 1854 deletions(-) diff --git a/README.md b/README.md index ae1d7bd..000b497 100644 --- a/README.md +++ b/README.md @@ -680,7 +680,7 @@ DESCRIPTION: creates nut holder of various styles. size[2] = holder height in mm data[0] = "m2", "m2.5", "m3", "m4" data[1] = "default", "sloped", "trap" - mask[0] = false + mask[0] = true mask[1] = length mask[2] = set back mask[3] = mstyle "default" @@ -994,9 +994,8 @@ DESCRIPTION: creates hard drive holes for 2.5 and 3.5 drives in various orientat size[] = not used data[0] = 2.5 or 3.5 data[1] = "portrait", "landscape" - data[2] = "vertical", "horizontal" - data[3] = "left", "right", "none" - data[4] = floor thickness + data[2] = "left", "right", "both", "bottom", "all" + data[3] = floor thickness mask[0] = false, not used mask[1] = length mask[2] = set back @@ -1303,7 +1302,7 @@ DESCRIPTION: creates db connectors. mask[0] = true mask[1] = length mask[2] = set back - mask[3] = mstyle "default" + mask[3] = mstyle "default", "fan_open", "fan_1", "fan_2", "fan_hex" ``` @@ -1324,11 +1323,12 @@ DESCRIPTION: creates a 2.5 hard drive model. rotation[] = object rotation parametric[] = "case", "sbc", "sbc-case_z" size[] = not used - data[0] = height + data[0] = "landscape", "portrait" + data[1] = height mask[0] = true mask[1] = length mask[2] = set back - mask[3] = mstyle "default" + mask[3] = mstyle "default", "bottom", "side", "both" ``` @@ -1349,11 +1349,11 @@ DESCRIPTION: creates a 3.5 hard drive model. rotation[] = object rotation parametric[] = "case", "sbc", "sbc-case_z" size[] = not used - data[] = not used + data[0] = "landscape", "portrait" mask[0] = true mask[1] = length mask[2] = set back - mask[3] = mstyle "default" + mask[3] = mstyle "default", "bottom", "side", "both" ``` diff --git a/lib/access_panel.scad b/lib/access_panel.scad index b42821f..335827f 100644 --- a/lib/access_panel.scad +++ b/lib/access_panel.scad @@ -15,11 +15,71 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - access_panel(size, orientation) access_cover(size, orientation) + access_panel(size, orientation, mask) */ + +/* + NAME: access_cover + DESCRIPTION: creates covers for access port openings + TODO: none + + USAGE: access_panel(size[], orientation) + + size[0] = size_x + size[1] = size_y + size[2] = floor thickness + orientation = "landscape", "portrait" +*/ + +module access_cover(size, orientation) { + + size_x = size[0]; + size_y = size[1]; + floorthick = size[2]; + adj = .01; + $fn = 90; + if(orientation == "portrait") { + difference() { + union() { + translate([1, 6.25, 0]) cube([size_x-2.15, size_y-17.5, floorthick]); + translate([(size_x/2)-4.75, size_y-12.25, 0]) slab([10, 5, floorthick], 5); + translate([1, 6.25, floorthick-adj]) cube([size_x-2.15, 6, floorthick]); + translate([4.25, 3, floorthick]) cube([7.25, 4, 2]); + translate([size_x-12.75, 3, floorthick]) cube([7.25, 4, 2]); + if(size_x > 100) { + translate([(size_x/2)+.25, 3, floorthick]) cube([7.25, 4, 2]); + } + } + translate([(size_x/2)+.25, size_y-6.5, -floorthick-adj]) + cylinder(d=3.2, h=(floorthick*2)+(adj*2)); + translate([(size_x/2)+.25, size_y-6.5, -adj]) + cylinder(d1=6, d2=3.2, h=floorthick); + } + } + if(orientation == "landscape") { + difference() { + union() { + translate([6.25, 0, 0]) cube([size_x-17.75, size_y-2, floorthick]); + translate([size_x-12.25, (size_y/2)-5.75, 0]) slab([5, 10, floorthick], 5); + translate([6.25, 0, floorthick-adj]) cube([6,size_y-2.15, floorthick]); + translate([3.5+adj, 3.25, floorthick]) cube([4, 7.25, 2]); + translate([3.5+adj, size_y-12.75, floorthick]) cube([4, 7.25, 2]); + if(size_y > 100) { + translate([3.5+adj, (size_y/2)-(7.75/2)-1, floorthick]) cube([4, 7.25, 2]); + } + } + translate([size_x-6.5, (size_y/2)-.75, -floorthick-adj]) + cylinder(d=3.2, h=(floorthick*2)+(adj*2)); + translate([size_x-6.5, (size_y/2)-.75, -adj]) + cylinder(d1=6, d2=3.2, h=floorthick); + } + } +} + + /* NAME: access_panel DESCRIPTION: creates opening and structure for access openings @@ -107,63 +167,4 @@ module access_panel(size, orientation, mask) { } } } -} - - -/* - NAME: access_cover - DESCRIPTION: creates covers for access port openings - TODO: none - - USAGE: access_panel(size[], orientation) - - size[0] = size_x - size[1] = size_y - size[2] = floor thickness - orientation = "landscape", "portrait" -*/ - -module access_cover(size, orientation) { - - size_x = size[0]; - size_y = size[1]; - floorthick = size[2]; - adj = .01; - $fn = 90; - if(orientation == "portrait") { - difference() { - union() { - translate([1, 6.25, 0]) cube([size_x-2.15, size_y-17.5, floorthick]); - translate([(size_x/2)-4.75, size_y-12.25, 0]) slab([10, 5, floorthick], 5); - translate([1, 6.25, floorthick-adj]) cube([size_x-2.15, 6, floorthick]); - translate([4.25, 3, floorthick]) cube([7.25, 4, 2]); - translate([size_x-12.75, 3, floorthick]) cube([7.25, 4, 2]); - if(size_x > 100) { - translate([(size_x/2)+.25, 3, floorthick]) cube([7.25, 4, 2]); - } - } - translate([(size_x/2)+.25, size_y-6.5, -floorthick-adj]) - cylinder(d=3.2, h=(floorthick*2)+(adj*2)); - translate([(size_x/2)+.25, size_y-6.5, -adj]) - cylinder(d1=6, d2=3.2, h=floorthick); - } - } - if(orientation == "landscape") { - difference() { - union() { - translate([6.25, 0, 0]) cube([size_x-17.75, size_y-2, floorthick]); - translate([size_x-12.25, (size_y/2)-5.75, 0]) slab([5, 10, floorthick], 5); - translate([6.25, 0, floorthick-adj]) cube([6,size_y-2.15, floorthick]); - translate([3.5+adj, 3.25, floorthick]) cube([4, 7.25, 2]); - translate([3.5+adj, size_y-12.75, floorthick]) cube([4, 7.25, 2]); - if(size_y > 100) { - translate([3.5+adj, (size_y/2)-(7.75/2)-1, floorthick]) cube([4, 7.25, 2]); - } - } - translate([size_x-6.5, (size_y/2)-.75, -floorthick-adj]) - cylinder(d=3.2, h=(floorthick*2)+(adj*2)); - translate([size_x-6.5, (size_y/2)-.75, -adj]) - cylinder(d1=6, d2=3.2, h=floorthick); - } - } -} +} \ No newline at end of file diff --git a/lib/art.scad b/lib/art.scad index f0171d3..1bb4bff 100644 --- a/lib/art.scad +++ b/lib/art.scad @@ -15,7 +15,13 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html + art(scale_d1, size_z, filename) + stl_model(scale_d1, filename) +*/ + + +/* NAME: art DESCRIPTION: create 2d artwork using dxf or svf TODO: none @@ -26,16 +32,6 @@ size_z = floor thickness filename = file name - - NAME: stl_model - DESCRIPTION: import 3d artwork using stl - TODO: none - - USAGE: art(scale_d1, size_z, filename) - - scale_d1 = amount to scale file - size_z = floor thickness - filename = file name */ module art(scale_d1, size_z, filename) { @@ -44,6 +40,18 @@ module art(scale_d1, size_z, filename) { } + +/* + NAME: stl_model + DESCRIPTION: import 3d artwork using stl + TODO: none + + USAGE: stl_model(scale_d1, filename) + + scale_d1 = amount to scale file + filename = file name +*/ + module stl_model(scale_d1, filename) { import(file = filename, scale=scale_d1); diff --git a/lib/batteries.scad b/lib/batteries.scad index 85d71a8..c00aafb 100644 --- a/lib/batteries.scad +++ b/lib/batteries.scad @@ -17,10 +17,11 @@ battery(type) battery_clip(bat_dia = 18.4) - module batt_holder(tolerance) + batt_holder(tolerance) */ + /* NAME: battery DESCRIPTION: creates 18650 and 21700 batteries diff --git a/lib/buttons.scad b/lib/buttons.scad index 9918277..c85547b 100644 --- a/lib/buttons.scad +++ b/lib/buttons.scad @@ -15,20 +15,21 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - button(style, diameter, height) + buttons(style, diameter, height, mask) button_assembly(style, diameter, height) + button_clip(style) button_plunger(style, diameter, height) button_top(style, diameter, height) - button_clip(style) */ + /* NAME: buttons DESCRIPTION: creates different button bodys and styles TODO: none - USAGE: buttons(style, diameter, height, mask) + USAGE: buttons(style, size, radius, post, mask) style = "recess", "cutout" size[0] = diameter of button body @@ -125,6 +126,31 @@ $fn = 90; } +/* + NAME: button_clip + DESCRIPTION: creates button c-clip + TODO: none + + USAGE: button_clip(style) + + style = "recess", "cutout" +*/ + +module button_clip(style) { + +adj = .01; +$fn = 90; + + if(style == "recess") { + difference() { + cylinder(d=8.5, h=.8); + translate([-1.5,-1.75,-adj]) cube([2.75,3.5,1]); + translate([-.75,-.75,-adj]) cube([5,1.25,1.25]); + } + } +} + + /* NAME: button_plunger DESCRIPTION: creates button plunger @@ -177,29 +203,4 @@ $fn = 90; translate([-1.25,-1.25,-3-adj]) cube([2.5,2.5,2]); } } -} - - -/* - NAME: button_clip - DESCRIPTION: creates button c-clip - TODO: none - - USAGE: button_clip(style) - - style = "recess", "cutout" -*/ - -module button_clip(style) { - -adj = .01; -$fn = 90; - - if(style == "recess") { - difference() { - cylinder(d=8.5, h=.8); - translate([-1.5,-1.75,-adj]) cube([2.75,3.5,1]); - translate([-.75,-.75,-adj]) cube([5,1.25,1.25]); - } - } -} +} \ No newline at end of file diff --git a/lib/cable_holder.scad b/lib/cable_holder.scad index 7c8d793..fd0b78b 100644 --- a/lib/cable_holder.scad +++ b/lib/cable_holder.scad @@ -15,8 +15,13 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html + cableholder_spacer() +*/ + + +/* NAME: cableholder_spacer - DESCRIPTION: creates 18650 and 21700 batteries + DESCRIPTION: creates spacer and cable holder for drive mounts TODO: none USAGE: cableholder_spacer() diff --git a/lib/custom.scad b/lib/custom.scad index adc591f..6de7db5 100644 --- a/lib/custom.scad +++ b/lib/custom.scad @@ -15,11 +15,12 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - hk_h3_port_extender(style, mask = false) + hk_h3_port_extender(style, mask) hk_h3_port_extender_holder(part, offset) */ + /* NAME: hk_h3_port_extender DESCRIPTION: @mctom's odroid-h3 gpio port extender @@ -27,11 +28,11 @@ USAGE: hk_h3_port_extender(style, mask) - style = "header", "remote" - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" + style = "header", "remote" + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" */ module hk_h3_port_extender(style, mask) { @@ -105,8 +106,8 @@ module hk_h3_port_extender(style, mask) { USAGE: hk_h3_port_extender_holder(part, offset) - part = "top","bottom","both" - offset = distance from mount face + part = "top","bottom","both" + offset = distance from mount face */ module hk_h3_port_extender_holder(part,offset=2) { diff --git a/lib/dsub.scad b/lib/dsub.scad index 405043f..09c2c63 100644 --- a/lib/dsub.scad +++ b/lib/dsub.scad @@ -15,6 +15,12 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html + dsub(style, gender, mask) + +*/ + + +/* NAME: dsub DESCRIPTION: creates dsub connectors TODO: 9db male, 25db male and female @@ -23,10 +29,10 @@ style = "db9" gender = "female","male" - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" */ module dsub(style, gender, mask) { diff --git a/lib/fans.scad b/lib/fans.scad index 988ab21..e28d4ac 100644 --- a/lib/fans.scad +++ b/lib/fans.scad @@ -15,35 +15,29 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - fans(style, size, mask) + fans(style, mask) fan_cover(size, thick) fan_mask(size, thick, style) */ + /* NAME: fans DESCRIPTION: creates different fan styles and sizes - TODO: add vans + TODO: add efficient vanes - USAGE: fans(style, size, mask) + USAGE: fans(style, mask) - style = "box", - size[0] = size of fan - size[2] = thickness of fan - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" + style = "box", + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default", "fan_open", "fan_1", "fan_2", "fan_hex" */ module fans(style, mask) { - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; - // size, thick, hole-spacing, hole-size, hub-size fan_data = [ ["box140x25", 140, 25, 124.5, 4.3, 40, "#353535"], @@ -67,13 +61,27 @@ module fans(style, mask) { hole_offset = (diameter-hole_space)/2; hub_size = fan_data[f[0]][5]; fan_color = fan_data[f[0]][6]; + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + adj = .01; $fn = 90; - if(enablemask == true && mstyle == "default") { - if(style == "box") { - translate([0, 0, -adj-msetback]) cylinder(d = diameter-2*adj, h = mlength); + if(enablemask == true) { + if(mstyle == "fan_open") { + translate([0, 0, -adj-msetback]) fan_mask(diameter, mlength, "fan_open"); + } + if(mstyle == "default" || mstyle == "fan_1") { + translate([0, 0, -adj-msetback]) fan_mask(diameter, mlength, "fan_1"); + } + if(mstyle == "fan_2") { + translate([0, 0, -adj-msetback]) fan_mask(diameter, mlength, "fan_2"); + } + if(mstyle == "fan_hex") { + translate([0, 0, -adj-msetback]) fan_mask(diameter, mlength, "fan_hex"); } } if(enablemask == false) { @@ -96,9 +104,8 @@ module fans(style, mask) { color(fan_color) translate([-4,-4, -1]) cube([diameter+8, 4, thickness+2]); color(fan_color) translate([-4,diameter, -1]) cube([diameter+8, 4, thickness+2]); } - color(fan_color) translate([diameter/2, diameter/2, thickness/2]) rotate([0,0,30]) - cylinder_fillet_inside(h=thickness, r=hub_size/2, top=1, bottom=1, $fn=90, fillet_fn=90, center=true); - + color(fan_color) translate([diameter/2, diameter/2, thickness/2]) rotate([0,0,30]) + cylinder_fillet_inside(h=thickness, r=hub_size/2, top=1, bottom=1, $fn=90, fillet_fn=90, center=true); } } @@ -124,14 +131,14 @@ module fan_cover(size, thick, style) { /* - DESCRIPTION: creates heatsink masks for openings + DESCRIPTION: creates fan masks for openings TODO: - USAGE: heatsink_mask(size, thick, style) + USAGE: fan_mask(size, thick, style) - size = size of fan - thick = thickness of cover - style = "fan_open", "fan_1", "fan_2", "fan_hex" + size = size of fan + thick = thickness of cover + style = "fan_open", "fan_1", "fan_2", "fan_hex" */ module fan_mask(size, thick, style) { @@ -331,11 +338,11 @@ module fan_mask(size, thick, style) { } } - translate([0, 0, 2]) + translate([0, 0, 11]) union() { cylinder(d=bar_size*2+0.1, thick+2); // Add a circle to prevent any tiny holes around cross bar - rotate([0, 0, 45]) cube([size, bar_size, thick+2], center=true); - rotate([0, 0, 45]) cube([bar_size, size, thick+2], center=true); + rotate([0, 0, 45]) cube([size, bar_size, thick+4], center=true); + rotate([0, 0, 45]) cube([bar_size, size, thick+4], center=true); } } } diff --git a/lib/fastener.scad b/lib/fastener.scad index 6799251..354a9f4 100644 --- a/lib/fastener.scad +++ b/lib/fastener.scad @@ -19,6 +19,7 @@ */ + /* NAME: fan_cover DESCRIPTION: creates fan covers for fan openings diff --git a/lib/feet.scad b/lib/feet.scad index dbb446e..ca52b79 100644 --- a/lib/feet.scad +++ b/lib/feet.scad @@ -15,6 +15,12 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html + feet (diameter, height) + +*/ + + +/* NAME: feet DESCRIPTION: creates simple case feet TODO: none diff --git a/lib/hd.scad b/lib/hd.scad index d40e03f..bdd0a98 100644 --- a/lib/hd.scad +++ b/lib/hd.scad @@ -15,120 +15,109 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - hd_mount(hd, orientation, position, side) + hd25(orientation, height, mask) hd25_tab(side) hd25_vtab(side) + hd35(orientation, mask) + hdd35_25holder(length) hd35_tab(side) hd35_vtab(side) - hd_bottom_holes(hd, orientation, position, side, thick) - hd25(height) - hd35() - hdd35_25holder(length) + hd_bottom_holes(hd, orientation, side, thick) + hd_mount(hd, orientation, position, side) */ - + + /* - NAME: hd_mount - DESCRIPTION: creates 2.5" and 3.5" hard drive mounts + NAME: hd25 + DESCRIPTION: creates 2.5" hard drive model TODO: none - USAGE: hd_mount(hd, orientation, position, side) + USAGE: hd25(orientation, height, mask) - hd = 2.5, 3.5 - orientation = "portrait", "landscape" - position = "vertical", "horizontal" - side = "left", "right" + orientation = "landscape", "portrait" + height = drive height + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default", "bottom", "side", "both" */ -module hd_mount(hd, orientation, position, side) { +module hd25(orientation, height, mask) { + + hd25_x = 100; + hd25_y = 69.85; + hd25_z = height; + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; adj = .01; $fn = 90; - if(hd == 2.5) { - if(orientation == "portrait") { - if(position == "vertical") { - if(side == "left") { - translate([0,14,0]) rotate([0,0,0]) hd25_vtab("right"); - translate([0,90.6,0]) rotate([0,0,0]) hd25_vtab("right"); - } - else { // right - translate([0,14,0]) rotate([0,0,0]) hd25_vtab("left"); - translate([0,90.6,0]) rotate([0,0,0]) hd25_vtab("left"); - } - } - else { - translate([-.5,14,0]) hd25_tab("left"); - translate([-.5,90.6,0]) hd25_tab("left"); - translate([70.35,14,0]) hd25_tab("right"); - translate([70.35,90.6,0]) hd25_tab("right"); - } + if(enablemask == true) { + if(orientation == "landscape" && (mstyle == "side" || mstyle == "both" || mstyle == "default")) { + translate([0, msetback, 0]) hd_holes(2.5, "landscape", "left", mlength); + translate([0, -msetback, 0]) hd_holes(2.5, "landscape", "right", mlength); } - if(orientation == "landscape") { - if(position == "vertical") { - if(side == "left") { - translate([9.4,0,0]) rotate([0,0,90]) hd25_vtab("right"); - translate([86,0,0]) rotate([0,0,90]) hd25_vtab("right"); - } - else { // right - translate([9.4,0,0]) rotate([0,0,90]) hd25_vtab("left"); - translate([86,0,0]) rotate([0,0,90]) hd25_vtab("left"); - } - } - else { - translate([9.4,4.07-4.5,0]) rotate([0,0,90]) hd25_tab("left"); - translate([86,4.07-4.5,0]) rotate([0,0,90]) hd25_tab("left"); - translate([86,65.79+4.5,0]) rotate([0,0,90]) hd25_tab("right"); - translate([9.4,65.79+4.5,0]) rotate([0,0,90]) hd25_tab("right"); - } + if(orientation == "landscape" && (mstyle == "bottom" || mstyle == "both")) { + translate([0, 0, msetback]) hd_holes(2.5, "landscape", "bottom", mlength); + } + if(orientation == "portrait" && (mstyle == "side" || mstyle == "both" || mstyle == "default")) { + translate([msetback, 0, 0]) hd_holes(2.5, "portrait", "left", mlength); + translate([-msetback, 0, 0]) hd_holes(2.5, "portrait", "right", mlength); + } + if(orientation == "portrait" && (mstyle == "bottom" || mstyle == "both")) { + translate([0, 0, -mlength+msetback]) hd_holes(2.5, "portrait", "bottom", mlength); } } - if(hd == 3.5) { - if(orientation == "portrait") { - if(position == "vertical") { - if(side == "left") { - translate([0,41.28,0]) rotate([0,0,0]) hd35_vtab("right"); - translate([0,41.28+44.45,0]) rotate([0,0,0]) hd35_vtab("right"); - translate([0,41.28+76.20,0]) rotate([0,0,0]) hd35_vtab("right"); - } - else { // right - translate([0,41.28,0]) rotate([0,0,0]) hd35_vtab("left"); - translate([0,41.28+44.45,0]) rotate([0,0,0]) hd35_vtab("left"); - translate([0,41.28+76.20,0]) rotate([0,0,0]) hd35_vtab("left"); - } - } - else { - translate([-.5,28.5,0]) hd35_tab("left"); - translate([-.5,69.75,0]) hd35_tab("left"); - translate([-.5,130.1,0]) hd35_tab("left"); - translate([101.6+.5,28.5,0]) hd35_tab("right"); - translate([101.6+.5,69.75,0]) hd35_tab("right"); - translate([101.6+.5,130.1,0]) hd35_tab("right"); + if(enablemask == false) { + if(orientation == "landscape") { + difference() { + color("LightGrey",.6) cube([hd25_x,hd25_y,hd25_z]); + + // bottom screw holes + color("Black",.6) translate([9.4,4.07,-adj]) cylinder(d=3,h=3); + color("Black",.6) translate([86,4.07,-adj]) cylinder(d=3,h=3); + color("Black",.6) translate([86,65.79,-adj]) cylinder(d=3,h=4); + color("Black",.6) translate([9.4,65.79,-adj]) cylinder(d=3,h=4); + + // side screw holes + color("Black",.6) translate([9.4,-adj,3]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([86,-adj,3]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([86,hd25_y+adj,3]) rotate([90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([9.4,hd25_y+adj,3]) rotate([90,0,0]) cylinder(d=3,h=3); + + // connector opening + color("LightSlateGray",.6) translate([hd25_x-5,11,-1]) cube([5+adj,32,5+adj]); } } - if(orientation == "landscape") { - if(position == "vertical") { - if(side == "left") { - translate([9.4,0,0]) rotate([0,0,90]) hd35_vtab("right"); - translate([86,0,0]) rotate([0,0,90]) hd35_vtab("right"); + if(orientation == "portrait") { + translate([0,hd25_x,0]) rotate([0,0,270]) + difference() { + color("LightGrey",.6) cube([hd25_x,hd25_y,hd25_z]); + + // bottom screw holes + color("Black",.6) translate([9.4,4.07,-adj]) cylinder(d=3,h=3); + color("Black",.6) translate([86,4.07,-adj]) cylinder(d=3,h=3); + color("Black",.6) translate([86,65.79,-adj]) cylinder(d=3,h=4); + color("Black",.6) translate([9.4,65.79,-adj]) cylinder(d=3,h=4); + + // side screw holes + color("Black",.6) translate([9.4,-adj,3]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([86,-adj,3]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([86,hd25_y+adj,3]) rotate([90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([9.4,hd25_y+adj,3]) rotate([90,0,0]) cylinder(d=3,h=3); + + // connector opening + color("LightSlateGray",.6) translate([hd25_x-5,11,-1]) cube([5+adj,32,5+adj]); } - else { // right - translate([9.4,0,0]) rotate([0,0,90]) hd35_vtab("left"); - translate([86,0,0]) rotate([0,0,90]) hd35_vtab("left"); - } - } - else { - translate([16.9,-.5,0]) rotate([0,0,90]) hd35_tab("left"); - translate([76.6,-.5,0]) rotate([0,0,90]) hd35_tab("left"); - translate([118.5,-.5,0]) rotate([0,0,90]) hd35_tab("left"); - translate([16.9,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right"); - translate([76.6,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right"); - translate([118.5,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right"); - } } } } + /* NAME: hd25_tab DESCRIPTION: creates 2.5" hard drive tabs for horizontal mounting @@ -275,6 +264,202 @@ module hd25_vtab(side) { } +/* + NAME: hd35 + DESCRIPTION: creates 3.5" hard drive model + TODO: none + + USAGE: hd35(orientation, mask) + + orientation = "landscape", "portrait" + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default", "bottom", "side", "both" +*/ + +module hd35(orientation, mask) { + + hd35_x = 147; + hd35_y = 101.6; + hd35_z = 26.1; + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + adj = .01; + $fn = 90; + + if(enablemask == true) { + if(orientation == "landscape" && (mstyle == "side" || mstyle == "both" || mstyle == "default")) { + translate([0, msetback, 0]) hd_holes(3.5, "landscape", "left", mlength); + translate([0, -msetback, 0]) hd_holes(3.5, "landscape", "right", mlength); + } + if(orientation == "landscape" && (mstyle == "bottom" || mstyle == "both")) { + translate([0, 0, msetback]) hd_holes(3.5, "landscape", "bottom", mlength); + } + if(orientation == "portrait" && (mstyle == "side" || mstyle == "both" || mstyle == "default")) { + translate([msetback, 0, 0]) hd_holes(3.5, "portrait", "left", mlength); + translate([-msetback, 0, 0]) hd_holes(3.5, "portrait", "right", mlength); + } + if(orientation == "portrait" && (mstyle == "bottom" || mstyle == "both")) { + translate([0, 0, -mlength+msetback]) hd_holes(3.5, "portrait", "bottom", mlength); + } + } + if(enablemask == false) { + if(orientation == "landscape") { + difference() { + color("LightGrey",.6) cube([hd35_x,hd35_y,hd35_z]); + + // bottom screw holes + color("Black",.6) translate([29.52,3.18,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([61.27,3.18,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([105.72,3.18,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([29.52,98.43,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([61.27,98.43,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([105.72,98.43,-adj]) cylinder(d=3,h=3+adj); + + // side screw holes + color("Black",.6) translate([16.9,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([76.6,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([118.5,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([118.5,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([76.6,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([16.9,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); + + // connector opening + color("LightSlateGray",.6) translate([hd35_x-5,11,-1]) cube([5+adj,32,5+adj]); + } + } + if(orientation == "portrait") { + translate([0,hd35_x,0]) rotate([0,0,270]) + difference() { + color("LightGrey",.6) cube([hd35_x,hd35_y,hd35_z]); + + // bottom screw holes + color("Black",.6) translate([29.52,3.18,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([61.27,3.18,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([105.72,3.18,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([29.52,98.43,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([61.27,98.43,-adj]) cylinder(d=3,h=3+adj); + color("Black",.6) translate([105.72,98.43,-adj]) cylinder(d=3,h=3+adj); + + // side screw holes + color("Black",.6) translate([16.9,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([76.6,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([118.5,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([118.5,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([76.6,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); + color("Black",.6) translate([16.9,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); + + // connector opening + color("LightSlateGray",.6) translate([hd35_x-5,11,-1]) cube([5+adj,32,5+adj]); + } + } + } +} + + +/* + NAME: hd35_25holder + DESCRIPTION: 3.5" hdd to 2.5" hdd holder + TODO: none + + USAGE: hdd35_25holder(length, width=101.6) + + length = length of holder min. 145mm for 3.5" drive +*/ + +module hd35_25holder(length, width=101.6) { + + wallthick = 3; + floorthick = 2; + hd35_x = length; // 145mm for 3.5" drive + hd35_y = width; + hd35_z = 12; + hd25_x = 100; + hd25_y = 69.85; + hd25_z = 9.5; + hd25_xloc = 2; // or (hd35_x-hd25_x)/2 + hd25_yloc = (hd35_y-hd25_y)/2; + hd25_zloc = 9.5; + adj = .1; + $fn=90; + + difference() { + union() { + difference() { + translate([(hd35_x/2),(hd35_y/2),(hd35_z/2)]) + cube_fillet_inside([hd35_x,hd35_y,hd35_z], + vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); + translate([(hd35_x/2),(hd35_y/2),(hd35_z/2)+floorthick]) + cube_fillet_inside([hd35_x-(wallthick*2),hd35_y-(wallthick*2),hd35_z], + vertical=[0,0,0,0], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); + + // end trim + translate([-adj,5,wallthick+2]) cube([wallthick+(adj*2),hd35_y-10,10]); + translate([hd35_x-wallthick-adj,5,wallthick+2]) cube([wallthick+(adj*2),hd35_y-10,10]); + + // bottom vents + for ( r=[15:40:hd35_x-40]) { + for (c=[hd35_y-76:4:75]) { + translate ([r,c,-adj]) cube([35,2,wallthick+(adj*2)]); + } + } + } + // 2.5 hdd bottom support + translate([9.4+hd25_xloc,4.07+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); + translate([86+hd25_xloc,4.07+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); + translate([86+hd25_xloc,65.79+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); + translate([9.4+hd25_xloc,65.79+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); + + // side nut holder support + translate([16,wallthick-adj,7]) rotate([-90,0,0]) cylinder(d=10,h=3); + translate([76,wallthick-adj,7]) rotate([-90,0,0]) cylinder(d=10,h=3); + if(length >= 120) { + translate([117.5,wallthick-adj,7]) rotate([-90,0,0]) cylinder(d=10,h=3); + translate([117.5,hd35_y-wallthick+adj,7]) rotate([90,0,0]) cylinder(d=10,h=3); + } + translate([76,hd35_y-wallthick+adj,7]) rotate([90,0,0]) cylinder(d=10,h=3); + translate([16,hd35_y-wallthick+adj,7]) rotate([90,0,0]) cylinder(d=10,h=3); + + // bottom-side support + translate([wallthick,wallthick,floorthick-2]) rotate([45,0,0]) cube([hd35_x-(wallthick*2),3,3]); + translate([wallthick,hd35_y-wallthick+adj,floorthick-2]) rotate([45,0,0]) cube([hd35_x-(wallthick*2),3,3]); + + } + // bottom screw holes + translate([9.4+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); + translate([86+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); + translate([86+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); + translate([9.4+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); + + // countersink holes + translate([9.4+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); + translate([86+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); + translate([86+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); + translate([9.4+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); + + // side screw holes + translate([16,-adj,7]) rotate([-90,0,0]) cylinder(d=3.6,h=7); + translate([76,-adj,7]) rotate([-90,0,0]) cylinder(d=3.6,h=7); + translate([117.5,-adj,7]) rotate([-90,0,0]) cylinder(d=3.6,h=7); + translate([117.5,hd35_y+adj,7]) rotate([90,0,0]) cylinder(d=3.6,h=7); + translate([76,hd35_y+adj,7]) rotate([90,0,0]) cylinder(d=3.6,h=7); + translate([16,hd35_y+adj,7]) rotate([90,0,0]) cylinder(d=3.6,h=7); + + // side nut trap + translate([16,wallthick-adj,7]) rotate([-90,0,0]) cylinder(r=3.30,h=5,$fn=6); + translate([76,wallthick-adj,7]) rotate([-90,0,0]) cylinder(r=3.30,h=5,$fn=6); + translate([117.5,wallthick-adj,7]) rotate([-90,0,0]) cylinder(r=3.30,h=5,$fn=6); + translate([117.5,hd35_y-wallthick-adj,7]) rotate([90,0,0]) cylinder(r=3.30,h=5,$fn=6); + translate([76,hd35_y-wallthick-adj,7]) rotate([90,0,0]) cylinder(r=3.30,h=5,$fn=6); + translate([16,hd35_y-wallthick-adj,7]) rotate([90,0,0]) cylinder(r=3.30,h=5,$fn=6); + } +} + + /* NAME: hd35_tab DESCRIPTION: creates 3.5" hard drive tabs for horizontal mounting @@ -429,16 +614,123 @@ module hd35_vtab(side) { DESCRIPTION: creates 2.5" and 3.5" hard drive hole mask for mounting TODO: none - USAGE: hd_bottom_holes(hd, orientation, position, side, thick) + USAGE: hd_bottom_holes(hd, orientation, side, thick) hd = 2.5, 3.5 orientation = "portrait", "landscape" - position = "vertical", "horizontal" - side = "left", "right", "none" + side = "left", "right", "both", "bottom", "all" thick = floor thickness */ -module hd_holes(hd, orientation, position, side, thick) { +module hd_holes(hd, orientation, side, thick) { + + hd25_x = 100; + hd25_y = 69.85; + hd35_x = 147; + hd35_y = 101.6; + hd35_z = 26.1; + adj = .01; + $fn = 90; + + if(hd == 2.5) { + if(orientation == "portrait") { + translate([0,hd25_x,0]) rotate([0,0,270]) union() { + if(side == "left" || side == "both" || side == "all") { + translate([9.4,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); + translate([86,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); + } + if(side == "right" || side == "both" || side == "all") { + translate([9.4,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); + translate([86,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); + } + if(side == "bottom" || side == "all") { + translate([9.4,4.07,0]) cylinder(d=3.6,h=thick); + translate([86,4.07,0]) cylinder(d=3.6,h=thick); + translate([86,65.79,0]) cylinder(d=3.6,h=thick); + translate([9.4,65.79,0]) cylinder(d=3.6,h=thick); + } + } + } + if(orientation == "landscape") { + if(side == "left" || side == "both" || side == "all") { + translate([9.4,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); + translate([86,-thick,3]) rotate([270,0,0]) cylinder(d=3.6,h=thick); + } + if(side == "right" || side == "both" || side == "all") { + translate([9.4,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); + translate([86,hd25_y+thick,3]) rotate([90,0,0]) cylinder(d=3.6,h=thick); + } + if(side == "bottom" || side == "all") { + translate([9.4,4.07,-thick]) cylinder(d=3.6,h=thick); + translate([86,4.07,-thick]) cylinder(d=3.6,h=thick); + translate([86,65.79,-thick]) cylinder(d=3.6,h=thick); + translate([9.4,65.79,-thick]) cylinder(d=3.6,h=thick); + } + } + } + if(hd == 3.5) { + if(orientation == "portrait") { + translate([0,hd35_x,0]) rotate([0,0,270]) union() { + if(side == "left" || side == "both" || side == "all") { + translate([16.9,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + translate([76.6,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + translate([118.5,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + } + if(side == "right" || side == "both" || side == "all") { + translate([118.5,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + translate([76.6,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + translate([16.9,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + } + if(side == "bottom" || side == "all") { + // landscape 3.5" bottom screw holes + translate([29.52,3.18,0]) cylinder(d=3.6,h=thick); + translate([61.27,3.18,0]) cylinder(d=3.6,h=thick); + translate([105.72,3.18,0]) cylinder(d=3.6,h=thick); + translate([29.52,98.43,0]) cylinder(d=3.6,h=thick); + translate([61.27,98.43,0]) cylinder(d=3.6,h=thick); + translate([105.72,98.43,0]) cylinder(d=3.6,h=thick); + } + } + } + if(orientation == "landscape") { + if(side == "left" || side == "both" || side == "all") { + translate([16.9,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + translate([76.6,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + translate([118.5,-thick,6.35]) rotate([270,0,0]) cylinder(d=3,h=thick); + } + if(side == "right" || side == "both" || side == "all") { + translate([118.5,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + translate([76.6,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + translate([16.9,hd35_y+thick,6.35]) rotate([90,0,0]) cylinder(d=3,h=thick); + } + if(side == "bottom" || side == "all") { + // landscape 3.5" bottom screw holes + translate([29.52,3.18,-thick]) cylinder(d=3.6,h=thick); + translate([61.27,3.18,-thick]) cylinder(d=3.6,h=thick); + translate([105.72,3.18,-thick]) cylinder(d=3.6,h=thick); + translate([29.52,98.43,-thick]) cylinder(d=3.6,h=thick); + translate([61.27,98.43,-thick]) cylinder(d=3.6,h=thick); + translate([105.72,98.43,-thick]) cylinder(d=3.6,h=thick); + } + } + } +} + + +/* + NAME: hd_mount + DESCRIPTION: creates 2.5" and 3.5" hard drive mounts + TODO: none + + USAGE: hd_mount(hd, orientation, position, side) + + hd = 2.5, 3.5 + orientation = "portrait", "landscape" + position = "vertical", "horizontal" + side = "left", "right" +*/ + +module hd_mount(hd, orientation, position, side) { adj = .01; $fn = 90; @@ -447,42 +739,37 @@ module hd_holes(hd, orientation, position, side, thick) { if(orientation == "portrait") { if(position == "vertical") { if(side == "left") { - translate([-3,14,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([-3,90.6,0]) cylinder(d=3.6,h=thick+(adj*2)); + translate([0,14,0]) rotate([0,0,0]) hd25_vtab("right"); + translate([0,90.6,0]) rotate([0,0,0]) hd25_vtab("right"); } - else { - // portrait 2.5" bottom screw holes - translate([3,14,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([3,90.6,0]) cylinder(d=3.6,h=thick+(adj*2)); + else { // right + translate([0,14,0]) rotate([0,0,0]) hd25_vtab("left"); + translate([0,90.6,0]) rotate([0,0,0]) hd25_vtab("left"); } } else { - // portrait 2.5" bottom screw holes - translate([4.07,14,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([4.07,90.6,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([65.79,90.6,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([65.79,14,0]) cylinder(d=3.6,h=thick+(adj*2)); - + translate([-.5,14,0]) hd25_tab("left"); + translate([-.5,90.6,0]) hd25_tab("left"); + translate([70.35,14,0]) hd25_tab("right"); + translate([70.35,90.6,0]) hd25_tab("right"); } } if(orientation == "landscape") { if(position == "vertical") { if(side == "left") { - translate([9.4,-3,0]) cylinder(d=3.6,h=thick+5); - translate([86,-3,0]) cylinder(d=3.6,h=thick+5); + translate([9.4,0,0]) rotate([0,0,90]) hd25_vtab("right"); + translate([86,0,0]) rotate([0,0,90]) hd25_vtab("right"); } - else { - echo(side); - translate([9.4,3,0]) cylinder(d=3.6,h=thick+5); - translate([86,3,0]) cylinder(d=3.6,h=thick+5); + else { // right + translate([9.4,0,0]) rotate([0,0,90]) hd25_vtab("left"); + translate([86,0,0]) rotate([0,0,90]) hd25_vtab("left"); } } else { - // landscape 2.5" bottom screw holes - translate([9.4,4.07,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([86,4.07,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([86,65.79,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([9.4,65.79,0]) cylinder(d=3.6,h=thick+(adj*2)); + translate([9.4,4.07-4.5,0]) rotate([0,0,90]) hd25_tab("left"); + translate([86,4.07-4.5,0]) rotate([0,0,90]) hd25_tab("left"); + translate([86,65.79+4.5,0]) rotate([0,0,90]) hd25_tab("right"); + translate([9.4,65.79+4.5,0]) rotate([0,0,90]) hd25_tab("right"); } } } @@ -490,217 +777,44 @@ module hd_holes(hd, orientation, position, side, thick) { if(orientation == "portrait") { if(position == "vertical") { if(side == "left") { - translate([-6,28.5,0]) cylinder(d=3.6,h=thick+5); - translate([-6,70.5,0]) cylinder(d=3.6,h=thick+5); - translate([-6,28.5+101.6,0]) cylinder(d=3.6,h=thick+5); + translate([0,41.28,0]) rotate([0,0,0]) hd35_vtab("right"); + translate([0,41.28+44.45,0]) rotate([0,0,0]) hd35_vtab("right"); + translate([0,41.28+76.20,0]) rotate([0,0,0]) hd35_vtab("right"); } - else { - // portrait 3.5" bottom screw holes - translate([6,28.5,0]) cylinder(d=3.6,h=thick+5); - translate([6,70.5,0]) cylinder(d=3.6,h=thick+5); - translate([6,28.5+101.6,0]) cylinder(d=3.6,h=thick+5); + else { // right + translate([0,41.28,0]) rotate([0,0,0]) hd35_vtab("left"); + translate([0,41.28+44.45,0]) rotate([0,0,0]) hd35_vtab("left"); + translate([0,41.28+76.20,0]) rotate([0,0,0]) hd35_vtab("left"); } } else { - // portrait 3.5" bottom screw holes - translate([3.18,41.28,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([3.18,85.73,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([3.18,117.48,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([98.43,41.28,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([98.43,85.73,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([98.43,117.48,0]) cylinder(d=3.6,h=thick+(adj*2)); + translate([-.5,28.5,0]) hd35_tab("left"); + translate([-.5,69.75,0]) hd35_tab("left"); + translate([-.5,130.1,0]) hd35_tab("left"); + translate([101.6+.5,28.5,0]) hd35_tab("right"); + translate([101.6+.5,69.75,0]) hd35_tab("right"); + translate([101.6+.5,130.1,0]) hd35_tab("right"); } } if(orientation == "landscape") { - // landscape 3.5" bottom screw holes - translate([29.52,3.18,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([61.27,3.18,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([105.72,3.18,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([29.52,98.43,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([61.27,98.43,0]) cylinder(d=3.6,h=thick+(adj*2)); - translate([105.72,98.43,0]) cylinder(d=3.6,h=thick+(adj*2)); - } - } -} - - -/* - NAME: hd25 - DESCRIPTION: creates 2.5" hard drive model - TODO: none - - USAGE: hd25(height) - - height = drive height -*/ - -module hd25(height) { - - hd25_x = 100; - hd25_y = 69.85; - hd25_z = height; - - adj = .01; - $fn=90; - - difference() { - color("LightGrey",.6) cube([hd25_x,hd25_y,hd25_z]); - - // bottom screw holes - color("Black",.6) translate([9.4,4.07,-adj]) cylinder(d=3,h=3); - color("Black",.6) translate([86,4.07,-adj]) cylinder(d=3,h=3); - color("Black",.6) translate([86,65.79,-adj]) cylinder(d=3,h=4); - color("Black",.6) translate([9.4,65.79,-adj]) cylinder(d=3,h=4); - - // side screw holes - color("Black",.6) translate([9.4,-adj,3]) rotate([-90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([86,-adj,3]) rotate([-90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([86,hd25_y+adj,3]) rotate([90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([9.4,hd25_y+adj,3]) rotate([90,0,0]) cylinder(d=3,h=3); - - // connector opening - color("LightSlateGray",.6) translate([hd25_x-5,11,-1]) cube([5+adj,32,5+adj]); - } -} - - -/* - NAME: hd35 - DESCRIPTION: creates 3.5" hard drive model - TODO: none - - USAGE: hd35() -*/ - -module hd35() { - - hd35_x = 147; - hd35_y = 101.6; - hd35_z = 26.1; - - adj = .01; - $fn=90; - - difference() { - color("LightGrey",.6) cube([hd35_x,hd35_y,hd35_z]); - - // bottom screw holes - color("Black",.6) translate([29.52,3.18,-adj]) cylinder(d=3,h=3+adj); - color("Black",.6) translate([61.27,3.18,-adj]) cylinder(d=3,h=3+adj); - color("Black",.6) translate([105.72,3.18,-adj]) cylinder(d=3,h=3+adj); - color("Black",.6) translate([29.52,98.43,-adj]) cylinder(d=3,h=3+adj); - color("Black",.6) translate([61.27,98.43,-adj]) cylinder(d=3,h=3+adj); - color("Black",.6) translate([105.72,98.43,-adj]) cylinder(d=3,h=3+adj); - - // side screw holes - color("Black",.6) translate([16.9,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([76.6,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([118.5,-adj,6.35]) rotate([-90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([118.5,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([76.6,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); - color("Black",.6) translate([16.9,hd35_y+adj,6.35]) rotate([90,0,0]) cylinder(d=3,h=3); - - // connector opening - color("LightSlateGray",.6) translate([hd35_x-5,11,-1]) cube([5+adj,32,5+adj]); - - } -} - - -/* - NAME: hd25 - DESCRIPTION: 3.5" hdd to 2.5" hdd holder - TODO: none - - USAGE: hdd35_25holder(length, width=101.6) - - length = length of holder min. 145mm for 3.5" drive -*/ - -module hdd35_25holder(length, width=101.6) { - - wallthick = 3; - floorthick = 2; - hd35_x = length; // 145mm for 3.5" drive - hd35_y = width; - hd35_z = 12; - hd25_x = 100; - hd25_y = 69.85; - hd25_z = 9.5; - hd25_xloc = 2; // or (hd35_x-hd25_x)/2 - hd25_yloc = (hd35_y-hd25_y)/2; - hd25_zloc = 9.5; - adj = .1; - $fn=90; - - difference() { - union() { - difference() { - translate([(hd35_x/2),(hd35_y/2),(hd35_z/2)]) - cube_fillet_inside([hd35_x,hd35_y,hd35_z], - vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); - translate([(hd35_x/2),(hd35_y/2),(hd35_z/2)+floorthick]) - cube_fillet_inside([hd35_x-(wallthick*2),hd35_y-(wallthick*2),hd35_z], - vertical=[0,0,0,0], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); - - // end trim - translate([-adj,5,wallthick+2]) cube([wallthick+(adj*2),hd35_y-10,10]); - translate([hd35_x-wallthick-adj,5,wallthick+2]) cube([wallthick+(adj*2),hd35_y-10,10]); - - // bottom vents - for ( r=[15:40:hd35_x-40]) { - for (c=[hd35_y-76:4:75]) { - translate ([r,c,-adj]) cube([35,2,wallthick+(adj*2)]); - } + if(position == "vertical") { + if(side == "left") { + translate([9.4,0,0]) rotate([0,0,90]) hd35_vtab("right"); + translate([86,0,0]) rotate([0,0,90]) hd35_vtab("right"); + } + else { // right + translate([9.4,0,0]) rotate([0,0,90]) hd35_vtab("left"); + translate([86,0,0]) rotate([0,0,90]) hd35_vtab("left"); } } - // 2.5 hdd bottom support - translate([9.4+hd25_xloc,4.07+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); - translate([86+hd25_xloc,4.07+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); - translate([86+hd25_xloc,65.79+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); - translate([9.4+hd25_xloc,65.79+hd25_yloc,floorthick-adj]) cylinder(d=8,h=4); - - // side nut holder support - translate([16,wallthick-adj,7]) rotate([-90,0,0]) cylinder(d=10,h=3); - translate([76,wallthick-adj,7]) rotate([-90,0,0]) cylinder(d=10,h=3); - if(length >= 120) { - translate([117.5,wallthick-adj,7]) rotate([-90,0,0]) cylinder(d=10,h=3); - translate([117.5,hd35_y-wallthick+adj,7]) rotate([90,0,0]) cylinder(d=10,h=3); + else { + translate([16.9,-.5,0]) rotate([0,0,90]) hd35_tab("left"); + translate([76.6,-.5,0]) rotate([0,0,90]) hd35_tab("left"); + translate([118.5,-.5,0]) rotate([0,0,90]) hd35_tab("left"); + translate([16.9,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right"); + translate([76.6,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right"); + translate([118.5,101.6-.5,0]) rotate([0,0,90]) hd35_tab("right"); } - translate([76,hd35_y-wallthick+adj,7]) rotate([90,0,0]) cylinder(d=10,h=3); - translate([16,hd35_y-wallthick+adj,7]) rotate([90,0,0]) cylinder(d=10,h=3); - - // bottom-side support - translate([wallthick,wallthick,floorthick-2]) rotate([45,0,0]) cube([hd35_x-(wallthick*2),3,3]); - translate([wallthick,hd35_y-wallthick+adj,floorthick-2]) rotate([45,0,0]) cube([hd35_x-(wallthick*2),3,3]); - } - // bottom screw holes - translate([9.4+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); - translate([86+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); - translate([86+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); - translate([9.4+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d=3,h=(floorthick*3)+(adj*2)); - - // countersink holes - translate([9.4+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); - translate([86+hd25_xloc,4.07+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); - translate([86+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); - translate([9.4+hd25_xloc,65.79+hd25_yloc,-adj]) cylinder(d1=6.5, d2=3, h=3); - - // side screw holes - translate([16,-adj,7]) rotate([-90,0,0]) cylinder(d=3.6,h=7); - translate([76,-adj,7]) rotate([-90,0,0]) cylinder(d=3.6,h=7); - translate([117.5,-adj,7]) rotate([-90,0,0]) cylinder(d=3.6,h=7); - translate([117.5,hd35_y+adj,7]) rotate([90,0,0]) cylinder(d=3.6,h=7); - translate([76,hd35_y+adj,7]) rotate([90,0,0]) cylinder(d=3.6,h=7); - translate([16,hd35_y+adj,7]) rotate([90,0,0]) cylinder(d=3.6,h=7); - - // side nut trap - translate([16,wallthick-adj,7]) rotate([-90,0,0]) cylinder(r=3.30,h=5,$fn=6); - translate([76,wallthick-adj,7]) rotate([-90,0,0]) cylinder(r=3.30,h=5,$fn=6); - translate([117.5,wallthick-adj,7]) rotate([-90,0,0]) cylinder(r=3.30,h=5,$fn=6); - translate([117.5,hd35_y-wallthick-adj,7]) rotate([90,0,0]) cylinder(r=3.30,h=5,$fn=6); - translate([76,hd35_y-wallthick-adj,7]) rotate([90,0,0]) cylinder(r=3.30,h=5,$fn=6); - translate([16,hd35_y-wallthick-adj,7]) rotate([90,0,0]) cylinder(r=3.30,h=5,$fn=6); } -} +} \ No newline at end of file diff --git a/lib/holder.scad b/lib/holder.scad index d8809d5..01dd762 100644 --- a/lib/holder.scad +++ b/lib/holder.scad @@ -15,12 +15,143 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - pcb_holder(size, wallthick) nut_holder(nut, style, dia_x, dia_y, height) + pcb_holder(size, wallthick) vu_holder(vu_model, side, vesa, cheight) */ + +/* + NAME: nut_holder + DESCRIPTION: creates various nut holders + TODO: none + + USAGE: nut_holder(nut, style, dia_x, dia_y, height, mask) + + nut = "m2", "m2.5", "m3", "m4" + style = "default", "sloped", "trap" + dia_x = top diameter or x size in mm + dia_y = bottom diameter or y size in mm + height = holder height in mm + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" + +*/ + +module nut_holder(nut, style, dia_x, dia_y, height, mask) { + + nuts = [[2,4,1.6], // m2 size, diameter, height + [2.5,5,2], // m2.5 size, diameter, height + [3,5.5,2.4], // m3 size, diameter, height + [4,7,3.2]]; // m4 size, diameter, height + + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + adj = .01; + $fn = 90; + + if(enablemask == true && mstyle == "default") { + if(nut == "m2") { + translate([0, 0, -mlength+msetback]) cylinder(d = nuts[0][0], h = mlength); + } + if(nut == "m2.5") { + translate([0, 0, -mlength+msetback]) cylinder(d = nuts[1][0], h = mlength); + } + if(nut == "m3") { + translate([0, 0, -mlength+msetback]) cylinder(d = nuts[2][0], h = mlength); + } + if(nut == "m4") { + translate([0, 0, -mlength+msetback]) cylinder(d = nuts[3][0], h = mlength); + } + } + if(enablemask == false) { + + if( style == "default") { + difference() { + cylinder(d=dia_x, h=height); + if(nut == "m2") { + translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[0][1]*2/sqrt(3), h=height, $fn=6); + } + if(nut == "m2.5") { + translate([0, 0, -1]) cylinder(d=nuts[1][0]+.25, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[1][1]*2/sqrt(3), h=height, $fn=6); + } + if(nut == "m3") { + translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[2][1]*2/sqrt(3), h=height, $fn=6); + } + if(nut == "m4") { + translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[3][1]*2/sqrt(3), h=height, $fn=6); + } + } + } + if( style == "sloped") { + difference() { + cylinder(d2=dia_x, d1=dia_y, h=height); + if(nut == "m2") { + translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[0][1]*2/sqrt(3), h=height, $fn=6); + } + if(nut == "m2.5") { + translate([0, 0, -1]) cylinder(d=nuts[1][0]+.25, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[1][1]*2/sqrt(3), h=height, $fn=6); + } + if(nut == "m3") { + translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[2][1]*2/sqrt(3), h=height, $fn=6); + } + if(nut == "m4") { + translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2); + translate([0, 0, 2]) cylinder(d=nuts[3][1]*2/sqrt(3), h=height, $fn=6); + } + } + } + if( style == "trap") { + if(nut == "m2") { + difference() { + translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); + translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2); + translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[0][1]*2/sqrt(3), h=nuts[0][2], $fn=6); + translate([-nuts[0][1]/2, 0, 2]) cube([nuts[0][1], dia_x, nuts[0][2]]); + } + } + if(nut == "m2.5") { + difference() { + translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); + translate([0, 0, -1]) cylinder(d=nuts[1][0]+.325, h=height+2); + translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[1][1]*2/sqrt(3), h=nuts[1][2], $fn=6); + translate([-nuts[1][1]/2, 0, 2]) cube([nuts[1][1], dia_x, nuts[1][2]]); + } + } + if(nut == "m3") { + difference() { + translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); + translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2); + translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[2][1]*2/sqrt(3), h=nuts[2][2], $fn=6); + translate([-nuts[2][1]/2, 0, 2]) cube([nuts[2][1], dia_x, nuts[2][2]]); + } + } + if(nut == "m4") { + difference() { + translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); + translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2); + translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[3][1]*2/sqrt(3), h=nuts[3][2], $fn=6); + translate([-nuts[3][1]/2, 0, 2]) cube([nuts[3][1], dia_x, nuts[3][2]]); + } + } + } + } +} + + /* NAME: pcb_holder DESCRIPTION: pcb bottom edge holder @@ -60,108 +191,6 @@ module pcb_holder(size, wallthick) { } -/* - NAME: nut_holder - DESCRIPTION: creates various nut holders - TODO: none - - USAGE: nut_holder(nut, style, dia_x, dia_y, height) - - nut = "m2", "m2.5", "m3", "m4" - style = "default", "sloped", "trap" - dia_x = top diameter or x size in mm - dia_y = bottom diameter or y size in mm - height = holder height in mm -*/ - -module nut_holder(nut, style, dia_x, dia_y, height) { - -nuts = [[2,4,1.6], // m2 size, diameter, height - [2.5,5,2], // m2.5 size, diameter, height - [3,5.5,2.4], // m3 size, diameter, height - [4,7,3.2]]; // m4 size, diameter, height - -$fn = 180; - - if( style == "default") { - difference() { - cylinder(d=dia_x, h=height); - if(nut == "m2") { - translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[0][1]*2/sqrt(3), h=height, $fn=6); - } - if(nut == "m2.5") { - translate([0, 0, -1]) cylinder(d=nuts[1][0]+.25, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[1][1]*2/sqrt(3), h=height, $fn=6); - } - if(nut == "m3") { - translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[2][1]*2/sqrt(3), h=height, $fn=6); - } - if(nut == "m4") { - translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[3][1]*2/sqrt(3), h=height, $fn=6); - } - } - } - if( style == "sloped") { - difference() { - cylinder(d2=dia_x, d1=dia_y, h=height); - if(nut == "m2") { - translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[0][1]*2/sqrt(3), h=height, $fn=6); - } - if(nut == "m2.5") { - translate([0, 0, -1]) cylinder(d=nuts[1][0]+.25, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[1][1]*2/sqrt(3), h=height, $fn=6); - } - if(nut == "m3") { - translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[2][1]*2/sqrt(3), h=height, $fn=6); - } - if(nut == "m4") { - translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2); - translate([0, 0, 2]) cylinder(d=nuts[3][1]*2/sqrt(3), h=height, $fn=6); - } - } - } - if( style == "trap") { - if(nut == "m2") { - difference() { - translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); - translate([0, 0, -1]) cylinder(d=nuts[0][0]+.25, h=height+2); - translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[0][1]*2/sqrt(3), h=nuts[0][2], $fn=6); - translate([-nuts[0][1]/2, 0, 2]) cube([nuts[0][1], dia_x, nuts[0][2]]); - } - } - if(nut == "m2.5") { - difference() { - translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); - translate([0, 0, -1]) cylinder(d=nuts[1][0]+.325, h=height+2); - translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[1][1]*2/sqrt(3), h=nuts[1][2], $fn=6); - translate([-nuts[1][1]/2, 0, 2]) cube([nuts[1][1], dia_x, nuts[1][2]]); - } - } - if(nut == "m3") { - difference() { - translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); - translate([0, 0, -1]) cylinder(d=nuts[2][0]+.5, h=height+2); - translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[2][1]*2/sqrt(3), h=nuts[2][2], $fn=6); - translate([-nuts[2][1]/2, 0, 2]) cube([nuts[2][1], dia_x, nuts[2][2]]); - } - } - if(nut == "m4") { - difference() { - translate([-dia_x/2, -dia_y/2, 0]) cube([dia_x, dia_y, height]); - translate([0, 0, -1]) cylinder(d=nuts[3][0]+.5, h=height+2); - translate([0, 0, 2]) rotate([0,0,30]) cylinder(d=nuts[3][1]*2/sqrt(3), h=nuts[3][2], $fn=6); - translate([-nuts[3][1]/2, 0, 2]) cube([nuts[3][1], dia_x, nuts[3][2]]); - } - } - } -} - - /* NAME: vu_holder DESCRIPTION: hk vu5,vu5a,vu7,vu7a display holder diff --git a/lib/keyhole.scad b/lib/keyhole.scad index 5ee70be..a7aefda 100644 --- a/lib/keyhole.scad +++ b/lib/keyhole.scad @@ -15,7 +15,10 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html +*/ + +/* NAME: keyhole DESCRIPTION: enclosed keyhole TODO: none @@ -39,9 +42,8 @@ module keyhole(keysize, mask) { mstyle = mask[3]; adj=.01; $fn = 90; -echo(keysize, mask); + if(enablemask == true && mstyle == "default") { -echo("THIS IS IT"); union() { translate([0, 0, -adj]) cylinder(h=keysize[3]+2*adj, d=keysize[0]); translate([-keysize[1]/2, 0, -adj]) cube([keysize[1], keysize[2]+keysize[0]/2, keysize[3]+2*adj]); @@ -49,7 +51,6 @@ echo("THIS IS IT"); } } else { -echo("THIS IS NOT IT"); difference() { union() { translate([0, 0, -adj]) @@ -80,4 +81,4 @@ echo("THIS IS NOT IT"); } } } -} +} \ No newline at end of file diff --git a/lib/oem_adafruit.scad b/lib/oem_adafruit.scad index fdba613..3e69179 100644 --- a/lib/oem_adafruit.scad +++ b/lib/oem_adafruit.scad @@ -15,17 +15,22 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html + adafruit_lcd(mask) +*/ + + +/* NAME: adafruit_lcd DESCRIPTION: adafruit 4311 2in TFT IPS Display model TODO: none USAGE: adafruit_lcd(mask[]) - mask[0] = true enables mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" + mask[0] = true enables mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" */ @@ -78,7 +83,4 @@ module adafruit_lcd(mask) { pcbpad("round", size_x-hole_size, size_y-hole_size, 0, "top", 0, [1, 1, 0], [hole_size, "#fee5a6", hole_size+1], size_z, enablemask, [false, 20, 0, "default"]); } -} - - - +} \ No newline at end of file diff --git a/lib/oem_hk.scad b/lib/oem_hk.scad index 88bb899..a23f1a6 100644 --- a/lib/oem_hk.scad +++ b/lib/oem_hk.scad @@ -15,53 +15,102 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html + hk_35lcd(mask) + hk_boom(speakers, orientation, mask) + hk_boom_grill(style, thick) + hk_boom_speaker(mask) + hk_boom_speaker_holder(style, tolerance) + hk_boom_speaker_pcb(side, speaker, pcb, mask) + hk_boom_speaker_strap() + hk_boom_vring(tolerance) + hk_hc4_oled(mask) + hk_hc4_oled_holder(side, floorthick, mask) + hk_m1s_case_holes(type) + hk_m1s_ups(mask) + hk_netcard(mask) + hk_pwr_button(mask) + hk_speaker() hk_uart(mask) hk_uart_holder(mask) hk_uart_strap () - hk_hc4_oled(mask) - hk_hc4_oled_holder(side, floorthick, mask) - hk_35lcd(mask) hk_vu7c(gpio_ext, tabs, mask) hk_vu8m(bracket, mask) hk_vu8s(mask) hk_wb2() - hk_netcard(mask) - u_bracket() + hk_xu4_shifter_shield(mask) m1_hdmount() - hk_speaker() - hk_boom(speakers, orientation, mask) - hk_boom_speaker_pcb(side, speaker, pcb, mask) - hk_boom_speaker(mask) - hk_boom_grill(style, thick) - hk_boom_speaker_holder(style, tolerance) - hk_boom_speaker_strap() - hk_boom_vring(tolerance) - hk_pwr_button(mask) - hk_m1s_case_holes - hk_m1s_ups() proto_m1s() proto_ups() - hk_xu4_shifter_shield(mask) + u_bracket() */ /* - NAME: hk_uart - DESCRIPTION: hardkernel micro-usb console uart + NAME: hk_35lcd + DESCRIPTION: hardkernel 3.5 lcd TODO: none - USAGE: hk_uart(mask) + USAGE: hk_35lcd(mask) + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" - mask[0] = enablemask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mask style, "default" */ -module hk_uart(mask) { +module hk_35lcd(mask) { + + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + adj = .01; + $fn = 90; + + if(enablemask == true && mstyle == "default") { + translate([14.5, 1.5, 8.5-adj-msetback]) cube([76.5, 52, mlength]); + } + if(enablemask == false) { + + difference() { + union() { + color("#008066") slab([95, 56, 1.7], 3.5); + color("black", 1) translate([10.5, 0, 1.7]) cube([74.75, 54.5, 4]); + color("white", 1) translate([8.5, 0, 5.7-adj]) cube([82.75, 54.5, 2]); + color("grey", 1) translate([8.5, 0, 7.7-adj]) cube([82.75, 54.5, .8]); + color("dimgrey", 1) translate([15, 2, 8.5-adj]) cube([75.5, 51, .25]); + } + translate([3.5, 3.5, -adj]) cylinder(d=3, h=6); + translate([3.5, 52.5, -adj]) cylinder(d=3, h=4); + } + button("momentary_4.5x4.5x4.5", 3, 8.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); + button("momentary_4.5x4.5x4.5", 3, 19.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); + button("momentary_4.5x4.5x4.5", 3, 30.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); + button("momentary_4.5x4.5x4.5", 3, 41.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); + header("open", 7.375, .8, 0, "bottom", 0, [20, 2, 6.75], ["thruhole", "black", "female", 2.54,"#fee5a6"], 1.7, false, [false,10,2,"default"]); + header("open", 92.5, 4, 0, "bottom", 0, [1, 5, 6.75], ["thruhole", "black", "male", 2.54,"#fee5a6"], 1.7, false, [false,10,2,"default"]); + } +} + + +/* + NAME: hk_boom + DESCRIPTION: hardkernel boom bonnet + TODO: none + + USAGE: hk_boom(speakers, orientation, mask) + + speakers = true, false + orientation = "front", "rear" + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default", "pcb", "speakers" +*/ + +module hk_boom(speakers, orientation, mask) { - size = [22,13,1.25]; enablemask = mask[0]; mlength = mask[1]; msetback = mask[2]; @@ -71,95 +120,381 @@ module hk_uart(mask) { $fn = 90; if(enablemask == true) { - translate([23-msetback,2,3]) rotate([90,0,90]) slot(4, 8.5, mlength); + if(mstyle == "default" || mstyle == "pcb") { + translate([35,35-msetback,5]) rotate([270,0,0]) slot(5, 19, mlength); + audio("jack_3.5-2", 7.75, 21.75, 0, "top", 180, [6.5,13.5,4], [5,0], 1.6, true, [true,mlength,msetback+2.5,"default"]); + } + if(mstyle == "default" || mstyle == "speakers") { + if(speakers == true && orientation == "rear") { + translate([-31.5/2,35/2,1.6]) hk_boom_speaker(mask); + translate([60+(31.5/2),35/2,1.6]) hk_boom_speaker(mask); + } + if(speakers == true && orientation == "front") { + translate([-31.5/2,35/2,0]) rotate([0,180,0]) hk_boom_speaker(mask); + translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) hk_boom_speaker(mask); + } + } } if(enablemask == false) { - color("#008066") cube([size[0],size[1],size[2]]); - translate([6.75,3,-2+adj])cylinder(d=.62, 2); - translate([6.75,5.25,-2+adj])cylinder(d=.62, 2); - translate([6.75,7.5,-2+adj])cylinder(d=.62, 2); - translate([6.75,9.75,-2+adj])cylinder(d=.62, 2); - uart("molex_5268",.5,.25,0,"top", 90, [0,0,0], [0], size[2], false, [false,0,0,"none"]); - usb2("micro",18.5, 2.5, 0, "top", 270, [0,0,0], [0], size[2], false, [false,0,0,"none"]); - ic("generic", 13, 4.5, 0, "top", 0, [4,4,1], ["dimgrey"], size[2], false, [false,0,0,"none"]); + difference() { + union() { + color("#008066") translate ([0,0,0]) slab([60,35,1.6],.5); + if(speakers == true) { + color("#008066") translate ([-31.5,0,0]) slab([31.5,35,1.6],.5); + color("white") translate ([-0.25,0,0]) cube([.5,35,1.6]); + color("#008066") translate ([60,0,0]) slab([31.5,35,1.6],.5); + color("white") translate ([60,0,0]) cube([.5,35,1.6]); + } + } + // pcb holes + color("#008066") translate([3.5,3.5,-adj]) cylinder(d=3,h=6); + color("#008066") translate([3.5,31.5,-adj]) cylinder(d=3,h=6); + color("#008066") translate([56.5,3.5,-adj]) cylinder(d=3,h=4); + color("#008066") translate([56.5,31.5,-adj]) cylinder(d=3,h=4); + if(speakers == true) { + // left + color("#008066") translate([-28,3.5,-adj]) cylinder(d=3,h=6); + color("#008066") translate([-28,31.5,-adj]) cylinder(d=3,h=6); + color("#008066") translate([-3.5,3.5,-adj]) cylinder(d=3,h=6); + color("#008066") translate([-3.5,31.5,-adj]) cylinder(d=3,h=6); + // right + color("#008066") translate([64.5,3.5,-adj]) cylinder(d=3,h=4); + color("#008066") translate([64.5,31.5,-adj]) cylinder(d=3,h=4); + color("#008066") translate([88,3.5,-adj]) cylinder(d=3,h=4); + color("#008066") translate([88,31.5,-adj]) cylinder(d=3,h=4); + // left speaker openings + color("#008066") translate([-31.5/2,35/2,-adj]) cylinder(d=23.5, h=3); + color("#008066") translate([-4-31.5/2,35/2+(23.5/2)-.5,-adj]) cube([6,3,3]); + color("#008066") translate([-4-31.5/2,35/2-(23.5/2)-2.5,-adj]) cube([6,3,3]); + color("#008066") translate([-4-31.5/2+(23.5/2)+1,-2+35/2,-adj]) cube([6,3,3]); + // right speaker openings + color("#008066") translate([60+(31.5/2),35/2,-adj]) cylinder(d=23.5, h=3); + color("#008066") translate([60-3+31.5/2,35/2+(23.5/2)-.5,-adj]) cube([6,3,3]); + color("#008066") translate([60-3+31.5/2,35/2-(23.5/2)-2.5,-adj]) cube([6,3,3]); + color("#008066") translate([60+1.25,-2+35/2,-adj]) cube([6,3,3]); + } + } + // headers + header("open", 7.5, 1, 0, "top", 0, [3,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); + header("open", 16, 1, 0, "top", 0, [7,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); + header("open", 40, 11, 0, "top", 0, [2,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); + header("open", 45.5, 11, 0, "top", 0, [2,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); + gpio("encl_header_12", 34, 2, 0, "top", 0, [2,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); + + difference() { + union() { + color("dimgray", 1) translate([44.5,27,1.6+2]) rotate([0,0,0]) cylinder(d=16, h=3); + color("dimgray", 1) translate([44.5,27,1.6]) rotate([0,0,0]) cylinder(d=8, h=2); + } + color("dimgray", 1) translate([44.5,27,1.6+4]) rotate([0,0,0]) cylinder(d=12, h=3); + for(d=[5:10:360]) { + color("dimgray") translate([44.5+(16/2)*cos(d),27+(16/2)*sin(d),1.6+2-adj]) cylinder(d=.75, h=3+2*adj); + } + } + color("gray", 1) translate([45,27,1.6+4-adj]) rotate([0,0,0]) cylinder(d=1.5, h=.25); + jst("ph", 0, 13.75, 0, "top", 90, [2,0,0], ["thruhole","top","white"], 1.6, false, [true,10,2,"default"]); + jst("ph", 55.75, 13.75, 0, "top", 270, [2,0,0], ["thruhole","top","white"], 1.6, false, [true,10,2,"default"]); + discrete("capacitor", 20, 30, 0, "top", 0, [6.25,0,6.5], [0], 1.6, false, [true,10,2,"default"]); + discrete("capacitor", 30, 30, 0, "top", 0, [6.25,0,6.5], [0], 1.6, false, [true,10,2,"default"]); + audio("jack_3.5-2", 7.75, 21.75, 0, "top", 180, [6.5,13.5,4], [5,2], 1.6, false, [true,10,2,"default"]); + translate([22,16,1.6-adj]) color("dimgrey") cube([6.5,4.5,1]); + translate([10,12,1.6-adj]) color("dimgrey") cube([4,4,1]); + translate([32.5,9,1.6-adj]) color("dimgrey") cube([3.5,3,1]); + if(speakers == true && orientation == "rear") { + translate([-31.5/2,35/2,1.6]) hk_boom_speaker([false,10,0,"default"]); + translate([60+(31.5/2),35/2,1.6]) hk_boom_speaker([false,10,0,"default"]); + } + if(speakers == true && orientation == "front") { + translate([-31.5/2,35/2,0]) rotate([0,180,0]) hk_boom_speaker([false,10,0,"default"]); + translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) hk_boom_speaker([false,10,0,"default"]); + } } } /* - NAME: hk_uart_holder - DESCRIPTION: hardkernel micro-usb uart holder + NAME: hk_boom_grill + DESCRIPTION: hardkernel stereo boom bonnet speaker grill TODO: none - USAGE: hk_uart_holder(mask) + USAGE: hk_boom_grill(style, thick) - mask[0] = enablemask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mask style, "default" + style = "flat", "frame", "dome" + thick = material thickness */ -module hk_uart_holder(mask) { +module hk_boom_grill(style, thick) { + + adj = .01; + $fn = 90; + if(style == "dome" || style == "frame") { + difference() { + union() { + difference() { + translate([0,0,-23]) sphere(d=52.5); + translate([0,0,-25]) sphere(d=52.5); + translate([-30,-30,-60.5]) cube([60,60,60]); + for(c=[-14.5:3:24]) { + for(r=[-14.5:3:24]) { + translate([r,c,-1]) cube([2,2,40]); + } + } + } + if(style == "frame") { + difference() { + translate([0,0,-1.25]) cylinder(d=30.5, h=thick); + translate([0,0,-1.25-adj]) cylinder(d=24, h=thick+2*adj); + } + } + } + } + } + if(style == "flat") { + difference() { + translate([0,0,0]) cylinder(d=27, h=thick); + for(c=[-14.5:3:24]) { + for(r=[-14.5:3:24]) { + translate([r,c,-1]) cube([2,2,thick+2]); + } + } + } + } +} + + +/* + NAME: hk_boom_speaker + DESCRIPTION: hardkernel stereo boom bonnet speakers + TODO: none + + USAGE: hk_boom_speaker(mask) + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" +*/ + +module hk_boom_speaker(mask) { enablemask = mask[0]; mlength = mask[1]; msetback = mask[2]; mstyle = mask[3]; + adj = .01; + $fn = 90; + if(enablemask == true) { - translate([4.5,msetback-1,6]) rotate([90,0,0]) slot(4, 8.5, mlength); + translate([0,0,-msetback]) cylinder(d=27, h=mlength); } if(enablemask == false) { -// translate([22,-2.5,-3]) rotate([0,0,90]) - union () { - difference () { - cube([18,21.75,9]); - translate ([2,-2,3]) cube([14,27,7]); - //pin slot - translate ([3.5,14.75,-1]) cube([11,1,5]); - //component bed - translate ([3.5,1.5,2]) cube ([11,14,2]); - //side trim - translate ([-1,-2.5,6]) cube([20,18,4]); - } - difference (){ - translate ([-1.5,18.5,0]) cylinder(r=3,h=9, $fn=90); - translate ([-1.5,18.5,-1]) cylinder (r=1.375, h=11, $fn=90); - } - difference (){ - translate ([19.5,18.5,0]) cylinder(r=3,h=9, $fn=90); - translate ([19.5,18.5,-1]) cylinder (r=1.375, h=11,$fn=90); + difference() { + union() { + color("silver") translate([0,0,-8.5]) cylinder_fillet_inside(h=6.5, r=21.4/2, + top=0, bottom=2, $fn=90, fillet_fn=30, center=false); + color("dimgray") translate([0,0,2.5-adj]) cylinder_fillet_inside(h=1, r=21.75/2, + top=1, bottom=0, $fn=90, fillet_fn=30, center=true); + + difference() { + color("black") translate([0,0,-5-adj]) cylinder(d=23.7, h=5); + for(d=[30:60:360]) { + color("dimgray") translate([(23.7/2)*cos(d),(23.7/2)*sin(d),-6-adj]) cylinder(d=6, h=5+2*adj); + } + } + color("black") translate([0,0,-adj]) cylinder(d=27.8, h=2); + color("dimgray") translate([0,0,1]) cylinder(d=22.8, h=1); + color("dimgray") translate([0,0,1]) cylinder(d=17.5, h=1.25); } + color("darkgray") translate([0,0,10.5]) sphere(d=23); } } } /* - NAME: hk_uart_strap - DESCRIPTION: hardkernel micro-usb uart holder strap + NAME: hk_boom_speaker_holder + DESCRIPTION: hardkernel stereo boom bonnet speaker holder TODO: none - USAGE: hk_uart_strap() + USAGE: hk_boom_speaker_holder(style, tolerance) + style = "friction", "clamp" + tolerance = friction adjustment */ -module hk_uart_strap() { +module hk_boom_speaker_holder(style, tolerance=0) { - translate([22,-2.5,-3]) rotate([0,0,90]) - union() { - difference () { - translate ([-4.5,15.5,9]) cube([27,6,3]); - translate ([-1.5,18.5,8]) cylinder (r=1.6, h=5, $fn=90); - translate ([19.5,18.5,8]) cylinder (r=1.6, h=5, $fn=90); - } - difference (){ - translate ([-1.5,18.5,12]) cylinder(r=3,h=1, $fn=90); - translate ([-1.5,18.5,11]) cylinder (r=1.6, h=7, $fn=90); + adj = .01; + $fn = 90; + + if(style == "friction") { + difference() { + translate([0,0,0]) cylinder(d=31, h=4); + translate([0,0,-adj]) cylinder(d=28+tolerance, h=4+2*adj); + translate([0,-1,-adj]) cube([15,40,10], center=true); + } + difference() { + translate([0,0,0]) cylinder(d=28+tolerance, h=2); + translate([0,0,-adj]) cylinder(d=28+tolerance-2, h=4+2*adj); + translate([0,-1,-adj]) cube([15,40,10], center=true); } - difference (){ - translate ([19.5,18.5,12]) cylinder(r=3,h=1, $fn=90); - translate ([19.5,18.5,11]) cylinder (r=1.6, h=7, $fn=90); + } + + if(style == "clamp") { + // bottom clamp + topthick = 2; + top_height = 14; + difference() { + cube([10.5,29,top_height-topthick]); + // speaker holders + translate([-1,14.5,14]) rotate([0,90,0]) cylinder(d=28, h=4.5); + translate([2,14.5,14]) rotate([0,90,0]) cylinder(d=24, h=6); + translate([4,14.5,14]) rotate([0,90,0]) cylinder(d=21.9, h=7.8); + } + } +} + + +/* + NAME: hk_boom_speaker_pcb + DESCRIPTION: hardkernel stereo boom bonnet speakers with optional speaker pcbs + TODO: none + + USAGE: hk_boom_speaker_pcb(side, speaker, pcb, mask) + + side = "left, "right" + speakers = true, false + orientation = "front", "rear" + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" +*/ + +module hk_boom_speaker_pcb(side, speaker, pcb, mask) { + + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + adj = .01; + $fn = 90; + + if(enablemask == true) { + translate([31.5/2,35/2,0]) hk_boom_speaker(mask); + } + if(enablemask == false) { + if(pcb == true) { + difference() { + color("#008066") slab([31.5,35,1.6],.5); + color("#008066") translate([27.5,4,-adj]) cylinder(d=3,h=6); + color("#008066") translate([27.5,31,-adj]) cylinder(d=3,h=6); + color("#008066") translate([4,4,-adj]) cylinder(d=3,h=6); + color("#008066") translate([4,31,-adj]) cylinder(d=3,h=6); + + // speaker openings + color("#008066") translate([(31.5/2),35/2,-adj]) cylinder(d=23.5, h=3); + color("#008066") translate([-3+31.5/2,35/2+(23.5/2)-.5,-adj]) cube([6,3,3]); + color("#008066") translate([-3+31.5/2,35/2-(23.5/2)-2.5,-adj]) cube([6,3,3]); + if(side == "right") { + color("#008066") translate([.5,-2+35/2,-adj]) cube([6,3,3]); + } + if(side == "left") { + color("#008066") translate([31.5/2+(23.5/2)-2.5,-2+35/2,-adj]) cube([6,3,3]); + } + } + } + if(speaker == true && pcb == true) { + translate([(31.5/2),35/2,1.6]) hk_boom_speaker([false,10,0,"default"]); + } + if(speaker == true && pcb == false) { + hk_boom_speaker([false,10,0,"default"]); + } + } +} + + +/* + NAME: hk_boom_speaker_strap + DESCRIPTION: hardkernel stereo boom bonnet speaker clamp holder top + TODO: none + + USAGE: hk_boom_speaker_strap(side) + + side = "left", "right" +*/ + +module hk_boom_speaker_strap(side) { + + topthick = 2; + top_height = 14; + adj = .01; + $fn = 90; + // top clamp + difference() { + difference() { + union() { + translate([-3,14.5,top_height]) rotate([0,90,0]) cylinder(d=35,h=13.75); + if(side == "left") { + translate([5.4,16.5,top_height+(topthick/2)-1]) cube_fillet_inside([16.75,55,topthick], + vertical=[6,1,6,1], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); + } + if(side == "right") { + translate([5.4,13,top_height+(topthick/2)-1]) cube_fillet_inside([16.75,55,topthick], + vertical=[1,6,1,1], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); + } + translate([10.75-adj,14.5,top_height]) rotate([0,90,0]) cylinder(d=35,h=3); + } + translate([-9.25,0,top_height-topthick-adj]) cube([20,29,topthick]); + difference() { + translate([-4.25,14.5,14]) rotate([0,90,0]) cylinder(d=28, h=15); + translate([-5.25,0,19]) cube([20,30,19.5]); + } + } + // speaker holders + translate([-3-adj,14.5,14]) rotate([0,90,0]) cylinder(d=30.8, h=4.5); + translate([-3-adj,14.5,14]) rotate([0,90,0]) cylinder(d=32.8, h=2); + translate([-2.75,14.5,14]) rotate([0,90,0]) cylinder(d=28, h=14.5); + translate([-4.55,-4,-4]) cube([20,37,topthick+15]); + + if(side == "left") { + translate([4.15,-3.4,-adj]) cylinder(d=3.2, h=50); + translate([4.15,-3.4,15]) cylinder(d=6, h=10); + translate([5.75,40,-adj]) cylinder(d=3.2, h=50); + } + if(side == "right") { + translate([4.5,32.5,-adj]) cylinder(d=3.2, h=50); + translate([4.5,32.5,15]) cylinder(d=6, h=10); + translate([10.5,-11,-adj]) cylinder(d=3.2, h=50); + } + } +} + + +/* + NAME: hk_boom_vring + DESCRIPTION: hardkernel stereo boom bonnet volume ring + TODO: none + + USAGE: hk_boom_vring(tolerance) + + tolerance = friction fit adjustment +*/ + +module hk_boom_vring(tolerance) { + + out_dia = 22; + in_dia = 16.15 + tolerance; + thick = 3; + nub = 1.25; + adj = .01; + $fn = 90; + difference() { + color("black") translate([0,0,0])cylinder(d=out_dia, h=thick); + color("dimgray") translate([0,0,-adj]) cylinder(d=in_dia, h=thick+2*adj); + for(d=[5:10:360]) { + color("dimgray") translate([(out_dia/2)*cos(d),(out_dia/2)*sin(d),-adj]) cylinder(d=nub, h=thick+2*adj); } } } @@ -298,52 +633,419 @@ module hk_hc4_oled_holder(side, wallthick, mask) { /* - NAME: hk_35lcd - DESCRIPTION: hardkernel 3.5 lcd + NAME: hk_m1s_case_holes + DESCRIPTION: hardkernel odroid-m1s oem case hole pattern TODO: none - USAGE: hk_35lcd(mask) - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" + USAGE: hk_m1s_case_holes(type = "landscape") + type = "landscape", "portrait" */ -module hk_35lcd(mask) { +module hk_m1s_case_holes(type = "landscape") { + + if(type == "portrait") { + cylinder(d=3, h=6); + translate([0,107,0]) cylinder(d=3, h=6); + translate([58,0,0]) cylinder(d=3, h=6); + translate([58,107,0]) cylinder(d=3, h=6); + } + else { + cylinder(d=3, h=6); + translate([0,58,0]) cylinder(d=3, h=6); + translate([107,0,0]) cylinder(d=3, h=6); + translate([107,58,0]) cylinder(d=3, h=6); + } +} + + +/* + NAME: hk_m1s_ups + DESCRIPTION: hardkernel odroid-m1s ups + TODO: none + + USAGE: hk_m1s_ups(mask) + + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" +*/ + +module hk_m1s_ups(mask) { enablemask = mask[0]; mlength = mask[1]; msetback = mask[2]; mstyle = mask[3]; + + pcb_size = [115,32,1.62]; adj = .01; $fn = 90; - if(enablemask == true && mstyle == "default") { - translate([14.5, 1.5, 8.5-adj-msetback]) cube([76.5, 52, mlength]); + if(enablemask == true) { + usbc("single_horizontal", 97.5, -1, 0, "top", 0, [0,0,0], [0], pcb_size[2], true, [true,mlength,msetback,mstyle]); + } + if(enablemask == false) { + difference() { + union() { + color("#008066") slab(pcb_size,4); + color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); + } + color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=4, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); + } + // battery and clips + color("grey") translate([15,5,pcb_size[2]]) rotate([0,0,270]) battery_clip(); + color("grey") translate([80,16,pcb_size[2]]) rotate([0,0,90]) battery_clip(); + translate([13.25,10.5,pcb_size[2]+10.4]) rotate([0,90,0]) battery("18650_convex"); + + header("open", 78, 26.5, 0, "top", 0, [7,2,6], ["thruhole","black","male",2.54,"silver"], pcb_size[2], false, [true,10,2,"default"]); + button("momentary_4.5x4.5x4.5", 86.75, .5, 0, "top", 0, [0,0,0], [0], pcb_size[2], false, [false,10,2,"default"]); + usbc("single_horizontal", 97.5, -1, 0, "top", 0, [0,0,0], [0], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 35, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 40, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 45, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 50, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 111.5, 8, 0, "top", 90, [3,1.5,.5], ["green"], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 111.5, 16, 0, "top", 90, [3,1.5,.5], ["red"], pcb_size[2], false, [false,10,2,"default"]); + smd("led", 111.5, 21, 0, "top", 90, [3,1.5,.5], ["red"], pcb_size[2], false, [false,10,2,"default"]); + } +} + + +/* + NAME: hk_netcard + DESCRIPTION: hardkernel m.2 network card + TODO: none + + USAGE: hk_netcard(mask) +*/ + +module hk_netcard(mask) { + + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + adj = .01; + $fn = 90; + + if(enablemask == true) { + translate([25.5, msetback-1,-14]) rotate([90, 0, 0]) slab([68, 14.5, mlength], .25); } if(enablemask == false) { difference() { union() { - color("#008066") slab([95, 56, 1.7], 3.5); - color("black", 1) translate([10.5, 0, 1.7]) cube([74.75, 54.5, 4]); - color("white", 1) translate([8.5, 0, 5.7-adj]) cube([82.75, 54.5, 2]); - color("grey", 1) translate([8.5, 0, 7.7-adj]) cube([82.75, 54.5, .8]); - color("dimgrey", 1) translate([15, 2, 8.5-adj]) cube([75.5, 51, .25]); + color("#008066") translate ([0,0,0]) linear_extrude(height = 1) import("./dxf/hk-network-card.dxf"); + color("goldenrod") translate([3.75,17.85,1-adj]) cylinder(d=6,h=3); + color("goldenrod") translate([106,24.85,1-adj]) cylinder(d=6,h=3); } - translate([3.5, 3.5, -adj]) cylinder(d=3, h=6); - translate([3.5, 52.5, -adj]) cylinder(d=3, h=4); + translate([20.85,3.85,-adj]) cylinder(d=3,h=4); + translate([3.75,17.85,-adj]) cylinder(d=3,h=6); + translate([3.75,51.1,-adj]) cylinder(d=3,h=4); + translate([20.15,43.85,-adj]) cylinder(d=3,h=4); + translate([106,24.85,-adj]) cylinder(d=3,h=6); + translate([96.5,3.85,-adj]) cylinder(d=3,h=4); + } + network("rj45_single", 26, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); + network("rj45_single", 43, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); + network("rj45_single", 60, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); + network("rj45_single", 77, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); + ic("generic", 30, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); + ic("generic", 47, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); + ic("generic", 64, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); + ic("generic", 79, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); + ic("generic", 56.5, 41, 0, "bottom", 0, [5, 9.75, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); + for (i=[34.65:.5:48.5]) { + color("#fee5a6") translate([98,i,1]) cube([2,.25,.25]); + color("#fee5a6") translate([98,i,-.24]) cube([2,.25,.25]); + } + for (i=[51:.5:53]) { + color("#fee5a6") translate([98,i,1]) cube([2,.25,.25]); + color("#fee5a6") translate([98,i,-.24]) cube([2,.25,.25]); } - button("momentary_4.5x4.5x4.5", 3, 8.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); - button("momentary_4.5x4.5x4.5", 3, 19.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); - button("momentary_4.5x4.5x4.5", 3, 30.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); - button("momentary_4.5x4.5x4.5", 3, 41.75, 0, "top", 0, [0,0,0], [0], 1.7, false, [false,10,2,"default"]); - header("open", 7.375, .8, 0, "bottom", 0, [20, 2, 6.75], ["thruhole", "black", "female", 2.54,"#fee5a6"], 1.7, false, [false,10,2,"default"]); - header("open", 92.5, 4, 0, "bottom", 0, [1, 5, 6.75], ["thruhole", "black", "male", 2.54,"#fee5a6"], 1.7, false, [false,10,2,"default"]); } } + +/* + NAME: hk_pwr_button + DESCRIPTION: hardkernel power button + TODO: none + + USAGE: hk_pwr_button(mask) + + mask[0] = true enables component mask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mstyle "default" +*/ + +module hk_pwr_button(mask) { + + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + adj=.01; + $fn = 90; + + if(enablemask == true) { + translate([0, 0, -mlength+msetback+adj]) cylinder(d=16, h=mlength); + } + if(enablemask == false) { + difference() { + union() { + // light ring + difference() { + color("blue", .6) translate([0, 0, 1.67]) cylinder(h=.1, d=14.75); + color("blue", .6) translate([0, 0, 1.66]) cylinder(h=.2, d=13.75); + } + // power symbol + color("blue", .6) translate([-.5, 0, 1.65]) color("blue", .6) cube([1,3.5,.1]); + difference() { + color("blue", .6) translate([0, 0, 1.66]) cylinder(h=.1, d=5.75); + color("blue", .6) translate([0, 0, 1.65]) cylinder(h=.2, d=4.5); + color("blue", .6) translate([-1.75, 0, 1.65]) cube([3.5,4,2]); + } + // body + color("Gainsboro") cylinder(h=1.66, d1=17.75, d2=14.75); + color("silver") translate([0, 0, -19]) cylinder(h=19, d=15.8); + difference() { + color("steelblue") translate([0, 0, -27.9]) cylinder(h=9, d=15.8); + color("steelblue") translate([-1+15.8/2, -4, -19-9.1]) cube([2,8,6.1]); + color("steelblue") translate([-1-15.8/2, -4, -19-9.1]) cube([2,8,6.1]); + } + color("white") translate([-3.5, -6, -28]) cube([7,12,2]); + + // nut + difference() { + translate([0, 0, -4.75]) color("Gainsboro", .6) cylinder(h=2.75, d=21.5, $fn=6); + translate([0, 0, -4.75]) color("Gainsboro", .6) cylinder(h=2.75, d=15.8); + } + // connector pins + color("silver") translate([-1.4, -.5, -34.99]) cube([2.8, 1, 7]); + color("silver") translate([-1.4, -.5+5, -34.99]) cube([2.8, 1, 7]); + color("silver") translate([-1.4, -.5-5, -34.99]) cube([2.8, 1, 7]); + color("silver") translate([-1.4-1.75, -.5+1.75, -34.99]) cube([1, 2.8, 7]); + color("silver") translate([-1.4+3.5, -.5+1.75, -34.99]) cube([1, 2.8, 7]); + } + } + } +} + + +/* + NAME: hk_speaker + DESCRIPTION: hardkernel speaker + TODO: none + + USAGE: hk_speaker() +*/ + +module hk_speaker() { + + spk_x = 44; + spk_y = 20; + spk_z = 98; + c_hole = 6; + i_dia = c_hole+3; + adj = .1; + + difference() { + translate([spk_x/2,spk_y/2,spk_z/2]) cube_fillet_inside([spk_x,spk_y,spk_z], + vertical=[0,0,0,0,0], top=[0,c_hole,0,c_hole], bottom=[0,c_hole,0,c_hole], $fn=90); + // speaker cone + translate([spk_x/2,-adj,spk_z-72]) rotate([-90,0,0]) cylinder(d=36, h=.5); + + // corner holes + translate([(c_hole/2)+2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) + cylinder(d=c_hole, h=spk_y+(2*adj)); + translate([(c_hole/2)+2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) + cylinder(d=c_hole, h=spk_y+(2*adj)); + translate([spk_x-(c_hole/2)-2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) + cylinder(d=c_hole, h=spk_y+(2*adj)); + translate([spk_x-(c_hole/2)-2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) + cylinder(d=c_hole, h=spk_y+(2*adj)); + + // lower left corner indent + translate([(c_hole/2)+2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([-adj-1,-adj,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([adj+.5,-adj,-(i_dia/2)+adj]) cube([i_dia+adj,10+adj,i_dia+adj+.5]); + translate([(c_hole/2)+2,-adj+12+adj,(c_hole/2)+2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([-adj-1,-adj+12+adj,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([adj+.5,-adj+12+adj,-(i_dia/2)+adj]) cube([i_dia+adj,10+adj,i_dia+adj+.5]); + + // upper left corner corner indent + translate([(c_hole/2)+2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([-adj-1,-adj,spk_z-i_dia-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([-adj+.5,-adj,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); + translate([(c_hole/2)+2,-adj+12,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([-adj-1,-adj+12,spk_z-i_dia-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([-adj+.5,-adj+12,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); + + // upper right corner corner indent + translate([spk_x-(c_hole/2)-2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([spk_x-1-(i_dia/2),-adj,spk_z-i_dia+adj-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([spk_x-.5-i_dia,-adj,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); + translate([spk_x-(c_hole/2)-2,-adj+12,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([spk_x-1-(i_dia/2),-adj+12,spk_z-i_dia+adj-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([spk_x-.5-i_dia,-adj+12,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); + + // lower right corner corner indent + translate([spk_x-(c_hole/2)-2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([spk_x-1-(i_dia/2),-adj,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([spk_x-.5-i_dia,-adj,-(i_dia/2)+adj]) cube([i_dia,10+adj,i_dia+adj+.5]); + translate([spk_x-(c_hole/2)-2,-adj+12,(c_hole/2)+2]) rotate([-90,0,0]) + cylinder(d=i_dia, h=10+adj); + translate([spk_x-1-(i_dia/2),-adj+12,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); + translate([spk_x-.5-i_dia,-adj+12,-(i_dia/2)+adj]) cube([i_dia,10+adj,i_dia+adj+.5]); + } + // speaker cone + translate([spk_x/2,-adj+46,spk_z-72]) { + difference() { + translate([0,0,0]) sphere(d=96, $fn=180); + translate([-50,-46,-50]) cube([100,100,100]); + } + } +} + + +/* + NAME: hk_uart + DESCRIPTION: hardkernel micro-usb console uart + TODO: none + + USAGE: hk_uart(mask) + + mask[0] = enablemask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mask style, "default" +*/ + +module hk_uart(mask) { + + size = [22,13,1.25]; + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + adj = .01; + $fn = 90; + + if(enablemask == true) { + translate([23-msetback,2,3]) rotate([90,0,90]) slot(4, 8.5, mlength); + } + if(enablemask == false) { + color("#008066") cube([size[0],size[1],size[2]]); + translate([6.75,3,-2+adj])cylinder(d=.62, 2); + translate([6.75,5.25,-2+adj])cylinder(d=.62, 2); + translate([6.75,7.5,-2+adj])cylinder(d=.62, 2); + translate([6.75,9.75,-2+adj])cylinder(d=.62, 2); + uart("molex_5268",.5,.25,0,"top", 90, [0,0,0], [0], size[2], false, [false,0,0,"none"]); + usb2("micro",18.5, 2.5, 0, "top", 270, [0,0,0], [0], size[2], false, [false,0,0,"none"]); + ic("generic", 13, 4.5, 0, "top", 0, [4,4,1], ["dimgrey"], size[2], false, [false,0,0,"none"]); + } +} + + +/* + NAME: hk_uart_holder + DESCRIPTION: hardkernel micro-usb uart holder + TODO: none + + USAGE: hk_uart_holder(mask) + + mask[0] = enablemask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mask style, "default" +*/ + +module hk_uart_holder(mask) { + + enablemask = mask[0]; + mlength = mask[1]; + msetback = mask[2]; + mstyle = mask[3]; + + if(enablemask == true) { + translate([4.5,msetback-1,6]) rotate([90,0,0]) slot(4, 8.5, mlength); + } + if(enablemask == false) { +// translate([22,-2.5,-3]) rotate([0,0,90]) + union () { + difference () { + cube([18,21.75,9]); + translate ([2,-2,3]) cube([14,27,7]); + //pin slot + translate ([3.5,14.75,-1]) cube([11,1,5]); + //component bed + translate ([3.5,1.5,2]) cube ([11,14,2]); + //side trim + translate ([-1,-2.5,6]) cube([20,18,4]); + } + difference (){ + translate ([-1.5,18.5,0]) cylinder(r=3,h=9, $fn=90); + translate ([-1.5,18.5,-1]) cylinder (r=1.375, h=11, $fn=90); + } + difference (){ + translate ([19.5,18.5,0]) cylinder(r=3,h=9, $fn=90); + translate ([19.5,18.5,-1]) cylinder (r=1.375, h=11,$fn=90); + } + } + } +} + + +/* + NAME: hk_uart_strap + DESCRIPTION: hardkernel micro-usb uart holder strap + TODO: none + + USAGE: hk_uart_strap() + +*/ + +module hk_uart_strap() { + + translate([22,-2.5,-3]) rotate([0,0,90]) + union() { + difference () { + translate ([-4.5,15.5,9]) cube([27,6,3]); + translate ([-1.5,18.5,8]) cylinder (r=1.6, h=5, $fn=90); + translate ([19.5,18.5,8]) cylinder (r=1.6, h=5, $fn=90); + } + difference (){ + translate ([-1.5,18.5,12]) cylinder(r=3,h=1, $fn=90); + translate ([-1.5,18.5,11]) cylinder (r=1.6, h=7, $fn=90); + } + difference (){ + translate ([19.5,18.5,12]) cylinder(r=3,h=1, $fn=90); + translate ([19.5,18.5,11]) cylinder (r=1.6, h=7, $fn=90); + } + } +} + + /* NAME: hk_vu7c DESCRIPTION: hardkernel vu7c lcd display @@ -547,70 +1249,6 @@ module hk_vu8m(brackets, mask) { } -/* - NAME: u_bracket - DESCRIPTION: hardkernel vu8m lcd brackets - TODO: none - - USAGE: u_bracket() - -*/ - -module u_bracket() { - $fn= 30; - xi = 124; - xo = 154; - yi = 42; - yo = 42 + 12; // Outer vertical dimension - z = 1.93; - rlo = 21.3; // Lower outer corner radii - rli = 1; // Lower inner corner radii - ruo = 5.7; // Upper outer corner radii - rui = 5.7; // Upper inner corner radii - - color([0.2,0.2,0.2]) - difference() { - union() { - hull() { - translate([ rlo, rlo,0]) cylinder(r=rlo, h=z, $fn=100); - translate([xo - rlo, rlo,0]) cylinder(r=rlo, h=z, $fn=100); - } - hull() { - translate([ ruo, yo - ruo,0]) cylinder(r=ruo, h=z); - translate([ 15 - rui, yo - rui,0]) cylinder(r=rui, h=z); - translate([ 0, rlo,0]) cube([15,$fs,z]); - } - hull() { - translate([xo - ruo, yo - ruo,0]) cylinder(r=ruo, h=z); - translate([xo - 15 + rui, yo - rui,0]) cylinder(r=rui, h=z); - translate([xo - 15 , rlo,0]) cube([15,$fs,z]); - } - } - hull() { - translate([ 15 + rli, yo - yi + rli,-1]) cylinder(r=rli, h=z+2); - translate([xo - 15 - rli, yo - yi + rli,-1]) cylinder(r=rli, h=z+2); - translate([ 15, yo,-1]) cube([xi,$fs,z+2]); - } - translate([ 7.5, yo - 4, -1]) cylinder(d=3.21, h=z+2); - translate([xo - 7.5, yo - 4, -1]) cylinder(d=3.21, h=z+2); - hull() { - translate([ 7.5, yo - 9.6, -1]) cylinder(d=3.21, h=z+2); - translate([ 7.5, yo - 29.4, -1]) cylinder(d=3.21, h=z+2); - } - hull() { - translate([xo - 7.5, yo - 9.6, -1]) cylinder(d=3.21, h=z+2); - translate([xo - 7.5, yo - 29.4, -1]) cylinder(d=3.21, h=z+2); - } - translate([ 15 + 5.00, 8.25, -1]) cylinder(d=4.11, h=z+2); - translate([xo - 15 - 30.00, 8.25, -1]) cylinder(d=4.11, h=z+2); - translate([ 15 + 10.75, 2.50, -1]) cylinder(d=4.11, h=z+2); - translate([ 15 + 41.75, 2.50, -1]) cylinder(d=4.11, h=z+2); - translate([ 15 + 82.25, 2.50, -1]) cylinder(d=4.11, h=z+2); - translate([ 15 + 113.25, 2.50, -1]) cylinder(d=4.11, h=z+2); - } -} - - /* NAME: hk_vu8s DESCRIPTION: hardkernel vu8s lcd display @@ -751,15 +1389,21 @@ module hk_wb2() { /* - NAME: hk_netcard - DESCRIPTION: hardkernel m.2 network card + NAME: hk_xu4_shifter_shield + DESCRIPTION: hardkernel xu4 shifter shield TODO: none - USAGE: hk_netcard(mask) + USAGE: hk__xu4_shifter_shield(mask) + + mask[0] = enablemask + mask[1] = mask length + mask[2] = mask setback + mask[3] = mask style, "default" */ -module hk_netcard(mask) { +module hk_xu4_shifter_shield(mask) { + size = [83,59,1]; enablemask = mask[0]; mlength = mask[1]; msetback = mask[2]; @@ -769,40 +1413,34 @@ module hk_netcard(mask) { $fn = 90; if(enablemask == true) { - translate([25.5, msetback-1,-14]) rotate([90, 0, 0]) slab([68, 14.5, mlength], .25); + switch("slide_4x9", 28, 55, 0, "top", 180, [5, 4, .8], ["dimgrey"], size[2], true, [true, 10, 2, "default"]); + gpio("open", 25, 1, 0, "top", 180, [20,2,6], ["thruhole","black","male",2.54,"silver"], size[2], true, [true, 10, 0, "block"]); } if(enablemask == false) { - difference() { union() { - color("#008066") translate ([0,0,0]) linear_extrude(height = 1) import("./dxf/hk-network-card.dxf"); - color("goldenrod") translate([3.75,17.85,1-adj]) cylinder(d=6,h=3); - color("goldenrod") translate([106,24.85,1-adj]) cylinder(d=6,h=3); + color("#18525d") slab(size,3.5); + pcbhole("round",3.5,3.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"left_rear"],size[2],false,[false,10,2,"default"]); + pcbhole("round",3.5,55.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"left_front"],size[2],false,[false,10,2,"default"]); + pcbhole("round",79.5,3.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"right_rear"],size[2],false,[false,10,2,"default"]); + pcbhole("round",79.5,55.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"right_front"],size[2],false,[false,10,2,"default"]); } - translate([20.85,3.85,-adj]) cylinder(d=3,h=4); - translate([3.75,17.85,-adj]) cylinder(d=3,h=6); - translate([3.75,51.1,-adj]) cylinder(d=3,h=4); - translate([20.15,43.85,-adj]) cylinder(d=3,h=4); - translate([106,24.85,-adj]) cylinder(d=3,h=6); - translate([96.5,3.85,-adj]) cylinder(d=3,h=4); - } - network("rj45_single", 26, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); - network("rj45_single", 43, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); - network("rj45_single", 60, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); - network("rj45_single", 77, -1, 0, "bottom", 0, [6, 6, .8], [0], 1, false, [false, 0, 0, "none"]); - ic("generic", 30, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); - ic("generic", 47, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); - ic("generic", 64, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); - ic("generic", 79, 25, 0, "bottom", 0, [6, 6, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); - ic("generic", 56.5, 41, 0, "bottom", 0, [5, 9.75, .8], ["dimgrey"], 1, false, [false, 0, 0, "none"]); - for (i=[34.65:.5:48.5]) { - color("#fee5a6") translate([98,i,1]) cube([2,.25,.25]); - color("#fee5a6") translate([98,i,-.24]) cube([2,.25,.25]); - } - for (i=[51:.5:53]) { - color("#fee5a6") translate([98,i,1]) cube([2,.25,.25]); - color("#fee5a6") translate([98,i,-.24]) cube([2,.25,.25]); + color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([3.5,55.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([79.5,3.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([79.5,55.5,-1]) cylinder(d=3, h=4); } + ic("generic", 43, 39.5, 0, "top", 0, [5, 4, .8], ["dimgrey"], size[2], false, [false, 0, 0, "none"]); + ic("generic", 53, 39.5, 0, "top", 0, [5, 4, .8], ["dimgrey"], size[2], false, [false, 0, 0, "none"]); + ic("generic", 63, 39.5, 0, "top", 0, [5, 4, .8], ["dimgrey"], size[2], false, [false, 0, 0, "none"]); + header("open", 77, 36.5, 0, "bottom", 0, [2,6,16], ["thruhole","black","female",2,"silver"], size[2], false, [true,10,2,"default"]); + header("open", 39, 53, 0, "bottom", 0, [15,2,16], ["thruhole","black","female",2,"silver"], size[2], false, [true,10,2,"default"]); + gpio("open", 25, 1, 0, "top", 180, [20,2,6], ["thruhole","black","male",2.54,"silver"], size[2], false, [true,10,2,"default"]); + header("open", 8, 1, 0, "top", 0, [6,1,6], ["thruhole","black","male",2.54,"silver"], size[2], false, [true,10,2,"default"]); + switch("slide_4x9", 28, 55, 0, "top", 180, [5, 4, .8], ["dimgrey"], size[2], false, [true, 0, 0, "none"]); + pcbpad("round", 9.27, 4.81, 0, "top", 0, [6, 21, .8], [1,"#fee5a6",1.7,"front"], size[2], false, [false, 0, 0, "none"]); + pcbpad("round", 24.54, 35.27, 0, "top", 0, [2, 9, .8], [1,"#fee5a6",1.7,"front"], size[2], false, [false, 0, 0, "none"]); + } } @@ -858,619 +1496,36 @@ module m1_hdmount() { /* - NAME: hk_speaker - DESCRIPTION: hardkernel speaker + NAME: proto_m1s + DESCRIPTION: prototype board with odroid-m1s footprint TODO: none - USAGE: hk_speaker() + USAGE: proto_m1s() + */ -module hk_speaker() { - - spk_x = 44; - spk_y = 20; - spk_z = 98; - c_hole = 6; - i_dia = c_hole+3; - adj = .1; - - difference() { - translate([spk_x/2,spk_y/2,spk_z/2]) cube_fillet_inside([spk_x,spk_y,spk_z], - vertical=[0,0,0,0,0], top=[0,c_hole,0,c_hole], bottom=[0,c_hole,0,c_hole], $fn=90); - // speaker cone - translate([spk_x/2,-adj,spk_z-72]) rotate([-90,0,0]) cylinder(d=36, h=.5); - - // corner holes - translate([(c_hole/2)+2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) - cylinder(d=c_hole, h=spk_y+(2*adj)); - translate([(c_hole/2)+2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) - cylinder(d=c_hole, h=spk_y+(2*adj)); - translate([spk_x-(c_hole/2)-2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) - cylinder(d=c_hole, h=spk_y+(2*adj)); - translate([spk_x-(c_hole/2)-2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) - cylinder(d=c_hole, h=spk_y+(2*adj)); - - // lower left corner indent - translate([(c_hole/2)+2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([-adj-1,-adj,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([adj+.5,-adj,-(i_dia/2)+adj]) cube([i_dia+adj,10+adj,i_dia+adj+.5]); - translate([(c_hole/2)+2,-adj+12+adj,(c_hole/2)+2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([-adj-1,-adj+12+adj,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([adj+.5,-adj+12+adj,-(i_dia/2)+adj]) cube([i_dia+adj,10+adj,i_dia+adj+.5]); - - // upper left corner corner indent - translate([(c_hole/2)+2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([-adj-1,-adj,spk_z-i_dia-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([-adj+.5,-adj,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); - translate([(c_hole/2)+2,-adj+12,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([-adj-1,-adj+12,spk_z-i_dia-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([-adj+.5,-adj+12,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); - - // upper right corner corner indent - translate([spk_x-(c_hole/2)-2,-adj,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([spk_x-1-(i_dia/2),-adj,spk_z-i_dia+adj-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([spk_x-.5-i_dia,-adj,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); - translate([spk_x-(c_hole/2)-2,-adj+12,spk_z-(c_hole/2)-2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([spk_x-1-(i_dia/2),-adj+12,spk_z-i_dia+adj-.5]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([spk_x-.5-i_dia,-adj+12,spk_z-(i_dia/2)+adj-.5]) cube([i_dia,10+adj,i_dia+adj+.5]); - - // lower right corner corner indent - translate([spk_x-(c_hole/2)-2,-adj,(c_hole/2)+2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([spk_x-1-(i_dia/2),-adj,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([spk_x-.5-i_dia,-adj,-(i_dia/2)+adj]) cube([i_dia,10+adj,i_dia+adj+.5]); - translate([spk_x-(c_hole/2)-2,-adj+12,(c_hole/2)+2]) rotate([-90,0,0]) - cylinder(d=i_dia, h=10+adj); - translate([spk_x-1-(i_dia/2),-adj+12,-adj]) cube([c_hole+adj,10+adj,i_dia+adj+.5]); - translate([spk_x-.5-i_dia,-adj+12,-(i_dia/2)+adj]) cube([i_dia,10+adj,i_dia+adj+.5]); - } - // speaker cone - translate([spk_x/2,-adj+46,spk_z-72]) { - difference() { - translate([0,0,0]) sphere(d=96, $fn=180); - translate([-50,-46,-50]) cube([100,100,100]); - } - } - } - - -/* - NAME: hk_boom - DESCRIPTION: hardkernel boom bonnet - TODO: none - - USAGE: hk_boom(speakers, orientation, mask) - - speakers = true, false - orientation = "front", "rear" - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default", "pcb", "speakers" -*/ - -module hk_boom(speakers, orientation, mask) { - - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; +module proto_m1s() { + pcb_size = [90,65,1.62]; adj = .01; $fn = 90; - if(enablemask == true) { - if(mstyle == "default" || mstyle == "pcb") { - translate([35,35-msetback,5]) rotate([270,0,0]) slot(5, 19, mlength); - audio("jack_3.5-2", 7.75, 21.75, 0, "top", 180, [6.5,13.5,4], [5,0], 1.6, true, [true,mlength,msetback+2.5,"default"]); - } - if(mstyle == "default" || mstyle == "speakers") { - if(speakers == true && orientation == "rear") { - translate([-31.5/2,35/2,1.6]) hk_boom_speaker(mask); - translate([60+(31.5/2),35/2,1.6]) hk_boom_speaker(mask); - } - if(speakers == true && orientation == "front") { - translate([-31.5/2,35/2,0]) rotate([0,180,0]) hk_boom_speaker(mask); - translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) hk_boom_speaker(mask); - } - } - } - if(enablemask == false) { + union() { difference() { union() { - color("#008066") translate ([0,0,0]) slab([60,35,1.6],.5); - if(speakers == true) { - color("#008066") translate ([-31.5,0,0]) slab([31.5,35,1.6],.5); - color("white") translate ([-0.25,0,0]) cube([.5,35,1.6]); - color("#008066") translate ([60,0,0]) slab([31.5,35,1.6],.5); - color("white") translate ([60,0,0]) cube([.5,35,1.6]); - } + color("#008066") slab(pcb_size,2); + color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([17.5,52.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color("#fee5a6") translate([67.5,55.1,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); } - // pcb holes - color("#008066") translate([3.5,3.5,-adj]) cylinder(d=3,h=6); - color("#008066") translate([3.5,31.5,-adj]) cylinder(d=3,h=6); - color("#008066") translate([56.5,3.5,-adj]) cylinder(d=3,h=4); - color("#008066") translate([56.5,31.5,-adj]) cylinder(d=3,h=4); - if(speakers == true) { - // left - color("#008066") translate([-28,3.5,-adj]) cylinder(d=3,h=6); - color("#008066") translate([-28,31.5,-adj]) cylinder(d=3,h=6); - color("#008066") translate([-3.5,3.5,-adj]) cylinder(d=3,h=6); - color("#008066") translate([-3.5,31.5,-adj]) cylinder(d=3,h=6); - // right - color("#008066") translate([64.5,3.5,-adj]) cylinder(d=3,h=4); - color("#008066") translate([64.5,31.5,-adj]) cylinder(d=3,h=4); - color("#008066") translate([88,3.5,-adj]) cylinder(d=3,h=4); - color("#008066") translate([88,31.5,-adj]) cylinder(d=3,h=4); - // left speaker openings - color("#008066") translate([-31.5/2,35/2,-adj]) cylinder(d=23.5, h=3); - color("#008066") translate([-4-31.5/2,35/2+(23.5/2)-.5,-adj]) cube([6,3,3]); - color("#008066") translate([-4-31.5/2,35/2-(23.5/2)-2.5,-adj]) cube([6,3,3]); - color("#008066") translate([-4-31.5/2+(23.5/2)+1,-2+35/2,-adj]) cube([6,3,3]); - // right speaker openings - color("#008066") translate([60+(31.5/2),35/2,-adj]) cylinder(d=23.5, h=3); - color("#008066") translate([60-3+31.5/2,35/2+(23.5/2)-.5,-adj]) cube([6,3,3]); - color("#008066") translate([60-3+31.5/2,35/2-(23.5/2)-2.5,-adj]) cube([6,3,3]); - color("#008066") translate([60+1.25,-2+35/2,-adj]) cube([6,3,3]); - } - } - // headers - header("open", 7.5, 1, 0, "top", 0, [3,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); - header("open", 16, 1, 0, "top", 0, [7,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); - header("open", 40, 11, 0, "top", 0, [2,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); - header("open", 45.5, 11, 0, "top", 0, [2,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); - gpio("encl_header_12", 34, 2, 0, "top", 0, [2,1,6], ["thruhole","black","male",2.54,"silver"], 1.6, false, [true,10,2,"default"]); - - difference() { - union() { - color("dimgray", 1) translate([44.5,27,1.6+2]) rotate([0,0,0]) cylinder(d=16, h=3); - color("dimgray", 1) translate([44.5,27,1.6]) rotate([0,0,0]) cylinder(d=8, h=2); - } - color("dimgray", 1) translate([44.5,27,1.6+4]) rotate([0,0,0]) cylinder(d=12, h=3); - for(d=[5:10:360]) { - color("dimgray") translate([44.5+(16/2)*cos(d),27+(16/2)*sin(d),1.6+2-adj]) cylinder(d=.75, h=3+2*adj); - } - } - color("gray", 1) translate([45,27,1.6+4-adj]) rotate([0,0,0]) cylinder(d=1.5, h=.25); - jst("ph", 0, 13.75, 0, "top", 90, [2,0,0], ["thruhole","top","white"], 1.6, false, [true,10,2,"default"]); - jst("ph", 55.75, 13.75, 0, "top", 270, [2,0,0], ["thruhole","top","white"], 1.6, false, [true,10,2,"default"]); - discrete("capacitor", 20, 30, 0, "top", 0, [6.25,0,6.5], [0], 1.6, false, [true,10,2,"default"]); - discrete("capacitor", 30, 30, 0, "top", 0, [6.25,0,6.5], [0], 1.6, false, [true,10,2,"default"]); - audio("jack_3.5-2", 7.75, 21.75, 0, "top", 180, [6.5,13.5,4], [5,2], 1.6, false, [true,10,2,"default"]); - translate([22,16,1.6-adj]) color("dimgrey") cube([6.5,4.5,1]); - translate([10,12,1.6-adj]) color("dimgrey") cube([4,4,1]); - translate([32.5,9,1.6-adj]) color("dimgrey") cube([3.5,3,1]); - if(speakers == true && orientation == "rear") { - translate([-31.5/2,35/2,1.6]) hk_boom_speaker([false,10,0,"default"]); - translate([60+(31.5/2),35/2,1.6]) hk_boom_speaker([false,10,0,"default"]); - } - if(speakers == true && orientation == "front") { - translate([-31.5/2,35/2,0]) rotate([0,180,0]) hk_boom_speaker([false,10,0,"default"]); - translate([60+(31.5/2),35/2,0]) rotate([0,180,0]) hk_boom_speaker([false,10,0,"default"]); - } - } -} - - -/* - NAME: hk_boom_speaker_pcb - DESCRIPTION: hardkernel stereo boom bonnet speakers with optional speaker pcbs - TODO: none - - USAGE: hk_boom_speaker_pcb(side, speaker, pcb, mask) - - side = "left, "right" - speakers = true, false - orientation = "front", "rear" - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" -*/ - -module hk_boom_speaker_pcb(side, speaker, pcb, mask) { - - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; - - adj = .01; - $fn = 90; - - if(enablemask == true) { - translate([31.5/2,35/2,0]) hk_boom_speaker(mask); - } - if(enablemask == false) { - if(pcb == true) { - difference() { - color("#008066") slab([31.5,35,1.6],.5); - color("#008066") translate([27.5,4,-adj]) cylinder(d=3,h=6); - color("#008066") translate([27.5,31,-adj]) cylinder(d=3,h=6); - color("#008066") translate([4,4,-adj]) cylinder(d=3,h=6); - color("#008066") translate([4,31,-adj]) cylinder(d=3,h=6); - - // speaker openings - color("#008066") translate([(31.5/2),35/2,-adj]) cylinder(d=23.5, h=3); - color("#008066") translate([-3+31.5/2,35/2+(23.5/2)-.5,-adj]) cube([6,3,3]); - color("#008066") translate([-3+31.5/2,35/2-(23.5/2)-2.5,-adj]) cube([6,3,3]); - if(side == "right") { - color("#008066") translate([.5,-2+35/2,-adj]) cube([6,3,3]); - } - if(side == "left") { - color("#008066") translate([31.5/2+(23.5/2)-2.5,-2+35/2,-adj]) cube([6,3,3]); - } - } - } - if(speaker == true && pcb == true) { - translate([(31.5/2),35/2,1.6]) hk_boom_speaker([false,10,0,"default"]); - } - if(speaker == true && pcb == false) { - hk_boom_speaker([false,10,0,"default"]); - } - } -} - - -/* - NAME: hk_boom_speaker - DESCRIPTION: hardkernel stereo boom bonnet speakers - TODO: none - - USAGE: hk_boom_speaker(mask) - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" -*/ - -module hk_boom_speaker(mask) { - - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; - - adj = .01; - $fn = 90; - - if(enablemask == true) { - translate([0,0,-msetback]) cylinder(d=27, h=mlength); - } - if(enablemask == false) { - difference() { - union() { - color("silver") translate([0,0,-8.5]) cylinder_fillet_inside(h=6.5, r=21.4/2, - top=0, bottom=2, $fn=90, fillet_fn=30, center=false); - color("dimgray") translate([0,0,2.5-adj]) cylinder_fillet_inside(h=1, r=21.75/2, - top=1, bottom=0, $fn=90, fillet_fn=30, center=true); - - difference() { - color("black") translate([0,0,-5-adj]) cylinder(d=23.7, h=5); - for(d=[30:60:360]) { - color("dimgray") translate([(23.7/2)*cos(d),(23.7/2)*sin(d),-6-adj]) cylinder(d=6, h=5+2*adj); - } - } - color("black") translate([0,0,-adj]) cylinder(d=27.8, h=2); - color("dimgray") translate([0,0,1]) cylinder(d=22.8, h=1); - color("dimgray") translate([0,0,1]) cylinder(d=17.5, h=1.25); - } - color("darkgray") translate([0,0,10.5]) sphere(d=23); - } - } -} - - -/* - NAME: hk_boom_grill - DESCRIPTION: hardkernel stereo boom bonnet speaker grill - TODO: none - - USAGE: hk_boom_grill(style, thick) - - style = "flat", "frame", "dome" - thick = material thickness -*/ - -module hk_boom_grill(style, thick) { - - adj = .01; - $fn = 90; - if(style == "dome" || style == "frame") { - difference() { - union() { - difference() { - translate([0,0,-23]) sphere(d=52.5); - translate([0,0,-25]) sphere(d=52.5); - translate([-30,-30,-60.5]) cube([60,60,60]); - for(c=[-14.5:3:24]) { - for(r=[-14.5:3:24]) { - translate([r,c,-1]) cube([2,2,40]); - } - } - } - if(style == "frame") { - difference() { - translate([0,0,-1.25]) cylinder(d=30.5, h=thick); - translate([0,0,-1.25-adj]) cylinder(d=24, h=thick+2*adj); - } - } - } - } - } - if(style == "flat") { - difference() { - translate([0,0,0]) cylinder(d=27, h=thick); - for(c=[-14.5:3:24]) { - for(r=[-14.5:3:24]) { - translate([r,c,-1]) cube([2,2,thick+2]); - } - } - } - } -} - - -/* - NAME: hk_boom_speaker_holder - DESCRIPTION: hardkernel stereo boom bonnet speaker holder - TODO: none - - USAGE: hk_boom_speaker_holder(style, tolerance) - - style = "friction", "clamp" - tolerance = friction adjustment -*/ - -module hk_boom_speaker_holder(style, tolerance=0) { - - adj = .01; - $fn = 90; - - if(style == "friction") { - difference() { - translate([0,0,0]) cylinder(d=31, h=4); - translate([0,0,-adj]) cylinder(d=28+tolerance, h=4+2*adj); - translate([0,-1,-adj]) cube([15,40,10], center=true); - } - difference() { - translate([0,0,0]) cylinder(d=28+tolerance, h=2); - translate([0,0,-adj]) cylinder(d=28+tolerance-2, h=4+2*adj); - translate([0,-1,-adj]) cube([15,40,10], center=true); - } - } - - if(style == "clamp") { - // bottom clamp - topthick = 2; - top_height = 14; - difference() { - cube([10.5,29,top_height-topthick]); - // speaker holders - translate([-1,14.5,14]) rotate([0,90,0]) cylinder(d=28, h=4.5); - translate([2,14.5,14]) rotate([0,90,0]) cylinder(d=24, h=6); - translate([4,14.5,14]) rotate([0,90,0]) cylinder(d=21.9, h=7.8); - } - } -} - - -/* - NAME: hk_boom_speaker_strap - DESCRIPTION: hardkernel stereo boom bonnet speaker clamp holder top - TODO: none - - USAGE: hk_boom_speaker_strap(side) - - side = "left", "right" -*/ - -module hk_boom_speaker_strap(side) { - - topthick = 2; - top_height = 14; - adj = .01; - $fn = 90; - // top clamp - difference() { - difference() { - union() { - translate([-3,14.5,top_height]) rotate([0,90,0]) cylinder(d=35,h=13.75); - if(side == "left") { - translate([5.4,16.5,top_height+(topthick/2)-1]) cube_fillet_inside([16.75,55,topthick], - vertical=[6,1,6,1], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); - } - if(side == "right") { - translate([5.4,13,top_height+(topthick/2)-1]) cube_fillet_inside([16.75,55,topthick], - vertical=[1,6,1,1], top=[0,0,0,0], bottom=[0,0,0,0], $fn=90); - } - translate([10.75-adj,14.5,top_height]) rotate([0,90,0]) cylinder(d=35,h=3); - } - translate([-9.25,0,top_height-topthick-adj]) cube([20,29,topthick]); - difference() { - translate([-4.25,14.5,14]) rotate([0,90,0]) cylinder(d=28, h=15); - translate([-5.25,0,19]) cube([20,30,19.5]); - } - } - // speaker holders - translate([-3-adj,14.5,14]) rotate([0,90,0]) cylinder(d=30.8, h=4.5); - translate([-3-adj,14.5,14]) rotate([0,90,0]) cylinder(d=32.8, h=2); - translate([-2.75,14.5,14]) rotate([0,90,0]) cylinder(d=28, h=14.5); - translate([-4.55,-4,-4]) cube([20,37,topthick+15]); - - if(side == "left") { - translate([4.15,-3.4,-adj]) cylinder(d=3.2, h=50); - translate([4.15,-3.4,15]) cylinder(d=6, h=10); - translate([5.75,40,-adj]) cylinder(d=3.2, h=50); - } - if(side == "right") { - translate([4.5,32.5,-adj]) cylinder(d=3.2, h=50); - translate([4.5,32.5,15]) cylinder(d=6, h=10); - translate([10.5,-11,-adj]) cylinder(d=3.2, h=50); - } - } -} - - -/* - NAME: hk_boom_vring - DESCRIPTION: hardkernel stereo boom bonnet volume ring - TODO: none - - USAGE: hk_boom_vring(tolerance) - - tolerance = friction fit adjustment -*/ - -module hk_boom_vring(tolerance) { - - out_dia = 22; - in_dia = 16.15 + tolerance; - thick = 3; - nub = 1.25; - adj = .01; - $fn = 90; - difference() { - color("black") translate([0,0,0])cylinder(d=out_dia, h=thick); - color("dimgray") translate([0,0,-adj]) cylinder(d=in_dia, h=thick+2*adj); - for(d=[5:10:360]) { - color("dimgray") translate([(out_dia/2)*cos(d),(out_dia/2)*sin(d),-adj]) cylinder(d=nub, h=thick+2*adj); - } - } -} - - -/* - NAME: hk_pwr_button - DESCRIPTION: hardkernel power button - TODO: none - - USAGE: hk_pwr_button(mask) - - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" -*/ - -module hk_pwr_button(mask) { - - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; - - adj=.01; - $fn = 90; - - if(enablemask == true) { - translate([0, 0, -mlength+msetback+adj]) cylinder(d=16, h=mlength); - } - if(enablemask == false) { - difference() { - union() { - // light ring - difference() { - color("blue", .6) translate([0, 0, 1.67]) cylinder(h=.1, d=14.75); - color("blue", .6) translate([0, 0, 1.66]) cylinder(h=.2, d=13.75); - } - // power symbol - color("blue", .6) translate([-.5, 0, 1.65]) color("blue", .6) cube([1,3.5,.1]); - difference() { - color("blue", .6) translate([0, 0, 1.66]) cylinder(h=.1, d=5.75); - color("blue", .6) translate([0, 0, 1.65]) cylinder(h=.2, d=4.5); - color("blue", .6) translate([-1.75, 0, 1.65]) cube([3.5,4,2]); - } - // body - color("Gainsboro") cylinder(h=1.66, d1=17.75, d2=14.75); - color("silver") translate([0, 0, -19]) cylinder(h=19, d=15.8); - difference() { - color("steelblue") translate([0, 0, -27.9]) cylinder(h=9, d=15.8); - color("steelblue") translate([-1+15.8/2, -4, -19-9.1]) cube([2,8,6.1]); - color("steelblue") translate([-1-15.8/2, -4, -19-9.1]) cube([2,8,6.1]); - } - color("white") translate([-3.5, -6, -28]) cube([7,12,2]); - - // nut - difference() { - translate([0, 0, -4.75]) color("Gainsboro", .6) cylinder(h=2.75, d=21.5, $fn=6); - translate([0, 0, -4.75]) color("Gainsboro", .6) cylinder(h=2.75, d=15.8); - } - // connector pins - color("silver") translate([-1.4, -.5, -34.99]) cube([2.8, 1, 7]); - color("silver") translate([-1.4, -.5+5, -34.99]) cube([2.8, 1, 7]); - color("silver") translate([-1.4, -.5-5, -34.99]) cube([2.8, 1, 7]); - color("silver") translate([-1.4-1.75, -.5+1.75, -34.99]) cube([1, 2.8, 7]); - color("silver") translate([-1.4+3.5, -.5+1.75, -34.99]) cube([1, 2.8, 7]); - } - } - } -} - - -/* - NAME: hk_m1s_ups - DESCRIPTION: hardkernel odroid-m1s ups - TODO: none - - USAGE: hk_m1s_ups(mask) - - mask[0] = true enables component mask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mstyle "default" -*/ - -module hk_m1s_ups(mask) { - - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; - - pcb_size = [115,32,1.62]; - adj = .01; - $fn = 90; - - if(enablemask == true) { - usbc("single_horizontal", 97.5, -1, 0, "top", 0, [0,0,0], [0], pcb_size[2], true, [true,mlength,msetback,mstyle]); - } - if(enablemask == false) { - difference() { - union() { - color("#008066") slab(pcb_size,4); - color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); - color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); - color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); - color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-.1]) cylinder(d=5.5, h=pcb_size[2]+.2); - } - color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=4, h=4); - color("#fee5a6") translate([3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); - color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=4, h=4); - color("#fee5a6") translate([pcb_size[0]-3.5,pcb_size[1]-3.5,-1]) cylinder(d=4, h=4); - } - // battery and clips - color("grey") translate([15,5,pcb_size[2]]) rotate([0,0,270]) battery_clip(); - color("grey") translate([80,16,pcb_size[2]]) rotate([0,0,90]) battery_clip(); - translate([13.25,10.5,pcb_size[2]+10.4]) rotate([0,90,0]) battery("18650_convex"); - - header("open", 78, 26.5, 0, "top", 0, [7,2,6], ["thruhole","black","male",2.54,"silver"], pcb_size[2], false, [true,10,2,"default"]); - button("momentary_4.5x4.5x4.5", 86.75, .5, 0, "top", 0, [0,0,0], [0], pcb_size[2], false, [false,10,2,"default"]); - usbc("single_horizontal", 97.5, -1, 0, "top", 0, [0,0,0], [0], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 35, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 40, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 45, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 50, 28, 0, "top", 0, [3,1.5,.5], ["DodgerBlue"], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 111.5, 8, 0, "top", 90, [3,1.5,.5], ["green"], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 111.5, 16, 0, "top", 90, [3,1.5,.5], ["red"], pcb_size[2], false, [false,10,2,"default"]); - smd("led", 111.5, 21, 0, "top", 90, [3,1.5,.5], ["red"], pcb_size[2], false, [false,10,2,"default"]); - } + color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([17.5,52.5,-1]) cylinder(d=3, h=4); + color("#fee5a6") translate([67.5,55.1,-1]) cylinder(d=3, h=4); + } + pcbpad("round", 8, 5, 0, "bottom", 0, [30,16,6], [1.27,"#fee5a6",2.1], pcb_size[2], false, [true,10,2,"default"]); + } } @@ -1510,118 +1565,64 @@ module proto_ups() { /* - NAME: proto_m1s - DESCRIPTION: prototype board with odroid-m1s footprint + NAME: u_bracket + DESCRIPTION: hardkernel vu8m lcd brackets TODO: none - USAGE: proto_m1s() + USAGE: u_bracket() */ -module proto_m1s() { +module u_bracket() { + $fn= 30; + xi = 124; + xo = 154; + yi = 42; + yo = 42 + 12; // Outer vertical dimension + z = 1.93; + rlo = 21.3; // Lower outer corner radii + rli = 1; // Lower inner corner radii + ruo = 5.7; // Upper outer corner radii + rui = 5.7; // Upper inner corner radii - pcb_size = [90,65,1.62]; - adj = .01; - $fn = 90; - - union() { - difference() { - union() { - color("#008066") slab(pcb_size,2); - color("#fee5a6") translate([3.5,3.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); - color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); - color("#fee5a6") translate([17.5,52.5,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); - color("#fee5a6") translate([67.5,55.1,-.1]) cylinder(d=4.5, h=pcb_size[2]+.2); + color([0.2,0.2,0.2]) + difference() { + union() { + hull() { + translate([ rlo, rlo,0]) cylinder(r=rlo, h=z, $fn=100); + translate([xo - rlo, rlo,0]) cylinder(r=rlo, h=z, $fn=100); } - color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=3, h=4); - color("#fee5a6") translate([pcb_size[0]-3.5,3.5,-1]) cylinder(d=3, h=4); - color("#fee5a6") translate([17.5,52.5,-1]) cylinder(d=3, h=4); - color("#fee5a6") translate([67.5,55.1,-1]) cylinder(d=3, h=4); - } - pcbpad("round", 8, 5, 0, "bottom", 0, [30,16,6], [1.27,"#fee5a6",2.1], pcb_size[2], false, [true,10,2,"default"]); - } -} - - -/* - NAME: hk_m1s_case_holes - DESCRIPTION: hardkernel odroid-m1s oem case hole pattern - TODO: none - - USAGE: hk_m1s_case_holes(type = "landscape") - - type = "landscape", "portrait" -*/ - -module hk_m1s_case_holes(type = "landscape") { - - if(type == "portrait") { - cylinder(d=3, h=6); - translate([0,107,0]) cylinder(d=3, h=6); - translate([58,0,0]) cylinder(d=3, h=6); - translate([58,107,0]) cylinder(d=3, h=6); - } - else { - cylinder(d=3, h=6); - translate([0,58,0]) cylinder(d=3, h=6); - translate([107,0,0]) cylinder(d=3, h=6); - translate([107,58,0]) cylinder(d=3, h=6); - } -} - - -/* - NAME: hk_xu4_shifter_shield - DESCRIPTION: hardkernel xu4 shifter shield - TODO: none - - USAGE: hk__xu4_shifter_shield(mask) - - mask[0] = enablemask - mask[1] = mask length - mask[2] = mask setback - mask[3] = mask style, "default" -*/ - -module hk_xu4_shifter_shield(mask) { - - size = [83,59,1]; - enablemask = mask[0]; - mlength = mask[1]; - msetback = mask[2]; - mstyle = mask[3]; - - adj = .01; - $fn = 90; - - if(enablemask == true) { - switch("slide_4x9", 28, 55, 0, "top", 180, [5, 4, .8], ["dimgrey"], size[2], true, [true, 10, 2, "default"]); - gpio("open", 25, 1, 0, "top", 180, [20,2,6], ["thruhole","black","male",2.54,"silver"], size[2], true, [true, 10, 0, "block"]); - } - if(enablemask == false) { - difference() { - union() { - color("#18525d") slab(size,3.5); - pcbhole("round",3.5,3.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"left_rear"],size[2],false,[false,10,2,"default"]); - pcbhole("round",3.5,55.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"left_front"],size[2],false,[false,10,2,"default"]); - pcbhole("round",79.5,3.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"right_rear"],size[2],false,[false,10,2,"default"]); - pcbhole("round",79.5,55.5,0,"top",0,[3,0,0],["solid","#fee5a6","none",5,"right_front"],size[2],false,[false,10,2,"default"]); + hull() { + translate([ ruo, yo - ruo,0]) cylinder(r=ruo, h=z); + translate([ 15 - rui, yo - rui,0]) cylinder(r=rui, h=z); + translate([ 0, rlo,0]) cube([15,$fs,z]); + } + hull() { + translate([xo - ruo, yo - ruo,0]) cylinder(r=ruo, h=z); + translate([xo - 15 + rui, yo - rui,0]) cylinder(r=rui, h=z); + translate([xo - 15 , rlo,0]) cube([15,$fs,z]); } - color("#fee5a6") translate([3.5,3.5,-1]) cylinder(d=3, h=4); - color("#fee5a6") translate([3.5,55.5,-1]) cylinder(d=3, h=4); - color("#fee5a6") translate([79.5,3.5,-1]) cylinder(d=3, h=4); - color("#fee5a6") translate([79.5,55.5,-1]) cylinder(d=3, h=4); } - ic("generic", 43, 39.5, 0, "top", 0, [5, 4, .8], ["dimgrey"], size[2], false, [false, 0, 0, "none"]); - ic("generic", 53, 39.5, 0, "top", 0, [5, 4, .8], ["dimgrey"], size[2], false, [false, 0, 0, "none"]); - ic("generic", 63, 39.5, 0, "top", 0, [5, 4, .8], ["dimgrey"], size[2], false, [false, 0, 0, "none"]); - header("open", 77, 36.5, 0, "bottom", 0, [2,6,16], ["thruhole","black","female",2,"silver"], size[2], false, [true,10,2,"default"]); - header("open", 39, 53, 0, "bottom", 0, [15,2,16], ["thruhole","black","female",2,"silver"], size[2], false, [true,10,2,"default"]); - gpio("open", 25, 1, 0, "top", 180, [20,2,6], ["thruhole","black","male",2.54,"silver"], size[2], false, [true,10,2,"default"]); - header("open", 8, 1, 0, "top", 0, [6,1,6], ["thruhole","black","male",2.54,"silver"], size[2], false, [true,10,2,"default"]); - switch("slide_4x9", 28, 55, 0, "top", 180, [5, 4, .8], ["dimgrey"], size[2], false, [true, 0, 0, "none"]); - pcbpad("round", 9.27, 4.81, 0, "top", 0, [6, 21, .8], [1,"#fee5a6",1.7,"front"], size[2], false, [false, 0, 0, "none"]); - pcbpad("round", 24.54, 35.27, 0, "top", 0, [2, 9, .8], [1,"#fee5a6",1.7,"front"], size[2], false, [false, 0, 0, "none"]); - + hull() { + translate([ 15 + rli, yo - yi + rli,-1]) cylinder(r=rli, h=z+2); + translate([xo - 15 - rli, yo - yi + rli,-1]) cylinder(r=rli, h=z+2); + translate([ 15, yo,-1]) cube([xi,$fs,z+2]); + } + translate([ 7.5, yo - 4, -1]) cylinder(d=3.21, h=z+2); + translate([xo - 7.5, yo - 4, -1]) cylinder(d=3.21, h=z+2); + hull() { + translate([ 7.5, yo - 9.6, -1]) cylinder(d=3.21, h=z+2); + translate([ 7.5, yo - 29.4, -1]) cylinder(d=3.21, h=z+2); + } + hull() { + translate([xo - 7.5, yo - 9.6, -1]) cylinder(d=3.21, h=z+2); + translate([xo - 7.5, yo - 29.4, -1]) cylinder(d=3.21, h=z+2); + } + translate([ 15 + 5.00, 8.25, -1]) cylinder(d=4.11, h=z+2); + translate([xo - 15 - 30.00, 8.25, -1]) cylinder(d=4.11, h=z+2); + translate([ 15 + 10.75, 2.50, -1]) cylinder(d=4.11, h=z+2); + translate([ 15 + 41.75, 2.50, -1]) cylinder(d=4.11, h=z+2); + translate([ 15 + 82.25, 2.50, -1]) cylinder(d=4.11, h=z+2); + translate([ 15 + 113.25, 2.50, -1]) cylinder(d=4.11, h=z+2); } -} +} \ No newline at end of file diff --git a/lib/standoff.scad b/lib/standoff.scad index cd7ddc5..430c22c 100644 --- a/lib/standoff.scad +++ b/lib/standoff.scad @@ -15,6 +15,10 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html +*/ + + +/* NAME: standoff DESCRIPTION: create standoffs TODO: none @@ -166,4 +170,4 @@ module standoff(stand_off, mask){ } } } -} +} \ No newline at end of file diff --git a/lib/vent.scad b/lib/vent.scad index 7f2046a..906d43a 100644 --- a/lib/vent.scad +++ b/lib/vent.scad @@ -15,12 +15,11 @@ along with this program. If not, see Code released under GPLv3: http://www.gnu.org/licenses/gpl.html - vent(width, length, height, gap, rows, columns, orientation) - vent_hex(cells_x, cells_y, thickness, cell_size, cell_spacing, orientation) vent_panel_hex(x, y, thick, cell_size, cell_spacing, border, borders); */ + /* NAME: vent_panel_hex DESCRIPTION: creates hex vent panel @@ -61,6 +60,4 @@ module vent_panel_hex(x, y, thick, cell_size=8, cell_spacing=3, border=3, border color("grey",1) translate([x - hxb, y - hyb, -1]) cylinder(d=hole, h=thick+3); } } -} - - +} \ No newline at end of file diff --git a/mod/add.scad b/mod/add.scad index 3d32a68..fc3a2f5 100644 --- a/mod/add.scad +++ b/mod/add.scad @@ -149,10 +149,10 @@ module add(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) { translate([loc_x,loc_y,loc_z]) rotate(rotation) fans(data[0],mask); } if(type == "hd25") { - translate([loc_x,loc_y,loc_z]) rotate(rotation) hd25(data[0]); + translate([loc_x,loc_y,loc_z]) rotate(rotation) hd25(data[0],data[1],mask); } if(type == "hd35") { - translate([loc_x,loc_y,loc_z]) rotate(rotation) hd35(); + translate([loc_x,loc_y,loc_z]) rotate(rotation) hd35(data[0],mask); } if(type == "hk_boom") { translate([loc_x,loc_y,loc_z]) rotate(rotation) hk_boom(data[0],data[1],mask); diff --git a/mod/case_top.scad b/mod/case_top.scad index b74d341..4865416 100644 --- a/mod/case_top.scad +++ b/mod/case_top.scad @@ -309,19 +309,19 @@ module case_top(case_design) { if (class == "pcbhole" && id == pcb_id && pcbhole_pos == "left_rear" && top_rear_left_enable == true && top_standoff[5] != "blind") { - translate([pcbhole_x,pcbhole_y,top_height+1]) cylinder(d=6.5, h=top_height); + translate([pcbhole_x,pcbhole_y,top_height+5]) cylinder(d=6.5, h=top_height); } if (class == "pcbhole" && id == pcb_id && pcbhole_pos == "left_front" && top_front_left_enable == true && top_standoff[5] != "blind") { - translate([pcbhole_x,pcbhole_y,top_height+1]) cylinder(d=6.5, h=top_height); + translate([pcbhole_x,pcbhole_y,top_height+5]) cylinder(d=6.5, h=top_height); } if (class == "pcbhole" && id == pcb_id && pcbhole_pos == "right_rear" && top_rear_right_enable == true && top_standoff[5] != "blind") { - translate([pcbhole_x,pcbhole_y,top_height+1]) cylinder(d=6.5, h=top_height); + translate([pcbhole_x,pcbhole_y,top_height+5]) cylinder(d=6.5, h=top_height); } if (class == "pcbhole" && id == pcb_id && pcbhole_pos == "right_front" && top_front_right_enable == true && top_standoff[5] != "blind") { - translate([pcbhole_x,pcbhole_y,top_height+1]) cylinder(d=6.5, h=top_height); + translate([pcbhole_x,pcbhole_y,top_height+5]) cylinder(d=6.5, h=top_height); } } } @@ -331,7 +331,7 @@ module case_top(case_design) { if((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= 10 || pcb_loc_y >= 10) && ext_top_rear_right_enable == true && ext_top_standoff[5] != "blind") { translate([width-ext_top_standoff_support_size/4-(2*(wallthick+gap))-(corner_fillet/2), - (corner_fillet/2)+ext_top_standoff_support_size/4,top_height+1]) cylinder(d=6.5, h=top_height); + (corner_fillet/2)+ext_top_standoff_support_size/4,top_height+5]) cylinder(d=6.5, h=top_height); } // right-front standoff if(((width-pcb_loc_x-pcb_width-(gap+2*wallthick) >= 10 && depth-pcb_loc_y-pcb_depth >= 10) || @@ -339,13 +339,13 @@ module case_top(case_design) { (width-pcb_loc_x-pcb_width-(gap+2*wallthick) <= 10 && depth-pcb_loc_y-pcb_depth >= 10)) && ext_top_front_right_enable == true && ext_top_standoff[5] != "blind") { translate([width-ext_top_standoff_support_size/4-(corner_fillet/2)-(2*(wallthick+gap)), - depth-ext_top_standoff_support_size/4-(corner_fillet/2)-(2*(wallthick+gap)),top_height+1]) + depth-ext_top_standoff_support_size/4-(corner_fillet/2)-(2*(wallthick+gap)),top_height+5]) cylinder(d=6.5, h=top_height); } // left-rear standoff if((pcb_loc_x >= 10 || pcb_loc_y >= 10) && ext_top_rear_left_enable == true && ext_top_standoff[5] != "blind") { translate([(corner_fillet/2)+ext_top_standoff_support_size/4, - (corner_fillet/2)+ext_top_standoff_support_size/4,top_height+1]) cylinder(d=6.5, h=top_height); + (corner_fillet/2)+ext_top_standoff_support_size/4,top_height+5]) cylinder(d=6.5, h=top_height); } // left-front standoff if(((pcb_loc_x >= 10 && (depth-(pcb_loc_y+pcb_depth)) >= 10) || @@ -353,8 +353,8 @@ module case_top(case_design) { (pcb_loc_x >= 10 && (depth-(pcb_loc_y+pcb_depth)) <= 10)) && ext_top_front_left_enable == true && ext_top_standoff[5] != "blind") { translate([+(corner_fillet/2)+ext_top_standoff_support_size/4, - depth-ext_top_standoff_support_size/4-(corner_fillet/2)-(2*(wallthick+gap)),top_height+1]) - cylinder(d=6.5, h=top_height+1); + depth-ext_top_standoff_support_size/4-(corner_fillet/2)-(2*(wallthick+gap)),top_height+5]) + cylinder(d=6.5, h=top_height); } } // top cover pattern diff --git a/mod/sub.scad b/mod/sub.scad index 61bfe4c..d54e731 100644 --- a/mod/sub.scad +++ b/mod/sub.scad @@ -55,7 +55,7 @@ module sub(type, loc_x, loc_y, loc_z, face, rotation, size, data, mask) { translate([loc_x,loc_y,loc_z]) rotate(rotation) fan_mask(size_x, size_z, data[0]); } if(type == "hd_holes") { - translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[1],data[2],data[3],data[4]); + translate([loc_x,loc_y,loc_z]) rotate(rotation) hd_bottom_holes(data[0],data[1],data[2],data[3]); } if(type == "knockout") { translate([loc_x,loc_y,loc_z]) rotate(rotation) knockout(size_x,size_y,data[0],size_z,data[1],data[2]); diff --git a/sbc_case_builder.json b/sbc_case_builder.json index 301b05c..fab89bb 100644 --- a/sbc_case_builder.json +++ b/sbc_case_builder.json @@ -1706,156 +1706,6 @@ "view": "model", "wallthick": "2" }, - "hc4_shell_drivebox2.5": { - "$fn": "90", - "access_panel_location": "[10, 15]", - "access_panel_orientation": "landscape", - "access_panel_rotation": "0", - "access_panel_size": "[70, 30]", - "accessory_highlight": "false", - "accessory_name": "hc4_shell_drivebox2.5", - "adj": "0.01", - "bend_allowance": "1", - "bottom_access_panel_enable": "false", - "bottom_clearence": "3.5", - "bottom_cover_pattern": "solid", - "bottom_front_left_adjust": "0", - "bottom_front_left_enable": "true", - "bottom_front_left_support": "left", - "bottom_front_right_adjust": "0", - "bottom_front_right_enable": "true", - "bottom_front_right_support": "none", - "bottom_rear_left_adjust": "0", - "bottom_rear_left_enable": "true", - "bottom_rear_left_support": "rear", - "bottom_rear_right_adjust": "0", - "bottom_rear_right_enable": "true", - "bottom_rear_right_support": "rear", - "bottom_sidewall_support": "true", - "bottom_standoff_diameter": "5.75", - "bottom_standoff_hole_size": "3.4", - "bottom_standoff_insert": "false", - "bottom_standoff_insert_dia": "4.2", - "bottom_standoff_insert_height": "5.1", - "bottom_standoff_pillar": "hex", - "bottom_standoff_reverse": "false", - "bottom_standoff_support_height": "15", - "bottom_standoff_support_size": "10", - "bottom_standoff_type": "countersunk", - "case_design": "shell", - "case_offset_bz": "12", - "case_offset_tz": "10", - "case_offset_x": "86", - "case_offset_y": "54", - "cooling": "fan_1", - "corner_fillet": "3", - "edge_fillet": "0", - "exhaust_vent": "none", - "ext_bottom_front_left_adjust": "0", - "ext_bottom_front_left_enable": "true", - "ext_bottom_front_left_support": "front", - "ext_bottom_front_right_adjust": "0", - "ext_bottom_front_right_enable": "true", - "ext_bottom_front_right_support": "front", - "ext_bottom_rear_left_adjust": "0", - "ext_bottom_rear_left_enable": "true", - "ext_bottom_rear_left_support": "rear", - "ext_bottom_rear_right_adjust": "0", - "ext_bottom_rear_right_enable": "true", - "ext_bottom_rear_right_support": "rear", - "ext_bottom_sidewall_support": "true", - "ext_bottom_standoff_diameter": "5.75", - "ext_bottom_standoff_hole_size": "3.4", - "ext_bottom_standoff_insert": "false", - "ext_bottom_standoff_insert_dia": "4.2", - "ext_bottom_standoff_insert_height": "5.1", - "ext_bottom_standoff_pillar": "hex", - "ext_bottom_standoff_reverse": "false", - "ext_bottom_standoff_support_height": "15", - "ext_bottom_standoff_support_size": "10", - "ext_bottom_standoff_type": "countersunk", - "ext_bottom_standoffs": "true", - "ext_top_front_left_adjust": "0", - "ext_top_front_left_enable": "true", - "ext_top_front_left_support": "front", - "ext_top_front_right_adjust": "0", - "ext_top_front_right_enable": "true", - "ext_top_front_right_support": "front", - "ext_top_rear_left_adjust": "0", - "ext_top_rear_left_enable": "true", - "ext_top_rear_left_support": "rear", - "ext_top_rear_right_adjust": "0", - "ext_top_rear_right_enable": "true", - "ext_top_rear_right_support": "rear", - "ext_top_sidewall_support": "true", - "ext_top_standoff_diameter": "5.75", - "ext_top_standoff_hole_size": "2.75", - "ext_top_standoff_insert": "true", - "ext_top_standoff_insert_dia": "4", - "ext_top_standoff_insert_height": "5.1", - "ext_top_standoff_pillar": "hex", - "ext_top_standoff_reverse": "true", - "ext_top_standoff_support_height": "15", - "ext_top_standoff_support_size": "10", - "ext_top_standoff_type": "blind", - "ext_top_standoffs": "true", - "fan_size": "0", - "flat_blank_section": "false", - "floorthick": "2", - "gap": "1.5", - "gpio_opening": "default", - "indents": "false", - "individual_part": "bottom", - "lower_bottom": "0", - "material_thickness": "0.5", - "move_front": "0", - "move_leftside": "0", - "move_rear": "0", - "move_rightside": "0", - "pcb_loc_x": "0", - "pcb_loc_y": "0", - "pcb_loc_z": "0", - "raise_top": "0", - "rear_io_plate": "false", - "sbc_bottom_standoffs": "true", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "hc4", - "sbc_off": "false", - "sbc_top_standoffs": "true", - "sidethick": "2", - "standard_motherboard_thickness": "0", - "text_color": "Green", - "text_font": "Nimbus Mono PS", - "tol": "0.25", - "top_cover_pattern": "solid", - "top_front_left_adjust": "0", - "top_front_left_enable": "true", - "top_front_left_support": "left", - "top_front_right_adjust": "0", - "top_front_right_enable": "true", - "top_front_right_support": "none", - "top_rear_left_adjust": "0", - "top_rear_left_enable": "true", - "top_rear_left_support": "rear", - "top_rear_right_adjust": "0", - "top_rear_right_enable": "true", - "top_rear_right_support": "rear", - "top_sidewall_support": "true", - "top_standoff_diameter": "5.75", - "top_standoff_hole_size": "2.75", - "top_standoff_insert": "true", - "top_standoff_insert_dia": "4", - "top_standoff_insert_height": "5.1", - "top_standoff_pillar": "hex", - "top_standoff_reverse": "true", - "top_standoff_support_height": "15", - "top_standoff_support_size": "10", - "top_standoff_type": "blind", - "uart_opening": "default", - "view": "model", - "wallthick": "2.5" - }, "hc4_shell_drivebox2.5v": { "$fn": "90", "access_panel_location": "[10, 15]", @@ -2156,156 +2006,6 @@ "view": "model", "wallthick": "3" }, - "hc4_tray_drivebox2.5": { - "$fn": "90", - "access_panel_location": "[10, 15]", - "access_panel_orientation": "landscape", - "access_panel_rotation": "0", - "access_panel_size": "[70, 30]", - "accessory_highlight": "false", - "accessory_name": "hc4_tray_drivebox2.5", - "adj": "0.01", - "bend_allowance": "1", - "bottom_access_panel_enable": "false", - "bottom_clearence": "3.5", - "bottom_cover_pattern": "solid", - "bottom_front_left_adjust": "0", - "bottom_front_left_enable": "true", - "bottom_front_left_support": "front", - "bottom_front_right_adjust": "0", - "bottom_front_right_enable": "true", - "bottom_front_right_support": "front", - "bottom_rear_left_adjust": "0", - "bottom_rear_left_enable": "true", - "bottom_rear_left_support": "rear", - "bottom_rear_right_adjust": "0", - "bottom_rear_right_enable": "true", - "bottom_rear_right_support": "rear", - "bottom_sidewall_support": "true", - "bottom_standoff_diameter": "5.75", - "bottom_standoff_hole_size": "3.4", - "bottom_standoff_insert": "false", - "bottom_standoff_insert_dia": "4.2", - "bottom_standoff_insert_height": "5.1", - "bottom_standoff_pillar": "hex", - "bottom_standoff_reverse": "false", - "bottom_standoff_support_height": "20", - "bottom_standoff_support_size": "10", - "bottom_standoff_type": "recessed", - "case_design": "tray", - "case_offset_bz": "12", - "case_offset_tz": "10", - "case_offset_x": "88", - "case_offset_y": "55", - "cooling": "fan_1", - "corner_fillet": "3", - "edge_fillet": "2", - "exhaust_vent": "none", - "ext_bottom_front_left_adjust": "0", - "ext_bottom_front_left_enable": "true", - "ext_bottom_front_left_support": "front", - "ext_bottom_front_right_adjust": "0", - "ext_bottom_front_right_enable": "true", - "ext_bottom_front_right_support": "front", - "ext_bottom_rear_left_adjust": "0", - "ext_bottom_rear_left_enable": "true", - "ext_bottom_rear_left_support": "rear", - "ext_bottom_rear_right_adjust": "0", - "ext_bottom_rear_right_enable": "true", - "ext_bottom_rear_right_support": "rear", - "ext_bottom_sidewall_support": "true", - "ext_bottom_standoff_diameter": "5.75", - "ext_bottom_standoff_hole_size": "3.4", - "ext_bottom_standoff_insert": "false", - "ext_bottom_standoff_insert_dia": "4.2", - "ext_bottom_standoff_insert_height": "5.1", - "ext_bottom_standoff_pillar": "hex", - "ext_bottom_standoff_reverse": "false", - "ext_bottom_standoff_support_height": "4", - "ext_bottom_standoff_support_size": "10", - "ext_bottom_standoff_type": "countersunk", - "ext_bottom_standoffs": "false", - "ext_top_front_left_adjust": "0", - "ext_top_front_left_enable": "true", - "ext_top_front_left_support": "front", - "ext_top_front_right_adjust": "0", - "ext_top_front_right_enable": "true", - "ext_top_front_right_support": "front", - "ext_top_rear_left_adjust": "0", - "ext_top_rear_left_enable": "true", - "ext_top_rear_left_support": "rear", - "ext_top_rear_right_adjust": "0", - "ext_top_rear_right_enable": "true", - "ext_top_rear_right_support": "rear", - "ext_top_sidewall_support": "true", - "ext_top_standoff_diameter": "5.75", - "ext_top_standoff_hole_size": "2.75", - "ext_top_standoff_insert": "false", - "ext_top_standoff_insert_dia": "4.2", - "ext_top_standoff_insert_height": "5.1", - "ext_top_standoff_pillar": "hex", - "ext_top_standoff_reverse": "true", - "ext_top_standoff_support_height": "4", - "ext_top_standoff_support_size": "10", - "ext_top_standoff_type": "blind", - "ext_top_standoffs": "false", - "fan_size": "0", - "flat_blank_section": "false", - "floorthick": "2", - "gap": "1.5", - "gpio_opening": "default", - "indents": "false", - "individual_part": "bottom", - "lower_bottom": "0", - "material_thickness": "0.5", - "move_front": "0", - "move_leftside": "0", - "move_rear": "0", - "move_rightside": "0", - "pcb_loc_x": "0", - "pcb_loc_y": "0", - "pcb_loc_z": "0", - "raise_top": "0", - "rear_io_plate": "false", - "sbc_bottom_standoffs": "true", - "sbc_highlight": "false", - "sbc_information": "false", - "sbc_model": "hc4", - "sbc_off": "false", - "sbc_top_standoffs": "false", - "sidethick": "2", - "standard_motherboard_thickness": "0", - "text_color": "Green", - "text_font": "Nimbus Mono PS", - "tol": "0.25", - "top_cover_pattern": "solid", - "top_front_left_adjust": "0", - "top_front_left_enable": "true", - "top_front_left_support": "front", - "top_front_right_adjust": "0", - "top_front_right_enable": "true", - "top_front_right_support": "front", - "top_rear_left_adjust": "0", - "top_rear_left_enable": "true", - "top_rear_left_support": "rear", - "top_rear_right_adjust": "0", - "top_rear_right_enable": "true", - "top_rear_right_support": "rear", - "top_sidewall_support": "true", - "top_standoff_diameter": "5.75", - "top_standoff_hole_size": "2.75", - "top_standoff_insert": "false", - "top_standoff_insert_dia": "4.2", - "top_standoff_insert_height": "5.1", - "top_standoff_pillar": "hex", - "top_standoff_reverse": "true", - "top_standoff_support_height": "4", - "top_standoff_support_size": "10", - "top_standoff_type": "blind", - "uart_opening": "default", - "view": "model", - "wallthick": "2" - }, "m1s_shell_nvme": { "$fn": "90", "access_panel_location": "[0, 28]", @@ -8902,6 +8602,304 @@ "uart_opening": "default", "view": "model", "wallthick": "2" + }, + "hc4_tray_drivebox2.5": { + "$fn": "90", + "access_panel_location": "[10, 15]", + "access_panel_orientation": "landscape", + "access_panel_rotation": "0", + "access_panel_size": "[70, 30]", + "accessory_highlight": "false", + "accessory_name": "hc4_tray_drivebox2.5", + "adj": "0.01", + "bend_allowance": "1", + "bottom_access_panel_enable": "false", + "bottom_clearence": "3.5", + "bottom_cover_pattern": "solid", + "bottom_front_left_adjust": "0", + "bottom_front_left_enable": "true", + "bottom_front_left_support": "front", + "bottom_front_right_adjust": "0", + "bottom_front_right_enable": "true", + "bottom_front_right_support": "front", + "bottom_rear_left_adjust": "0", + "bottom_rear_left_enable": "true", + "bottom_rear_left_support": "rear", + "bottom_rear_right_adjust": "0", + "bottom_rear_right_enable": "true", + "bottom_rear_right_support": "rear", + "bottom_sidewall_support": "true", + "bottom_standoff_diameter": "5.75", + "bottom_standoff_hole_size": "3.4", + "bottom_standoff_insert": "false", + "bottom_standoff_insert_dia": "4.2", + "bottom_standoff_insert_height": "5.1", + "bottom_standoff_pillar": "hex", + "bottom_standoff_reverse": "false", + "bottom_standoff_support_height": "4", + "bottom_standoff_support_size": "10", + "bottom_standoff_type": "recessed", + "case_design": "tray", + "case_offset_bz": "12", + "case_offset_tz": "10", + "case_offset_x": "88", + "case_offset_y": "55", + "cooling": "fan_1", + "corner_fillet": "3", + "edge_fillet": "2", + "ext_bottom_front_left_adjust": "0", + "ext_bottom_front_left_enable": "true", + "ext_bottom_front_left_support": "front", + "ext_bottom_front_right_adjust": "0", + "ext_bottom_front_right_enable": "true", + "ext_bottom_front_right_support": "front", + "ext_bottom_rear_left_adjust": "0", + "ext_bottom_rear_left_enable": "true", + "ext_bottom_rear_left_support": "rear", + "ext_bottom_rear_right_adjust": "0", + "ext_bottom_rear_right_enable": "true", + "ext_bottom_rear_right_support": "rear", + "ext_bottom_sidewall_support": "true", + "ext_bottom_standoff_diameter": "5.75", + "ext_bottom_standoff_hole_size": "3.4", + "ext_bottom_standoff_insert": "false", + "ext_bottom_standoff_insert_dia": "4.2", + "ext_bottom_standoff_insert_height": "5.1", + "ext_bottom_standoff_pillar": "hex", + "ext_bottom_standoff_reverse": "false", + "ext_bottom_standoff_support_height": "4", + "ext_bottom_standoff_support_size": "10", + "ext_bottom_standoff_type": "countersunk", + "ext_bottom_standoffs": "false", + "ext_top_front_left_adjust": "0", + "ext_top_front_left_enable": "true", + "ext_top_front_left_support": "front", + "ext_top_front_right_adjust": "0", + "ext_top_front_right_enable": "true", + "ext_top_front_right_support": "front", + "ext_top_rear_left_adjust": "0", + "ext_top_rear_left_enable": "true", + "ext_top_rear_left_support": "rear", + "ext_top_rear_right_adjust": "0", + "ext_top_rear_right_enable": "true", + "ext_top_rear_right_support": "rear", + "ext_top_sidewall_support": "true", + "ext_top_standoff_diameter": "5.75", + "ext_top_standoff_hole_size": "2.75", + "ext_top_standoff_insert": "false", + "ext_top_standoff_insert_dia": "4.2", + "ext_top_standoff_insert_height": "5.1", + "ext_top_standoff_pillar": "hex", + "ext_top_standoff_reverse": "true", + "ext_top_standoff_support_height": "4", + "ext_top_standoff_support_size": "10", + "ext_top_standoff_type": "blind", + "ext_top_standoffs": "false", + "fan_size": "0", + "flat_blank_section": "false", + "floorthick": "2", + "gap": "1", + "gpio_opening": "default", + "indents": "false", + "individual_part": "bottom", + "lower_bottom": "0", + "material_thickness": "0.5", + "move_front": "0", + "move_leftside": "0", + "move_rear": "0", + "move_rightside": "0", + "pcb_loc_x": "0", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "rear_io_plate": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "hc4", + "sbc_off": "false", + "sbc_top_standoffs": "false", + "sidethick": "2", + "standard_motherboard_thickness": "0", + "text_color": "Green", + "text_font": "Nimbus Mono PS", + "tol": "0.25", + "top_cover_pattern": "solid", + "top_front_left_adjust": "0", + "top_front_left_enable": "true", + "top_front_left_support": "front", + "top_front_right_adjust": "0", + "top_front_right_enable": "true", + "top_front_right_support": "front", + "top_rear_left_adjust": "0", + "top_rear_left_enable": "true", + "top_rear_left_support": "rear", + "top_rear_right_adjust": "0", + "top_rear_right_enable": "true", + "top_rear_right_support": "rear", + "top_sidewall_support": "true", + "top_standoff_diameter": "5.75", + "top_standoff_hole_size": "2.75", + "top_standoff_insert": "false", + "top_standoff_insert_dia": "4.2", + "top_standoff_insert_height": "5.1", + "top_standoff_pillar": "hex", + "top_standoff_reverse": "true", + "top_standoff_support_height": "4", + "top_standoff_support_size": "10", + "top_standoff_type": "blind", + "uart_opening": "default", + "view": "model", + "wallthick": "2" + }, + "hc4_shell_drivebox2.5": { + "$fn": "90", + "access_panel_location": "[10, 15]", + "access_panel_orientation": "landscape", + "access_panel_rotation": "0", + "access_panel_size": "[70, 30]", + "accessory_highlight": "false", + "accessory_name": "hc4_shell_drivebox2.5", + "adj": "0.01", + "bend_allowance": "1", + "bottom_access_panel_enable": "false", + "bottom_clearence": "3.5", + "bottom_cover_pattern": "solid", + "bottom_front_left_adjust": "0", + "bottom_front_left_enable": "true", + "bottom_front_left_support": "left", + "bottom_front_right_adjust": "0", + "bottom_front_right_enable": "true", + "bottom_front_right_support": "none", + "bottom_rear_left_adjust": "0", + "bottom_rear_left_enable": "true", + "bottom_rear_left_support": "rear", + "bottom_rear_right_adjust": "0", + "bottom_rear_right_enable": "true", + "bottom_rear_right_support": "rear", + "bottom_sidewall_support": "true", + "bottom_standoff_diameter": "5.75", + "bottom_standoff_hole_size": "3.4", + "bottom_standoff_insert": "true", + "bottom_standoff_insert_dia": "4.2", + "bottom_standoff_insert_height": "5.1", + "bottom_standoff_pillar": "hex", + "bottom_standoff_reverse": "false", + "bottom_standoff_support_height": "4", + "bottom_standoff_support_size": "10", + "bottom_standoff_type": "countersunk", + "case_design": "shell", + "case_offset_bz": "12", + "case_offset_tz": "10", + "case_offset_x": "86", + "case_offset_y": "54", + "cooling": "fan_1", + "corner_fillet": "3", + "edge_fillet": "0", + "ext_bottom_front_left_adjust": "0", + "ext_bottom_front_left_enable": "true", + "ext_bottom_front_left_support": "front", + "ext_bottom_front_right_adjust": "0", + "ext_bottom_front_right_enable": "true", + "ext_bottom_front_right_support": "front", + "ext_bottom_rear_left_adjust": "0", + "ext_bottom_rear_left_enable": "true", + "ext_bottom_rear_left_support": "rear", + "ext_bottom_rear_right_adjust": "0", + "ext_bottom_rear_right_enable": "true", + "ext_bottom_rear_right_support": "rear", + "ext_bottom_sidewall_support": "true", + "ext_bottom_standoff_diameter": "5.75", + "ext_bottom_standoff_hole_size": "3.4", + "ext_bottom_standoff_insert": "true", + "ext_bottom_standoff_insert_dia": "4.2", + "ext_bottom_standoff_insert_height": "5.1", + "ext_bottom_standoff_pillar": "hex", + "ext_bottom_standoff_reverse": "false", + "ext_bottom_standoff_support_height": "4", + "ext_bottom_standoff_support_size": "10", + "ext_bottom_standoff_type": "blind", + "ext_bottom_standoffs": "true", + "ext_top_front_left_adjust": "0", + "ext_top_front_left_enable": "true", + "ext_top_front_left_support": "front", + "ext_top_front_right_adjust": "0", + "ext_top_front_right_enable": "true", + "ext_top_front_right_support": "front", + "ext_top_rear_left_adjust": "0", + "ext_top_rear_left_enable": "true", + "ext_top_rear_left_support": "rear", + "ext_top_rear_right_adjust": "0", + "ext_top_rear_right_enable": "true", + "ext_top_rear_right_support": "rear", + "ext_top_sidewall_support": "true", + "ext_top_standoff_diameter": "6", + "ext_top_standoff_hole_size": "3.4", + "ext_top_standoff_insert": "true", + "ext_top_standoff_insert_dia": "4", + "ext_top_standoff_insert_height": "5.1", + "ext_top_standoff_pillar": "hex", + "ext_top_standoff_reverse": "true", + "ext_top_standoff_support_height": "17", + "ext_top_standoff_support_size": "10", + "ext_top_standoff_type": "recessed", + "ext_top_standoffs": "true", + "fan_size": "0", + "flat_blank_section": "false", + "floorthick": "2", + "gap": "1.5", + "gpio_opening": "default", + "indents": "false", + "individual_part": "bottom", + "lower_bottom": "0", + "material_thickness": "0.5", + "move_front": "0", + "move_leftside": "0", + "move_rear": "0", + "move_rightside": "0", + "pcb_loc_x": "0", + "pcb_loc_y": "0", + "pcb_loc_z": "0", + "raise_top": "0", + "rear_io_plate": "false", + "sbc_bottom_standoffs": "true", + "sbc_highlight": "false", + "sbc_information": "false", + "sbc_model": "hc4", + "sbc_off": "false", + "sbc_top_standoffs": "true", + "sidethick": "2", + "standard_motherboard_thickness": "0", + "text_color": "Green", + "text_font": "Nimbus Mono PS", + "tol": "0.25", + "top_cover_pattern": "solid", + "top_front_left_adjust": "0", + "top_front_left_enable": "false", + "top_front_left_support": "left", + "top_front_right_adjust": "0", + "top_front_right_enable": "false", + "top_front_right_support": "none", + "top_rear_left_adjust": "0", + "top_rear_left_enable": "true", + "top_rear_left_support": "rear", + "top_rear_right_adjust": "0", + "top_rear_right_enable": "false", + "top_rear_right_support": "rear", + "top_sidewall_support": "true", + "top_standoff_diameter": "5.75", + "top_standoff_hole_size": "2.75", + "top_standoff_insert": "true", + "top_standoff_insert_dia": "4", + "top_standoff_insert_height": "5.1", + "top_standoff_pillar": "hex", + "top_standoff_reverse": "true", + "top_standoff_support_height": "17", + "top_standoff_support_size": "10", + "top_standoff_type": "recessed", + "uart_opening": "default", + "view": "model", + "wallthick": "2.5" } }, "fileFormatVersion": "1" diff --git a/sbc_case_builder_accessories.cfg b/sbc_case_builder_accessories.cfg index 29c64c4..f4e9aa2 100644 --- a/sbc_case_builder_accessories.cfg +++ b/sbc_case_builder_accessories.cfg @@ -201,29 +201,19 @@ accessory_data = [ // Odroid-HC4 ["hc4_tray_drivebox2.5", - "add1","hk_hc4_oled_holder",20,82,1.99,"bottom",[0,0,0],["case",false,true,false],[0,0,2],[0],[true,10,2,"default"], + "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"], "add2","hd_holder",10,-24,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"], - "sub","hd_holes",10,-24,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"], - "sub","round",92,-10,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], - "sub","round",92,66.6,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], - "sub","round",92,-10,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], - "sub","round",92,66.6,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], "suball","fan_mask",37,-.1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"], "suball","vent",72,87,27,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], - "model","hk_hc4_oled",20,81,2,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"], - "model","hd25",10,76,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], - "model","hd25",10,76,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], + "model","hk_hc4_oled",20,82,2,"bottom",[0,0,0],["case",false,true,false],[0,0,0],[0],[false,10,2,"default"], + "model","hd25",10,-24,2,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait",15],[true,17,2,"both"], + "model","hd25",10,-24,20,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait",15],[true,17,2,"default"], "model","fan_cover",37,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,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"], - "add2","hd_holder",10,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"], - "sub","hd_holes",10,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"], - "sub","round",92,-5,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], - "sub","round",92,69.6,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], - "sub","round",92,-5,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], - "sub","round",92,69.6,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], + "add2","hd_holder",12,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"], "sub","vent",71.85,88,30,"top",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], "suball","fan_mask",39,-.1,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"], "sub","vent",-3.5,35,34,"top",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], @@ -231,16 +221,16 @@ accessory_data = [ "sub","vent",-3.5,35,9,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], "sub","vent",92,35,9,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,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"], - "model","hd25",10,79,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], - "model","hd25",10,79,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], + "model","hd25",12,-21,2,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait",15],[true,20,2,"both"], + "model","hd25",12,-21,20,"bottom",[0,0,0],["case",true,true,false],[0,0,0],["portrait",15],[true,20,2,"default"], "model","fan_cover",39,-4,7,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]], ["hc4_shell_drivebox2.5v", "add2","hd_holder",45.6,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right"],[false,10,2,"default"], "add2","hd_holder",79.6,-21,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], - "sub","hd_holes",45.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right",3],[false,10,2,"default"], - "sub","hd_holes",79.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], +// "sub","hd_holes",45.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right",3],[false,10,2,"default"], +// "sub","hd_holes",79.6,-21,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], "sub","round",91.3,-5,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,6],[0],[false,10,2,"default"], "sub","round",91.3,71.6,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,6],[0],[false,10,2,"default"], "sub","vent",71.85,88,30,"top",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], @@ -248,22 +238,22 @@ accessory_data = [ "add1","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"], "model","fan_cover",46.6,-3,30,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"], - "model","hd25",45.6,79,71.85,"bottom",[-90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], - "model","hd25",79.3,79,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], + "model","hd25",45.6,79,71.85,"bottom",[-90,0,-90],["case",true,true,false],[0,0,0],["portrait",15],[true,10,2,"default"], + "model","hd25",79.3,79,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],["portrait",15],[true,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]], ["hc4_shell_drivebox3.5", "add1","hk_hc4_oled_holder",20,82,3,"bottom",[0,0,0],["case",false,true,false],[0,0,3],[0],[true,10,2,"default"], "add2","hd_holder",-19.4,-67,3,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait"],[false,10,2,"default"], - "sub","hd_holes",-19.4,-67,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"], +// "sub","hd_holes",-19.4,-67,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"], "sub","round",91.6,-38.5,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,3.4,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,63.1,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "suball","vent",72,88,29,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], "suball","fan_mask",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,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"], - "model","hd35",-19.4,80,3,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"], - "model","hd35",-19.4,80,35,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"], + "model","hd35",-19.4,80,3,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait"],[true,10,2,"default"], + "model","hd35",-19.4,80,35,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait"],[true,10,2,"default"], "model","fan_cover",5.6,-4,7,"top",[90,0,0],["case",true,false,false],[40,0,3],["fan_1"],[false,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_1"],[false,10,2,"default"]], @@ -307,14 +297,14 @@ accessory_data = [ // "add2","button",60,118.5,37.7,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,18.5],["recess"],[true,10,2,"default"], // "model","button_assembly",60,118.5,37.7,"top",[0,0,0],["sbc-case_z",false,false,true],[10,0,18.5],["recess"],[false,10,2,"default"], // "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,11],["recess"],[false,10,2,"default"], - "sub","hd_holes",10,22,35,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"], - "model","hd25",80,122,35.5,"top",[0,180,90],["sbc-case_z",true,true,true],[0,0,0],[7],[false,10,2,"default"], +// "sub","hd_holes",10,22,35,"top",[0,0,0],["sbc-case_z",true,true,true],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"], + "model","hd25",80,122,35.5,"top",[0,180,90],["sbc-case_z",true,true,true],[0,0,0],["portrait",7],[true,10,2,"default"], "sub","vent",94.5,32,10,"top",[0,0,90],["case",true,false,false],[2,15,4],[1,17,"vertical",1],[false,10,2,"default"], "sub","vent",-6.5,32,10,"top",[0,0,90],["case",false,false,false],[2,15,4],[1,17,"vertical",1],[false,10,2,"default"]], ["m1_fitted_drivebox2.5", "add2","hd_holder",10,20,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait"],[false,10,2,"default"], - "sub","hd_holes",10,20,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"], +// "sub","hd_holes",10,20,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","horizontal","none",3],[false,10,2,"default"], "sub","round",92,34,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], "sub","round",92,110.6,5,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], "sub","round",92,34,23,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], @@ -324,14 +314,14 @@ accessory_data = [ "sub","vent",92,25,30,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], "sub","vent",-3.75,25,9,"bottom",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], "sub","vent",92,25,9,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], - "model","hd25",10,120,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], - "model","hd25",10,120,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], + "model","hd25",10,120,2,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait",15],[true,10,2,"default"], + "model","hd25",10,120,20,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait",15],[true,10,2,"default"], "model","fan_cover",39,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"]], ["m1_fitted_drivebox3.5", "add2","hd_holder",-19.4,-27,2.49,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait"],[false,10,2,"default"], - "sub","hd_holes",-19.4,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"], +// "sub","hd_holes",-19.4,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"], "sub","round",91.6,1.5,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,43.4,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,103.1,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], @@ -341,13 +331,13 @@ accessory_data = [ "sub","vent",92,60,20,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], "suball","vent",29,126,29,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], "suball","fan_mask",5.6,-1.5,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_open"],[false,10,2,"default"], - "model","hd35",-19.4,120,2.49,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"], - "model","hd35",-19.4,120,34.5,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"], + "model","hd35",-19.4,120,2.49,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait"],[true,10,2,"default"], + "model","hd35",-19.4,120,34.5,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait"],[true,10,2,"default"], "model","fan_cover",5.6,-4,7,"bottom",[90,0,0],["case",true,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[40,0,3],["fan_hex"],[false,10,2,"default"]], ["m1_fitted_pizzabox", - "sub","hd_holes",-12,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"], +// "sub","hd_holes",-12,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","horizontal","none",3],[false,10,2,"default"], "sub","round",91.6,1.5,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,43.4,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,103.1,9.35,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], @@ -355,11 +345,11 @@ accessory_data = [ "sub","vent",92,60,9,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], "suball","vent",-89,126,15,"bottom",[0,0,0],["case",true,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], "suball","fan_mask",-30,60,48,"top",[0,0,0],["case",true,false,false],[80,0,3],["fan_open"],[false,10,2,"default"], - "model","hd35",-12,120,2.5,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"]], + "model","hd35",-12,120,2.5,"bottom",[0,0,-90],["case",true,true,false],[0,0,0],["portrait"],[true,10,2,"default"]], ["m1_fitted_drivebox3.5v", "add2","hd_holder",80,-27,2.49,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","vertical","left"],[false,10,2,"default"], - "sub","hd_holes",80,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","vertical","left",3],[false,10,2,"default"], +// "sub","hd_holes",80,-27,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[3.5,"portrait","vertical","left",3],[false,10,2,"default"], "sub","round",91.6,14.5,6,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,58.55,6,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], "sub","round",91.6,90.1,6,"bottom",[0,90,0],["case",true,true,false],[3,0,4],[0],[false,10,2,"default"], @@ -369,7 +359,7 @@ accessory_data = [ "sub","vent",92,60,20,"bottom",[0,0,90],["case",true,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], "suball","vent",29,126,29,"bottom",[0,0,0],["case",false,true,false],[2,13,4],[1,4,"vertical",1],[false,10,2,"default"], "suball","fan_mask",5.6,-1.5,35,"bottom",[90,0,0],["case",true,false,false],[60,0,3],["fan_open"],[false,10,2,"default"], - "model","hd35",80,120,2.5,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[0],[false,10,2,"default"], + "model","hd35",80,120,2.5,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],["portrait"],[true,10,2,"default"], "model","fan_cover",5.6,-4,35,"bottom",[90,0,0],["case",true,false,false],[60,0,3],["fan_hex"],[false,10,2,"default"], "platter","fan_cover",-50,50,0,"bottom",[0,0,0],["case",false,false,false],[60,0,3],["fan_hex"],[false,10,2,"default"]], @@ -403,8 +393,8 @@ accessory_data = [ "sub","round",111,34,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,3],[0],[false,10,2,"default"], "sub","round",111,110.6,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,3],[0],[false,10,2,"default"], "add2","hd_holder",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"], - "sub","hd_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], - "model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[7],[false,10,2,"default"]], +// "sub","hd_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], + "model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],["portrait",7],[true,10,2,"default"]], ["h3_shell_router", "sub","vent",-3.5,30,40,"top",[0,0,90],["case",false,false,false],[2,10,4],[1,17,"vertical",1],[false,10,2,"default"], @@ -434,8 +424,8 @@ accessory_data = [ "model","button_assembly",23.77,106.43,55.25,"top",[0,0,0],["sbc-case_z",true,true,true],[10,0,42],["recess"],[false,10,2,"default"], "model","hk_netcard",0,0,19,"bottom",[0,0,0],["sbc",true,true,true],[0,0,0],["portrait"],[true,10,2,"default"], "add2","hd_holder",101,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"], - "sub","hd_holes",101,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], - "model","hd25",101,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[7],[false,10,2,"default"], +// "sub","hd_holes",101,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], + "model","hd25",101,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],["portrait",7],[true,10,2,"default"], "platter","button_assembly",-20,0,0,"top",[0,0,0],["case",false,false,false],[10,0,42],["recess"],[false,10,2,"default"], "platter","button_assembly",-30,0,0,"top",[0,0,0],["case",false,false,false],[10,0,42],["recess"],[false,10,2,"default"]], @@ -505,8 +495,8 @@ accessory_data = [ "sub","round",111,34,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,6],[0],[false,10,2,"default"], "sub","round",111,110.5,6.07,"bottom",[0,90,0],["case",true,false,false],[3,0,6],[0],[false,10,2,"default"], "add2","hd_holder",98,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"], - "sub","hd_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], - "model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[7],[false,10,2,"default"]], +// "sub","hd_holes",98,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], + "model","hd25",98,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],["portrait",7],[true,10,2,"default"]], ["h3_ultimate2", "suball","fan_mask",0,25,3,"top",[0,270,0],["case",false,false,false],[60,0,6],["fan_open"],[false,10,2,"default"], @@ -569,10 +559,10 @@ accessory_data = [ "sub","round",111,100.6,6.07,"bottom",[0,90,0],["case",true,true,false],[3,0,3],[0],[false,10,2,"default"], "add2","hd_holder",100,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left"],[false,10,2,"default"], "add2","hd_holder",65,10,1.99,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right"],[false,10,2,"default"], - "sub","hd_holes",100,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], - "sub","hd_holes",65,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right",3],[false,10,2,"default"], - "model","hd25",65,110,71.85,"bottom",[-90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"], - "model","hd25",100,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],[15],[false,10,2,"default"]], +// "sub","hd_holes",100,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","left",3],[false,10,2,"default"], +// "sub","hd_holes",65,10,-.01,"bottom",[0,0,0],["case",true,true,false],[0,0,0],[2.5,"portrait","vertical","right",3],[false,10,2,"default"], + "model","hd25",65,110,71.85,"bottom",[-90,0,-90],["case",true,true,false],[0,0,0],["portrait",15],[true,10,2,"default"], + "model","hd25",100,110,2,"bottom",[90,0,-90],["case",true,true,false],[0,0,0],["portrait",15],[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"],