From ad62ce362c76e5f6d77e2c8e1fc7d6cb73b813ac Mon Sep 17 00:00:00 2001 From: Chris Palmer Date: Tue, 22 Oct 2019 16:21:05 +0100 Subject: [PATCH] Can now force fan screws to be the full depth and nuts then get washers. --- readme.md | 14 +++++--------- tests/png/fans.png | Bin 43752 -> 43780 bytes vitamins/fan.scad | 22 +++++++++++++++------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/readme.md b/readme.md index 4792f19..260a7a4 100644 --- a/readme.md +++ b/readme.md @@ -616,16 +616,11 @@ Can draw three styles: solid, open frame and open frame with screw bosses. | ```fan_thickness(type)``` | Thickness of the frame | | ```fan_width(type)``` | Width of square | -### Functions -| Function | Description | -|:--- |:--- | -| ```fan_screw_length(type, thickness)``` | Screw length required | - ### Modules | Module | Description | |:--- |:--- | | ```fan(type)``` | Draw specified fan, origin in the centre | -| ```fan_assembly(type, thickness, include_fan = true, screw = false)``` | Fan with its fasteners | +| ```fan_assembly(type, thickness, include_fan = true, screw = false, full_depth = false)``` | Fan with its fasteners | | ```fan_hole_positions(type, z = undef)``` | Position children at the screw hole positions | | ```fan_holes(type, poly = false, screws = true, h = 100)``` | Make all the holes for the fan, or just the aperture if ```screws``` is false. Set ```poly``` true for poly_holes. | @@ -652,9 +647,9 @@ Can draw three styles: solid, open frame and open frame with screw bosses. | 20 | ```screw(M4_dome_screw, 16)``` | Screw M4 dome x 16mm | | 4 | ```screw(M4_dome_screw, 25)``` | Screw M4 dome x 25mm | | 4 | ```screw(M4_dome_screw, 30)``` | Screw M4 dome x 30mm | -| 4 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm | -| 8 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm | -| 28 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm | +| 8 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm | +| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm | +| 32 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm | Top @@ -1683,6 +1678,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o ### Functions | Function | Description | |:--- |:--- | +| ```pcb_component_position(type, name)``` | Return x y position of specified component | | ```pcb_coord(type, p)``` | Convert offsets from the edge to coordinates relative to the centre | | ```pcb_screw(type, cap = hs_cap)``` | Mounting screw type | diff --git a/tests/png/fans.png b/tests/png/fans.png index c0572faff7a0bd397ac29fab5c63a7244014fb27..152826c644e55a88d10c509e23fd7e832456bc0d 100644 GIT binary patch delta 12125 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 E0P5ihcmMzZ delta 12117 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 diff --git a/vitamins/fan.scad b/vitamins/fan.scad index 70bf01d..89de9c3 100644 --- a/vitamins/fan.scad +++ b/vitamins/fan.scad @@ -147,11 +147,16 @@ module fan_holes(type, poly = false, screws = true, h = 100) { //! Make all the } } -function nut_and_washer_thickness(screw, nyloc) = washer_thickness(screw_washer(screw)) + nut_thickness(screw_nut(screw), nyloc); -function fan_screw_depth(type) = fan_boss_d(type) ? fan_depth(type) : fan_thickness(type); -function fan_screw_length(type, thickness) = screw_longer_than(thickness + fan_screw_depth(type) + nut_and_washer_thickness(fan_screw(type), true)); //! Screw length required +function fan_screw_depth(type, full_depth = false) = fan_boss_d(type) || full_depth ? fan_depth(type) : fan_thickness(type); -module fan_assembly(type, thickness, include_fan = true, screw = false) { //! Fan with its fasteners +function fan_screw_length(type, thickness, full_depth = false) = + let(depth = fan_screw_depth(type, full_depth), + washers = depth == fan_depth(type) ? 2 : 1, + washer = screw_washer(fan_screw(type)), + nut = screw_nut(fan_screw(type))) + screw_longer_than(thickness + depth + washer_thickness(washer) * washers + nut_thickness(nut, true)); //! Screw length required + +module fan_assembly(type, thickness, include_fan = true, screw = false, full_depth = false) { //! Fan with its fasteners translate_z(-fan_depth(type) / 2) { if(include_fan) fan(type); @@ -160,11 +165,14 @@ module fan_assembly(type, thickness, include_fan = true, screw = false) { //! Fa nut = screw_nut(Screw); fan_hole_positions(type) { translate_z(thickness) - screw_and_washer(Screw, fan_screw_length(type, thickness)); + screw_and_washer(Screw, fan_screw_length(type, thickness, full_depth)); - translate_z(include_fan ? -fan_screw_depth(type) : 0) + translate_z(include_fan ? -fan_screw_depth(type, full_depth) : 0) vflip() - nut(nut, true); + if(fan_screw_depth(type, full_depth) == fan_depth(type)) + nut_and_washer(nut, true); + else + nut(nut, true); } } }