Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
1f1a360b7c | ||
|
a547c98995 | ||
|
d9fa8c8668 | ||
|
bf5b6d7c30 | ||
|
9cfde7f524 | ||
|
184f19ef04 | ||
|
c88472121e | ||
|
a74bf094aa | ||
|
5a06f79466 | ||
|
98e17080d8 | ||
|
d3f308a45e | ||
|
fe454884e0 | ||
|
c019448dd3 | ||
|
eadc541e8f | ||
|
02791c40ac | ||
|
85b8ffbbc3 | ||
|
dd5d3869ad | ||
|
b84eb3cf31 | ||
|
0ec7aabcfb | ||
|
baa737c4d8 | ||
|
70b13d2f27 | ||
|
c9aad0178e | ||
|
df96551b11 | ||
|
a5a360e0d1 | ||
|
828e5ad36e | ||
|
cedaafed3d | ||
|
0d38d82416 | ||
|
041341b946 | ||
|
70622ba8de |
@@ -52,7 +52,7 @@ iec = IEC_inlet_atx;
|
||||
socket = Contactum;
|
||||
|
||||
|
||||
foot = [20, 8, 3, 1, M3_dome_screw, 10];
|
||||
foot = Foot(d = 20, h = 8, t = 3, r = 1, screw = M3_dome_screw);
|
||||
|
||||
module foot_stl() foot(foot);
|
||||
|
||||
|
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 168 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 290 KiB |
Before Width: | Height: | Size: 291 KiB After Width: | Height: | Size: 293 KiB |
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 236 KiB |
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 178 KiB |
@@ -52,14 +52,7 @@ $fs = extrusion_width / 2;
|
||||
|
||||
function round_to_layer(z) = ceil(z / layer_height) * layer_height;
|
||||
// Some additional named colours
|
||||
grey20 = [0.2, 0.2, 0.2];
|
||||
grey30 = [0.3, 0.3, 0.3];
|
||||
grey40 = [0.4, 0.4, 0.4];
|
||||
grey50 = [0.5, 0.5, 0.5];
|
||||
grey60 = [0.6, 0.6, 0.6];
|
||||
grey70 = [0.7, 0.7, 0.7];
|
||||
grey80 = [0.8, 0.8, 0.8];
|
||||
grey90 = [0.9, 0.9, 0.9];
|
||||
function grey(n) = [0.01, 0.01, 0.01] * n; //! Generate a shade of grey to pass to color().
|
||||
gold = [255/255, 215/255, 0/255];
|
||||
brass = [255/255, 220/255, 100/255];
|
||||
silver = [0.75, 0.75, 0.75];
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 794 KiB After Width: | Height: | Size: 798 KiB |
168
printed/box.scad
@@ -31,26 +31,29 @@
|
||||
//!
|
||||
//! Normally the side sheets are the same type but they can be overridden individually as long as the substitute has the same thickness.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../core.scad>
|
||||
use <../vitamins/sheet.scad>
|
||||
use <../vitamins/screw.scad>
|
||||
use <../vitamins/washer.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
use <../utils/quadrant.scad>
|
||||
use <../utils/round.scad>
|
||||
|
||||
bezel_clearance = 0.2;
|
||||
sheet_end_clearance = 1;
|
||||
sheet_slot_clearance = 0.2;
|
||||
|
||||
function box_screw(type) = type[0]; //! Screw type to be used at the corners
|
||||
function box_wall(type) = type[1]; //! Wall thickness of 3D parts
|
||||
function box_sheets(type) = type[2]; //! Sheet type used for the sides
|
||||
function box_top_sheet(type) = type[3]; //! Sheet type for the top
|
||||
function box_base_sheet(type)= type[4]; //! Sheet type for the bottom
|
||||
function box_feet(type) = type[5]; //! True to enable feet on the bottom bezel
|
||||
function box_width(type) = type[6]; //! Internal width
|
||||
function box_depth(type) = type[7]; //! Internal depth
|
||||
function box_height(type) = type[8]; //! Internal height
|
||||
function box_screw(type) = type[0]; //! Screw type to be used at the corners
|
||||
function box_shelf_screw(type) = type[1]; //! Screw type to hold a shelf
|
||||
function box_wall(type) = type[2]; //! Wall thickness of 3D parts
|
||||
function box_sheets(type) = type[3]; //! Sheet type used for the sides
|
||||
function box_top_sheet(type) = type[4]; //! Sheet type for the top
|
||||
function box_base_sheet(type) = type[5]; //! Sheet type for the bottom
|
||||
function box_feet(type) = type[6]; //! True to enable feet on the bottom bezel
|
||||
function box_width(type) = type[7]; //! Internal width
|
||||
function box_depth(type) = type[8]; //! Internal depth
|
||||
function box_height(type) = type[9]; //! Internal height
|
||||
|
||||
function box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false, shelf_screw = M3_dome_screw) = //! Construct a property list for a box.
|
||||
concat([screw, shelf_screw, wall, sheets, top_sheet, base_sheet, feet], size);
|
||||
|
||||
function box_bezel_clearance(type) = bezel_clearance;
|
||||
|
||||
@@ -59,6 +62,7 @@ function box_profile_overlap(type) = 3 + sheet_end_clearance / 2;
|
||||
|
||||
function box_washer(type) = screw_washer(box_screw(type));
|
||||
function box_insert(type) = screw_insert(box_screw(type));
|
||||
function box_shelf_insert(type) = screw_insert(box_shelf_screw(type));
|
||||
|
||||
function box_hole_inset(type) = washer_radius(box_washer(type)) + 1;
|
||||
function box_insert_r(type) = insert_hole_radius(box_insert(type));
|
||||
@@ -87,23 +91,32 @@ function box_bezel_height(type, bottom) = //! Bezel height for top or bottom
|
||||
|
||||
grill_hole = 5;
|
||||
grill_gap = 1.9;
|
||||
module grill(width, height, r = 1000, poly = false, h = 0) { //! A staggered array of 5mm holes to make grills in sheets. Can be constrained to be circular. Set ```poly``` ```true``` for printing, ```false``` for milling.
|
||||
|
||||
function box_grill_hole_r() = grill_hole / 2;
|
||||
|
||||
module grill_hole_positions(width, height, r = 1000) {
|
||||
nx = floor(width / (grill_hole + grill_gap));
|
||||
xpitch = width / nx;
|
||||
ny = floor(height / ((grill_hole + grill_gap) * cos(30)));
|
||||
ypitch = height / ny;
|
||||
|
||||
for(y = [0 : ny - 1], x = [0 : nx - 1 - (y % 2)]) {
|
||||
$x = -width / 2 + (x + 0.5 + (y % 2) / 2) * xpitch;
|
||||
$y = -height / 2 + (y + 0.5) * ypitch;
|
||||
if(sqrt(sqr($x) + sqr($y)) + grill_hole / 2 <= r)
|
||||
translate([$x, $y])
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
module grill(width, height, r = 1000, poly = false, h = 0) { //! A staggered array of 5mm holes to make grills in sheets. Can be constrained to be circular. Set ```poly``` ```true``` for printing, ```false``` for milling.
|
||||
extrude_if(h)
|
||||
for(y = [0 : ny - 1], x = [0 : nx - 1 - (y % 2)]) {
|
||||
x = -width / 2 + (x + 0.5 + (y % 2) / 2) * xpitch;
|
||||
y = -height / 2 + (y + 0.5) * ypitch;
|
||||
if(sqrt(sqr(x) + sqr(y)) + grill_hole / 2 <= r)
|
||||
translate([x, y])
|
||||
if(poly)
|
||||
poly_circle(r = grill_hole / 2);
|
||||
else
|
||||
circle(d = grill_hole);
|
||||
}
|
||||
if(poly)
|
||||
grill_hole_positions(width, height, r)
|
||||
poly_circle(r = grill_hole / 2);
|
||||
else
|
||||
grill_hole_positions(width, height, r)
|
||||
circle(d = grill_hole);
|
||||
}
|
||||
|
||||
module box_corner_profile_2D(type) { //! The 2D shape of the corner profile.
|
||||
@@ -175,6 +188,15 @@ module box_corner_profile_section(type, section, sections) { //! Generates inter
|
||||
}
|
||||
}
|
||||
|
||||
module box_corner_profile_sections(type, section, sections) { //! Generate four copies of a corner profile section
|
||||
stl("box_corner_profile");
|
||||
offset = box_boss_r(type) + 1;
|
||||
for(i = [0 : 3])
|
||||
rotate(i * 90)
|
||||
translate([offset, offset])
|
||||
box_corner_profile_section(type, section, sections);
|
||||
}
|
||||
|
||||
module box_corner_quadrants(type, width, depth)
|
||||
for(corner = [0:3]) {
|
||||
x = [-1,1,1,-1][corner];
|
||||
@@ -258,10 +280,11 @@ dowel_length = 20;
|
||||
dowel_wall = extrusion_width * 3;
|
||||
dowel_h_wall = layer_height * 6;
|
||||
|
||||
|
||||
module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlocking sections of the bezel to allow it to be bigger than the printer
|
||||
w = (box_width(type) + 2 * box_outset(type)) / cols;
|
||||
h = (box_depth(type) + 2 * box_outset(type)) / rows;
|
||||
tw = box_width(type) + 2 * box_outset(type);
|
||||
w = tw / cols;
|
||||
th = box_depth(type) + 2 * box_outset(type);
|
||||
h = th / rows;
|
||||
bw = box_outset(type) - bezel_clearance / 2;
|
||||
bw2 = box_outset(type) + box_inset(type);
|
||||
|
||||
@@ -336,7 +359,7 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
|
||||
render() difference() {
|
||||
union() {
|
||||
clip(xmin = 0, xmax = w, ymin = 0, ymax = h)
|
||||
translate([box_width(type) / 2 + box_outset(type) - x * w, box_depth(type) / 2 + box_outset(type) - y * h, box_profile_overlap(type)])
|
||||
translate([tw / 2 - x * w, th / 2 - y * h, box_profile_overlap(type)])
|
||||
box_bezel(type, bottom);
|
||||
|
||||
if(x < cols - 1 && y == 0)
|
||||
@@ -396,7 +419,6 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module box_screw_hole_positions(type)
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
translate([x * (box_width(type) / 2 - box_hole_inset(type)), y * (box_depth(type) / 2 - box_hole_inset(type))])
|
||||
@@ -439,6 +461,96 @@ module box_shelf_blank(type, sheet = false) { //! Generates a 2D template for a
|
||||
}
|
||||
}
|
||||
|
||||
module box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = undef) { //! Place children at the shelf screw positions
|
||||
w = is_undef(wall) ? box_wall(type) : wall;
|
||||
insert = box_shelf_insert(type);
|
||||
translate_z(-insert_boss_radius(insert, w))
|
||||
for(p = screw_positions)
|
||||
multmatrix(p)
|
||||
translate_z(thickness)
|
||||
children();
|
||||
}
|
||||
|
||||
module box_shelf_bracket(type, screw_positions, wall = undef) { //! Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts
|
||||
stl("shelf_bracket");
|
||||
w = is_undef(wall) ? box_wall(type) : wall;
|
||||
insert = box_shelf_insert(type);
|
||||
lip = 2 * insert_boss_radius(insert, w);
|
||||
width = insert_length(insert) + w;
|
||||
|
||||
module shape()
|
||||
difference() {
|
||||
square([box_width(type), box_depth(type)], center = true);
|
||||
|
||||
offset(bezel_clearance / 2)
|
||||
box_corner_quadrants(type, box_width(type), box_depth(type));
|
||||
|
||||
if($children)
|
||||
hflip()
|
||||
children();
|
||||
}
|
||||
|
||||
module boss()
|
||||
translate_z(-width + eps)
|
||||
linear_extrude(width - 2 * eps)
|
||||
hull() {
|
||||
circle4n(r = lip / 2 - eps);
|
||||
|
||||
translate([-lip / 2, -lip / 2 + eps])
|
||||
square([lip, eps]);
|
||||
}
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(w)
|
||||
difference() {
|
||||
shape()
|
||||
if($children)
|
||||
children(0);
|
||||
|
||||
round(2) offset(-width)
|
||||
shape()
|
||||
if($children)
|
||||
children(0);
|
||||
}
|
||||
|
||||
linear_extrude(lip)
|
||||
difference() {
|
||||
shape()
|
||||
if($children)
|
||||
children(0);
|
||||
|
||||
offset(-w)
|
||||
shape()
|
||||
if($children)
|
||||
children(0);
|
||||
}
|
||||
|
||||
hflip()
|
||||
box_shelf_screw_positions(type, screw_positions, 0, w)
|
||||
boss();
|
||||
}
|
||||
if($children > 1)
|
||||
hflip()
|
||||
children(1);
|
||||
|
||||
hflip()
|
||||
box_shelf_screw_positions(type, screw_positions, 0, w)
|
||||
insert_hole(insert, counterbore = 1, horizontal = true);
|
||||
}
|
||||
}
|
||||
|
||||
module box_shelf_bracket_section(type, rows, cols, x, y) { //! Generates sections of the shelf bracket to allow it to be bigger than the printer
|
||||
tw = box_width(type);
|
||||
w = tw / cols;
|
||||
th = box_depth(type);
|
||||
h = th / rows;
|
||||
|
||||
clip(xmin = 0, xmax = w, ymin = 0, ymax = h)
|
||||
translate([tw / 2 - x * w, th / 2 - y * h])
|
||||
children();
|
||||
}
|
||||
|
||||
module box_left_blank(type, sheet = false) { //! Generates a 2D template for the left sheet, ```sheet``` can be set to override the type
|
||||
dxf("box_left");
|
||||
|
||||
|
@@ -50,6 +50,9 @@ function bbox_name(type) = type[8] ? type[8] : "bbox"; //! Optional name i
|
||||
function bbox_skip_blocks(type)= type[9] ? type[9] : []; //! List of fixing blocks to skip, used to allow a hinged panel for example
|
||||
function star_washers(type) = type[10] ? type[10] : is_undef(type[10]); //! Set to false to remove star washers.
|
||||
|
||||
function bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true) = //! Construct the property list for a butt_box
|
||||
[ screw, sheets, base_sheet, top_sheet, span, size.x, size.y, size.z, name, skip_blocks, star_washers ];
|
||||
|
||||
function bbox_volume(type) = bbox_width(type) * bbox_depth(type) * bbox_height(type) / 1000000; //! Internal volume in litres
|
||||
function bbox_area(type) = let(w = bbox_width(type), d = bbox_depth(type), h = bbox_height(type)) //! Internal surdface area in m^2
|
||||
2 * (w * d + w * h + d * h) / 1000000;
|
||||
@@ -107,12 +110,9 @@ function fixing_block_positions(type) = let(
|
||||
|
||||
function side_holes(type) = [for(p = fixing_block_positions(type), q = fixing_block_holes(bbox_screw(type))) p * q];
|
||||
|
||||
module drill_holes(type, t)
|
||||
for(list = [corner_holes(type), side_holes(type)], p = list)
|
||||
let(q = t * p)
|
||||
if(abs(transform([0, 0, 0], q).z) < eps)
|
||||
multmatrix(q)
|
||||
drill(screw_clearance_radius(bbox_screw(type)), 0);
|
||||
module bbox_drill_holes(type, t)
|
||||
position_children(concat(corner_holes(type), side_holes(type)), t)
|
||||
drill(screw_clearance_radius(bbox_screw(type)), 0);
|
||||
|
||||
module bbox_base_blank(type) { //! 2D template for the base
|
||||
dxf(str(bbox_name(type), "_base"));
|
||||
@@ -120,7 +120,7 @@ module bbox_base_blank(type) { //! 2D template for the base
|
||||
difference() {
|
||||
sheet_2D(bbox_base_sheet(type), bbox_width(type), bbox_depth(type), 1);
|
||||
|
||||
drill_holes(type, translate(bbox_height(type) / 2));
|
||||
bbox_drill_holes(type, translate(bbox_height(type) / 2));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,7 +133,7 @@ module bbox_top_blank(type) { //! 2D template for the top
|
||||
translate([0, t / 2])
|
||||
sheet_2D(bbox_top_sheet(type), bbox_width(type) + 2 * t, bbox_depth(type) + t);
|
||||
|
||||
drill_holes(type, translate(-bbox_height(type) / 2));
|
||||
bbox_drill_holes(type, translate(-bbox_height(type) / 2));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ module bbox_left_blank(type, sheet = false) { //! 2D template for the left side
|
||||
translate([-t / 2, -bb / 2])
|
||||
sheet_2D(subst_sheet(type, sheet), bbox_depth(type) + t, bbox_height(type) + bb);
|
||||
|
||||
drill_holes(type, rotate([0, 90, 90]) * translate([bbox_width(type) / 2, 0]));
|
||||
bbox_drill_holes(type, rotate([0, 90, 90]) * translate([bbox_width(type) / 2, 0]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ module bbox_right_blank(type, sheet = false) { //! 2D template for the right sid
|
||||
translate([t / 2, -bb / 2])
|
||||
sheet_2D(subst_sheet(type, sheet), bbox_depth(type) + t, bbox_height(type) + bb);
|
||||
|
||||
drill_holes(type, rotate([0, 90, 90]) * translate([-bbox_width(type) / 2, 0]));
|
||||
bbox_drill_holes(type, rotate([0, 90, 90]) * translate([-bbox_width(type) / 2, 0]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,7 +180,7 @@ module bbox_front_blank(type, sheet = false, width = 0) { //! 2D template for th
|
||||
translate([0, (bt - bb) / 2])
|
||||
sheet_2D(subst_sheet(type, sheet), max(bbox_width(type) + 2 * t, width), bbox_height(type) + bb + bt);
|
||||
|
||||
drill_holes(type, rotate([-90, 0, 0]) * translate([0, bbox_depth(type) / 2]));
|
||||
bbox_drill_holes(type, rotate([-90, 0, 0]) * translate([0, bbox_depth(type) / 2]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ module bbox_back_blank(type, sheet = false) { //! 2D template for the back
|
||||
translate([0, -bb / 2])
|
||||
sheet_2D(subst_sheet(type, sheet), bbox_width(type), bbox_height(type) + bb);
|
||||
|
||||
drill_holes(type, rotate([-90, 0, 0]) * translate([0, -bbox_depth(type) / 2]));
|
||||
bbox_drill_holes(type, rotate([-90, 0, 0]) * translate([0, -bbox_depth(type) / 2]));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -42,6 +42,9 @@ function hinge_screws(type) = type[8]; //! How many screws
|
||||
function hinge_clearance(type) = type[9]; //! Clearance between knuckles
|
||||
function hinge_margin(type) = type[10]; //! How far to keep the screws from the knuckes
|
||||
|
||||
function flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin) = //! Construct the property list for a flat hinge.
|
||||
[name, size.x, size.y, size.z, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin];
|
||||
|
||||
function hinge_radius(type) = washer_radius(screw_washer(hinge_screw(type))) + 1;
|
||||
|
||||
module hinge_screw_positions(type) { //! Place children at the screw positions
|
||||
|
@@ -24,8 +24,10 @@
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
||||
foot = [25, 12, 3, 2, M4_cap_screw, 10];
|
||||
insert_foot = [20, 10, 0, 2, M3_cap_screw, 10];
|
||||
function Foot(d, h, t, r, screw, slant = 10) = [d, h, t, r, screw, slant]; //! Construct a foot property list
|
||||
|
||||
foot = Foot(25, 12, 3, 2, M4_cap_screw);
|
||||
insert_foot = Foot(20, 10, 0, 2, M3_cap_screw);
|
||||
|
||||
function insert_foot() = insert_foot; //! Default foot with insert
|
||||
|
||||
|
@@ -30,6 +30,9 @@ include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
use <foot.scad>
|
||||
|
||||
function pbox(name, wall, top_t, base_t, radius, size, foot = false, screw = false, ridges = [0, 0]) //! Construct a printed box property list
|
||||
= concat([name, wall, top_t, base_t, foot, screw, radius, ridges], size);
|
||||
|
||||
function pbox_name(type) = type[0]; //! Name to allow more than one box in a project
|
||||
function pbox_wall(type) = type[1]; //! Wall thickness
|
||||
function pbox_top(type) = type[2]; //! Top thickness
|
||||
@@ -75,7 +78,7 @@ function pbox_screw_inset(type) = //! How far the base screws are inset
|
||||
R = pbox_radius(type)
|
||||
) max(r, R - (R - r) / sqrt(2));
|
||||
|
||||
module pbox_screw_positions(type) {
|
||||
module pbox_screw_positions(type) { //! Place children at base screw positions
|
||||
foot = pbox_foot(type);
|
||||
inset = pbox_screw_inset(type);
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
@@ -124,6 +127,9 @@ module pbox_inner_shape(type) {
|
||||
rounded_square([w, d], rad, center = true);
|
||||
}
|
||||
|
||||
module pbox_outer_shape(type) //! 2D outer shape of the box
|
||||
offset(pbox_wall(type) / 2) pbox_mid_shape(type);
|
||||
|
||||
module pbox_base(type) { //! Generate the STL for the base
|
||||
stl(str(pbox_name(type),"_base"));
|
||||
t = pbox_base(type);
|
||||
@@ -158,7 +164,7 @@ module pbox(type) { //! Generate the STL for the main case
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(total_height)
|
||||
offset(wall / 2) pbox_mid_shape(type);
|
||||
pbox_outer_shape(type);
|
||||
|
||||
if($children > 2)
|
||||
children(2);
|
||||
|
@@ -31,7 +31,7 @@ insert = screw_insert(screw);
|
||||
screw_depth = insert_length(insert) + 1;
|
||||
|
||||
function ribbon_clamp_hole_pitch(ways) = ribbon_clamp_slot(ways) + 2 * min_wall + 2 * corrected_radius(insert_hole_radius(insert)); //! Hole pitch
|
||||
function ribbon_clamp_width() = 2 * (insert_hole_radius(insert) + 2); //! Width
|
||||
function ribbon_clamp_width() = 2 * (insert_hole_radius(insert) + wall); //! Width
|
||||
function ribbon_clamp_length(ways) = ribbon_clamp_hole_pitch(ways) + ribbon_clamp_width(); //! Length given ways
|
||||
function ribbon_clamp_height() = screw_depth + 1; //! Height
|
||||
|
||||
|
@@ -135,7 +135,7 @@ module ssr_shroud_fastened_assembly(type, cable_d, thickness, name) //! Assembly
|
||||
|
||||
*translate_z(cable_d / 2)
|
||||
rotate([90, 0, 0])
|
||||
stl_colour(grey20)
|
||||
stl_colour(grey(20))
|
||||
cylinder(d = cable_d, h = 20, center = true);
|
||||
}
|
||||
}
|
||||
|
@@ -24,8 +24,7 @@
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
||||
strap = [18, 2, M3_pan_screw, 3, 25];
|
||||
function strap() = strap;
|
||||
strap = strap();
|
||||
|
||||
wall = 2;
|
||||
clearance = 0.5;
|
||||
@@ -40,6 +39,10 @@ function strap_screw(type = strap) = type[2]; //! Screw type
|
||||
function strap_panel(type = strap) = type[3]; //! Panel thickness
|
||||
function strap_extension(type = strap) = type[4]; //! How much length of the strap that can pull out
|
||||
|
||||
|
||||
function strap(width = 18, thickness = 2, screw = M3_pan_screw, panel_thickness = 3, extension = 25) = //! Construct a property list for a strap
|
||||
[ width, thickness, screw, panel_thickness, extension ];
|
||||
|
||||
function strap_insert(type) = screw_insert(strap_screw(type)); //! The insert type
|
||||
function strap_key(type) = strap_panel(type) - panel_clearance;
|
||||
function strap_height(type) = wall + max(insert_length(strap_insert(type)) - strap_key(type), strap_thickness(type) + clearance); //! Height of the ends
|
||||
|
68
readme.md
@@ -235,7 +235,7 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey20, tooth_colour = grey50)``` | Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified |
|
||||
| ```belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey(20)``` | Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified |
|
||||
|
||||

|
||||
|
||||
@@ -523,6 +523,8 @@ Various electronic components used in hot ends and heated beds.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```TO220_thickness()``` | Thickness of the tab of a TO220 |
|
||||
| ```fack2spm_bezel_size()``` | FACK2SPM Bezel dimensions |
|
||||
| ```fack2spm_screw()``` | Screw type for FACK2SPM |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -531,6 +533,9 @@ Various electronic components used in hot ends and heated beds.
|
||||
| ```al_clad_resistor(type, value, leads = true)``` | Draw an aluminium clad resistor |
|
||||
| ```al_clad_resistor_hole_positions(type)``` | Position children at the screw holes of an aluminium clad resistor |
|
||||
| ```al_clad_resistor_holes(type, h = 100)``` | Drill screw holes for an aluminium clad resistor |
|
||||
| ```fack2spm()``` | Draw a FACK2SPM Cat5E RJ45 shielded panel mount coupler |
|
||||
| ```fack2spm_hole_positions()``` | Place children at the FACK2SPM mounting hole positions |
|
||||
| ```fack2spm_holes(h = 0)``` | Cut the holes for a FACK2SPM |
|
||||
| ```panel_USBA()``` | Draw a panel mount USBA connector |
|
||||
| ```panel_USBA_hole_positions()``` | Place children at hole positions |
|
||||
| ```panel_USBA_holes(h = 100)``` | Make holes for USBA connector |
|
||||
@@ -555,6 +560,7 @@ Various electronic components used in hot ends and heated beds.
|
||||
| 4 | ```screw(M2p5_pan_screw, 16)``` | Screw M2.5 pan x 16mm |
|
||||
| 4 | ```screw(M3_pan_screw, 16)``` | Screw M3 pan x 16mm |
|
||||
| 1 | ```panel_USBA()``` | Socket USB A panel mount |
|
||||
| 1 | ```tuk_fack2spm()``` | TUK FACK2SPM Cat5E RJ45 shielded panel mount coupler |
|
||||
| 1 | ```thermal_cutout(TC)``` | Thermal cutout TC |
|
||||
| 1 | ```resistor(Epcos)``` | Thermistor Epcos B57560G104F 100K 1% |
|
||||
| 1 | ```resistor(EpcosBlue)``` | Thermistor Epcos B57861S104F40 100K 1% |
|
||||
@@ -1433,7 +1439,7 @@ The 7 SEGMENT.TTF font from the [docs](docs) directory needs to be installed to
|
||||
| ```meter_lug_size(type)``` | Lug length and width |
|
||||
| ```meter_offset(type)``` | Display position, 0 = center, +1 = top |
|
||||
| ```meter_pcb_size(type)``` | PCB size excluding lugs |
|
||||
| ```meter_shunt(type)``` | Ampmeter shunt wire |
|
||||
| ```meter_shunt(type)``` | Ammeter shunt wire |
|
||||
| ```meter_size(type)``` | Size of display |
|
||||
|
||||
### Functions
|
||||
@@ -1443,6 +1449,7 @@ The 7 SEGMENT.TTF font from the [docs](docs) directory needs to be installed to
|
||||
| ```meter_bezel_rad(type)``` | Printed bezel corner radius |
|
||||
| ```meter_bezel_wall(type)``` | Printed bezel wall thickness |
|
||||
| ```meter_bezel_width(type)``` | Printed bezel width |
|
||||
| ```meter_shunt_y(type)``` | Shunt y coordinate |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -1970,10 +1977,18 @@ Notes on the DSN_VC288:
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```pmeter_aperture(type)``` | Aperture length, width and bevel |
|
||||
| ```pmeter_bevel(type)``` | Bezel bevel inset and start height |
|
||||
| ```pmeter_bevel(type)``` | Bezel bevel inset and start height or a radius |
|
||||
| ```pmeter_bezel(type)``` | Bezel size |
|
||||
| ```pmeter_bezel_r(type)``` | Bezel radius |
|
||||
| ```pmeter_button_colour(type)``` | Button colour |
|
||||
| ```pmeter_button_pos(type)``` | Button position |
|
||||
| ```pmeter_button_r(type)``` | Button radius |
|
||||
| ```pmeter_button_size(type)``` | Button size |
|
||||
| ```pmeter_buttons(type)``` | List of buttons |
|
||||
| ```pmeter_inner_ap(type)``` | Inner aperture |
|
||||
| ```pmeter_inner_ap_o(type)``` | Inner aperture offset |
|
||||
| ```pmeter_pcb(type)``` | Optional PCB for open types |
|
||||
| ```pmeter_pcb_h(type)``` | Component height from the front |
|
||||
| ```pmeter_pcb_z(type)``` | Distance of PCB from the back |
|
||||
| ```pmeter_size(type)``` | Body size including bezel height |
|
||||
| ```pmeter_tab(type)``` | Tab size |
|
||||
@@ -1989,6 +2004,7 @@ Notes on the DSN_VC288:
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```panel_meter(type)``` | Draw panel mounted LCD meter module |
|
||||
| ```panel_meter_button(type)``` | Draw panel meter button |
|
||||
| ```panel_meter_cutout(type, h = 0)``` | Make panel cutout |
|
||||
|
||||

|
||||
@@ -1999,6 +2015,7 @@ Notes on the DSN_VC288:
|
||||
| 1 | ```panel_meter(DSN_VC288)``` | DSN-VC288 DC 100V 10A Voltmeter ammeter |
|
||||
| 1 | ```panel_meter(PZEM001)``` | Peacefair PZEM-001 AC digital multi-function meter |
|
||||
| 1 | ```panel_meter(PZEM021)``` | Peacefair PZEM-021 AC digital multi-function meter |
|
||||
| 1 | ```panel_meter(DSP5005)``` | Ruideng DSP5005 Power supply module |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2050,6 +2067,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
||||
| ```block(size, colour, makes_cutout, cutouts)``` | Draw a coloured cube to represent a random PCB component |
|
||||
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
|
||||
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
|
||||
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
|
||||
@@ -2083,7 +2101,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```box_header(2p54header, 4, 2, smt = 0)``` | Box header 4 x 2 |
|
||||
| 1 | ```box_header(2p54header, 4, 2)``` | Box header 4 x 2 |
|
||||
| 1 | ```d_plug(DCONN9, pcb = true)``` | D-type 9 way PCB mount plug |
|
||||
| 1 | ```dil_socket(12, 15.24)``` | DIL socket 24 x 0.6" |
|
||||
| 1 | ```hdmi(hdmi_full)``` | HDMI socket |
|
||||
@@ -2096,12 +2114,11 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | ```microswitch(small_microswitch)``` | Microswitch DM1-00P-110-3 |
|
||||
| 1 | ```hdmi(hdmi_mini)``` | Mini HDMI socket |
|
||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||
| 1 | ```pin_header(2p54header, 4, 1, smt = 0)``` | Pin header 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 5, 1, smt = undef)``` | Pin header 5 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 4, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 4, 1)``` | Pin header 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 5, 1)``` | Pin header 5 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 4, 1)``` | Pin socket 4 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 6, 1)``` | Pin socket 6 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 8, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 8 x 1 |
|
||||
| 2 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
|
||||
| 1 | ```ax_res(res1_2, 10, tol = 10)``` | Resistor 10 Ohms 10% 0.5W |
|
||||
| 1 | ```ax_res(res1_4, 100, tol = 2)``` | Resistor 100 Ohms 2% 0.25W |
|
||||
| 1 | ```ax_res(res1_8, 1000)``` | Resistor 1000 Ohms 5% 0.125W |
|
||||
@@ -2174,6 +2191,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
||||
| ```block(size, colour, makes_cutout, cutouts)``` | Draw a coloured cube to represent a random PCB component |
|
||||
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
|
||||
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
|
||||
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
|
||||
@@ -2573,10 +2591,10 @@ Linear rails with carriages.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```carriage(type, rail, end_colour = grey20, wiper_colour = grey20)``` | Draw the specified carriage |
|
||||
| ```carriage(type, rail, end_colour = grey(20)``` | Draw the specified carriage |
|
||||
| ```carriage_hole_positions(type)``` | Position children over screw holes |
|
||||
| ```rail(type, length)``` | Draw the specified rail |
|
||||
| ```rail_assembly(type, length, pos, carriage_end_colour = grey20, carriage_wiper_colour = grey20)``` | Rail and carriage assembly |
|
||||
| ```rail_assembly(type, length, pos, carriage_end_colour = grey(20)``` | Rail and carriage assembly |
|
||||
| ```rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)``` | Position children over screw holes |
|
||||
| ```rail_screws(type, length, thickness, screws = 100)``` | Place screws in the rail |
|
||||
|
||||
@@ -3854,6 +3872,7 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
| ```box_height(type)``` | Internal height |
|
||||
| ```box_screw(type)``` | Screw type to be used at the corners |
|
||||
| ```box_sheets(type)``` | Sheet type used for the sides |
|
||||
| ```box_shelf_screw(type)``` | Screw type to hold a shelf |
|
||||
| ```box_top_sheet(type)``` | Sheet type for the top |
|
||||
| ```box_wall(type)``` | Wall thickness of 3D parts |
|
||||
| ```box_width(type)``` | Internal width |
|
||||
@@ -3861,6 +3880,7 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```box(screw, wall, sheets, top_sheet, base_sheet, size, feet = false, shelf_screw = M3_dome_screw)``` | Construct a property list for a box. |
|
||||
| ```box_bezel_height(type, bottom)``` | Bezel height for top or bottom |
|
||||
| ```box_corner_gap(type)``` | Gap between box_sheets at the corners to connect inside and outside profiles |
|
||||
| ```box_inset(type)``` | How much the bezel intrudes on the specified width and length, away from the corners |
|
||||
@@ -3880,6 +3900,7 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
| ```box_corner_profile(type)``` | Generates the corner profile STL for 3D printing. |
|
||||
| ```box_corner_profile_2D(type)``` | The 2D shape of the corner profile. |
|
||||
| ```box_corner_profile_section(type, section, sections)``` | Generates interlocking sections of the corner profile to allow it to be taller than the printer |
|
||||
| ```box_corner_profile_sections(type, section, sections)``` | Generate four copies of a corner profile section |
|
||||
| ```box_front(type)``` | Default front, can be overridden to customise |
|
||||
| ```box_front_blank(type, sheet = false)``` | Generates a 2D template for the front sheet, ```sheet``` can be set to override the type |
|
||||
| ```box_left(type)``` | Default left side, can be overridden to customise |
|
||||
@@ -3887,6 +3908,9 @@ Normally the side sheets are the same type but they can be overridden individual
|
||||
| ```box_right(type)``` | Default right side, can be overridden to customise |
|
||||
| ```box_right_blank(type, sheet = false)``` | Generates a 2D template for the right sheet, ```sheet``` can be set to override the type |
|
||||
| ```box_shelf_blank(type, sheet = false)``` | Generates a 2D template for a shelf sheet |
|
||||
| ```box_shelf_bracket(type, screw_positions, wall = undef)``` | Generates a shelf bracket, the first optional child is a 2D cutout and the second 3D cutouts |
|
||||
| ```box_shelf_bracket_section(type, rows, cols, x, y)``` | Generates sections of the shelf bracket to allow it to be bigger than the printer |
|
||||
| ```box_shelf_screw_positions(type, screw_positions, thickness = 0, wall = undef)``` | Place children at the shelf screw positions |
|
||||
| ```box_top(type)``` | Default top, can be overridden to customise |
|
||||
| ```box_top_blank(type)``` | Generates a 2D template for the top sheet |
|
||||
| ```grill(width, height, r = 1000, poly = false, h = 0)``` | A staggered array of 5mm holes to make grills in sheets. Can be constrained to be circular. Set ```poly``` ```true``` for printing, ```false``` for milling. |
|
||||
@@ -3972,6 +3996,7 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```bbox(screw, sheets, base_sheet, top_sheet, span, size, name = "bbox", skip_blocks = [], star_washers = true)``` | Construct the property list for a butt_box |
|
||||
| ```bbox_area(type)``` | Internal surdface area in m^2 |
|
||||
| ```bbox_volume(type)``` | Internal volume in litres |
|
||||
|
||||
@@ -4439,6 +4464,11 @@ This allows the hinges and one set of screws to belong to one assembly and the o
|
||||
| ```hinge_thickness(type)``` | Thickness of the leaves |
|
||||
| ```hinge_width(type)``` | Width |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```flat_hinge(name, size, pin_d, knuckle_d, knuckles, screw, screws, clearance, margin)``` | Construct the property list for a flat hinge. |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
@@ -4500,6 +4530,7 @@ inserts don't grip well in rubber.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```Foot(d, h, t, r, screw, slant = 10)``` | Construct a foot property list |
|
||||
| ```insert_foot()``` | Default foot with insert |
|
||||
|
||||
### Modules
|
||||
@@ -4670,6 +4701,7 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```pbox(name, wall, top_t, base_t, radius, size, foot = false, screw = false, ridges = [0, 0])``` | Construct a printed box property list |
|
||||
| ```pbox_inclusion(type)``` | How far the ledge for the base extends inwards |
|
||||
| ```pbox_insert(type)``` | The insert for the base screws |
|
||||
| ```pbox_screw(type)``` | Foot screw if got feet else base_screw |
|
||||
@@ -4685,6 +4717,8 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
| ```pbox_base(type)``` | Generate the STL for the base |
|
||||
| ```pbox_base_screws(type, thickness = 0)``` | Place the screws and feet |
|
||||
| ```pbox_inserts(type)``` | Place the inserts for the base screws |
|
||||
| ```pbox_outer_shape(type)``` | 2D outer shape of the box |
|
||||
| ```pbox_screw_positions(type)``` | Place children at base screw positions |
|
||||
|
||||

|
||||
|
||||
@@ -4997,6 +5031,7 @@ be fully customised by passing a list of properties.
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```strap(width = 18, thickness = 2, screw = M3_pan_screw, panel_thickness = 3, extension = 25)``` | Construct a property list for a strap |
|
||||
| ```strap_end_width(type = strap)``` | Width of the ends |
|
||||
| ```strap_height(type)``` | Height of the ends |
|
||||
| ```strap_insert(type)``` | The insert type |
|
||||
@@ -5181,12 +5216,18 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```angle_between(v1, v2)``` | Return the angle between two vectors |
|
||||
| ```augment(m)``` | Augment a matrix by adding an identity matrix to the right |
|
||||
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
|
||||
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
||||
| ```invert(m)``` | Invert a matrix |
|
||||
| ```nearly_zero(x)``` | True if x is close to zero |
|
||||
| ```reverse(v)``` | Reverse a vector |
|
||||
| ```rot3_z(a)``` | Generate a 3x3 matrix to rotate around z |
|
||||
| ```rotate(a, v)``` | Generate a 4x4 rotation matrix, ```a``` can be a vector of three angles or a single angle around ```z```, or around axis ```v``` |
|
||||
| ```rowswap(m, i, j)``` | Swap two rows of a matrix |
|
||||
| ```scale(v)``` | Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally |
|
||||
| ```solve(m, i = 0, j = 0)``` | Solve each row ensuring diagonal is not zero |
|
||||
| ```solve_row(m, i)``` | Make diagonal one by dividing the row by it and subtract from other rows to make column zero |
|
||||
| ```transform(v, m)``` | Apply 4x4 transform to a 3 vector by extending it and cropping it again |
|
||||
| ```transform_points(path, m)``` | Apply transform to a path |
|
||||
| ```translate(v)``` | Generate a 4x4 translation matrix, ```v``` can be ```[x, y]```, ```[x, y, z]``` or ```z``` |
|
||||
@@ -5195,6 +5236,11 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| ```vec3(v)``` | Return a 3 vector with the first three elements of ```v``` |
|
||||
| ```vec4(v)``` | Return a 4 vector with the first three elements of ```v``` |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```position_children(list, t)``` | Position children if they are on the Z = 0 plane when transformed by t |
|
||||
|
||||

|
||||
|
||||
|
||||
|
@@ -213,7 +213,7 @@ def parse_bom(file = "openscad.log", name = None):
|
||||
main.assemblies[stack[-1]].add_part(s)
|
||||
else:
|
||||
if 'ERROR:' in line or 'WARNING:' in line:
|
||||
print(line[:-1])
|
||||
raise Exception(line[:-1])
|
||||
return main
|
||||
|
||||
def usage():
|
||||
@@ -221,53 +221,57 @@ def usage():
|
||||
sys.exit(1)
|
||||
|
||||
def boms(target = None, assembly = None):
|
||||
bom_dir = set_config(target, usage) + "bom"
|
||||
if assembly:
|
||||
bom_dir += "/accessories"
|
||||
if not os.path.isdir(bom_dir):
|
||||
try:
|
||||
bom_dir = set_config(target, usage) + "bom"
|
||||
if assembly:
|
||||
bom_dir += "/accessories"
|
||||
if not os.path.isdir(bom_dir):
|
||||
os.makedirs(bom_dir)
|
||||
else:
|
||||
assembly = "main_assembly"
|
||||
if os.path.isdir(bom_dir):
|
||||
shutil.rmtree(bom_dir)
|
||||
sleep(0.1)
|
||||
os.makedirs(bom_dir)
|
||||
else:
|
||||
assembly = "main_assembly"
|
||||
if os.path.isdir(bom_dir):
|
||||
shutil.rmtree(bom_dir)
|
||||
sleep(0.1)
|
||||
os.makedirs(bom_dir)
|
||||
#
|
||||
# Find the scad file that makes the module
|
||||
#
|
||||
scad_file = find_scad_file(assembly)
|
||||
if not scad_file:
|
||||
raise Exception("can't find source for " + assembly)
|
||||
#
|
||||
# make a file to use the module
|
||||
#
|
||||
bom_maker_name = source_dir + "/bom.scad"
|
||||
with open(bom_maker_name, "w") as f:
|
||||
f.write("use <%s>\n" % scad_file)
|
||||
f.write("%s();\n" % assembly);
|
||||
#
|
||||
# Run openscad
|
||||
#
|
||||
openscad.run("-D", "$bom=2", "-D", "$preview=true", "--hardwarnings", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
|
||||
os.remove(bom_maker_name)
|
||||
print("Generating bom ...", end=" ")
|
||||
#
|
||||
# Find the scad file that makes the module
|
||||
#
|
||||
scad_file = find_scad_file(assembly)
|
||||
if not scad_file:
|
||||
raise Exception("can't find source for " + assembly)
|
||||
#
|
||||
# make a file to use the module
|
||||
#
|
||||
bom_maker_name = source_dir + "/bom.scad"
|
||||
with open(bom_maker_name, "w") as f:
|
||||
f.write("use <%s>\n" % scad_file)
|
||||
f.write("%s();\n" % assembly);
|
||||
#
|
||||
# Run openscad
|
||||
#
|
||||
openscad.run("-D", "$bom=2", "-D", "$preview=true", "--hardwarnings", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
|
||||
os.remove(bom_maker_name)
|
||||
print("Generating bom ...", end=" ")
|
||||
|
||||
main = parse_bom("openscad.echo", assembly)
|
||||
main = parse_bom("openscad.echo", assembly)
|
||||
|
||||
if assembly == "main_assembly":
|
||||
main.print_bom(True, open(bom_dir + "/bom.txt","wt"))
|
||||
if assembly == "main_assembly":
|
||||
main.print_bom(True, open(bom_dir + "/bom.txt","wt"))
|
||||
|
||||
for ass in main.assemblies:
|
||||
with open(bom_dir + "/" + ass + ".txt", "wt") as f:
|
||||
bom = main.assemblies[ass]
|
||||
print(bom.make_name(ass) + ":", file=f)
|
||||
bom.print_bom(False, f)
|
||||
for ass in main.assemblies:
|
||||
with open(bom_dir + "/" + ass + ".txt", "wt") as f:
|
||||
bom = main.assemblies[ass]
|
||||
print(bom.make_name(ass) + ":", file=f)
|
||||
bom.print_bom(False, f)
|
||||
|
||||
data = [main.assemblies[ass].flat_data() for ass in main.ordered_assemblies]
|
||||
with open(bom_dir + "/bom.json", 'w') as outfile:
|
||||
json.dump(data, outfile, indent = 4)
|
||||
data = [main.assemblies[ass].flat_data() for ass in main.ordered_assemblies]
|
||||
with open(bom_dir + "/bom.json", 'w') as outfile:
|
||||
json.dump(data, outfile, indent = 4)
|
||||
|
||||
print("done")
|
||||
print("done")
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 3: usage()
|
||||
@@ -286,8 +290,4 @@ if __name__ == '__main__':
|
||||
if assembly:
|
||||
if assembly[-9:] != "_assembly": usage()
|
||||
|
||||
try:
|
||||
boms(target, assembly)
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
boms(target, assembly)
|
||||
|
@@ -27,6 +27,7 @@ import c14n_stl
|
||||
from set_config import *
|
||||
from deps import *
|
||||
from shutil import copyfile
|
||||
import re
|
||||
|
||||
source_dirs = { "stl" : "platters", "dxf" : "panels" }
|
||||
target_dirs = { "stl" : "printed", "dxf" : "routed" }
|
||||
@@ -38,43 +39,52 @@ def plateup(target, part_type, usage = None):
|
||||
top_dir = set_config(target, usage)
|
||||
parts_dir = top_dir + part_type + 's'
|
||||
target_dir = parts_dir + '/' + target_dirs[part_type]
|
||||
source_dir = top_dir + source_dirs[part_type]
|
||||
deps_dir = source_dir + "/deps"
|
||||
if not os.path.isdir(source_dir):
|
||||
return
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
if not os.path.isdir(deps_dir):
|
||||
os.makedirs(deps_dir)
|
||||
source_dir1 = source_dirs[part_type]
|
||||
source_dir2 = top_dir + source_dirs[part_type]
|
||||
#
|
||||
# Decide which files to make
|
||||
#
|
||||
sources = [file for file in os.listdir(source_dir) if file.endswith('.scad')]
|
||||
#
|
||||
# Run OpenSCAD on the source files to make the targets
|
||||
# Loop through source directories
|
||||
#
|
||||
used = []
|
||||
for src in sources:
|
||||
src_file = source_dir + '/' + src
|
||||
part_file = target_dir + '/' + src[:-4] + part_type
|
||||
dname = deps_name(deps_dir, src)
|
||||
changed = check_deps(part_file, dname)
|
||||
if changed:
|
||||
print(changed)
|
||||
openscad.run("-D$bom=1", "-d", dname, "-o", part_file, src_file)
|
||||
if part_type == 'stl':
|
||||
c14n_stl.canonicalise(part_file)
|
||||
log_name = 'openscad.log'
|
||||
else:
|
||||
log_name = 'openscad.echo'
|
||||
openscad.run_silent("-D$bom=1", "-o", log_name, src_file)
|
||||
for dir in [source_dir1, source_dir2]:
|
||||
if not os.path.isdir(dir):
|
||||
continue
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
#
|
||||
# Add the files on the BOM to the used list
|
||||
# Make the deps dir
|
||||
#
|
||||
with open(log_name) as file:
|
||||
for line in file.readlines():
|
||||
if line.startswith('ECHO: "~') and line.endswith('.' + part_type + '"\n'):
|
||||
used.append(line[8:-2])
|
||||
deps_dir = dir + "/deps"
|
||||
if not os.path.isdir(deps_dir):
|
||||
os.makedirs(deps_dir)
|
||||
#
|
||||
# Decide which files to make
|
||||
#
|
||||
sources = [file for file in os.listdir(dir) if file.endswith('.scad')]
|
||||
#
|
||||
# Run OpenSCAD on the source files to make the targets
|
||||
#
|
||||
for src in sources:
|
||||
src_file = dir + '/' + src
|
||||
part_file = target_dir + '/' + src[:-4] + part_type
|
||||
dname = deps_name(deps_dir, src)
|
||||
changed = check_deps(part_file, dname)
|
||||
if changed:
|
||||
print(changed)
|
||||
openscad.run("-D$bom=1", "-d", dname, "-o", part_file, src_file)
|
||||
if part_type == 'stl':
|
||||
c14n_stl.canonicalise(part_file)
|
||||
log_name = 'openscad.log'
|
||||
else:
|
||||
log_name = 'openscad.echo'
|
||||
openscad.run_silent("-D$bom=1", "-o", log_name, src_file)
|
||||
#
|
||||
# Add the files on the BOM to the used list
|
||||
#
|
||||
with open(log_name) as file:
|
||||
for line in file.readlines():
|
||||
match = re.match(r'^ECHO: "~(.*?\.' + part_type + r').*"$', line)
|
||||
if match:
|
||||
used.append(match.group(1))
|
||||
#
|
||||
# Copy file that are not included
|
||||
#
|
||||
|
@@ -30,7 +30,7 @@ def usage():
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
if len(sys.argv) > 2: usage()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
target = sys.argv[1]
|
||||
|
@@ -34,7 +34,7 @@ TMC2130 = ["TMC2130", "TMC2130",
|
||||
[
|
||||
[ 10, 1, 0, "-2p54header", 8, 1 ,undef, "blue" ],
|
||||
[ 10, 13, 0, "-2p54header", 8, 1],
|
||||
[ 12, 7, 0, "-chip", 6, 4, 1, grey20 ],
|
||||
[ 12, 7, 0, "-chip", 6, 4, 1, grey(20) ],
|
||||
// mock up a heat sink
|
||||
[ 10, 7, 0, "block", 9, 9, 2, TMC2130HeatSinkColor ],
|
||||
[ 10, 11, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
|
||||
@@ -61,11 +61,11 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 20, -15, 0, "trimpot10", true],
|
||||
[ 10, 2, 0, "smd_led", LED0805, "red"],
|
||||
[ 10, 10, 0, "2p54header", 4, 1],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, undef, "blue" ],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, false, "blue" ],
|
||||
[ 10, 20, 0, "2p54boxhdr", 4, 2],
|
||||
[ 10, 30, 0, "2p54socket", 6, 1],
|
||||
[ 25, 30, 0, "2p54socket", 4, 1, undef, undef, undef, "red" ],
|
||||
[ 10, 40, 0, "chip", 10, 5, 1, grey20],
|
||||
[ 25, 30, 0, "2p54socket", 4, 1, false, 0, false, "red" ],
|
||||
[ 10, 40, 0, "chip", 10, 5, 1, grey(20)],
|
||||
[ 5, 50, 0, "led", LED3mm, "red"],
|
||||
[ 12, 50, 0, "led", LED5mm, "orange"],
|
||||
[ 25, 50, 0, "led", LED10mm, "yellow"],
|
||||
@@ -97,7 +97,7 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 50, 50, 0, "molex_hdr", 2],
|
||||
[ 50, 60, 0, "jst_xh", 2],
|
||||
[ 50, 70, 180, "term254", 3],
|
||||
[ 63, 70, 180, "term254", 3, undef, grey20],
|
||||
[ 63, 70, 180, "term254", 3, undef, grey(20)],
|
||||
[ 75, 70, 180, "gterm508",2, undef, "blue"],
|
||||
|
||||
[ 50, 90, 180, "gterm35", 4, [1,2]],
|
||||
@@ -107,7 +107,7 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
|
||||
[ 55, 110, 180, "gterm635", 2],
|
||||
[ 75, 110, 180, "gterm635", 2, undef, "blue"],
|
||||
[ 90, 110, 180, "gterm", gt_5x17, 2, undef, grey20],
|
||||
[ 90, 110, 180, "gterm", gt_5x17, 2, undef, grey(20)],
|
||||
|
||||
[ 50, 130, 180, "term35", 4],
|
||||
[ 70, 130, 180, "term35", 3, "lime"],
|
||||
@@ -119,7 +119,7 @@ test_pcb = ["TestPCB", "Test PCB",
|
||||
[ 80, 200, 0, "pdip", 24, "27C32", true, inch(0.6) ],
|
||||
[ 80, 170, 0, "pdip", 8, "NE555" ],
|
||||
[ 52, 206, 0, "2p54socket", 8, 1 ],
|
||||
[ 52, 194, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
|
||||
[ 52, 194, 0, "2p54socket", 8, 1, false, 0, false, "red" ],
|
||||
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
|
||||
[ 50, 240, 0, "potentiometer"],
|
||||
[ 75, 240, 0, "potentiometer", 7, 8],
|
||||
|
@@ -65,7 +65,7 @@ module belt_test() {
|
||||
translate([-25, 0])
|
||||
layout([for(b = belts) belt_width(b)], 10)
|
||||
rotate([0, 90, 0])
|
||||
belt(belts[$i], [[0, 0, 20], [0, 1, 20]], belt_colour = $i%2==0 ? grey90 : grey20, tooth_colour = $i%2==0 ? grey70 : grey50);
|
||||
belt(belts[$i], [[0, 0, 20], [0, 1, 20]], belt_colour = $i%2==0 ? grey(90) : grey(20), tooth_colour = $i%2==0 ? grey(70) : grey(50));
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -23,7 +23,7 @@ use <../vitamins/insert.scad>
|
||||
|
||||
use <../printed/box.scad>
|
||||
|
||||
box = [M3_dome_screw, 3, DiBond, PMMA3, DiBond6, true, 150, 100, 70];
|
||||
box = box(screw = M3_dome_screw, wall = 3, sheets = DiBond, top_sheet = PMMA3, base_sheet = DiBond6, feet = true, size = [150, 100, 70]);
|
||||
|
||||
include <../printed/box_assembly.scad>
|
||||
|
||||
|
@@ -25,7 +25,7 @@ include <../printed/butt_box.scad>
|
||||
|
||||
$explode = 0;
|
||||
|
||||
box = [M3_dome_screw, DiBond, DiBond6, PMMA3, 250, 400, 300, 120];
|
||||
box = bbox(screw = M3_dome_screw, sheets = DiBond, base_sheet = DiBond6, top_sheet = PMMA3, span = 250, size = [400, 300, 120]);
|
||||
|
||||
module bbox_assembly() _bbox_assembly(box);
|
||||
|
||||
|
@@ -41,9 +41,12 @@ module components() {
|
||||
translate([0, 50])
|
||||
TO220("Generic TO220 package");
|
||||
|
||||
translate([50, 50])
|
||||
translate([40, 50])
|
||||
panel_USBA();
|
||||
|
||||
translate([80, 50])
|
||||
fack2spm();
|
||||
|
||||
translate([0,80])
|
||||
thermal_cutouts();
|
||||
|
||||
|
@@ -32,8 +32,8 @@ clearance = 0.2;
|
||||
|
||||
angle = 0; // [-90 : 180]
|
||||
|
||||
big_hinge = ["big", width, depth, thickness, pin_diameter, knuckle_diameter, knuckles, M3_dome_screw, screws, clearance, margin];
|
||||
small_hinge = ["small", 20, 16, 2, 2.85, 7, 3, M3_dome_screw, 2, 0.2, 0];
|
||||
big_hinge = flat_hinge(name = "big", size = [width, depth, thickness], pin_d = pin_diameter, knuckle_d = knuckle_diameter, knuckles = knuckles, screw = M3_dome_screw, screws = screws, clearance = clearance, margin = margin);
|
||||
small_hinge = flat_hinge(name = "small", size =[ 20, 16, 2], pin_d = 2.85, knuckle_d = 7, knuckles = 3, screw = M3_dome_screw, screws = 2, clearance = 0.2, margin = 0);
|
||||
|
||||
hinges = [small_hinge, big_hinge];
|
||||
|
||||
|
@@ -22,7 +22,7 @@ use <../utils/layout.scad>
|
||||
include <../vitamins/panel_meters.scad>
|
||||
|
||||
module panel_meters()
|
||||
layout([for(p = panel_meters) pmeter_size(p).x], 20)
|
||||
layout([for(p = panel_meters) pmeter_bezel(p).x], 10)
|
||||
panel_meter(panel_meters[$i]);
|
||||
|
||||
if($preview)
|
||||
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 251 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 108 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 60 KiB |
@@ -21,25 +21,25 @@ include <../core.scad>
|
||||
use <../printed/foot.scad>
|
||||
use <../printed/printed_box.scad>
|
||||
|
||||
foot = [13, 5, 2, 1, M3_pan_screw, 10];
|
||||
foot = Foot(d = 13, h = 5, t = 2, r = 1, screw = M3_pan_screw);
|
||||
module foot_stl() foot(foot);
|
||||
|
||||
wall = 2;
|
||||
top_thickness = 2;
|
||||
base_thickness = 2;
|
||||
case_inner_rad = 8;
|
||||
inner_rad = 8;
|
||||
|
||||
width = 80;
|
||||
depth = 45;
|
||||
height = 40;
|
||||
|
||||
box1 = ["box1", wall, top_thickness, base_thickness, false, M2_cap_screw, case_inner_rad, [8, 1], width, depth, height];
|
||||
box2 = ["smooth_box", wall, top_thickness, base_thickness, foot, false, case_inner_rad, [0, 0], width, depth, height];
|
||||
box1 = pbox(name = "box1", wall = wall, top_t = top_thickness, base_t = base_thickness, radius = inner_rad, size = [width, depth, height], screw = M2_cap_screw, ridges = [8, 1]);
|
||||
box2 = pbox(name = "smooth_box", wall = wall, top_t = top_thickness, base_t = base_thickness, radius = inner_rad, size = [width, depth, height], foot = foot);
|
||||
|
||||
module box1_feet_positions() {
|
||||
clearance = 2;
|
||||
foot_r = foot_diameter(foot) / 2;
|
||||
x_inset = case_inner_rad + foot_r - pbox_ridges(box1).y;
|
||||
x_inset = inner_rad + foot_r - pbox_ridges(box1).y;
|
||||
z_inset = foot_r + clearance;
|
||||
h = height + base_thickness;
|
||||
|
||||
|
@@ -33,7 +33,7 @@ module rails()
|
||||
nut = screw_nut(screw);
|
||||
washer = screw_washer(screw);
|
||||
|
||||
rail_assembly(rail, length, rail_travel(rail, length) / 2, $i<2 ? grey20 : "green", $i<2 ? grey20 : "red");
|
||||
rail_assembly(rail, length, rail_travel(rail, length) / 2, $i<2 ? grey(20) : "green", $i<2 ? grey(20) : "red");
|
||||
|
||||
rail_screws(rail, length, sheet + nut_thickness(nut, true) + washer_thickness(washer));
|
||||
|
||||
|
@@ -28,12 +28,12 @@ use <global.scad>
|
||||
|
||||
module use_stl(name) { //! Import an STL to make a build platter
|
||||
stl(name);
|
||||
|
||||
import(str("../stls/", name, ".stl"));
|
||||
path = is_undef($target) ? "../stls/" : str("../", $target, "/stls/");
|
||||
import(str(path, name, ".stl"));
|
||||
}
|
||||
|
||||
module use_dxf(name) { //! Import a DXF to make a build panel
|
||||
dxf(name);
|
||||
|
||||
import(str("../dxfs/", name, ".dxf"));
|
||||
path = is_undef($target) ? "../dxfs/" : str("../", $target, "/dxfs/");
|
||||
import(str(path, name, ".dxf"));
|
||||
}
|
||||
|
@@ -90,3 +90,42 @@ function euler(R) = let(ay = asin(-R[2][0]), cy = cos(ay)) //! Convert a rotatio
|
||||
cy ? [ atan2(R[2][1] / cy, R[2][2] / cy), ay, atan2(R[1][0] / cy, R[0][0] / cy) ]
|
||||
: R[2][0] < 0 ? [atan2( R[0][1], R[0][2]), 180, 0]
|
||||
: [atan2(-R[0][1], -R[0][2]), -180, 0];
|
||||
|
||||
module position_children(list, t) //! Position children if they are on the Z = 0 plane when transformed by t
|
||||
for(p = list)
|
||||
let(q = t * p)
|
||||
if(abs(transform([0, 0, 0], q).z) < 0.01)
|
||||
multmatrix(q)
|
||||
children();
|
||||
|
||||
// Matrix inversion: https://www.mathsisfun.com/algebra/matrix-inverse-row-operations-gauss-jordan.html
|
||||
|
||||
function augment(m) = let(l = len(m), n = identity(l)) [ //! Augment a matrix by adding an identity matrix to the right
|
||||
for(i = [0 : l - 1])
|
||||
concat(m[i], n[i])
|
||||
];
|
||||
|
||||
function rowswap(m, i, j) = [ //! Swap two rows of a matrix
|
||||
for(k = [0 : len(m) - 1])
|
||||
k == i ? m[j] : k == j ? m[i] : m[k]
|
||||
];
|
||||
|
||||
function solve_row(m, i) = let(diag = m[i][i]) [ //! Make diagonal one by dividing the row by it and subtract from other rows to make column zero
|
||||
for(j = [0 : len(m) - 1])
|
||||
i == j ? m[j] / diag : m[j] - m[i] * m[j][i] / diag
|
||||
];
|
||||
|
||||
function nearly_zero(x) = abs(x) < 1e-5; //! True if x is close to zero
|
||||
|
||||
function solve(m, i = 0, j = 0) = //! Solve each row ensuring diagonal is not zero
|
||||
i < len(m) ?
|
||||
assert(i + j < len(m), "matrix is singular")
|
||||
solve(!nearly_zero(m[i + j][i]) ? solve_row(j ? rowswap(m, i, i + j) : m, i) : solve(m, i, j + 1), i + 1)
|
||||
: m;
|
||||
|
||||
function invert(m) = let(n =len(m), m = solve(augment(m))) [ //! Invert a matrix
|
||||
for(i = [0 : n - 1]) [
|
||||
for(j = [n : 2 * n - 1])
|
||||
each m[i][j]
|
||||
]
|
||||
];
|
||||
|
@@ -41,7 +41,7 @@ function no_point(str) = chr([for(c = str) if(c == ".") ord("p") else ord(c)]);
|
||||
// We model the belt path at the pitch radius of the pulleys and the pitch line of the belt to get an accurate length.
|
||||
// The belt is then drawn by offseting each side from the pitch line.
|
||||
//
|
||||
module belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey20, tooth_colour = grey50) { //! Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified
|
||||
module belt(type, points, gap = 0, gap_pt = undef, belt_colour = grey(20), tooth_colour = grey(50)) { //! Draw a belt path given a set of points and pitch radii where the pulleys are. Closed loop unless a gap is specified
|
||||
width = belt_width(type);
|
||||
pitch = belt_pitch(type);
|
||||
thickness = belt_thickness(type);
|
||||
|
@@ -39,7 +39,7 @@ function blower_top(type) = type[14]; //! Thickness of the top
|
||||
function blower_wall(type) = type[15]; //! Side wall thickness
|
||||
function blower_lug(type) = type[16]; //! Height of the lugs
|
||||
|
||||
fan_colour = grey20;
|
||||
fan_colour = grey(20);
|
||||
|
||||
module blower(type) { //! Draw specified blower
|
||||
length = blower_length(type);
|
||||
|
@@ -46,7 +46,7 @@ module square_button(type, colour = "yellow") { //! Draw square button with spec
|
||||
pitch = (w/ 2 - wall - rivit * 0.75);
|
||||
stem = square_button_cap_stem(type);
|
||||
|
||||
color(grey20) {
|
||||
color(grey(20)) {
|
||||
rounded_rectangle([w, w, h - 0.5], r = wall, center = false);
|
||||
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
|
@@ -33,7 +33,7 @@ function circlip_a(type) = type[5]; //! Size of the lugs
|
||||
function circlip_b(type) = type[6]; //! Widest part of the taper
|
||||
function circlip_d5(type) = type[7]; //! Plier hole diameter
|
||||
|
||||
circlip_colour = grey20;
|
||||
circlip_colour = grey(20);
|
||||
closed_angle = 25;
|
||||
|
||||
module internal_circlip(type, open = 0) { //! Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install
|
||||
|
@@ -28,6 +28,7 @@ include <../core.scad>
|
||||
include <tubings.scad>
|
||||
include <spades.scad>
|
||||
use <../utils/rounded_cylinder.scad>
|
||||
use <../utils/dogbones.scad>
|
||||
|
||||
function resistor_length(type) = type[2]; //! Body length
|
||||
function resistor_diameter(type) = type[3]; //! Body diameter
|
||||
@@ -447,3 +448,75 @@ module thermal_cutout(type) { //! Draw specified thermal cutout
|
||||
thermal_cutout_hole_positions(type)
|
||||
children();
|
||||
}
|
||||
|
||||
function fack2spm_bezel_size() = [19.2, 35.5, 2.6, 2]; //! FACK2SPM Bezel dimensions
|
||||
|
||||
module fack2spm_hole_positions() //! Place children at the FACK2SPM mounting hole positions
|
||||
for(end = [-1, 1])
|
||||
translate([0, end * 28.96 / 2])
|
||||
children();
|
||||
|
||||
function fack2spm_screw() = M3_dome_screw; //! Screw type for FACK2SPM
|
||||
|
||||
module fack2spm_holes(h = 0) { //! Cut the holes for a FACK2SPM
|
||||
fack2spm_hole_positions()
|
||||
drill(screw_clearance_radius(fack2spm_screw()), h);
|
||||
|
||||
dogbone_rectangle([17.15, 22.86, h]);
|
||||
}
|
||||
|
||||
module fack2spm() { //! Draw a FACK2SPM Cat5E RJ45 shielded panel mount coupler
|
||||
vitamin("tuk_fack2spm(): TUK FACK2SPM Cat5E RJ45 shielded panel mount coupler");
|
||||
|
||||
bezel = fack2spm_bezel_size();
|
||||
body = [16.8, 22.8, 9.8];
|
||||
socket = [14.5, 16.1, 29.6];
|
||||
y_offset = -(19.45 - 16.3) / 2;
|
||||
plug = [12, 6.8, 10];
|
||||
plug_y = y_offset - socket.y / 2 + 4 + plug.y / 2;
|
||||
tab1 = [4, 3];
|
||||
tab2 = [6.3, 1.6];
|
||||
|
||||
module socket()
|
||||
translate([0, y_offset])
|
||||
square([socket.x, socket.y], center = true);
|
||||
|
||||
color("silver") {
|
||||
linear_extrude(bezel.z)
|
||||
difference() {
|
||||
rounded_square([bezel.x, bezel.y], bezel[3]);
|
||||
|
||||
fack2spm_hole_positions()
|
||||
circle(d = 3.15);
|
||||
|
||||
socket();
|
||||
}
|
||||
|
||||
translate_z(bezel.z - body.z)
|
||||
linear_extrude(body.z - eps)
|
||||
difference() {
|
||||
square([body.x, body.y], center = true);
|
||||
|
||||
socket();
|
||||
}
|
||||
|
||||
translate_z(bezel.z - socket.z)
|
||||
linear_extrude(socket.z - 0.1)
|
||||
difference() {
|
||||
offset(-0.1) socket();
|
||||
|
||||
translate([0, plug_y]) {
|
||||
square([plug.x, plug.y], center = true);
|
||||
|
||||
translate([0, -plug.y / 2]) {
|
||||
square([tab1.x, 2 * tab1.y], center = true);
|
||||
|
||||
square([tab2.x, 2 * tab2.y], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
translate([0, plug_y, -socket.z / 2])
|
||||
cube([plug.x, plug.y, socket.z - 2 * plug.z], center = true);
|
||||
}
|
||||
}
|
||||
|
@@ -23,9 +23,9 @@
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/thread.scad>
|
||||
|
||||
d_pillar_colour = grey90;
|
||||
d_plug_shell_colour = grey80;
|
||||
d_plug_insulator_colour = grey20;
|
||||
d_pillar_colour = grey(90);
|
||||
d_plug_shell_colour = grey(80);
|
||||
d_plug_insulator_colour = grey(20);
|
||||
|
||||
function d_flange_length(type) = type[1]; //! Length of the flange
|
||||
function d_lengths(type) = type[2]; //! Lengths of the D for plug and socket
|
||||
|
@@ -91,7 +91,7 @@ module dil_socket(rows, w, pitch = inch(0.1)) {
|
||||
hole = [0.8, 0.5];
|
||||
pin_l = 3;
|
||||
|
||||
color(grey20) {
|
||||
color(grey(20)) {
|
||||
linear_extrude(h)
|
||||
difference() {
|
||||
square([width, length], center = true);
|
||||
@@ -129,7 +129,7 @@ module dip(n, part, size, w, pitch, pin) { //! Draw DIP package
|
||||
D = [3, 0.6];
|
||||
|
||||
translate_z(pdip_pin_s(pin)) {
|
||||
color(grey20) {
|
||||
color(grey(20)) {
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(size.x, center = true)
|
||||
difference() {
|
||||
|
@@ -122,7 +122,7 @@ module extrusion(type, length, center = true, cornerHole = false) { //! Draw the
|
||||
|
||||
vitamin(str("extrusion(", type[0], ", ", length, arg(cornerHole, false, "cornerHole"), "): Extrusion ", type[0], " x ", length, "mm"));
|
||||
|
||||
color(grey90)
|
||||
color(grey(90))
|
||||
linear_extrude(length, center = center)
|
||||
extrusion_cross_section(type, cornerHole);
|
||||
}
|
||||
|
@@ -28,7 +28,7 @@ use <nut.scad>
|
||||
use <washer.scad>
|
||||
use <../utils/tube.scad>
|
||||
|
||||
fan_colour = grey20;
|
||||
fan_colour = grey(20);
|
||||
|
||||
function fan_width(type) = type[0]; //! Width of square
|
||||
function fan_depth(type) = type[1]; //! Depth of fan
|
||||
|
@@ -61,7 +61,7 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
|
||||
//
|
||||
// Nut
|
||||
//
|
||||
colour = grey40;
|
||||
colour = grey(40);
|
||||
vflip()
|
||||
translate_z(thickness)
|
||||
explode(height) {
|
||||
|
@@ -33,8 +33,8 @@
|
||||
// h t s t t t
|
||||
// h
|
||||
//
|
||||
JHeadMk4 = ["JHeadMk4", jhead, "JHead MK4", 64, 5.1, 16, 50, grey20, 12, 4.64, 14, [0, 2.94, -5], 20, 20];
|
||||
JHeadMk5 = ["JHeadMk5", jhead, "JHead MK5", 51.2, 5.1, 16, 40, grey20, 12, 4.64, 13, [0, 2.38, -5], 20, 20];
|
||||
JHeadMk4 = ["JHeadMk4", jhead, "JHead MK4", 64, 5.1, 16, 50, grey(20), 12, 4.64, 14, [0, 2.94, -5], 20, 20];
|
||||
JHeadMk5 = ["JHeadMk5", jhead, "JHead MK5", 51.2, 5.1, 16, 40, grey(20), 12, 4.64, 13, [0, 2.38, -5], 20, 20];
|
||||
E3Dv5 = ["E3Dv5", e3d, "E3D V5 direct", 70, 3.7, 16, 50.1, "silver", 12, 6, 15, [1, 5, -4.5], 14.5, 28];
|
||||
E3Dv6 = ["E3Dv6", e3d, "E3D V6 direct", 62, 3.7, 16, 42.7, "silver", 12, 6, 15, [1, 5, -4.5], 14, 21];
|
||||
E3D_clone = ["E3D_clone", e3d, "E3D clone aliexpress",66, 6.8, 16, 46, "silver", 12, 5.6, 15, [1, 5, -4.5], 14.5, 21];
|
||||
|
@@ -29,7 +29,7 @@ flange_d = 45.5;
|
||||
flange_t = 1.5;
|
||||
flange_d2 = 32;
|
||||
flange_t2 = 2;
|
||||
apperture_d = 24.7;
|
||||
aperture_d = 24.7;
|
||||
hygrometer_hole_r = 21.3;
|
||||
slot_w = 5.5;
|
||||
|
||||
@@ -51,12 +51,12 @@ module hygrometer() { //! Draw a hygrometer
|
||||
vitamin("hygrometer(): Mini LCD Digital Thermometer / Hygrometer");
|
||||
|
||||
explode(40) {
|
||||
color(grey30)
|
||||
color(grey(30))
|
||||
rotate_extrude()
|
||||
polygon([
|
||||
[0, 0],
|
||||
[apperture_d / 2, 0],
|
||||
[apperture_d / 2, flange_t],
|
||||
[aperture_d / 2, 0],
|
||||
[aperture_d / 2, flange_t],
|
||||
[flange_d2 / 2, flange_t2],
|
||||
[flange_d / 2, flange_t],
|
||||
[flange_d / 2, 0],
|
||||
@@ -66,21 +66,21 @@ module hygrometer() { //! Draw a hygrometer
|
||||
]);
|
||||
|
||||
color("#94A7AB")
|
||||
cylinder(d = apperture_d, h = eps);
|
||||
cylinder(d = aperture_d, h = eps);
|
||||
|
||||
color("black")
|
||||
linear_extrude(0.2, center = true) {
|
||||
translate([0, 3])
|
||||
text("20_4", font = "7 segment", valign = "bottom", halign = "center", size = apperture_d / 6);
|
||||
text("20_4", font = "7 segment", valign = "bottom", halign = "center", size = aperture_d / 6);
|
||||
|
||||
translate([7, 3])
|
||||
text("C", font = "7 segment", valign = "bottom", halign = "center", size = apperture_d / 8);
|
||||
text("C", font = "7 segment", valign = "bottom", halign = "center", size = aperture_d / 8);
|
||||
|
||||
translate([-1.9, 0.5])
|
||||
text("50", font = "7 segment", valign = "top", halign = "center", size = apperture_d / 2.7);
|
||||
text("50", font = "7 segment", valign = "top", halign = "center", size = aperture_d / 2.7);
|
||||
|
||||
translate([0, -apperture_d / 6])
|
||||
text(" %", font = "Arial", valign = "center", halign = "center", size = apperture_d / 6);
|
||||
translate([0, -aperture_d / 6])
|
||||
text(" %", font = "Arial", valign = "center", halign = "center", size = aperture_d / 6);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -134,7 +134,7 @@ module iec(type) { //! Draw specified IEC connector
|
||||
}
|
||||
}
|
||||
|
||||
color(grey20) {
|
||||
color(grey(20)) {
|
||||
// Flange
|
||||
flange_t = iec_flange_t(type);
|
||||
linear_extrude(flange_t)
|
||||
|
@@ -25,7 +25,7 @@ use <../utils/tube.scad>
|
||||
use <washer.scad>
|
||||
use <ball_bearing.scad>
|
||||
|
||||
kp_pillow_block_colour = grey70;
|
||||
kp_pillow_block_colour = grey(70);
|
||||
|
||||
function kp_diameter(type) = type[1]; //! Rod hole diameter
|
||||
function kp_hole_offset(type) = type[2]; //! Rod hole offset
|
||||
|
@@ -34,7 +34,7 @@ function meter_lug_size(type) = type[4]; //! Lug length and width
|
||||
function meter_lug_offset(type) = type[5]; //! Lug position, 0 = center, +1 = top
|
||||
function meter_hole_pitch(type) = type[6]; //! Lug hole pitch
|
||||
function meter_hole_radius(type) = type[7]; //! Lug hole radius
|
||||
function meter_shunt(type) = type[8]; //! Ampmeter shunt wire
|
||||
function meter_shunt(type) = type[8]; //! Ammeter shunt wire
|
||||
|
||||
function meter_pos(type) = (meter_pcb_size(type).y - meter_size(type).y) * meter_offset(type) / 2;
|
||||
function meter_lug_pos(type) = (meter_pcb_size(type).y - meter_lug_size(type).y) * meter_lug_offset(type) / 2;
|
||||
@@ -44,6 +44,8 @@ module meter_hole_positions(type) //! Position children over the holes
|
||||
translate([side * meter_hole_pitch(type) / 2, meter_lug_pos(type)])
|
||||
children();
|
||||
|
||||
function meter_shunt_y(type) = meter_pos(type) - meter_pcb_size(type).y / 2; //! Shunt y coordinate
|
||||
|
||||
module meter(type, colour = "red", value = "888", display_colour = false) //! Draw a meter with optional colour and display value
|
||||
{
|
||||
vitamin(str("meter(", type[0], arg(colour, "red", "colour"), "): LED ", meter_shunt(type) ? "am" : "volt", "meter ", colour));
|
||||
@@ -80,7 +82,7 @@ module meter(type, colour = "red", value = "888", display_colour = false) //! Dr
|
||||
|
||||
shunt = meter_shunt(type);
|
||||
if(shunt)
|
||||
translate([0, -meter_pcb_size(type).y / 2 + meter_pos(type), size.z])
|
||||
translate([0, meter_shunt_y(type), size.z])
|
||||
vflip()
|
||||
color("#b87333")
|
||||
wire_link(shunt.y, shunt.x, shunt.z, tail = 2);
|
||||
|
@@ -19,7 +19,7 @@
|
||||
|
||||
// display size offset pcb size lug size offset hole pitch and size
|
||||
led_meter = ["led_meter", [22.72, 10.14, 6.3], 0, [22.72, 11.04, 0.96], [30, 4.2], 0, 26, 2.2 / 2, false];
|
||||
led_ameter = ["led_ameter", [22.72, 14.05, 7.3], 1, [27.5, 18.54, 1.2], [35, 6.25], 1, 29, 3.0 / 2, [15.5, 1.5, 7.75]];
|
||||
led_ameter = ["led_ameter", [22.72, 14.05, 7.3], 1, [27.5, 18.6, 1.2], [35, 6.25], 1, 29, 3.0 / 2, [15.5, 1.5, 7.75]];
|
||||
|
||||
led_meters = [led_meter, led_ameter];
|
||||
|
||||
|
@@ -24,9 +24,9 @@ include <../utils/core/core.scad>
|
||||
|
||||
use <../utils/tube.scad>
|
||||
|
||||
bearing_colour = grey70;
|
||||
groove_colour = grey60;
|
||||
seal_colour = grey30;
|
||||
bearing_colour = grey(70);
|
||||
groove_colour = grey(60);
|
||||
seal_colour = grey(30);
|
||||
|
||||
|
||||
function bearing_length(type) = type[1]; //! Total length
|
||||
|
@@ -24,8 +24,8 @@ small_leg = [0.9, 3.3, 0.4, 0];
|
||||
medium_leg = [0.5, 3.9, 3.2, 1.6, [0, -0.5]];
|
||||
large_leg = [11.4, 0.8, 6.3, 1.8, [1.7, 0]];
|
||||
|
||||
small_microswitch = ["small_microswitch", "DM1-00P-110-3", 5.8, 6.5, 12.8, 0, 2, [[-3.25, -1.65], [3.25, -1.65]], 2.9, 1.2, [-1.95, 3.75], [[-5.08, -4.95], [0, -4.9], [5.08, -4.9] ], small_leg, grey20, "white" ];
|
||||
medium_microswitch = ["medium_microswitch","SS-01 or SS-5GL", 6.4, 10.2, 19.8, 1, 2.35, [[-4.8, -2.6 ], [4.7, -2.6 ]], 3.2, 2, [-2.8, 5.8 ], [[-8.05, -7.05], [0.75, -7.05], [8.05, -7.05] ], medium_leg, grey20, "burlywood" ];
|
||||
small_microswitch = ["small_microswitch", "DM1-00P-110-3", 5.8, 6.5, 12.8, 0, 2, [[-3.25, -1.65], [3.25, -1.65]], 2.9, 1.2, [-1.95, 3.75], [[-5.08, -4.95], [0, -4.9], [5.08, -4.9] ], small_leg, grey(20), "white" ];
|
||||
medium_microswitch = ["medium_microswitch","SS-01 or SS-5GL", 6.4, 10.2, 19.8, 1, 2.35, [[-4.8, -2.6 ], [4.7, -2.6 ]], 3.2, 2, [-2.8, 5.8 ], [[-8.05, -7.05], [0.75, -7.05], [8.05, -7.05] ], medium_leg, grey(20), "burlywood" ];
|
||||
large_microswitch = ["large_microswitch", "Saia G3 low force", 10.4, 15.9, 28.0, 2, 3.1, [[-11.1, -5.15], [11.2, 5.15]], 4, 2.75,[-9.1, 9.55], [[19.7, 2.19], [19.7, -3.45], [8.3, -10.45] ], large_leg, "ivory", "white" ];
|
||||
|
||||
microswitches = [small_microswitch, medium_microswitch, large_microswitch];
|
||||
|
@@ -87,7 +87,7 @@ module mod(type) { //! Draw specified module
|
||||
linear_extrude(body_l, center = true)
|
||||
profile();
|
||||
|
||||
color(grey20)
|
||||
color(grey(20))
|
||||
for(end = [-1, 1])
|
||||
translate([end * body_l / 2, 0, 0])
|
||||
rotate([90, 0, end * 90])
|
||||
|
@@ -55,7 +55,7 @@ module nut(type, nyloc = false, brass = false, nylon = false) { //! Draw specifi
|
||||
vitamin(str("nut(", type[0], arg(nyloc, false, "nyloc"), arg(brass, false, "brass"), arg(nylon, false, "nylon"),
|
||||
"): Nut M", nut_size(type), " x ", thickness, "mm ", desc));
|
||||
|
||||
colour = brass ? brass_colour : nylon ? grey30: grey70;
|
||||
colour = brass ? brass_colour : nylon ? grey(30): grey(70);
|
||||
explode(nyloc ? 10 : 0) {
|
||||
color(colour) {
|
||||
linear_extrude(thickness)
|
||||
@@ -147,7 +147,7 @@ module sliding_t_nut(type) {
|
||||
tabSizeZ = nut_thickness(type);
|
||||
holeRadius = nut_size(type) / 2;
|
||||
|
||||
color(grey80)
|
||||
color(grey(80))
|
||||
extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, 0, hammerNut);
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ module nut_square(type, brass = false, nylon = false) { //! Draw specified squar
|
||||
vitamin(str("nut(", type[0], arg(brass, false, "brass"), arg(nylon, false, "nylon"),
|
||||
"): Nut M", nut_size(type), "nS ", width, " x ", thickness, "mm ", desc));
|
||||
|
||||
colour = brass ? brass_colour : nylon ? grey30 : grey70;
|
||||
colour = brass ? brass_colour : nylon ? grey(30) : grey(70);
|
||||
color(colour)
|
||||
difference() {
|
||||
linear_extrude(thickness) {
|
||||
|
@@ -53,7 +53,7 @@ module opengrab() { //! Draw OpenGrab module
|
||||
translate_z(magnet / 2 + eps)
|
||||
cube([width, width, magnet - eps], center = true);
|
||||
|
||||
color(grey80) {
|
||||
color(grey(80)) {
|
||||
gap = (width - poles * pole_w + 3 * eps) / (poles - 1);
|
||||
pitch = pole_w + gap;
|
||||
for(i = [0 : poles - 1])
|
||||
@@ -84,7 +84,7 @@ module opengrab() { //! Draw OpenGrab module
|
||||
module opengrab_target() { //! Draw OpenGrab target
|
||||
vitamin("opengrab_target(): OpenGrab silicon steel target plate");
|
||||
|
||||
color(grey80)
|
||||
color(grey(80))
|
||||
linear_extrude(target)
|
||||
difference() {
|
||||
square([width, width], center = true);
|
||||
|
@@ -28,21 +28,42 @@
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
use <../utils/dogbones.scad>
|
||||
use <../utils/rounded_cylinder.scad>
|
||||
use <pcb.scad>
|
||||
|
||||
function pmeter_size(type) = type[2]; //! Body size including bezel height
|
||||
function pmeter_bezel(type) = type[3]; //! Bezel size
|
||||
function pmeter_bezel_r(type) = type[4]; //! Bezel radius
|
||||
function pmeter_bevel(type) = type[5]; //! Bezel bevel inset and start height
|
||||
function pmeter_aperture(type) = type[6]; //! Aperture length, width and bevel
|
||||
function pmeter_tab(type) = type[7]; //! Tab size
|
||||
function pmeter_tab_z(type) = type[8]; //! Tab vertical position
|
||||
function pmeter_thickness(type) = type[9]; //! Wall thickness if not closed
|
||||
function pmeter_pcb(type) = type[10]; //! Optional PCB for open types
|
||||
function pmeter_pcb_z(type) = type[11]; //! Distance of PCB from the back
|
||||
function pmeter_size(type) = type[2]; //! Body size including bezel height
|
||||
function pmeter_bezel(type) = type[3]; //! Bezel size
|
||||
function pmeter_bezel_r(type) = type[4]; //! Bezel radius
|
||||
function pmeter_bevel(type) = type[5]; //! Bezel bevel inset and start height or a radius
|
||||
function pmeter_aperture(type) = type[6]; //! Aperture length, width and bevel
|
||||
function pmeter_tab(type) = type[7]; //! Tab size
|
||||
function pmeter_tab_z(type) = type[8]; //! Tab vertical position
|
||||
function pmeter_thickness(type) = type[9]; //! Wall thickness if not closed
|
||||
function pmeter_inner_ap(type) = type[10]; //! Inner aperture
|
||||
function pmeter_inner_ap_o(type) = type[11]; //! Inner aperture offset
|
||||
function pmeter_pcb(type) = type[12]; //! Optional PCB for open types
|
||||
function pmeter_pcb_z(type) = type[13]; //! Distance of PCB from the back
|
||||
function pmeter_pcb_h(type) = type[14]; //! Component height from the front
|
||||
function pmeter_buttons(type) = type[15]; //! List of buttons
|
||||
|
||||
function pmeter_button_pos(type) = type[0]; //! Button position
|
||||
function pmeter_button_size(type) = type[1]; //! Button size
|
||||
function pmeter_button_r(type) = type[2]; //! Button radius
|
||||
function pmeter_button_colour(type) = type[3]; //! Button colour
|
||||
|
||||
function pmeter_depth(type) = pmeter_size(type).z - pmeter_bezel(type).z; //! Depth below bezel
|
||||
|
||||
module panel_meter_button(type) { //! Draw panel meter button
|
||||
size = pmeter_button_size(type);
|
||||
r = pmeter_button_r(type);
|
||||
color(pmeter_button_colour(type))
|
||||
translate(pmeter_button_pos(type))
|
||||
if(size.x)
|
||||
rounded_rectangle(pmeter_button_size(type), r, center = false);
|
||||
else
|
||||
cylinder(r = r, h = size.z);
|
||||
}
|
||||
|
||||
module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
vitamin(str("panel_meter(", type[0], "): ", type[1]));
|
||||
size = pmeter_size(type);
|
||||
@@ -51,29 +72,52 @@ module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
t = pmeter_thickness(type);
|
||||
r = pmeter_bezel_r(type);
|
||||
h = size.z - bezel.z;
|
||||
app = pmeter_aperture(type);
|
||||
ap = pmeter_aperture(type);
|
||||
tab = pmeter_tab(type);
|
||||
tab_z = pmeter_tab_z(type);
|
||||
pcb = pmeter_pcb(type);
|
||||
ap2 = pmeter_inner_ap(type);
|
||||
pcb_h = pmeter_pcb_h(type) - bezel.z;
|
||||
buttons = pmeter_buttons(type);
|
||||
|
||||
color("#94A7AB")
|
||||
cube([app.x, app.y, 3 * eps], center = true);
|
||||
cube([ap.x, ap.y, 3 * eps], center = true);
|
||||
|
||||
color(grey30) union() {
|
||||
module corner(x, y)
|
||||
translate([x * (bezel.x / 2 - bevel), y * (bezel.y / 2 - bevel)])
|
||||
rounded_cylinder(r = r, r2 = bevel, h = bezel.z);
|
||||
|
||||
color(grey(30)) union() {
|
||||
//
|
||||
// Bezel and aperture
|
||||
//
|
||||
difference() {
|
||||
hull() {
|
||||
rounded_rectangle([bezel.x - 2 * bevel.x, bezel.y - 2 * bevel.x, bezel.z], r - bevel.x, center = false);
|
||||
rounded_rectangle([bezel.x, bezel.y, bevel[1]],r, center = false);
|
||||
}
|
||||
hull() {
|
||||
translate_z(bezel.z + eps) {
|
||||
cube([app.x + app.z, app.y + app.z, eps], center = true);
|
||||
|
||||
cube([app.x, app.y, bezel.z * 2], center = true);
|
||||
if(is_list(bevel))
|
||||
hull() {
|
||||
rounded_rectangle([bezel.x - 2 * bevel.x, bezel.y - 2 * bevel.x, bezel.z], r - bevel.x, center = false);
|
||||
rounded_rectangle([bezel.x, bezel.y, bevel[1]], r, center = false);
|
||||
}
|
||||
else
|
||||
hull() {
|
||||
corner(-1, -1);
|
||||
corner(-1, 1);
|
||||
corner( 1, -1);
|
||||
corner( 1, 1);
|
||||
}
|
||||
|
||||
hull() {
|
||||
r = max(0, -ap.z);
|
||||
if(ap.z > 0)
|
||||
translate_z(bezel.z + eps)
|
||||
cube([ap.x + ap.z, ap.y + ap.z, eps], center = true);
|
||||
|
||||
translate_z(bezel.z + eps)
|
||||
rounded_rectangle([ap.x, ap.y, bezel.z * 2], r, center = true);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Body
|
||||
//
|
||||
translate_z(-h)
|
||||
linear_extrude(h)
|
||||
difference() {
|
||||
@@ -82,7 +126,9 @@ module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
if(t)
|
||||
square([size.x - 2 * t, size.y - 2 * t], center = true);
|
||||
}
|
||||
|
||||
//
|
||||
// tabs
|
||||
//
|
||||
if(tab)
|
||||
for(end = [-1, 1])
|
||||
translate([end * (size.x / 2 + tab.x / 2), 0, -size.z + tab_z])
|
||||
@@ -91,10 +137,27 @@ module panel_meter(type) { //! Draw panel mounted LCD meter module
|
||||
cube([tab.x, tab.y, tab.z], center = true);
|
||||
|
||||
}
|
||||
if(ap2)
|
||||
color("grey")
|
||||
linear_extrude(ap2.z)
|
||||
difference() {
|
||||
square([ap.x, ap.y], center = true);
|
||||
|
||||
translate(pmeter_inner_ap_o(type))
|
||||
square([ap2.x, ap2.y], center = true);
|
||||
}
|
||||
if(pcb)
|
||||
vflip()
|
||||
translate_z(h - pcb_thickness(pcb) - pmeter_pcb_z(type))
|
||||
pcb(pcb);
|
||||
|
||||
if(pcb_h > 0)
|
||||
%translate_z(-pcb_h / 2 - eps)
|
||||
cube([size.x - 2 * t - eps, size.y - 2 * t - eps, pcb_h], center = true);
|
||||
|
||||
if(buttons)
|
||||
for(b = buttons)
|
||||
panel_meter_button(b);
|
||||
}
|
||||
|
||||
module panel_meter_cutout(type, h = 0) { //! Make panel cutout
|
||||
|
@@ -20,19 +20,32 @@
|
||||
//
|
||||
//! Panel mounted digital meter modules
|
||||
//
|
||||
// body size bezel size, radius, bevel aperture tab tab_z t
|
||||
// inner aperture offset pcb pcb z h
|
||||
PZEM021 = ["PZEM021", "Peacefair PZEM-021 AC digital multi-function meter", [84.6, 44.7, 24.4], [89.6, 49.6, 2.3], 1.5, [1, 1], [51, 30, 5], [1.3, 10, 6], 15.5, 0];
|
||||
PZEM001 = ["PZEM001", "Peacefair PZEM-001 AC digital multi-function meter", [62 , 52.5, 24.4], [67, 57.5, 2.0], 2.0, [1, 1], [61, 46,-3], [1.2, 10, 6], 15.5, 0,
|
||||
[36, 36, 1.9], [0, 0], false, 0, 0, [
|
||||
[[25, 8, 0], [0, 0, 2], 4, grey(90)],
|
||||
[[25, -8, 0], [0, 0, 2], 4, grey(90)],
|
||||
|
||||
PZEM021 = ["PZEM021", "Peacefair PZEM-021 AC digital multi-function meter", [84.6, 44.7, 24.4], [89.6, 49.6, 2.3], 1.5, [1, 1], [51, 30, 5], [1.3, 10, 6], 15.5, 0];
|
||||
PZEM001 = ["PZEM001", "Peacefair PZEM-001 AC digital multi-function meter", [62 , 52.5, 24.4], [67, 57.5, 2.0], 1.5, [1, 1], [36, 36, 0], [1.2, 10, 6], 15.5, 0];
|
||||
]];
|
||||
|
||||
DSN_VC288PCB = ["", "", 41, 21, 1, 0, 0, 0, "green", false, [],
|
||||
[ [ 5, -3, 0, "jst_xh", 3],
|
||||
DSP5004PCB = ["", "", 68, 36, 1.6, 0, 0, 0, "green", false, [], [], []];
|
||||
DSP5005 = ["DSP5005", "Ruideng DSP5005 Power supply module", [71.6, 39.8, 25.0], [79, 43.0, 2.3], 2.0, 1, [67, 32,-1], [2.0, 12, 9], 13.5, 1.5,
|
||||
[28, 27, 0.7], [-4.5, 0], DSP5004PCB, 10, 36, [
|
||||
[[ 22, 4, 2], [ 0, 0, 11], 6, "silver"],
|
||||
[[ 22, 4, 5], [ 0, 0, 6], 6.5, "silver"],
|
||||
[[ 22, -9, 0], [ 8, 6, 1], 2.99, "yellow"],
|
||||
[[-25, -9, 0], [ 6.5, 4.5, 1], 0.5, "yellow"],
|
||||
[[-25, 0, 0], [ 6.5, 4.5, 1], 0.5, "yellow"],
|
||||
[[-25, 9, 0], [ 6.5, 4.5, 1], 0.5, "yellow"],
|
||||
]];
|
||||
|
||||
],
|
||||
[]];
|
||||
DSN_VC288PCB = ["", "", 41, 21, 1, 0, 0, 0, "green", false, [], [[ 5, -3, 0, "jst_xh", 3], ], []];
|
||||
|
||||
DSN_VC288 = ["DSN_VC288","DSN-VC288 DC 100V 10A Voltmeter ammeter", [45.3, 26, 17.4], [47.8, 28.8, 2.5], 0, [1, 1.8], [36, 18, 2.5], [], 0, 2,
|
||||
DSN_VC288PCB, 5];
|
||||
[], 0, DSN_VC288PCB, 5];
|
||||
|
||||
panel_meters = [DSN_VC288, PZEM021, PZEM001];
|
||||
panel_meters = [DSN_VC288, PZEM021, PZEM001, DSP5005];
|
||||
|
||||
use <panel_meter.scad>
|
||||
|
@@ -248,7 +248,7 @@ module rj45(cutout = false) { //! Draw RJ45 Ethernet connector
|
||||
cube([h, w, eps], center = true);
|
||||
}
|
||||
|
||||
color(grey30) {
|
||||
color(grey(30)) {
|
||||
linear_extrude(l - 0.2, center = true)
|
||||
difference() {
|
||||
square([h - 0.1, w - 0.1], center = true);
|
||||
@@ -279,7 +279,7 @@ module jack(cutout = false) { //! Draw 3.5mm jack
|
||||
rotate([0, 90, 0])
|
||||
cylinder(d = d + 2 * panel_clearance, h = 100);
|
||||
else
|
||||
color(grey20)
|
||||
color(grey(20))
|
||||
rotate([0, 90, 0]) {
|
||||
linear_extrude(l / 2)
|
||||
difference() {
|
||||
@@ -508,7 +508,7 @@ module barrel_jack(cutout = false) { //! Draw barrel power jack
|
||||
if(cutout)
|
||||
;
|
||||
else {
|
||||
color(grey20) rotate([0, 90, 0]) {
|
||||
color(grey(20)) rotate([0, 90, 0]) {
|
||||
linear_extrude(l, center = true) {
|
||||
difference() {
|
||||
translate([-h / 2, 0])
|
||||
@@ -580,7 +580,7 @@ module uSD(size, cutout = false) { //! Draw uSD socket
|
||||
cube([size.x, size.z, t], center = true);
|
||||
}
|
||||
if(w > 0)
|
||||
color(grey20)
|
||||
color(grey(20))
|
||||
rotate([90, 0, 90])
|
||||
translate_z(t)
|
||||
linear_extrude(size.y - t, center = true)
|
||||
@@ -608,7 +608,7 @@ module flex(cutout = false) { //! Draw flexistrip connector
|
||||
if(cutout)
|
||||
;
|
||||
else {
|
||||
color(grey30) {
|
||||
color(grey(30)) {
|
||||
translate_z(0.5)
|
||||
cube([l, w, 1], center = true);
|
||||
|
||||
@@ -664,7 +664,7 @@ module flat_flex(cutout = false) { //! Draw flat flexistrip connector as used on
|
||||
if(cutout)
|
||||
;
|
||||
else {
|
||||
color(grey30) {
|
||||
color(grey(30)) {
|
||||
translate([w / 2 - w1, 0, h1 / 2])
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(w1)
|
||||
@@ -676,7 +676,7 @@ module flat_flex(cutout = false) { //! Draw flat flexistrip connector as used on
|
||||
}
|
||||
|
||||
}
|
||||
color(grey90) {
|
||||
color(grey(90)) {
|
||||
translate([-w / 2 + w3 / 2, 0, h3 / 2])
|
||||
cube([w3, l3, h3], center = true);
|
||||
|
||||
@@ -867,51 +867,64 @@ module trimpot10(vertical, cutout = false) { //! Draw a ten turn trimpot
|
||||
}
|
||||
}
|
||||
|
||||
module block(size, colour, makes_cutout, cutouts) //! Draw a coloured cube to represent a random PCB component
|
||||
if(cutouts) {
|
||||
if(makes_cutout)
|
||||
translate([-50, 0, size.z / 2 - panel_clearance])
|
||||
cube([100, size.y + 2 * panel_clearance, size.z + 2 * panel_clearance], center = true);
|
||||
}
|
||||
else
|
||||
color(colour)
|
||||
translate_z(size.z / 2)
|
||||
cube(size, center = true);
|
||||
|
||||
module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb component from description
|
||||
function show(comp, part) = (comp[3] == part || comp[3] == str("-",part)) && (!cutouts || angle == undef || angle == comp.z);
|
||||
function param(n, default = 0) = len(comp) > n ? comp[n] : default;
|
||||
rotate(comp.z) {
|
||||
if(show(comp, "2p54header")) pin_header(2p54header, comp[4], comp[5], param(6), cutouts, colour = param(7, undef));
|
||||
if(show(comp, "2p54boxhdr")) box_header(2p54header, comp[4], comp[5], param(6), cutouts);
|
||||
if(show(comp, "2p54socket")) pin_socket(2p54header, comp[4], comp[5], param(6, false), param(7), param(8, false), cutouts, param(9, undef));
|
||||
if(show(comp, "chip")) chip(comp[4], comp[5], comp[6], param(7, grey30), cutouts);
|
||||
if(show(comp, "rj45")) rj45(cutouts);
|
||||
if(show(comp, "usb_A")) usb_Ax1(cutouts);
|
||||
if(show(comp, "usb_Ax2")) usb_Ax2(cutouts);
|
||||
if(show(comp, "usb_uA")) usb_uA(cutouts);
|
||||
if(show(comp, "usb_B")) usb_B(cutouts);
|
||||
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey20));
|
||||
if(show(comp, "potentiometer")) potentiometer(param(4, 5), param(5, 9));
|
||||
if(show(comp, "jack")) jack(cutouts);
|
||||
if(show(comp, "barrel_jack")) barrel_jack(cutouts);
|
||||
if(show(comp, "hdmi")) hdmi(hdmi_full, cutouts);
|
||||
if(show(comp, "mini_hdmi")) hdmi(hdmi_mini, cutouts);
|
||||
if(show(comp, "flex")) flex(cutouts);
|
||||
if(show(comp, "flat_flex")) flat_flex(cutouts);
|
||||
if(show(comp, "D_plug")) if(!cutouts) translate_z(d_pcb_offset(comp[4])) d_plug(comp[4], pcb = true);
|
||||
if(show(comp, "molex_hdr")) if(!cutouts) molex_254(comp[4]);
|
||||
if(show(comp, "jst_xh")) if(!cutouts) jst_xh_header(jst_xh_header, comp[4], param(5, false), param(6, "white"), param(7, undef));
|
||||
if(show(comp, "term254")) if(!cutouts) green_terminal(gt_2p54,comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "gterm")) if(!cutouts) green_terminal(comp[4], comp[5], comp[6], param(7,"lime"));
|
||||
if(show(comp, "gterm35")) if(!cutouts) green_terminal(gt_3p5, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "gterm508")) if(!cutouts) green_terminal(gt_5p08, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "gterm635")) if(!cutouts) green_terminal(gt_6p35, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "term35")) if(!cutouts) terminal_35(comp[4], param(5,"blue"));
|
||||
if(show(comp, "transition")) if(!cutouts) idc_transition(2p54header, comp[4], comp[5]);
|
||||
if(show(comp, "block"))
|
||||
color(comp[7]) if(!cutouts) translate_z(comp[6] / 2) cube([comp[4], comp[5], comp[6]], center = true);
|
||||
else if(comp[8]) translate([-50, 0, comp[6] / 2 - panel_clearance]) cube([100, comp[5] + 2 * panel_clearance, comp[6] + 2 * panel_clearance], center = true);
|
||||
if(show(comp, "button_6mm")) square_button(button_6mm);
|
||||
if(show(comp, "microswitch")) translate_z(microswitch_thickness(comp[4])/2) microswitch(comp[4]);
|
||||
if(show(comp, "pcb")) if(!cutouts) translate_z(comp[4]) pcb(comp[5]);
|
||||
if(show(comp, "standoff")) if(!cutouts) standoff(comp[4], comp[5], comp[6], comp[7]);
|
||||
if(show(comp, "uSD")) uSD(comp[4], cutouts);
|
||||
if(show(comp, "trimpot10")) trimpot10(param(4, false), cutouts);
|
||||
if(show(comp, "led")) led(comp[4], comp[5], 2.6);
|
||||
if(show(comp, "pdip")) pdip(comp[4], comp[5], param(6, false), param(7, inch(0.3)));
|
||||
if(show(comp, "ax_res")) ax_res(comp[4], comp[5], param(6, 5), param(7, 0));
|
||||
// Components that have a cutout parameter go in this section
|
||||
if(show(comp, "2p54header")) pin_header(2p54header, comp[4], comp[5], param(6, false), false, cutouts, colour = param(7, undef));
|
||||
if(show(comp, "2p54boxhdr")) box_header(2p54header, comp[4], comp[5], param(6, false), cutouts);
|
||||
if(show(comp, "2p54socket")) pin_socket(2p54header, comp[4], comp[5], param(6, false), param(7, 0), param(8, false), cutouts, param(9, undef));
|
||||
if(show(comp, "chip")) chip(comp[4], comp[5], comp[6], param(7, grey(30)), cutouts);
|
||||
if(show(comp, "rj45")) rj45(cutouts);
|
||||
if(show(comp, "usb_A")) usb_Ax1(cutouts);
|
||||
if(show(comp, "usb_Ax2")) usb_Ax2(cutouts);
|
||||
if(show(comp, "usb_uA")) usb_uA(cutouts);
|
||||
if(show(comp, "usb_B")) usb_B(cutouts);
|
||||
if(show(comp, "jack")) jack(cutouts);
|
||||
if(show(comp, "barrel_jack")) barrel_jack(cutouts);
|
||||
if(show(comp, "hdmi")) hdmi(hdmi_full, cutouts);
|
||||
if(show(comp, "mini_hdmi")) hdmi(hdmi_mini, cutouts);
|
||||
if(show(comp, "flex")) flex(cutouts);
|
||||
if(show(comp, "flat_flex")) flat_flex(cutouts);
|
||||
if(show(comp, "uSD")) uSD(comp[4], cutouts);
|
||||
if(show(comp, "trimpot10")) trimpot10(param(4, false), cutouts);
|
||||
if(show(comp, "molex_usb_Ax2")) molex_usb_Ax2(cutouts);
|
||||
if(show(comp, "smd_led")) smd_led(comp[4], comp[5], cutouts);
|
||||
if(show(comp, "smd_led")) smd_led(comp[4], comp[5], cutouts);
|
||||
if(show(comp, "block")) block(size = [comp[4], comp[5], comp[6]], colour = comp[7], makes_cutout = param(8));
|
||||
if(!cutouts) {
|
||||
// Components that don't have a cutout parameter go in this section
|
||||
if(show(comp, "button_6mm")) square_button(button_6mm);
|
||||
if(show(comp, "microswitch")) translate_z(microswitch_thickness(comp[4])/2) microswitch(comp[4]);
|
||||
if(show(comp, "pcb")) translate_z(comp[4]) pcb(comp[5]);
|
||||
if(show(comp, "standoff")) standoff(comp[4], comp[5], comp[6], comp[7]);
|
||||
if(show(comp, "term254")) green_terminal(gt_2p54,comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "gterm")) green_terminal(comp[4], comp[5], comp[6], param(7,"lime"));
|
||||
if(show(comp, "gterm35")) green_terminal(gt_3p5, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "gterm508")) green_terminal(gt_5p08, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "gterm635")) green_terminal(gt_6p35, comp[4], comp[5], param(6,"lime"));
|
||||
if(show(comp, "term35")) terminal_35(comp[4], param(5,"blue"));
|
||||
if(show(comp, "transition")) idc_transition(2p54header, comp[4], comp[5]);
|
||||
if(show(comp, "led")) led(comp[4], comp[5], 2.6);
|
||||
if(show(comp, "pdip")) pdip(comp[4], comp[5], param(6, false), param(7, inch(0.3)));
|
||||
if(show(comp, "ax_res")) ax_res(comp[4], comp[5], param(6, 5), param(7, 0));
|
||||
if(show(comp, "D_plug")) translate_z(d_pcb_offset(comp[4])) d_plug(comp[4], pcb = true);
|
||||
if(show(comp, "molex_hdr")) molex_254(comp[4]);
|
||||
if(show(comp, "jst_xh")) jst_xh_header(jst_xh_header, comp[4], param(5, false), param(6, "white"), param(7, undef));
|
||||
if(show(comp, "potentiometer")) potentiometer(param(4, 5), param(5, 9));
|
||||
if(show(comp, "buzzer")) buzzer(param(4, 9), param(5, 12), param(6, grey(20)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -112,7 +112,7 @@ DuetE = ["DuetE", "Duet 2 Ethernet electronics",
|
||||
[109.8, -58.8, 0, "chip", inch(0.03), inch(0.06), 1, "red"], // Bed heater
|
||||
|
||||
[ 2.3, -37.2, 0, "chip", 3.6, 4.8, 2.0, "silver"], // Reset switch
|
||||
[ 0.0, -37.2, 0, "chip", 2.0, 2.6, 1.4, grey20], // Reset button
|
||||
[ 0.0, -37.2, 0, "chip", 2.0, 2.6, 1.4, grey(20)], // Reset button
|
||||
],
|
||||
[": Micro SD card", ": Cat 5 patch cable 300mm"]];
|
||||
|
||||
@@ -361,8 +361,8 @@ WD2002SJ = ["WD2002SJ", "WD2002SJ Buck Boost DC-DC converter", 78, 47, 1.6, 0, 3
|
||||
[ -25.5, 3.1, 0, "trimpot10", true],
|
||||
[ 30.5, 3.1, 0, "trimpot10", true],
|
||||
[ 41.5, 3.1, 0, "trimpot10", true],
|
||||
[ -10.5, 1.5, 0, "smd_led", LED0805, "blue"],
|
||||
[ 16, 1.8, 0, "smd_led", LED0805, "red"],
|
||||
[ -10.4, 1.4, 0, "smd_led", LED0805, "blue"],
|
||||
[ 15.7, 2.7, 0, "smd_led", LED0805, "red"],
|
||||
],
|
||||
[]];
|
||||
|
||||
|
@@ -34,8 +34,8 @@ M3x13_hex_pillar = ["M3x13_hex_pillar", "hex", 3, 13, 5/cos(30
|
||||
M3x20_hex_pillar = ["M3x20_hex_pillar", "hex", 3, 20, 5/cos(30), 5/cos(30), 6, 6, "silver", silver, -8, 8];
|
||||
M3x20_nylon_pillar = ["M3x20_nylon_pillar", "nylon", 3, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6];
|
||||
M4x17_nylon_pillar = ["M4x17_nylon_pillar", "nylon", 4, 20, 8, 5/cos(30), 0, 6, "white", brass, -6, 6];
|
||||
M3x20_nylon_hex_pillar = ["M3x20_nylon_hex_pillar", "hex nylon", 3, 20, 8/cos(30), 8/cos(30), 6, 6, grey20, grey20, -6, 6];
|
||||
M3x10_nylon_hex_pillar = ["M3x10_nylon_hex_pillar", "hex nylon", 3, 10,5.5/cos(30),5.5/cos(30),6, 6, grey20, grey20, -6, 6];
|
||||
M3x20_nylon_hex_pillar = ["M3x20_nylon_hex_pillar", "hex nylon", 3, 20, 8/cos(30), 8/cos(30), 6, 6, grey(20), grey(20), -6, 6];
|
||||
M3x10_nylon_hex_pillar = ["M3x10_nylon_hex_pillar", "hex nylon", 3, 10,5.5/cos(30),5.5/cos(30),6, 6, grey(20), grey(20), -6, 6];
|
||||
|
||||
|
||||
pillars = [M2x16_brass_pillar, M3x13_hex_pillar, M3x20_hex_pillar, M3x20_nylon_pillar, M4x17_nylon_pillar, M3x10_nylon_hex_pillar, M3x20_nylon_hex_pillar];
|
||||
|
@@ -52,7 +52,7 @@ module pin_header(type, cols = 1, rows = 1, smt = false, right_angle = false, cu
|
||||
|
||||
if(cutout)
|
||||
dogbone_rectangle([cols * pitch + 2 * panel_clearance, rows * pitch + 2 * panel_clearance, 100], center = false);
|
||||
else
|
||||
else {
|
||||
vitamin(str("pin_header(", type[0], ", ", cols, ", ", rows,
|
||||
arg(smt, false, "smt"), arg(right_angle, false, "right_angle"), "): Pin header ", cols, " x ", rows, right_angle ? " right_angle" : ""));
|
||||
|
||||
@@ -91,6 +91,7 @@ module pin_header(type, cols = 1, rows = 1, smt = false, right_angle = false, cu
|
||||
square([pitch - chamfer, pitch + eps], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module box_header(type, cols = 1, rows = 1, smt = false, cutout = false) { //! Draw box header
|
||||
@@ -102,7 +103,7 @@ module box_header(type, cols = 1, rows = 1, smt = false, cutout = false) { //! D
|
||||
|
||||
if(cutout)
|
||||
dogbone_rectangle([cols * pitch + 2 * panel_clearance, rows * pitch + 2 * panel_clearance, 100], center = false);
|
||||
else
|
||||
else {
|
||||
vitamin(str("box_header(", type[0], ", ", cols, ", ", rows, arg(smt, false, "smt"), "): Box header ", cols, " x ", rows));
|
||||
|
||||
translate_z(smt ? 3.5 - h : 0) {
|
||||
@@ -125,6 +126,7 @@ module box_header(type, cols = 1, rows = 1, smt = false, cutout = false) { //! D
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module idc_transition(type, cols = 5, skip = [], cutout = false) { //! Draw IDC transition header
|
||||
|
@@ -24,8 +24,8 @@
|
||||
// h l w w c
|
||||
// c
|
||||
//
|
||||
2p54header = ["2p54header", 2.54, 11.6, 3.2, 0.66, "gold", grey20, 8.5];
|
||||
jst_xh_header = ["JST XH header",2.5,10,3.4, 0.64, "gold", grey90, 7];
|
||||
2p54header = ["2p54header", 2.54, 11.6, 3.2, 0.66, "gold", grey(20), 8.5];
|
||||
jst_xh_header = ["JST XH header",2.5,10,3.4, 0.64, "gold", grey(90), 7];
|
||||
|
||||
pin_headers = [ 2p54header ];
|
||||
|
||||
|
@@ -76,7 +76,7 @@ module terminal_block(type, ways) { //! Draw a power supply terminal block
|
||||
contact_h = 0.4;
|
||||
washer_t = 1.2;
|
||||
translate([0, -tl]) {
|
||||
color(grey20) {
|
||||
color(grey(20)) {
|
||||
cube([depth, tl, h2]);
|
||||
|
||||
translate([depth2, 0])
|
||||
|
@@ -65,7 +65,7 @@ module carriage_hole_positions(type) { //! Position children over screw holes
|
||||
children();
|
||||
}
|
||||
|
||||
module carriage(type, rail, end_colour = grey20, wiper_colour = grey20) { //! Draw the specified carriage
|
||||
module carriage(type, rail, end_colour = grey(20), wiper_colour = grey(20)) { //! Draw the specified carriage
|
||||
total_l = carriage_length(type);
|
||||
block_l = carriage_block_length(type);
|
||||
block_w = carriage_width(type);
|
||||
@@ -82,7 +82,7 @@ module carriage(type, rail, end_colour = grey20, wiper_colour = grey20) { //! Dr
|
||||
square([w , rail_height(rail) + 0.2]);
|
||||
}
|
||||
|
||||
color(grey90) {
|
||||
color(grey(90)) {
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(block_l, center = true)
|
||||
difference() {
|
||||
@@ -132,7 +132,7 @@ module rail(type, length) { //! Draw the specified rail
|
||||
|
||||
vitamin(str("rail(", type[0], ", ", length, "): Linear rail ", type[0], " x ", length, "mm"));
|
||||
|
||||
color(grey90) {
|
||||
color(grey(90)) {
|
||||
linear_extrude(height - rail_bore_depth(type)) difference() {
|
||||
square([length, width], center = true);
|
||||
rail_hole_positions(type, length)
|
||||
@@ -166,7 +166,7 @@ module rail(type, length) { //! Draw the specified rail
|
||||
}
|
||||
}
|
||||
|
||||
module rail_assembly(type, length, pos, carriage_end_colour = grey20, carriage_wiper_colour = grey20) { //! Rail and carriage assembly
|
||||
module rail_assembly(type, length, pos, carriage_end_colour = grey(20), carriage_wiper_colour = grey(20)) { //! Rail and carriage assembly
|
||||
rail(type, length);
|
||||
|
||||
translate([pos, 0])
|
||||
|
@@ -53,7 +53,7 @@ module rocker(type, colour) { //! Draw the specified rocker switch
|
||||
rocker_r2 = (sqr(x2) + sqr(y2)) / (2 * y2);
|
||||
|
||||
explode(30) {
|
||||
color(grey20) {
|
||||
color(grey(20)) {
|
||||
linear_extrude(rocker_flange_t(type))
|
||||
difference() {
|
||||
rounded_square([rocker_flange_w(type), rocker_flange_h(type)], 0.5);
|
||||
@@ -65,7 +65,7 @@ module rocker(type, colour) { //! Draw the specified rocker switch
|
||||
rounded_rectangle([rocker_width(type), rocker_height(type), rocker_depth(type) + eps], 0.5, center = false);
|
||||
}
|
||||
if(rocker_pivot(type))
|
||||
color(colour ? colour : grey30)
|
||||
color(colour ? colour : grey(30))
|
||||
translate_z(rocker_pivot(type))
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(rocker_w, center = true)
|
||||
|
@@ -25,9 +25,9 @@
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/thread.scad>
|
||||
|
||||
rod_colour = grey80;
|
||||
studding_colour = grey70;
|
||||
leadscrew_colour = grey70;
|
||||
rod_colour = grey(80);
|
||||
studding_colour = grey(70);
|
||||
leadscrew_colour = grey(70);
|
||||
|
||||
module rod(d , l, center = true) { //! Draw a smooth rod with specified diameter and length
|
||||
vitamin(str("rod(", d, ", ", l, "): Smooth rod ", d, "mm x ", l, "mm"));
|
||||
|
@@ -82,7 +82,7 @@ module screw(type, length, hob_point = 0, nylon = false) { //! Draw specified sc
|
||||
: length;
|
||||
d = 2 * screw_radius(type);
|
||||
pitch = metric_coarse_pitch(d);
|
||||
colour = nylon || head_type == hs_grub ? grey40 : grey80;
|
||||
colour = nylon || head_type == hs_grub ? grey(40) : grey(80);
|
||||
|
||||
module shaft(socket = 0, headless = false) {
|
||||
point = screw_nut(type) ? 0 : 3 * rad;
|
||||
@@ -259,22 +259,28 @@ module screw_countersink(type) { //! Countersink shape
|
||||
|
||||
module screw_and_washer(type, length, star = false, penny = false) { //! Screw with a washer which can be standard or penny and an optional star washer on top
|
||||
washer = screw_washer(type);
|
||||
head_type = screw_head_type(type);
|
||||
|
||||
translate_z(exploded() * 6)
|
||||
if(penny)
|
||||
penny_washer(washer);
|
||||
else
|
||||
washer(washer);
|
||||
if(head_type != hs_cs && head_type != hs_cs_cap) {
|
||||
translate_z(exploded() * 6)
|
||||
if(penny)
|
||||
penny_washer(washer);
|
||||
else
|
||||
washer(washer);
|
||||
|
||||
translate_z(washer_thickness(washer)) {
|
||||
if(star) {
|
||||
translate_z(exploded() * 8)
|
||||
star_washer(washer);
|
||||
translate_z(washer_thickness(washer)) {
|
||||
if(star) {
|
||||
translate_z(exploded() * 8)
|
||||
star_washer(washer);
|
||||
|
||||
translate_z(washer_thickness(washer))
|
||||
translate_z(washer_thickness(washer))
|
||||
screw(type, length);
|
||||
}
|
||||
else
|
||||
screw(type, length);
|
||||
}
|
||||
else
|
||||
screw(type, length);
|
||||
}
|
||||
else
|
||||
translate_z(eps)
|
||||
screw(type, length);
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ function scs_circlip(type) = type[15]; //! Circlip used
|
||||
function scs_spacer(type) = type[16]; //! Spacer used in long bearings
|
||||
|
||||
|
||||
sks_bearing_block_colour = grey90;
|
||||
sks_bearing_block_colour = grey(90);
|
||||
|
||||
module scs_bearing_block(type) { //! Draw the specified SCS bearing block
|
||||
vitamin(str("scs_bearing_block(", type[0], "): ", type[0], " bearing block"));
|
||||
|
@@ -24,7 +24,7 @@ include <../utils/fillet.scad>
|
||||
|
||||
use <washer.scad>
|
||||
|
||||
sk_bracket_colour = grey70;
|
||||
sk_bracket_colour = grey(70);
|
||||
|
||||
function sk_diameter(type) = type[1]; //! Rod hole diameter
|
||||
function sk_hole_offset(type) = type[2]; //! Rod hole offset
|
||||
@@ -85,7 +85,7 @@ module sk_bracket(type) { //! SK shaft support bracket
|
||||
}
|
||||
}
|
||||
// Add the retaining bolt. No hole was cut, since it is only for display.
|
||||
color(grey20)
|
||||
color(grey(20))
|
||||
translate([P / 2 - screw_head_height(M3_cap_screw) / 2, (F - h + d / 2) / 2, 0])
|
||||
rotate([0,90,0])
|
||||
not_on_bom() no_explode()
|
||||
|
@@ -41,8 +41,8 @@ function NEMA_holes(type) = [-NEMA_hole_pitch(type) / 2, NEMA_hole_pitch(t
|
||||
function NEMA_big_hole(type) = NEMA_boss_radius(type) + 0.2; //! Clearance hole for the big boss
|
||||
|
||||
stepper_body_colour = "black";
|
||||
stepper_cap_colour = grey50;
|
||||
stepper_machined_colour = grey90;
|
||||
stepper_cap_colour = grey(50);
|
||||
stepper_machined_colour = grey(90);
|
||||
|
||||
module NEMA_outline(type) //! 2D outline
|
||||
intersection() {
|
||||
|
@@ -25,8 +25,8 @@
|
||||
include <../utils/core/core.scad>
|
||||
include <../utils/sweep.scad>
|
||||
|
||||
soft_washer_colour = grey20;
|
||||
hard_washer_colour = grey80;
|
||||
soft_washer_colour = grey(20);
|
||||
hard_washer_colour = grey(80);
|
||||
star_washer_colour = brass;
|
||||
|
||||
function washer_size(type) = type[1]; //! Noiminal size
|
||||
|