133 lines
4.8 KiB
OpenSCAD
133 lines
4.8 KiB
OpenSCAD
//
|
|
// NopSCADlib Copyright Chris Palmer 2018
|
|
// nop.head@gmail.com
|
|
// hydraraptor.blogspot.com
|
|
//
|
|
// This file is part of NopSCADlib.
|
|
//
|
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
|
// the License, or (at your option) any later version.
|
|
//
|
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
// See the GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
|
// If not, see <https://www.gnu.org/licenses/>.
|
|
//
|
|
|
|
//
|
|
//! Washers, star washers, penny washers and printed washers.
|
|
//!
|
|
//! If a washer is given a child, usually a screw or a nut, then it is placed on its top surface.
|
|
//
|
|
include <../utils/core/core.scad>
|
|
include <../utils/sweep.scad>
|
|
|
|
soft_washer_colour = grey(20);
|
|
hard_washer_colour = grey(80);
|
|
star_washer_colour = brass;
|
|
|
|
function washer_size(type) = type[1]; //! Noiminal size
|
|
function washer_diameter(type) = type[2]; //! External diameter
|
|
function washer_thickness(type) = type[3]; //! Thickness
|
|
function washer_soft(type) = type[4]; //! True if rubber
|
|
function star_washer_diameter(type) = type[5]; //! Star version size
|
|
function spring_washer_diameter(type) = type[6]; //! Spring washer size
|
|
function spring_washer_thickness(type)= type[7]; //! Spring washer thickness
|
|
function penny_washer(type) = type[8]; //! Corresponding penny washer
|
|
function washer_radius(type) = washer_diameter(type) / 2; //! Outside radius
|
|
|
|
function washer_id(type) = washer_size(type) + 0.1; //! Inside diameter
|
|
function washer_colour(type) = washer_soft(type) ? soft_washer_colour : hard_washer_colour; //! Washer colour
|
|
|
|
module washer(type) { //! Draw specified washer
|
|
hole = washer_size(type);
|
|
thickness = washer_thickness(type);
|
|
diameter = washer_diameter(type);
|
|
p = penny_washer(type);
|
|
penny = !is_undef(p) && !is_list(p);
|
|
if(washer_soft(type))
|
|
vitamin(str("washer(", type[0], "_washer): Washer rubber M", hole, " x ", diameter, "mm x ", thickness, "mm"));
|
|
else
|
|
vitamin(str("washer(", type[0], "_washer): Washer ", penny ? "penny " : "", " M", hole, " x ", diameter, "mm x ", thickness, "mm"));
|
|
color(washer_colour(type))
|
|
linear_extrude( thickness - 0.05)
|
|
difference() {
|
|
circle(d = diameter);
|
|
circle(d = washer_id(type));
|
|
}
|
|
|
|
if($children)
|
|
translate_z(thickness)
|
|
children();
|
|
}
|
|
|
|
module penny_washer(type) { //! Draw penny version of specified plain washer
|
|
penny = penny_washer(type);
|
|
assert(penny, "no penny version");
|
|
washer(penny)
|
|
children();
|
|
}
|
|
|
|
module star_washer(type) { //! Draw star version of washer
|
|
hole = washer_size(type);
|
|
thickness = washer_thickness(type);
|
|
diameter = star_washer_diameter(type);
|
|
rad = diameter / 2;
|
|
inner = (hole / 2 + rad) / 2;
|
|
spoke = rad - hole / 2;
|
|
vitamin(str("star_washer(", type[0], "_washer): Washer star M", hole, " x ", thickness, "mm"));
|
|
color(star_washer_colour)
|
|
linear_extrude(thickness)
|
|
difference() {
|
|
circle(rad);
|
|
|
|
circle(d = washer_id(type));
|
|
|
|
for(a = [0:30:360])
|
|
rotate(a)
|
|
translate([inner + spoke / 2, 0, 0.5])
|
|
square([spoke, 2 * PI * inner / 36], center = true);
|
|
}
|
|
if($children)
|
|
translate_z(thickness)
|
|
children();
|
|
}
|
|
|
|
module spring_washer(type) { //! Draw spring version of washer
|
|
hole = washer_size(type);
|
|
thickness = spring_washer_thickness(type);
|
|
diameter = spring_washer_diameter(type);
|
|
vitamin(str("spring_washer(", type[0], "_washer): Washer spring M", hole, " x ", thickness, "mm"));
|
|
ir = washer_id(type) / 2;
|
|
or = diameter / 2;
|
|
pitch = exploded() ? thickness / 2 : 0;
|
|
path = circle_points((ir + or) / 2, pitch);
|
|
profile = rectangle_points(thickness, or - ir);
|
|
len = len(path);
|
|
color(hard_washer_colour)
|
|
translate_z(thickness / 2)
|
|
rotate(-90)
|
|
sweep(path, profile, twist = -helical_twist_per_segment(ir, pitch, len) * (len - 1));
|
|
|
|
if($children)
|
|
translate_z(thickness)
|
|
children();
|
|
}
|
|
|
|
module printed_washer(type, name = false) { //! Create printed washer
|
|
stl(name ? name : str("M", washer_size(type) * 10, "_washer"));
|
|
t = round_to_layer(washer_thickness(type));
|
|
or = washer_radius(type);
|
|
ir = washer_id(type) / 2;
|
|
stl_colour(pp1_colour)
|
|
linear_extrude(t, center = false, convexity = 2)
|
|
poly_ring(or, ir);
|
|
|
|
if($children)
|
|
translate_z(t)
|
|
children();
|
|
}
|