Compare commits
93 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8ab7993148 | ||
|
16dd8d6d17 | ||
|
08c268145e | ||
|
ba7e64233a | ||
|
7090c714ce | ||
|
654f094304 | ||
|
1e5e5860e1 | ||
|
3d8a9ec8aa | ||
|
7ec059142f | ||
|
7f0d96b824 | ||
|
9e826c1a09 | ||
|
2c1dbe04a9 | ||
|
d644d6b698 | ||
|
8db4cc2cb5 | ||
|
509a87939c | ||
|
40607e6cfc | ||
|
599fbba6c2 | ||
|
52729d012c | ||
|
6097e07094 | ||
|
9d71438a3c | ||
|
ffa1ab940b | ||
|
3174013e1a | ||
|
c4eea38a2b | ||
|
0cd89279a5 | ||
|
92051e0b28 | ||
|
f4b22e35c7 | ||
|
17ecfc07f3 | ||
|
9658205efd | ||
|
53140a4cc1 | ||
|
2798d39538 | ||
|
8be0cc98ea | ||
|
6a5f31edd8 | ||
|
e068918e21 | ||
|
1614f50b73 | ||
|
32522b28d7 | ||
|
1936c95d06 | ||
|
16060629c0 | ||
|
b7b5c837bd | ||
|
dc4e24b63a | ||
|
3ab934d83e | ||
|
d1324a670e | ||
|
f5fdec613c | ||
|
c55b8b6d1c | ||
|
56ec8e03ad | ||
|
728b7adf38 | ||
|
75747687d9 | ||
|
03c97e8b6a | ||
|
8ac06b53e7 | ||
|
de76eb46e7 | ||
|
2c77f184a2 | ||
|
4d3d9dfdfe | ||
|
f7a972f946 | ||
|
4e81fcbd4f | ||
|
1f038decd4 | ||
|
da958fe112 | ||
|
61493eaa34 | ||
|
804c00bdcb | ||
|
11ea68681f | ||
|
d703ae4997 | ||
|
ed97d226f8 | ||
|
4107a2c848 | ||
|
f7ef075434 | ||
|
6f93b6af9a | ||
|
53f416eef1 | ||
|
6354219627 | ||
|
56e2b71bda | ||
|
8f5503586d | ||
|
1cd9edfe87 | ||
|
a85fdaf176 | ||
|
18294b4b81 | ||
|
ad62ce362c | ||
|
9f27f26894 | ||
|
2eaa4bfc21 | ||
|
1944039f22 | ||
|
1c221ad612 | ||
|
85adf7b4f4 | ||
|
64bde2cb3a | ||
|
c34469e852 | ||
|
dbc3c36f44 | ||
|
8c51183ba6 | ||
|
a9c4e60cac | ||
|
d041b18025 | ||
|
e85887fec4 | ||
|
ededb514b8 | ||
|
d0d525b97a | ||
|
371d274906 | ||
|
7118e6eb03 | ||
|
46004381b7 | ||
|
cfdf759a49 | ||
|
6f4859a4b5 | ||
|
3a087be0e9 | ||
|
77aa8fe44d | ||
|
6fe4548213 |
16
.gitattributes
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||||
|
* text=auto eol=lf
|
||||||
|
|
||||||
|
# Declare text files that are normalized and converted on checkout.
|
||||||
|
*.scad text
|
||||||
|
*.py text
|
||||||
|
*.md text
|
||||||
|
|
||||||
|
# Handle Windows batch and command files
|
||||||
|
*.{bat,[bB][aA][tT]} text eol=crlf
|
||||||
|
*.{cmd,[cC][mM][dD]} text eol=crlf
|
||||||
|
|
||||||
|
# Denote files that are binary and should not be modified.
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
|
1
.gitignore
vendored
@@ -7,6 +7,7 @@ tests/bom/
|
|||||||
*.log
|
*.log
|
||||||
*.html
|
*.html
|
||||||
bounds.json
|
bounds.json
|
||||||
|
options.json
|
||||||
times.txt
|
times.txt
|
||||||
*_diff.png
|
*_diff.png
|
||||||
*.echo
|
*.echo
|
||||||
|
BIN
docs/metric_threads.png
Normal file
After Width: | Height: | Size: 17 KiB |
@@ -26,7 +26,7 @@ OpenSCAD has to be setup to find libraries by setting the ```OPENSCADPATH``` env
|
|||||||
in the directory it points to. This can be done with ```git clone https://github.com/nophead/NopSCADlib.git``` while in that directory or, if you don't want to use GIT,
|
in the directory it points to. This can be done with ```git clone https://github.com/nophead/NopSCADlib.git``` while in that directory or, if you don't want to use GIT,
|
||||||
by downloading https://github.com/nophead/NopSCADlib/archive/master.zip and unzipping it to a directory called NopSCADlib.
|
by downloading https://github.com/nophead/NopSCADlib/archive/master.zip and unzipping it to a directory called NopSCADlib.
|
||||||
|
|
||||||
The ```NopSCADlib/scripts``` directory needs to be added to the executable search path.
|
The ```NopSCADlib/scripts``` directory needs to be added to the executable search path, ```PATH``` on Windows and ```path``` on Linux and Mac.
|
||||||
|
|
||||||
The installation can be tested by opening ```NopSCADlib/libtest.scad``` in the OpenSCAD GUI. It should render all the objects in the library in about 1 minute.
|
The installation can be tested by opening ```NopSCADlib/libtest.scad``` in the OpenSCAD GUI. It should render all the objects in the library in about 1 minute.
|
||||||
|
|
||||||
|
@@ -39,6 +39,7 @@ pp2_colour = is_undef($pp2_colour) ? "red" : $pp2_colour; // pri
|
|||||||
pp3_colour = is_undef($pp3_colour) ? "blue" : $pp3_colour; // printed part colour 3
|
pp3_colour = is_undef($pp3_colour) ? "blue" : $pp3_colour; // printed part colour 3
|
||||||
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
|
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
|
||||||
show_rays = is_undef($show_rays) ? false : $show_rays; // show camera sight lines and light direction
|
show_rays = is_undef($show_rays) ? false : $show_rays; // show camera sight lines and light direction
|
||||||
|
show_threads = is_undef($show_threads) ? false : $show_threads; // show screw threads
|
||||||
|
|
||||||
// Minimum wall is about two filaments wide but we extrude it closer to get better bonding
|
// Minimum wall is about two filaments wide but we extrude it closer to get better bonding
|
||||||
squeezed_wall = $preview ? 2 * extrusion_width - layer_height * (1 - PI / 4)
|
squeezed_wall = $preview ? 2 * extrusion_width - layer_height * (1 - PI / 4)
|
||||||
@@ -59,7 +60,8 @@ grey60 = [0.6, 0.6, 0.6];
|
|||||||
grey70 = [0.7, 0.7, 0.7];
|
grey70 = [0.7, 0.7, 0.7];
|
||||||
grey80 = [0.8, 0.8, 0.8];
|
grey80 = [0.8, 0.8, 0.8];
|
||||||
grey90 = [0.9, 0.9, 0.9];
|
grey90 = [0.9, 0.9, 0.9];
|
||||||
brass = "gold";
|
brass = [255/255, 215/255, 0/255];
|
||||||
|
silver = [0.75, 0.75, 0.75];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enums
|
* Enums
|
||||||
|
2
lib.scad
@@ -62,6 +62,7 @@ include <vitamins/spools.scad>
|
|||||||
include <vitamins/mains_sockets.scad>
|
include <vitamins/mains_sockets.scad>
|
||||||
include <vitamins/ldrs.scad>
|
include <vitamins/ldrs.scad>
|
||||||
include <vitamins/geared_steppers.scad>
|
include <vitamins/geared_steppers.scad>
|
||||||
|
include <vitamins/extrusions.scad>
|
||||||
|
|
||||||
use <vitamins/jack.scad>
|
use <vitamins/jack.scad>
|
||||||
use <vitamins/meter.scad>
|
use <vitamins/meter.scad>
|
||||||
@@ -90,3 +91,4 @@ use <utils/layout.scad>
|
|||||||
use <utils/round.scad>
|
use <utils/round.scad>
|
||||||
use <utils/offset.scad>
|
use <utils/offset.scad>
|
||||||
use <utils/sector.scad>
|
use <utils/sector.scad>
|
||||||
|
use <utils/thread.scad>
|
||||||
|
BIN
libtest.png
Before Width: | Height: | Size: 716 KiB After Width: | Height: | Size: 766 KiB |
17
libtest.scad
@@ -32,6 +32,7 @@ use <tests/cable_strips.scad>
|
|||||||
use <tests/components.scad>
|
use <tests/components.scad>
|
||||||
use <tests/d_connectors.scad>
|
use <tests/d_connectors.scad>
|
||||||
use <tests/displays.scad>
|
use <tests/displays.scad>
|
||||||
|
use <tests/extrusions.scad>
|
||||||
use <tests/fans.scad>
|
use <tests/fans.scad>
|
||||||
use <tests/fuseholder.scad>
|
use <tests/fuseholder.scad>
|
||||||
use <tests/geared_steppers.scad>
|
use <tests/geared_steppers.scad>
|
||||||
@@ -91,6 +92,7 @@ use <tests/strap_handle.scad>
|
|||||||
use <tests/ssr_shroud.scad>
|
use <tests/ssr_shroud.scad>
|
||||||
use <tests/psu_shroud.scad>
|
use <tests/psu_shroud.scad>
|
||||||
use <tests/flat_hinge.scad>
|
use <tests/flat_hinge.scad>
|
||||||
|
use <tests/pcb_mount.scad>
|
||||||
|
|
||||||
x5 = 800;
|
x5 = 800;
|
||||||
|
|
||||||
@@ -134,13 +136,13 @@ translate([x5, cable_grommets_y + 250])
|
|||||||
translate([900, 600])
|
translate([900, 600])
|
||||||
box_test();
|
box_test();
|
||||||
|
|
||||||
translate([850, 1170])
|
translate([850, 1260])
|
||||||
bbox_test();
|
bbox_test();
|
||||||
|
|
||||||
x0 = 0;
|
x0 = 0;
|
||||||
inserts_y = 0;
|
inserts_y = 0;
|
||||||
nuts_y = inserts_y + 20;
|
nuts_y = inserts_y + 20;
|
||||||
washers_y = nuts_y + 60;
|
washers_y = nuts_y + 100;
|
||||||
screws_y = washers_y + 120;
|
screws_y = washers_y + 120;
|
||||||
o_rings_y = screws_y + 130;
|
o_rings_y = screws_y + 130;
|
||||||
springs_y = o_rings_y + 20;
|
springs_y = o_rings_y + 20;
|
||||||
@@ -151,7 +153,7 @@ leadnuts_y = pillars_y + 40;
|
|||||||
pulleys_y = leadnuts_y +40;
|
pulleys_y = leadnuts_y +40;
|
||||||
hot_ends_y = pulleys_y + 60;
|
hot_ends_y = pulleys_y + 60;
|
||||||
linear_bearings_y = hot_ends_y + 50;
|
linear_bearings_y = hot_ends_y + 50;
|
||||||
sheets_y = linear_bearings_y + 50;
|
sheets_y = linear_bearings_y + 100;
|
||||||
pcbs_y = sheets_y + 40;
|
pcbs_y = sheets_y + 40;
|
||||||
displays_y = pcbs_y + 150;
|
displays_y = pcbs_y + 150;
|
||||||
fans_y = displays_y + 100;
|
fans_y = displays_y + 100;
|
||||||
@@ -202,6 +204,10 @@ translate([x0, linear_bearings_y]) {
|
|||||||
rods();
|
rods();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
translate([x0+150, linear_bearings_y+30]) {
|
||||||
|
extrusions();
|
||||||
|
}
|
||||||
|
|
||||||
translate([x0 + 10, hot_ends_y])
|
translate([x0 + 10, hot_ends_y])
|
||||||
hot_ends();
|
hot_ends();
|
||||||
|
|
||||||
@@ -248,7 +254,7 @@ buttons_y = spades_y + 40;
|
|||||||
jacks_y = buttons_y + 40;
|
jacks_y = buttons_y + 40;
|
||||||
microswitches_y = jacks_y + 40;
|
microswitches_y = jacks_y + 40;
|
||||||
rockers_y = microswitches_y + 40;
|
rockers_y = microswitches_y + 40;
|
||||||
toggles_y = rockers_y + 40;
|
toggles_y = rockers_y + 60;
|
||||||
components_y = toggles_y + 40;
|
components_y = toggles_y + 40;
|
||||||
|
|
||||||
translate([x2, leds_y])
|
translate([x2, leds_y])
|
||||||
@@ -304,6 +310,9 @@ translate([x3, veroboard_y])
|
|||||||
translate([x3 + 70, veroboard_y + 30])
|
translate([x3 + 70, veroboard_y + 30])
|
||||||
geared_steppers();
|
geared_steppers();
|
||||||
|
|
||||||
|
translate([x3 + 140, veroboard_y + 20])
|
||||||
|
pcb_mounts();
|
||||||
|
|
||||||
translate([x3, d_connectors_y])
|
translate([x3, d_connectors_y])
|
||||||
d_connectors();
|
d_connectors();
|
||||||
|
|
||||||
|
@@ -50,6 +50,10 @@ 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 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 star_washers(type) = type[10] ? type[10] : is_undef(type[10]); //! Set to false to remove 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;
|
||||||
|
|
||||||
module bbox_shelf_blank(type) { //! 2D template for a shelf
|
module bbox_shelf_blank(type) { //! 2D template for a shelf
|
||||||
dxf(str(bbox_name(type), "_shelf"));
|
dxf(str(bbox_name(type), "_shelf"));
|
||||||
|
|
||||||
@@ -165,7 +169,7 @@ module bbox_right_blank(type, sheet = false) { //! 2D template for the right sid
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module bbox_front_blank(type, sheet = false) { //! 2D template for the front
|
module bbox_front_blank(type, sheet = false, width = 0) { //! 2D template for the front
|
||||||
dxf(str(bbox_name(type), "_front"));
|
dxf(str(bbox_name(type), "_front"));
|
||||||
|
|
||||||
t = sheet_thickness(bbox_sheets(type));
|
t = sheet_thickness(bbox_sheets(type));
|
||||||
@@ -174,7 +178,7 @@ module bbox_front_blank(type, sheet = false) { //! 2D template for the front
|
|||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
translate([0, (bt - bb) / 2])
|
translate([0, (bt - bb) / 2])
|
||||||
sheet_2D(subst_sheet(type, sheet), bbox_width(type) + 2 * t, bbox_height(type) + bb + bt);
|
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]));
|
drill_holes(type, rotate([-90, 0, 0]) * translate([0, bbox_depth(type) / 2]));
|
||||||
}
|
}
|
||||||
@@ -205,7 +209,7 @@ module _bbox_assembly(type, top = true, base = true, left = true, right = true,
|
|||||||
width = bbox_width(type);
|
width = bbox_width(type);
|
||||||
depth = bbox_depth(type);
|
depth = bbox_depth(type);
|
||||||
height = bbox_height(type);
|
height = bbox_height(type);
|
||||||
echo("Box:", width, depth, height);
|
echo("Box:", width, depth, height, volume = bbox_volume(type), area = bbox_area(type));
|
||||||
|
|
||||||
t = sheet_thickness(bbox_sheets(type));
|
t = sheet_thickness(bbox_sheets(type));
|
||||||
bt = sheet_thickness(bbox_base_sheet(type));
|
bt = sheet_thickness(bbox_base_sheet(type));
|
||||||
|
@@ -195,12 +195,15 @@ module mouse_grommet_assembly(r, thickness)
|
|||||||
module ribbon_grommet_20_3_stl() ribbon_grommet(20, 3);
|
module ribbon_grommet_20_3_stl() ribbon_grommet(20, 3);
|
||||||
module mouse_grommet_15_3_stl() mouse_grommet(1.5, 3);
|
module mouse_grommet_15_3_stl() mouse_grommet(1.5, 3);
|
||||||
module mouse_grommet_20_3_stl() mouse_grommet(2, 3);
|
module mouse_grommet_20_3_stl() mouse_grommet(2, 3);
|
||||||
|
module mouse_grommet_25_3_stl() mouse_grommet(2.5, 3);
|
||||||
module mouse_grommet_30_3_stl() mouse_grommet(3, 3);
|
module mouse_grommet_30_3_stl() mouse_grommet(3, 3);
|
||||||
|
|
||||||
module round_grommet_bottom_30_stl() round_grommet_bottom(3);
|
module round_grommet_bottom_30_stl() round_grommet_bottom(3);
|
||||||
module round_grommet_bottom_40_stl() round_grommet_bottom(4);
|
module round_grommet_bottom_40_stl() round_grommet_bottom(4);
|
||||||
|
module round_grommet_bottom_50_stl() round_grommet_bottom(5);
|
||||||
module round_grommet_bottom_60_stl() round_grommet_bottom(6);
|
module round_grommet_bottom_60_stl() round_grommet_bottom(6);
|
||||||
|
|
||||||
module round_grommet_top_30_3_stl() round_grommet_top(3, 3);
|
module round_grommet_top_30_3_stl() round_grommet_top(3, 3);
|
||||||
module round_grommet_top_40_3_stl() round_grommet_top(4, 3);
|
module round_grommet_top_40_3_stl() round_grommet_top(4, 3);
|
||||||
|
module round_grommet_top_50_3_stl() round_grommet_top(5, 3);
|
||||||
module round_grommet_top_60_3_stl() round_grommet_top(6, 3);
|
module round_grommet_top_60_3_stl() round_grommet_top(6, 3);
|
||||||
|
124
printed/pcb_mount.scad
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2019
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
//! A frame to mount a PCB by its corners when it has no mounting holes.
|
||||||
|
//! The stl must be given a parameterless wrapper in the project that uses it.
|
||||||
|
//
|
||||||
|
include <../core.scad>
|
||||||
|
include <../vitamins/screws.scad>
|
||||||
|
use <../vitamins/pcb.scad>
|
||||||
|
|
||||||
|
clearance = 0.2;
|
||||||
|
min_wall = extrusion_width * 2;
|
||||||
|
wall = 2;
|
||||||
|
|
||||||
|
overlap = 2;
|
||||||
|
|
||||||
|
screw = M3_cap_screw;
|
||||||
|
screw_clearance_r = 3.1 / 2;
|
||||||
|
pillar_r = corrected_radius(screw_clearance_r) + wall;
|
||||||
|
|
||||||
|
function pillar_x_pitch(pcb) = pcb_length(pcb) + 2 * clearance + 2 * (pillar_r - overlap) / sqrt(2); //! x pitch of screw pillars
|
||||||
|
function pillar_y_pitch(pcb) = pcb_width(pcb) + 2 * clearance + 2 * (pillar_r - overlap) / sqrt(2); //! y pitch of screw pillars
|
||||||
|
|
||||||
|
function pcb_mount_length(pcb) = pillar_x_pitch(pcb) + 2 * pillar_r; //! Outside length of the mount
|
||||||
|
function pcb_mount_width(pcb) = pillar_y_pitch(pcb) + 2 * pillar_r; //! Outside width of the mount
|
||||||
|
|
||||||
|
frame_w = 3;
|
||||||
|
frame_t = 2;
|
||||||
|
|
||||||
|
washer_thickness = 1.25;
|
||||||
|
|
||||||
|
module pcb_mount_screw_positions(pcb) //! Positions of the screws and pillars
|
||||||
|
for(x = [-1, 1], y = [-1, 1])
|
||||||
|
translate([x * pillar_x_pitch(pcb) / 2, y * pillar_y_pitch(pcb) / 2])
|
||||||
|
children();
|
||||||
|
|
||||||
|
module pcb_mount_holes(pcb, h = 0) //! Drill holes for PCB mount
|
||||||
|
pcb_mount_screw_positions(pcb)
|
||||||
|
drill(screw_clearance_radius(screw), h);
|
||||||
|
|
||||||
|
module pcb_mount_ring()
|
||||||
|
difference() {
|
||||||
|
circle(pillar_r);
|
||||||
|
|
||||||
|
poly_circle(screw_clearance_r);
|
||||||
|
}
|
||||||
|
|
||||||
|
module pcb_mount_washer_stl() //! A plastic washer to clamp a PCB
|
||||||
|
linear_extrude(height = washer_thickness)
|
||||||
|
pcb_mount_ring();
|
||||||
|
|
||||||
|
module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mount for the specified PCB.
|
||||||
|
stl(str("pcb_mount_", pcb[0], "_", height));
|
||||||
|
|
||||||
|
y_pitch = pcb_width(pcb) > 4 * pillar_r + 4 ? pillar_r + 1
|
||||||
|
: pcb_width(pcb) / 2 + frame_w + 1 + pillar_r;
|
||||||
|
|
||||||
|
if(washers)
|
||||||
|
for(x = [-1, 1], y = [-1, 1])
|
||||||
|
translate([x * (pillar_r + 1), y * y_pitch, 0])
|
||||||
|
pcb_mount_washer_stl();
|
||||||
|
|
||||||
|
for(x = [-1, 1])
|
||||||
|
translate([x * pillar_x_pitch(pcb) / 2, 0, frame_t / 2])
|
||||||
|
cube([frame_w, pillar_y_pitch(pcb) - 2 * wall, frame_t], center = true);
|
||||||
|
|
||||||
|
for(y = [-1, 1])
|
||||||
|
translate([0, y * pillar_y_pitch(pcb) / 2, frame_t / 2])
|
||||||
|
cube([pillar_x_pitch(pcb) - 2 * wall, frame_w, frame_t], center = true);
|
||||||
|
|
||||||
|
pcb_mount_screw_positions(pcb)
|
||||||
|
linear_extrude(height = height)
|
||||||
|
pcb_mount_ring();
|
||||||
|
|
||||||
|
linear_extrude(height = height + pcb_thickness(pcb) - layer_height)
|
||||||
|
difference() {
|
||||||
|
pcb_mount_screw_positions(pcb)
|
||||||
|
pcb_mount_ring();
|
||||||
|
|
||||||
|
square([pcb_length(pcb) + 2 * clearance, pcb_width(pcb) + 2 * clearance], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly with fasteners
|
||||||
|
translate_z(height)
|
||||||
|
pcb(pcb);
|
||||||
|
|
||||||
|
color(pp1_colour) pcb_mount(pcb, washers = false);
|
||||||
|
|
||||||
|
washer = screw_washer(screw);
|
||||||
|
nut = screw_nut(screw);
|
||||||
|
t = pcb_thickness(pcb);
|
||||||
|
screw_length = screw_longer_than(height + t + washer_thickness + thickness + washer_thickness(washer) + nut_thickness(nut, true));
|
||||||
|
|
||||||
|
pcb_mount_screw_positions(pcb) {
|
||||||
|
translate_z(height + t) {
|
||||||
|
color(pp2_colour) pcb_mount_washer_stl();
|
||||||
|
|
||||||
|
translate_z(washer_thickness)
|
||||||
|
screw(screw, screw_length);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate_z(-thickness)
|
||||||
|
vflip()
|
||||||
|
nut_and_washer(nut, true);
|
||||||
|
}
|
||||||
|
}
|
@@ -34,7 +34,7 @@ knob_waves = 5;
|
|||||||
knob_height = knob_stem_h + knob_thickness;
|
knob_height = knob_stem_h + knob_thickness;
|
||||||
function knob_height() = knob_height;
|
function knob_height() = knob_height;
|
||||||
|
|
||||||
module screw_knob(screw) { //! Generate the STL foe a knob to fit the specified hex screw
|
module screw_knob(screw) { //! Generate the STL for a knob to fit the specified hex screw
|
||||||
stl(str("screw_knob_M", screw_radius(screw) * 20));
|
stl(str("screw_knob_M", screw_radius(screw) * 20));
|
||||||
|
|
||||||
knob_stem_r = nut_trap_radius(screw_nut(screw)) + knob_wall;
|
knob_stem_r = nut_trap_radius(screw_nut(screw)) + knob_wall;
|
||||||
|
385
readme.md
@@ -28,24 +28,25 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
|||||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Pcb_mount">Pcb_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Ldrs">Ldrs</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Ldrs">Ldrs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||||
|
<tr><td> <a href = "#Microview">Microview</a> </td><td></td><td></td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Modules">Modules</a> </td><td></td><td></td><td></td><td></td></tr>
|
<tr><td> <a href = "#Modules">Modules</a> </td><td></td><td></td><td></td><td></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -195,7 +196,7 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```belt(type, points, gap = 0, gap_pt = undef)``` | 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 = 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 |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -260,7 +261,7 @@ Models of radial blowers.
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```blower(PE4020)``` | Blower Pengda Technology 4020 |
|
| 1 | ```blower(PE4020)``` | Blower Pengda Technology 4020 |
|
||||||
| 1 | ```blower(RM5015)``` | Blower Runda RB5015 |
|
| 1 | ```blower(RB5015)``` | Blower Runda RB5015 |
|
||||||
| 3 | ```screw(M3_cap_screw, 20)``` | Screw M3 cap x 20mm |
|
| 3 | ```screw(M3_cap_screw, 20)``` | Screw M3 cap x 20mm |
|
||||||
| 2 | ```screw(M4_cap_screw, 25)``` | Screw M4 cap x 25mm |
|
| 2 | ```screw(M4_cap_screw, 25)``` | Screw M4 cap x 25mm |
|
||||||
| 3 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
| 3 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||||
@@ -581,9 +582,58 @@ LCD dispays.
|
|||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```display(HDMI5)``` | HDMI display 5" |
|
| 1 | ```display(HDMI5)``` | HDMI display 5" |
|
||||||
| 1 | ```display(LCD1602A)``` | LCD display 1602A |
|
| 1 | ```display(LCD1602A)``` | LCD display 1602A |
|
||||||
|
| 1 | ```display(LCDS7282B)``` | LCD display S-7282B |
|
||||||
| 1 | ```display(SSD1963_4p3)``` | LCD display SSD1963 4.3" |
|
| 1 | ```display(SSD1963_4p3)``` | LCD display SSD1963 4.3" |
|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="Extrusions"></a>
|
||||||
|
## Extrusions
|
||||||
|
Aluminium extrusion.
|
||||||
|
|
||||||
|
|
||||||
|
[vitamins/extrusions.scad](vitamins/extrusions.scad) Object definitions.
|
||||||
|
|
||||||
|
[vitamins/extrusion.scad](vitamins/extrusion.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/extrusions.scad](tests/extrusions.scad) Code for this example.
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```extrusion_center_hole(type)``` | Diameter of center hole |
|
||||||
|
| ```extrusion_center_square(type)``` | Size of center square |
|
||||||
|
| ```extrusion_channel_width(type)``` | Channel width |
|
||||||
|
| ```extrusion_channel_width_internal(type)``` | Internal channel width |
|
||||||
|
| ```extrusion_corner_hole(type)``` | Diameter of corner hole |
|
||||||
|
| ```extrusion_fillet(type)``` | Radius of corner fillet |
|
||||||
|
| ```extrusion_height(type)``` | Height of extrusion |
|
||||||
|
| ```extrusion_spar_thickness(type)``` | Spar thickness |
|
||||||
|
| ```extrusion_tab_thickness(type)``` | Tab thickness |
|
||||||
|
| ```extrusion_width(type)``` | Width of extrusion |
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
| Module | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```extrusion(type, length, cornerHole = false)``` | Draw the specified extrusion |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Vitamins
|
||||||
|
| Qty | Module call | BOM entry |
|
||||||
|
| ---:|:--- |:---|
|
||||||
|
| 1 | ```extrusion(E2020, 80)``` | Extrusion E2020 x 80mm |
|
||||||
|
| 1 | ```extrusion(E2040, 80)``` | Extrusion E2040 x 80mm |
|
||||||
|
| 1 | ```extrusion(E2060, 80)``` | Extrusion E2060 x 80mm |
|
||||||
|
| 1 | ```extrusion(E2080, 80)``` | Extrusion E2080 x 80mm |
|
||||||
|
| 1 | ```extrusion(E3030, 80)``` | Extrusion E3030 x 80mm |
|
||||||
|
| 1 | ```extrusion(E3060, 80)``` | Extrusion E3060 x 80mm |
|
||||||
|
| 1 | ```extrusion(E4040, 80)``` | Extrusion E4040 x 80mm |
|
||||||
|
| 1 | ```extrusion(E4080, 80)``` | Extrusion E4080 x 80mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -615,16 +665,11 @@ Can draw three styles: solid, open frame and open frame with screw bosses.
|
|||||||
| ```fan_thickness(type)``` | Thickness of the frame |
|
| ```fan_thickness(type)``` | Thickness of the frame |
|
||||||
| ```fan_width(type)``` | Width of square |
|
| ```fan_width(type)``` | Width of square |
|
||||||
|
|
||||||
### Functions
|
|
||||||
| Function | Description |
|
|
||||||
|:--- |:--- |
|
|
||||||
| ```fan_screw_length(type, thickness)``` | Screw length required |
|
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```fan(type)``` | Draw specified fan, origin in the centre |
|
| ```fan(type)``` | Draw specified fan, origin in the centre |
|
||||||
| ```fan_assembly(type, thickness, include_fan = true, screw = false)``` | Fan with its fasteners |
|
| ```fan_assembly(type, thickness, include_fan = true, screw = false, full_depth = false)``` | Fan with its fasteners |
|
||||||
| ```fan_hole_positions(type, z = undef)``` | Position children at the screw hole positions |
|
| ```fan_hole_positions(type, z = undef)``` | Position children at the screw hole positions |
|
||||||
| ```fan_holes(type, poly = false, screws = true, h = 100)``` | Make all the holes for the fan, or just the aperture if ```screws``` is false. Set ```poly``` true for poly_holes. |
|
| ```fan_holes(type, poly = false, screws = true, h = 100)``` | Make all the holes for the fan, or just the aperture if ```screws``` is false. Set ```poly``` true for poly_holes. |
|
||||||
|
|
||||||
@@ -634,6 +679,7 @@ Can draw three styles: solid, open frame and open frame with screw bosses.
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```fan(fan120x25)``` | Fan 120mm x 25mm |
|
| 1 | ```fan(fan120x25)``` | Fan 120mm x 25mm |
|
||||||
|
| 1 | ```fan(fan17x8)``` | Fan 17mm x 8mm |
|
||||||
| 1 | ```fan(fan25x10)``` | Fan 25mm x 10mm |
|
| 1 | ```fan(fan25x10)``` | Fan 25mm x 10mm |
|
||||||
| 1 | ```fan(fan30x10)``` | Fan 30mm x 10mm |
|
| 1 | ```fan(fan30x10)``` | Fan 30mm x 10mm |
|
||||||
| 1 | ```fan(fan40x11)``` | Fan 40mm x 11mm |
|
| 1 | ```fan(fan40x11)``` | Fan 40mm x 11mm |
|
||||||
@@ -643,17 +689,20 @@ Can draw three styles: solid, open frame and open frame with screw bosses.
|
|||||||
| 1 | ```fan(fan70x15)``` | Fan 70mm x 15mm |
|
| 1 | ```fan(fan70x15)``` | Fan 70mm x 15mm |
|
||||||
| 1 | ```fan(fan80x25)``` | Fan 80mm x 25mm |
|
| 1 | ```fan(fan80x25)``` | Fan 80mm x 25mm |
|
||||||
| 1 | ```fan(fan80x38)``` | Fan 80mm x 38mm |
|
| 1 | ```fan(fan80x38)``` | Fan 80mm x 38mm |
|
||||||
|
| 4 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
||||||
| 4 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
| 4 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||||
| 8 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
| 8 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
| 28 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
| 28 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||||
|
| 4 | ```screw(M2_cap_screw, 16)``` | Screw M2 cap x 16mm |
|
||||||
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
||||||
| 8 | ```screw(M3_dome_screw, 20)``` | Screw M3 dome x 20mm |
|
| 8 | ```screw(M3_dome_screw, 20)``` | Screw M3 dome x 20mm |
|
||||||
| 20 | ```screw(M4_dome_screw, 16)``` | Screw M4 dome x 16mm |
|
| 20 | ```screw(M4_dome_screw, 16)``` | Screw M4 dome x 16mm |
|
||||||
| 4 | ```screw(M4_dome_screw, 25)``` | Screw M4 dome x 25mm |
|
| 4 | ```screw(M4_dome_screw, 25)``` | Screw M4 dome x 25mm |
|
||||||
| 4 | ```screw(M4_dome_screw, 30)``` | Screw M4 dome x 30mm |
|
| 4 | ```screw(M4_dome_screw, 30)``` | Screw M4 dome x 30mm |
|
||||||
| 4 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
| 8 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
|
||||||
| 8 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
| 8 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||||
| 28 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||||
|
| 32 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -829,7 +878,7 @@ Needs updating as mostly obsolete versions.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```hot_end(type, filament, naked = false)``` | Draw specified hot end |
|
| ```hot_end(type, filament, naked = false, resistor_wire_rotate = [0,0,0])``` | Draw specified hot end |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -943,10 +992,11 @@ IEC mains inlets and outlet.
|
|||||||
| 1 | ```iec(IEC_inlet)``` | IEC inlet |
|
| 1 | ```iec(IEC_inlet)``` | IEC inlet |
|
||||||
| 1 | ```iec(IEC_inlet_atx)``` | IEC inlet for ATX |
|
| 1 | ```iec(IEC_inlet_atx)``` | IEC inlet for ATX |
|
||||||
| 1 | ```iec(IEC_outlet)``` | IEC outlet RS 811-7193 |
|
| 1 | ```iec(IEC_outlet)``` | IEC outlet RS 811-7193 |
|
||||||
| 10 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
| 1 | ```iec(IEC_switched_fused_inlet)``` | IEC320 C14 switched fused inlet module |
|
||||||
|
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
| 4 | ```screw(M3_cs_cap_screw, 10)``` | Screw M3 cs cap x 10mm |
|
| 4 | ```screw(M3_cs_cap_screw, 10)``` | Screw M3 cs cap x 10mm |
|
||||||
| 6 | ```screw(M3_cs_cap_screw, 12)``` | Screw M3 cs cap x 12mm |
|
| 8 | ```screw(M3_cs_cap_screw, 12)``` | Screw M3 cs cap x 12mm |
|
||||||
| 10 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -1103,7 +1153,9 @@ Nuts for leadscrews.
|
|||||||
| ```leadnut_hole_dia(type)``` | The diameter of the screw holes |
|
| ```leadnut_hole_dia(type)``` | The diameter of the screw holes |
|
||||||
| ```leadnut_hole_pitch(type)``` | The radia pitch of the screw holes |
|
| ```leadnut_hole_pitch(type)``` | The radia pitch of the screw holes |
|
||||||
| ```leadnut_holes(type)``` | The number of screw holes |
|
| ```leadnut_holes(type)``` | The number of screw holes |
|
||||||
|
| ```leadnut_lead(type)``` | Screw lead |
|
||||||
| ```leadnut_od(type)``` | Outer diameter of the shank |
|
| ```leadnut_od(type)``` | Outer diameter of the shank |
|
||||||
|
| ```leadnut_pitch(type)``` | Screw pitch |
|
||||||
| ```leadnut_screw(type)``` | The type of the fixing screws |
|
| ```leadnut_screw(type)``` | The type of the fixing screws |
|
||||||
|
|
||||||
### Functions
|
### Functions
|
||||||
@@ -1244,6 +1296,9 @@ LMnUU linear bearings.
|
|||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```bearing_dia(type)``` | Outside diameter |
|
| ```bearing_dia(type)``` | Outside diameter |
|
||||||
|
| ```bearing_groove_dia(type)``` | Groove diameter |
|
||||||
|
| ```bearing_groove_length(type)``` | Groove length |
|
||||||
|
| ```bearing_groove_spacing(type)``` | Spacing between grooves, outer to outer, ie includes the grooves themselves |
|
||||||
| ```bearing_length(type)``` | Total length |
|
| ```bearing_length(type)``` | Total length |
|
||||||
| ```bearing_rod_dia(type)``` | Internal diameter |
|
| ```bearing_rod_dia(type)``` | Internal diameter |
|
||||||
|
|
||||||
@@ -1262,12 +1317,21 @@ LMnUU linear bearings.
|
|||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
|
| 1 | ```linear_bearing(LM10LUU)``` | Linear bearing LM10LUU |
|
||||||
| 1 | ```linear_bearing(LM10UU)``` | Linear bearing LM10UU |
|
| 1 | ```linear_bearing(LM10UU)``` | Linear bearing LM10UU |
|
||||||
|
| 1 | ```linear_bearing(LM12LUU)``` | Linear bearing LM12LUU |
|
||||||
| 1 | ```linear_bearing(LM12UU)``` | Linear bearing LM12UU |
|
| 1 | ```linear_bearing(LM12UU)``` | Linear bearing LM12UU |
|
||||||
|
| 1 | ```linear_bearing(LM16LUU)``` | Linear bearing LM16LUU |
|
||||||
|
| 1 | ```linear_bearing(LM16UU)``` | Linear bearing LM16UU |
|
||||||
|
| 1 | ```linear_bearing(LM3LUU)``` | Linear bearing LM3LUU |
|
||||||
| 1 | ```linear_bearing(LM3UU)``` | Linear bearing LM3UU |
|
| 1 | ```linear_bearing(LM3UU)``` | Linear bearing LM3UU |
|
||||||
|
| 1 | ```linear_bearing(LM4LUU)``` | Linear bearing LM4LUU |
|
||||||
| 1 | ```linear_bearing(LM4UU)``` | Linear bearing LM4UU |
|
| 1 | ```linear_bearing(LM4UU)``` | Linear bearing LM4UU |
|
||||||
|
| 1 | ```linear_bearing(LM5LUU)``` | Linear bearing LM5LUU |
|
||||||
| 1 | ```linear_bearing(LM5UU)``` | Linear bearing LM5UU |
|
| 1 | ```linear_bearing(LM5UU)``` | Linear bearing LM5UU |
|
||||||
|
| 1 | ```linear_bearing(LM6LUU)``` | Linear bearing LM6LUU |
|
||||||
| 1 | ```linear_bearing(LM6UU)``` | Linear bearing LM6UU |
|
| 1 | ```linear_bearing(LM6UU)``` | Linear bearing LM6UU |
|
||||||
|
| 1 | ```linear_bearing(LM8LUU)``` | Linear bearing LM8LUU |
|
||||||
| 1 | ```linear_bearing(LM8UU)``` | Linear bearing LM8UU |
|
| 1 | ```linear_bearing(LM8UU)``` | Linear bearing LM8UU |
|
||||||
|
|
||||||
|
|
||||||
@@ -1559,11 +1623,16 @@ If a nut is given a child then it gets placed on its top surface.
|
|||||||
| 1 | ```nut(M2p5_nut)``` | Nut M2.5 x 2.2mm |
|
| 1 | ```nut(M2p5_nut)``` | Nut M2.5 x 2.2mm |
|
||||||
| 1 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
| 1 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||||
| 1 | ```nut(M2p5_nut, nylon = true)``` | Nut M2.5 x 2.2mm nylon |
|
| 1 | ```nut(M2p5_nut, nylon = true)``` | Nut M2.5 x 2.2mm nylon |
|
||||||
|
| 1 | ```hammer_nut(M3_hammer_nut)``` | Nut M3 hammer |
|
||||||
|
| 1 | ```sliding_t_nut(M3_sliding_t_nut)``` | Nut M3 sliding T |
|
||||||
| 1 | ```nut(M3_nut)``` | Nut M3 x 2.4mm |
|
| 1 | ```nut(M3_nut)``` | Nut M3 x 2.4mm |
|
||||||
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
|
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
|
||||||
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
|
| 1 | ```hammer_nut(M4_hammer_nut)``` | Nut M4 hammer |
|
||||||
|
| 1 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
|
||||||
| 1 | ```nut(M4_nut)``` | Nut M4 x 3.2mm |
|
| 1 | ```nut(M4_nut)``` | Nut M4 x 3.2mm |
|
||||||
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||||
|
| 1 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
|
||||||
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
|
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
|
||||||
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
|
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
|
||||||
| 1 | ```nut(M6_half_nut)``` | Nut M6 x 3mm |
|
| 1 | ```nut(M6_half_nut)``` | Nut M6 x 3mm |
|
||||||
@@ -1657,6 +1726,13 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
### Properties
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| ```hdmi_depth(type)``` | Front to back depth |
|
||||||
|
| ```hdmi_height(type)``` | Outside height above the PCB |
|
||||||
|
| ```hdmi_height1(type)``` | Inside height at the sides |
|
||||||
|
| ```hdmi_height2(type)``` | Inside height in the middle |
|
||||||
|
| ```hdmi_thickness(type)``` | Wall thickness of the metal |
|
||||||
|
| ```hdmi_width1(type)``` | Inside width at the top |
|
||||||
|
| ```hdmi_width2(type)``` | Inside width at the bottom |
|
||||||
| ```pcb_accessories(type)``` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
|
| ```pcb_accessories(type)``` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
|
||||||
| ```pcb_colour(type)``` | Colour of the subtrate |
|
| ```pcb_colour(type)``` | Colour of the subtrate |
|
||||||
| ```pcb_components(type)``` | List of components |
|
| ```pcb_components(type)``` | List of components |
|
||||||
@@ -1675,16 +1751,20 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| ```pcb_component_position(type, name, index = 0)``` | Return x y position of specified component |
|
||||||
| ```pcb_coord(type, p)``` | Convert offsets from the edge to coordinates relative to the centre |
|
| ```pcb_coord(type, p)``` | Convert offsets from the edge to coordinates relative to the centre |
|
||||||
|
| ```pcb_grid_pos(type, x, y, z = 0)``` | Returns a pcb grid position |
|
||||||
| ```pcb_screw(type, cap = hs_cap)``` | Mounting screw type |
|
| ```pcb_screw(type, cap = hs_cap)``` | Mounting screw type |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
||||||
|
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
|
||||||
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
|
| ```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 |
|
||||||
| ```flex(cutout = false)``` | Draw flexistrip connector |
|
| ```flex(cutout = false)``` | Draw flexistrip connector |
|
||||||
| ```hdmi(cutout = false)``` | Draw HDMI socket |
|
| ```hdmi(type, cutout = false)``` | Draw HDMI socket |
|
||||||
| ```jack(cutout = false)``` | Draw 3.5mm jack |
|
| ```jack(cutout = false)``` | Draw 3.5mm jack |
|
||||||
| ```molex_254(ways)``` | Draw molex header |
|
| ```molex_254(ways)``` | Draw molex header |
|
||||||
| ```pcb(type)``` | Draw specified PCB |
|
| ```pcb(type)``` | Draw specified PCB |
|
||||||
@@ -1694,7 +1774,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| ```pcb_component_position(type, name)``` | Position child at the specified component position |
|
| ```pcb_component_position(type, name)``` | Position child at the specified component position |
|
||||||
| ```pcb_components(type, cutouts = false, angle = undef)``` | Draw list of PCB components on the PCB |
|
| ```pcb_components(type, cutouts = false, angle = undef)``` | Draw list of PCB components on the PCB |
|
||||||
| ```pcb_cutouts(type, angle = undef)``` | Make cut outs to clear components on a PCB |
|
| ```pcb_cutouts(type, angle = undef)``` | Make cut outs to clear components on a PCB |
|
||||||
| ```pcb_grid(type, x, y, z = 0)``` | Positions children at specified grid positions |
|
| ```pcb_grid(type, x, y, z = 0)``` | Positions children at specified grid position |
|
||||||
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
|
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
|
||||||
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
||||||
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
|
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
|
||||||
@@ -1716,14 +1796,15 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
|
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
|
||||||
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
|
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
|
||||||
| 1 | ```pcb(Duex5)``` | Duex5 expasnion board |
|
| 1 | ```pcb(Duex5)``` | Duex5 expasnion board |
|
||||||
|
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
|
||||||
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
|
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
|
||||||
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
|
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
|
||||||
| 1 | ```pcb(Melzi)``` | Melzi electronics |
|
| 1 | ```pcb(Melzi)``` | Melzi electronics |
|
||||||
| 3 | | Micro SD card |
|
| 4 | | Micro SD card |
|
||||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||||
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
|
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
|
||||||
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
||||||
| 20 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
| 32 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||||
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||||
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
||||||
@@ -1734,20 +1815,25 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| 1 | ```pcb(PERF74x51)``` | Perfboard 74 x 51mm |
|
| 1 | ```pcb(PERF74x51)``` | Perfboard 74 x 51mm |
|
||||||
| 1 | ```pcb(PERF80x20)``` | Perfboard 80 x 20mm |
|
| 1 | ```pcb(PERF80x20)``` | Perfboard 80 x 20mm |
|
||||||
| 1 | ```pin_socket(2p54header, 13, 2, right_angle = true)``` | Pin socket 13 x 2 right_angle |
|
| 1 | ```pin_socket(2p54header, 13, 2, right_angle = true)``` | Pin socket 13 x 2 right_angle |
|
||||||
|
| 1 | ```pcb(RAMPSEndstop)``` | RAMPS Endstop Switch |
|
||||||
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
|
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
|
||||||
| 8 | ```screw(M2_cap_screw, 20)``` | Screw M2 cap x 20mm |
|
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
|
||||||
| 8 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
|
| 16 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
|
||||||
| 4 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
| 4 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
||||||
| 12 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
| 8 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
|
||||||
| 4 | ```screw(M2p5_pan_screw, 30)``` | Screw M2.5 pan x 30mm |
|
| 4 | ```screw(M2p5_cap_screw, 35)``` | Screw M2.5 cap x 35mm |
|
||||||
| 4 | ```screw(M3_cap_screw, 25)``` | Screw M3 cap x 25mm |
|
| 8 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
||||||
|
| 4 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
|
||||||
|
| 4 | ```screw(M2p5_pan_screw, 35)``` | Screw M2.5 pan x 35mm |
|
||||||
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
|
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
|
||||||
| 12 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
|
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
|
||||||
|
| 4 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
|
||||||
|
| 8 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
|
||||||
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
|
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
|
||||||
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
||||||
| 1 | | USB A to Mini B lead |
|
| 1 | | USB A to Mini B lead |
|
||||||
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
|
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
|
||||||
| 20 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
| 32 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||||
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||||
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
||||||
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
|
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
|
||||||
@@ -1755,21 +1841,24 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
### Printed
|
### Printed
|
||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 4 | pcb_spacer20110.stl |
|
|
||||||
| 4 | pcb_spacer20120.stl |
|
|
||||||
| 4 | pcb_spacer20130.stl |
|
| 4 | pcb_spacer20130.stl |
|
||||||
| 4 | pcb_spacer20140.stl |
|
| 4 | pcb_spacer20140.stl |
|
||||||
|
| 4 | pcb_spacer20150.stl |
|
||||||
|
| 4 | pcb_spacer20160.stl |
|
||||||
| 4 | pcb_spacer25100_2.stl |
|
| 4 | pcb_spacer25100_2.stl |
|
||||||
| 4 | pcb_spacer25210.stl |
|
| 4 | pcb_spacer25110_2.stl |
|
||||||
|
| 4 | pcb_spacer25120_2.stl |
|
||||||
|
| 4 | pcb_spacer25230.stl |
|
||||||
|
| 4 | pcb_spacer25240.stl |
|
||||||
| 4 | pcb_spacer2570.stl |
|
| 4 | pcb_spacer2570.stl |
|
||||||
| 4 | pcb_spacer2580_2.stl |
|
| 4 | pcb_spacer2580.stl |
|
||||||
| 4 | pcb_spacer2590_2.stl |
|
| 4 | pcb_spacer2590.stl |
|
||||||
| 4 | pcb_spacer30150.stl |
|
| 4 | pcb_spacer30170.stl |
|
||||||
| 4 | pcb_spacer30160.stl |
|
| 4 | pcb_spacer30180.stl |
|
||||||
| 4 | pcb_spacer30200.stl |
|
| 4 | pcb_spacer30220.stl |
|
||||||
| 4 | pcb_spacer40170.stl |
|
|
||||||
| 4 | pcb_spacer40180.stl |
|
|
||||||
| 4 | pcb_spacer40190.stl |
|
| 4 | pcb_spacer40190.stl |
|
||||||
|
| 4 | pcb_spacer40200.stl |
|
||||||
|
| 4 | pcb_spacer40210.stl |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -1850,18 +1939,20 @@ Pin headers and sockets, etc.
|
|||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```box_header(type, cols = 1, rows = 1, smt = false, cutout = false)``` | Draw box header |
|
| ```box_header(type, cols = 1, rows = 1, smt = false, cutout = false)``` | Draw box header |
|
||||||
| ```idc_transition(type, cols = 5, skip = [], cutout = false)``` | Draw IDC transition header |
|
| ```idc_transition(type, cols = 5, skip = [], cutout = false)``` | Draw IDC transition header |
|
||||||
|
| ```jst_xh_header(type, pin_count, right_angle=false, colour, pin_colour)``` | Draw JST XH connector |
|
||||||
| ```pin(type, length = undef)``` | Draw a header pin |
|
| ```pin(type, length = undef)``` | Draw a header pin |
|
||||||
| ```pin_header(type, cols = 1, rows = 1, smt = false, cutout = false)``` | Draw pin header |
|
| ```pin_header(type, cols = 1, rows = 1, smt = false, right_angle = false, cutout = false)``` | Draw pin header |
|
||||||
| ```pin_socket(type, cols = 1, rows = 1, right_angle = false, height = 0, cutout = false)``` | Draw pin socket |
|
| ```pin_socket(type, cols = 1, rows = 1, right_angle = false, height = 0, smt = false, cutout = false)``` | Draw pin socket |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```box_header(2p54header102)``` | Box header 10 x 2 |
|
| 1 | ```box_header(2p54header, 10, 2)``` | Box header 10 x 2 |
|
||||||
| 1 | ```idc_transition(2p54header, 10)``` | IDC transition header 10 x 2 |
|
| 1 | ```idc_transition(2p54header, 10)``` | IDC transition header 10 x 2 |
|
||||||
| 1 | ```pin_header(2p54header102)``` | Pin header 10 x 2 |
|
| 1 | ```pin_header(2p54header, 10, 2)``` | Pin header 10 x 2 |
|
||||||
|
| 1 | ```pin_header(2p54header, 10, 2, right_angle = true)``` | Pin header 10 x 2 right_angle |
|
||||||
| 1 | ```pin_socket(2p54header, 10, 2)``` | Pin socket 10 x 2 |
|
| 1 | ```pin_socket(2p54header, 10, 2)``` | Pin socket 10 x 2 |
|
||||||
| 1 | ```pin_socket(2p54header, 10, 2, right_angle = true)``` | Pin socket 10 x 2 right_angle |
|
| 1 | ```pin_socket(2p54header, 10, 2, right_angle = true)``` | Pin socket 10 x 2 right_angle |
|
||||||
|
|
||||||
@@ -2057,10 +2148,10 @@ Linear rails with carriages.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```carriage(type, rail)``` | Draw the specified carriage |
|
| ```carriage(type, rail, end_color = grey20, wiper_color = grey20)``` | Draw the specified carriage |
|
||||||
| ```carriage_hole_positions(type)``` | Position children over screw holes |
|
| ```carriage_hole_positions(type)``` | Position children over screw holes |
|
||||||
| ```rail(type, length)``` | Draw the specified rail |
|
| ```rail(type, length)``` | Draw the specified rail |
|
||||||
| ```rail_assembly(type, length, pos)``` | Rail and carriage assembly |
|
| ```rail_assembly(type, length, pos, carriage_end_color = grey20, carriage_wiper_color = grey20)``` | Rail and carriage assembly |
|
||||||
| ```rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)``` | Position children over screw holes |
|
| ```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 |
|
| ```rail_screws(type, length, thickness, screws = 100)``` | Place screws in the rail |
|
||||||
|
|
||||||
@@ -2107,6 +2198,7 @@ Ring terminals and earth assemblies for DiBond panels.
|
|||||||
### Properties
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| ```ringterm_crimp_length(type)``` | If non-zero the length of the crimp tube |
|
||||||
| ```ringterm_hole(type)``` | Wire hole diameter |
|
| ```ringterm_hole(type)``` | Wire hole diameter |
|
||||||
| ```ringterm_id(type)``` | Inside diameter |
|
| ```ringterm_id(type)``` | Inside diameter |
|
||||||
| ```ringterm_length(type)``` | Length of the tail including the ring |
|
| ```ringterm_length(type)``` | Length of the tail including the ring |
|
||||||
@@ -2132,12 +2224,13 @@ Ring terminals and earth assemblies for DiBond panels.
|
|||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 2 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
| 3 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
| 1 | ```ring_terminal(M3_ringterm)``` | Ring terminal 3mm |
|
| 1 | ```ring_terminal(M3_ringterm)``` | Ring terminal 3mm |
|
||||||
| 1 | ```ring_terminal(M3_ringterm_cs)``` | Ring terminal 3mm |
|
| 1 | ```ring_terminal(M3_ringterm_cs)``` | Ring terminal 3mm |
|
||||||
|
| 1 | ```ring_terminal(M3_ringterm_crimp)``` | Ring terminal crimp 3mm |
|
||||||
| 1 | ```screw(M3_cap_screw, 10)``` | Screw M3 cap x 10mm |
|
| 1 | ```screw(M3_cap_screw, 10)``` | Screw M3 cap x 10mm |
|
||||||
| 1 | ```screw(M3_dome_screw, 10)``` | Screw M3 dome x 10mm |
|
| 2 | ```screw(M3_dome_screw, 10)``` | Screw M3 dome x 10mm |
|
||||||
| 4 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
|
| 6 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -2145,7 +2238,7 @@ Ring terminals and earth assemblies for DiBond panels.
|
|||||||
---
|
---
|
||||||
<a name="Rockers"></a>
|
<a name="Rockers"></a>
|
||||||
## Rockers
|
## Rockers
|
||||||
Rocket switch. Also used for neon indicator in the same form factor.
|
Rocker switch. Also used for neon indicator in the same form factor.
|
||||||
|
|
||||||
|
|
||||||
[vitamins/rockers.scad](vitamins/rockers.scad) Object definitions.
|
[vitamins/rockers.scad](vitamins/rockers.scad) Object definitions.
|
||||||
@@ -2166,7 +2259,7 @@ Rocket switch. Also used for neon indicator in the same form factor.
|
|||||||
| ```rocker_height(type)``` | Body height |
|
| ```rocker_height(type)``` | Body height |
|
||||||
| ```rocker_part(type)``` | Part description |
|
| ```rocker_part(type)``` | Part description |
|
||||||
| ```rocker_pivot(type)``` | Pivot distance from the back of the flange |
|
| ```rocker_pivot(type)``` | Pivot distance from the back of the flange |
|
||||||
| ```rocker_slot_h(type)``` | Panel slow height |
|
| ```rocker_slot_h(type)``` | Panel slot height |
|
||||||
| ```rocker_slot_w(type)``` | Panel slot width |
|
| ```rocker_slot_w(type)``` | Panel slot width |
|
||||||
| ```rocker_spades(type)``` | Spade types and positions |
|
| ```rocker_spades(type)``` | Spade types and positions |
|
||||||
| ```rocker_width(type)``` | Body width |
|
| ```rocker_width(type)``` | Body width |
|
||||||
@@ -2174,7 +2267,7 @@ Rocket switch. Also used for neon indicator in the same form factor.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```rocker(type)``` | Draw the specified rocker switch |
|
| ```rocker(type, colour)``` | Draw the specified rocker switch |
|
||||||
| ```rocker_hole(type, h = 0)``` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
|
| ```rocker_hole(type, h = 0)``` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
|
||||||
|
|
||||||

|

|
||||||
@@ -2182,8 +2275,8 @@ Rocket switch. Also used for neon indicator in the same form factor.
|
|||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```rocker(neon_indicator)``` | Neon Indicator H8630FBNAL |
|
| 2 | ```rocker(neon_indicator)``` | Neon Indicator H8630FBNAL |
|
||||||
| 1 | ```rocker(small_rocker)``` | Rocker Switch PRASA1-16F-BB0BW |
|
| 2 | ```rocker(small_rocker)``` | Rocker Switch PRASA1-16F-BB0BW |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -2201,16 +2294,23 @@ Steel rods and studding with chamfered ends.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```rod(d , l)``` | Draw a smooth rod with specified length and diameter |
|
| ```leadscrew(d , l, lead, starts, center = true)``` | Draw a leadscrew with specified diameter, length, lead and number of starts |
|
||||||
| ```studding(d , l)``` | Draw a threaded rod with specified length and diameter |
|
| ```rod(d , l, center = true)``` | Draw a smooth rod with specified diameter and length |
|
||||||
|
| ```studding(d , l, center = true)``` | Draw a threaded rod with specified diameter and length |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
|
| 1 | ```leadscrew(10, 80, 8, 4)``` | Leadscrew 10 x 80mm, 8mm lead, 4 starts |
|
||||||
|
| 1 | ```leadscrew(12, 80, 12, 4)``` | Leadscrew 12 x 80mm, 12mm lead, 4 starts |
|
||||||
|
| 1 | ```leadscrew(16, 80, 16, 4)``` | Leadscrew 16 x 80mm, 16mm lead, 4 starts |
|
||||||
|
| 1 | ```leadscrew(6, 80, 2, 1)``` | Leadscrew 6 x 80mm, 2mm lead, 1 starts |
|
||||||
|
| 1 | ```leadscrew(8, 80, 8, 4)``` | Leadscrew 8 x 80mm, 8mm lead, 4 starts |
|
||||||
| 1 | ```rod(10, 80)``` | Smooth rod 10mm x 80mm |
|
| 1 | ```rod(10, 80)``` | Smooth rod 10mm x 80mm |
|
||||||
| 1 | ```rod(12, 80)``` | Smooth rod 12mm x 80mm |
|
| 1 | ```rod(12, 80)``` | Smooth rod 12mm x 80mm |
|
||||||
|
| 1 | ```rod(16, 80)``` | Smooth rod 16mm x 80mm |
|
||||||
| 1 | ```rod(3, 80)``` | Smooth rod 3mm x 80mm |
|
| 1 | ```rod(3, 80)``` | Smooth rod 3mm x 80mm |
|
||||||
| 1 | ```rod(4, 80)``` | Smooth rod 4mm x 80mm |
|
| 1 | ```rod(4, 80)``` | Smooth rod 4mm x 80mm |
|
||||||
| 1 | ```rod(5, 80)``` | Smooth rod 5mm x 80mm |
|
| 1 | ```rod(5, 80)``` | Smooth rod 5mm x 80mm |
|
||||||
@@ -2218,6 +2318,7 @@ Steel rods and studding with chamfered ends.
|
|||||||
| 1 | ```rod(8, 80)``` | Smooth rod 8mm x 80mm |
|
| 1 | ```rod(8, 80)``` | Smooth rod 8mm x 80mm |
|
||||||
| 1 | ```studding(10, 80)``` | Threaded rod M10 x 80mm |
|
| 1 | ```studding(10, 80)``` | Threaded rod M10 x 80mm |
|
||||||
| 1 | ```studding(12, 80)``` | Threaded rod M12 x 80mm |
|
| 1 | ```studding(12, 80)``` | Threaded rod M12 x 80mm |
|
||||||
|
| 1 | ```studding(16, 80)``` | Threaded rod M16 x 80mm |
|
||||||
| 1 | ```studding(3, 80)``` | Threaded rod M3 x 80mm |
|
| 1 | ```studding(3, 80)``` | Threaded rod M3 x 80mm |
|
||||||
| 1 | ```studding(4, 80)``` | Threaded rod M4 x 80mm |
|
| 1 | ```studding(4, 80)``` | Threaded rod M4 x 80mm |
|
||||||
| 1 | ```studding(5, 80)``` | Threaded rod M5 x 80mm |
|
| 1 | ```studding(5, 80)``` | Threaded rod M5 x 80mm |
|
||||||
@@ -2276,17 +2377,17 @@ Machine screws and wood screws with various head styles.
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```screw(No632_pan_screw, 30)``` | Screw 6-32 pan x 30mm |
|
| 1 | ```screw(No632_pan_screw, 30)``` | Screw 6-32 pan x 30mm |
|
||||||
| 1 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
|
| 1 | ```screw(M2_cap_screw, 10)``` | Screw M2 cap x 10mm |
|
||||||
| 1 | ```screw(M2_cs_cap_screw, 25)``` | Screw M2 cs cap x 25mm |
|
| 1 | ```screw(M2_cs_cap_screw, 10)``` | Screw M2 cs cap x 10mm |
|
||||||
| 1 | ```screw(M2p5_cap_screw, 25)``` | Screw M2.5 cap x 25mm |
|
| 1 | ```screw(M2p5_cap_screw, 10)``` | Screw M2.5 cap x 10mm |
|
||||||
| 1 | ```screw(M2p5_pan_screw, 30)``` | Screw M2.5 pan x 30mm |
|
| 1 | ```screw(M2p5_pan_screw, 10)``` | Screw M2.5 pan x 10mm |
|
||||||
| 1 | ```screw(M3_cap_screw, 25)``` | Screw M3 cap x 25mm |
|
| 1 | ```screw(M3_cap_screw, 10)``` | Screw M3 cap x 10mm |
|
||||||
| 1 | ```screw(M3_cs_cap_screw, 25)``` | Screw M3 cs cap x 25mm |
|
| 1 | ```screw(M3_cs_cap_screw, 10)``` | Screw M3 cs cap x 10mm |
|
||||||
| 1 | ```screw(M3_dome_screw, 25)``` | Screw M3 dome x 25mm |
|
| 1 | ```screw(M3_dome_screw, 10)``` | Screw M3 dome x 10mm |
|
||||||
| 1 | ```screw(M3_grub_screw, 6)``` | Screw M3 grub x 6mm |
|
| 1 | ```screw(M3_grub_screw, 6)``` | Screw M3 grub x 6mm |
|
||||||
| 1 | ```screw(M3_hex_screw, 30)``` | Screw M3 hex x 30mm |
|
| 1 | ```screw(M3_hex_screw, 10)``` | Screw M3 hex x 10mm |
|
||||||
| 1 | ```screw(M3_low_cap_screw, 25)``` | Screw M3 low cap x 25mm |
|
| 1 | ```screw(M3_low_cap_screw, 10)``` | Screw M3 low cap x 10mm |
|
||||||
| 1 | ```screw(M3_pan_screw, 30)``` | Screw M3 pan x 30mm |
|
| 1 | ```screw(M3_pan_screw, 10)``` | Screw M3 pan x 10mm |
|
||||||
| 1 | ```screw(M4_cap_screw, 25)``` | Screw M4 cap x 25mm |
|
| 1 | ```screw(M4_cap_screw, 25)``` | Screw M4 cap x 25mm |
|
||||||
| 1 | ```screw(M4_cs_cap_screw, 25)``` | Screw M4 cs cap x 25mm |
|
| 1 | ```screw(M4_cs_cap_screw, 25)``` | Screw M4 cs cap x 25mm |
|
||||||
| 1 | ```screw(M4_dome_screw, 25)``` | Screw M4 dome x 25mm |
|
| 1 | ```screw(M4_dome_screw, 25)``` | Screw M4 dome x 25mm |
|
||||||
@@ -2301,8 +2402,8 @@ Machine screws and wood screws with various head styles.
|
|||||||
| 1 | ```screw(M6_pan_screw, 30)``` | Screw M6 pan x 30mm |
|
| 1 | ```screw(M6_pan_screw, 30)``` | Screw M6 pan x 30mm |
|
||||||
| 1 | ```screw(M8_cap_screw, 35)``` | Screw M8 cap x 35mm |
|
| 1 | ```screw(M8_cap_screw, 35)``` | Screw M8 cap x 35mm |
|
||||||
| 1 | ```screw(M8_hex_screw, 30)``` | Screw M8 hex x 30mm |
|
| 1 | ```screw(M8_hex_screw, 30)``` | Screw M8 hex x 30mm |
|
||||||
| 1 | ```screw(No2_screw, 30)``` | Screw No2 pan wood x 30mm |
|
| 1 | ```screw(No2_screw, 10)``` | Screw No2 pan wood x 10mm |
|
||||||
| 1 | ```screw(No4_screw, 30)``` | Screw No4 pan wood x 30mm |
|
| 1 | ```screw(No4_screw, 10)``` | Screw No4 pan wood x 10mm |
|
||||||
| 1 | ```screw(No6_cs_screw, 30)``` | Screw No6 cs wood x 30mm |
|
| 1 | ```screw(No6_cs_screw, 30)``` | Screw No6 cs wood x 30mm |
|
||||||
| 1 | ```screw(No6_screw, 30)``` | Screw No6 pan wood x 30mm |
|
| 1 | ```screw(No6_screw, 30)``` | Screw No6 pan wood x 30mm |
|
||||||
|
|
||||||
@@ -2462,7 +2563,7 @@ Filament spool models
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```spool(type)``` | Draw specified spool |
|
| ```spool(type, filament_depth = 0, filament_colour = "white", filament_d = 3)``` | Draw specified spool with optional filament |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -2470,6 +2571,7 @@ Filament spool models
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```spool(spool_200x55)``` | Filament spool 200 x 55 |
|
| 1 | ```spool(spool_200x55)``` | Filament spool 200 x 55 |
|
||||||
|
| 1 | ```spool(spool_200x60)``` | Filament spool 200 x 60 |
|
||||||
| 1 | ```spool(spool_300x85)``` | Filament spool 300 x 85 |
|
| 1 | ```spool(spool_300x85)``` | Filament spool 300 x 85 |
|
||||||
| 1 | ```spool(spool_300x88)``` | Filament spool 300 x 88 |
|
| 1 | ```spool(spool_300x88)``` | Filament spool 300 x 88 |
|
||||||
|
|
||||||
@@ -2589,7 +2691,7 @@ NEMA stepper motor model.
|
|||||||
| ```NEMA_length(type)``` | Body length |
|
| ```NEMA_length(type)``` | Body length |
|
||||||
| ```NEMA_radius(type)``` | End cap radius |
|
| ```NEMA_radius(type)``` | End cap radius |
|
||||||
| ```NEMA_shaft_dia(type)``` | Shaft diameter |
|
| ```NEMA_shaft_dia(type)``` | Shaft diameter |
|
||||||
| ```NEMA_shaft_length(type)``` | Shaft length above the face |
|
| ```NEMA_shaft_length(type)``` | Shaft length above the face, if a list then a leadscrew: length, lead, starts |
|
||||||
| ```NEMA_width(type)``` | Width of the square face |
|
| ```NEMA_width(type)``` | Width of the square face |
|
||||||
|
|
||||||
### Functions
|
### Functions
|
||||||
@@ -2601,7 +2703,7 @@ NEMA stepper motor model.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```NEMA(type)``` | Draw specified NEMA stepper motor |
|
| ```NEMA(type, shaft_angle = 0)``` | Draw specified NEMA stepper motor |
|
||||||
| ```NEMA_outline(type)``` | 2D outline |
|
| ```NEMA_outline(type)``` | 2D outline |
|
||||||
| ```NEMA_screw_positions(type, n = 4)``` | Positions children at the screw holes |
|
| ```NEMA_screw_positions(type, n = 4)``` | Positions children at the screw holes |
|
||||||
| ```NEMA_screws(type, screw, n = 4, screw_length = 8, earth = undef)``` | Place screws and optional earth tag |
|
| ```NEMA_screws(type, screw, n = 4, screw_length = 8, earth = undef)``` | Place screws and optional earth tag |
|
||||||
@@ -3229,6 +3331,12 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
|||||||
| ```bbox_width(type)``` | Internal width |
|
| ```bbox_width(type)``` | Internal width |
|
||||||
| ```star_washers(type)``` | Set to false to remove star washers. |
|
| ```star_washers(type)``` | Set to false to remove star washers. |
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```bbox_area(type)``` | Internal surdface area in m^2 |
|
||||||
|
| ```bbox_volume(type)``` | Internal volume in litres |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
@@ -3238,7 +3346,7 @@ Uses [fixing blocks](#fixing_block) and [corner blocks](#corner_block).
|
|||||||
| ```bbox_base(type)``` | Default base, can be overridden to customise |
|
| ```bbox_base(type)``` | Default base, can be overridden to customise |
|
||||||
| ```bbox_base_blank(type)``` | 2D template for the base |
|
| ```bbox_base_blank(type)``` | 2D template for the base |
|
||||||
| ```bbox_front(type)``` | Default front, can be overridden to customise |
|
| ```bbox_front(type)``` | Default front, can be overridden to customise |
|
||||||
| ```bbox_front_blank(type, sheet = false)``` | 2D template for the front |
|
| ```bbox_front_blank(type, sheet = false, width = 0)``` | 2D template for the front |
|
||||||
| ```bbox_left(type)``` | Default left side, can be overridden to customise |
|
| ```bbox_left(type)``` | Default left side, can be overridden to customise |
|
||||||
| ```bbox_left_blank(type, sheet = false)``` | 2D template for the left side |
|
| ```bbox_left_blank(type, sheet = false)``` | 2D template for the left side |
|
||||||
| ```bbox_right(type)``` | Default right side, can be overridden to customise |
|
| ```bbox_right(type)``` | Default right side, can be overridden to customise |
|
||||||
@@ -3556,6 +3664,7 @@ The ring spacing as well as the number of spokes can be specified, if zero a gas
|
|||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 1 | fan_guard_120.stl |
|
| 1 | fan_guard_120.stl |
|
||||||
|
| 1 | fan_guard_17.stl |
|
||||||
| 1 | fan_guard_25.stl |
|
| 1 | fan_guard_25.stl |
|
||||||
| 1 | fan_guard_30.stl |
|
| 1 | fan_guard_30.stl |
|
||||||
| 1 | fan_guard_40.stl |
|
| 1 | fan_guard_40.stl |
|
||||||
@@ -3830,6 +3939,54 @@ Printed handle that can be printed without needing support material due to its t
|
|||||||
| 1 | handle_assembly |
|
| 1 | handle_assembly |
|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="Pcb_mount"></a>
|
||||||
|
## Pcb_mount
|
||||||
|
A frame to mount a PCB by its corners when it has no mounting holes.
|
||||||
|
The stl must be given a parameterless wrapper in the project that uses it.
|
||||||
|
|
||||||
|
|
||||||
|
[printed/pcb_mount.scad](printed/pcb_mount.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/pcb_mount.scad](tests/pcb_mount.scad) Code for this example.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```pcb_mount_length(pcb)``` | Outside length of the mount |
|
||||||
|
| ```pcb_mount_width(pcb)``` | Outside width of the mount |
|
||||||
|
| ```pillar_x_pitch(pcb)``` | x pitch of screw pillars |
|
||||||
|
| ```pillar_y_pitch(pcb)``` | y pitch of screw pillars |
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
| Module | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```pcb_mount(pcb, height = 5, washers = true)``` | Make the STL of a pcb mount for the specified PCB. |
|
||||||
|
| ```pcb_mount_assembly(pcb, thickness, height = 5)``` | A PCB mount assembly with fasteners |
|
||||||
|
| ```pcb_mount_holes(pcb, h = 0)``` | Drill holes for PCB mount |
|
||||||
|
| ```pcb_mount_screw_positions(pcb)``` | Positions of the screws and pillars |
|
||||||
|
| ```pcb_mount_washer_stl()``` | A plastic washer to clamp a PCB |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Vitamins
|
||||||
|
| Qty | Module call | BOM entry |
|
||||||
|
| ---:|:--- |:---|
|
||||||
|
| 4 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
|
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
||||||
|
| 1 | ```pin_socket(2p54header, 13, 2)``` | Pin socket 13 x 2 |
|
||||||
|
| 4 | ```screw(M3_cap_screw, 16)``` | Screw M3 cap x 16mm |
|
||||||
|
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
|
||||||
|
| 4 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||||
|
|
||||||
|
### Printed
|
||||||
|
| Qty | Filename |
|
||||||
|
| ---:|:--- |
|
||||||
|
| 1 | pcb_mount_PI_IO_5.stl |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -3955,7 +4112,7 @@ Knob with embedded hex head screw.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```screw_knob(screw)``` | Generate the STL foe a knob to fit the specified hex screw |
|
| ```screw_knob(screw)``` | Generate the STL for a knob to fit the specified hex screw |
|
||||||
| ```screw_knob_assembly(screw, length)``` | Assembly with the screw in place |
|
| ```screw_knob_assembly(screw, length)``` | Assembly with the screw in place |
|
||||||
|
|
||||||

|

|
||||||
@@ -4283,7 +4440,7 @@ Layout objects in a line with equal gaps given a vector of their widths.
|
|||||||
---
|
---
|
||||||
<a name="Maths"></a>
|
<a name="Maths"></a>
|
||||||
## Maths
|
## Maths
|
||||||
Maths utilities for minapulating vectors and matrices.
|
Maths utilities for manipulating vectors and matrices.
|
||||||
|
|
||||||
|
|
||||||
[utils/maths.scad](utils/maths.scad) Implementation.
|
[utils/maths.scad](utils/maths.scad) Implementation.
|
||||||
@@ -4293,6 +4450,8 @@ Maths utilities for minapulating vectors and matrices.
|
|||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| ```angle_between(v1, v2)``` | Return the angle between two vectors |
|
||||||
|
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
|
||||||
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
||||||
| ```reverse(v)``` | Reverse a vector |
|
| ```reverse(v)``` | Reverse a vector |
|
||||||
| ```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``` |
|
| ```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``` |
|
||||||
@@ -4303,6 +4462,7 @@ Maths utilities for minapulating vectors and matrices.
|
|||||||
| ```transpose(m)``` | Transpose an arbitrary size matrix |
|
| ```transpose(m)``` | Transpose an arbitrary size matrix |
|
||||||
| ```unit(v)``` | Convert ```v``` to a unit vector |
|
| ```unit(v)``` | Convert ```v``` to a unit vector |
|
||||||
| ```vec3(v)``` | Return a 3 vector with the first three elements of ```v``` |
|
| ```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``` |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -4469,9 +4629,12 @@ An additional twist around the path can be specified. If the path is closed this
|
|||||||
| ```after(path1, path2)``` | Translate ```path2``` so its start meets the end of ```path1``` and then concatenate |
|
| ```after(path1, path2)``` | Translate ```path2``` so its start meets the end of ```path1``` and then concatenate |
|
||||||
| ```arc_points(r, a = [90, 0, 180], al = 90)``` | Generate the points of a circular arc |
|
| ```arc_points(r, a = [90, 0, 180], al = 90)``` | Generate the points of a circular arc |
|
||||||
| ```before(path1, path2)``` | Translate ```path1``` so its end meets the start of ```path2``` and then concatenate |
|
| ```before(path1, path2)``` | Translate ```path1``` so its end meets the start of ```path2``` and then concatenate |
|
||||||
| ```circle_points(r = 1, z = 0)``` | Generate the points of a circle, setting z makes a single turn spiral |
|
| ```cap(facets, segment = 0, end)``` | Create the mesh for an end cap |
|
||||||
|
| ```circle_points(r = 1, z = 0, dir = -1)``` | Generate the points of a circle, setting z makes a single turn spiral |
|
||||||
|
| ```helical_twist_per_segment(r, pitch, sides)``` | Calculate the twist around Z that rotate_from_to() introduces |
|
||||||
| ```path_length(path, i = 0, length = 0)``` | Calculated the length along a path |
|
| ```path_length(path, i = 0, length = 0)``` | Calculated the length along a path |
|
||||||
| ```rectangle_points(w, h)``` | Generate the points of a rectangle |
|
| ```rectangle_points(w, h)``` | Generate the points of a rectangle |
|
||||||
|
| ```skin_faces(points, npoints, facets, loop, offset = 0)``` | Create the mesh for the swept volume without end caps |
|
||||||
| ```sweep(path, profile, loop = false, twist = 0)``` | Generate the point list and face list of the swept volume |
|
| ```sweep(path, profile, loop = false, twist = 0)``` | Generate the point list and face list of the swept volume |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
@@ -4482,6 +4645,50 @@ An additional twist around the path can be specified. If the path is closed this
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="Thread"></a>
|
||||||
|
## Thread
|
||||||
|
Utilities for making threads with sweep. They can be used to model screws, nuts, studding, leadscrews, etc, and also to make printed threads.
|
||||||
|
|
||||||
|
The ends can be tapered, flat or chamfered by setting the ```top``` and ```bot``` parameters to -1 for tapered, 0 for a flat cut and positive to
|
||||||
|
specify a chamfer angle.
|
||||||
|
|
||||||
|
Threads are by default solid, so the male version is wrapped around a cylinder and the female inside a tube. This can be suppressed to just get the helix, for
|
||||||
|
example to make a printed pot with a screw top lid.
|
||||||
|
|
||||||
|
Threads with a typical 60 degree angle appear too bright with OpenSCAD's primitive lighting model as they face towards the lights more than the top and sides of
|
||||||
|
a cylinder. To get around this a colour can be passed to thread that is used to colour the cylinder and then toned down to colour the helix.
|
||||||
|
|
||||||
|
Making the ends requires a CGAL intersection, which make threads relatively slow. For this reason they are generally disabled when using the GUI but can
|
||||||
|
be enabled by setting ```$show_threads``` to ```true```. When the tests are run, by default, threads are enabled only for things that feature them like screws.
|
||||||
|
This behaviour can be changed by setting a ```SHOW_THREADS``` environment variable to ```false``` to disable all threads and ```true``` to enable all threads.
|
||||||
|
The same variable also affects the generation of assembly diagrams.
|
||||||
|
|
||||||
|
Threads obey the $fn, $fa, $fs variables.
|
||||||
|
|
||||||
|
|
||||||
|
[utils/thread.scad](utils/thread.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/thread.scad](tests/thread.scad) Code for this example.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```metric_coarse_pitch(d)``` | Convert metric diameter to pitch |
|
||||||
|
| ```thread_profile(h, crest, angle, overlap = 0.1)``` | Create thread profile path |
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
| Module | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```female_metric_thread(d, pitch, length, center = true, top = -1, bot = -1, colour = undef)``` | Create female thread with metric profile |
|
||||||
|
| ```male_metric_thread(d, pitch, length, center = true, top = -1, bot = -1, solid = true, colour = undef)``` | Create male thread with metric profile |
|
||||||
|
| ```thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef)``` | Create male or femail thread, ends can be tapered, chamfered or square |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
0
scripts/bom.py
Normal file → Executable file
0
scripts/doc_scripts.py
Normal file → Executable file
0
scripts/dxfs.py
Normal file → Executable file
0
scripts/gallery.py
Normal file → Executable file
0
scripts/make_all.py
Normal file → Executable file
@@ -24,7 +24,7 @@ from __future__ import print_function
|
|||||||
|
|
||||||
import subprocess, sys
|
import subprocess, sys
|
||||||
|
|
||||||
def _run(args, silent):
|
def run_list(args, silent = False):
|
||||||
cmd = ["openscad"] + args
|
cmd = ["openscad"] + args
|
||||||
if not silent:
|
if not silent:
|
||||||
for arg in cmd:
|
for arg in cmd:
|
||||||
@@ -39,7 +39,7 @@ def _run(args, silent):
|
|||||||
sys.exit(rc)
|
sys.exit(rc)
|
||||||
|
|
||||||
def run(*args):
|
def run(*args):
|
||||||
_run(list(args), False)
|
run_list(list(args), False)
|
||||||
|
|
||||||
def run_silent(*args):
|
def run_silent(*args):
|
||||||
_run(list(args), True);
|
run_list(list(args), True);
|
||||||
|
49
scripts/options.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#
|
||||||
|
# NopSCADlib Copyright Chris Palmer 2020
|
||||||
|
# nop.head@gmail.com
|
||||||
|
# hydraraptor.blogspot.com
|
||||||
|
#
|
||||||
|
# This file is part of NopSCADlib.
|
||||||
|
#
|
||||||
|
# NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
# GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
# the License, or (at your option) any later version.
|
||||||
|
#
|
||||||
|
# NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
# See the GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
# If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Set command line options from enviroment variables and check if they have changed
|
||||||
|
|
||||||
|
import json, os, deps
|
||||||
|
|
||||||
|
def check_options(dir = '.'):
|
||||||
|
global options, options_mtime
|
||||||
|
options = { "show_threads": str(os.getenv("SHOW_THREADS")) }
|
||||||
|
options_fname = dir + '/options.json'
|
||||||
|
try:
|
||||||
|
with open(options_fname) as json_file:
|
||||||
|
last_options = json.load(json_file)
|
||||||
|
except:
|
||||||
|
last_options = {}
|
||||||
|
if last_options != options:
|
||||||
|
with open(options_fname, 'w') as outfile:
|
||||||
|
json.dump(options, outfile, indent = 4)
|
||||||
|
options_mtime = deps.mtime(options_fname)
|
||||||
|
|
||||||
|
def have_changed(changed, target):
|
||||||
|
if not changed and deps.mtime(target) < options_mtime:
|
||||||
|
return "command line options changed"
|
||||||
|
return changed
|
||||||
|
|
||||||
|
def list():
|
||||||
|
result = []
|
||||||
|
for name in options.keys():
|
||||||
|
value = options[name]
|
||||||
|
if value != 'None':
|
||||||
|
result.append('-D$' + name + '=' + value)
|
||||||
|
return result
|
0
scripts/render.py
Normal file → Executable file
0
scripts/set_config.py
Normal file → Executable file
0
scripts/stls.py
Normal file → Executable file
5
scripts/tests.py
Normal file → Executable file
@@ -27,6 +27,7 @@ import openscad
|
|||||||
import subprocess
|
import subprocess
|
||||||
import bom
|
import bom
|
||||||
import times
|
import times
|
||||||
|
import options
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
import shutil
|
import shutil
|
||||||
@@ -96,6 +97,7 @@ def tests(tests):
|
|||||||
index = {}
|
index = {}
|
||||||
bodies = {}
|
bodies = {}
|
||||||
times.read_times()
|
times.read_times()
|
||||||
|
options.check_options(deps_dir)
|
||||||
#
|
#
|
||||||
# Make cover pic if does not exist as very slow. Delete it to force an update.
|
# Make cover pic if does not exist as very slow. Delete it to force an update.
|
||||||
#
|
#
|
||||||
@@ -190,11 +192,12 @@ def tests(tests):
|
|||||||
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
|
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
|
||||||
changed = check_deps(oldest, dname)
|
changed = check_deps(oldest, dname)
|
||||||
changed = times.check_have_time(changed, scad_name)
|
changed = times.check_have_time(changed, scad_name)
|
||||||
|
changed = options.have_changed(changed, oldest)
|
||||||
if changed:
|
if changed:
|
||||||
print(changed)
|
print(changed)
|
||||||
t = time.time()
|
t = time.time()
|
||||||
tmp_name = 'tmp.png'
|
tmp_name = 'tmp.png'
|
||||||
openscad.run("-D", "$bom=2", colour_scheme, "--projection=p", "--imgsize=%d,%d" % (w, h), "--camera=0,0,0,70,0,315,500", "--autocenter", "--viewall", "-d", dname, "-o", tmp_name, scad_name);
|
openscad.run_list(options.list() + ["-D$bom=2", colour_scheme, "--projection=p", "--imgsize=%d,%d" % (w, h), "--camera=0,0,0,70,0,315,500", "--autocenter", "--viewall", "-d", dname, "-o", tmp_name, scad_name]);
|
||||||
times.add_time(scad_name, t)
|
times.add_time(scad_name, t)
|
||||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1000x600", "-bordercolor", background, "-border", "10", tmp_name])
|
do_cmd(["magick", tmp_name, "-trim", "-resize", "1000x600", "-bordercolor", background, "-border", "10", tmp_name])
|
||||||
update_image(tmp_name, png_name)
|
update_image(tmp_name, png_name)
|
||||||
|
7
scripts/views.py
Normal file → Executable file
@@ -28,6 +28,7 @@ import openscad
|
|||||||
from tests import do_cmd, update_image, colour_scheme, background
|
from tests import do_cmd, update_image, colour_scheme, background
|
||||||
import time
|
import time
|
||||||
import times
|
import times
|
||||||
|
import options
|
||||||
from deps import *
|
from deps import *
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
@@ -102,6 +103,7 @@ def views(target, do_assemblies = None):
|
|||||||
os.makedirs(deps_dir)
|
os.makedirs(deps_dir)
|
||||||
|
|
||||||
times.read_times(target_dir)
|
times.read_times(target_dir)
|
||||||
|
options.check_options(deps_dir)
|
||||||
bounds_fname = top_dir + 'stls/bounds.json'
|
bounds_fname = top_dir + 'stls/bounds.json'
|
||||||
with open(bounds_fname) as json_file:
|
with open(bounds_fname) as json_file:
|
||||||
bounds_map = json.load(json_file)
|
bounds_map = json.load(json_file)
|
||||||
@@ -154,7 +156,7 @@ def views(target, do_assemblies = None):
|
|||||||
f.write("use <%s/%s>\n" % (dir, filename))
|
f.write("use <%s/%s>\n" % (dir, filename))
|
||||||
f.write("%s();\n" % module);
|
f.write("%s();\n" % module);
|
||||||
#
|
#
|
||||||
# Run openscad on th created file
|
# Run openscad on the created file
|
||||||
#
|
#
|
||||||
dname = deps_name(deps_dir, filename)
|
dname = deps_name(deps_dir, filename)
|
||||||
for explode in [0, 1]:
|
for explode in [0, 1]:
|
||||||
@@ -163,11 +165,12 @@ def views(target, do_assemblies = None):
|
|||||||
png_name = png_name.replace('_assembly', '_assembled')
|
png_name = png_name.replace('_assembly', '_assembled')
|
||||||
changed = check_deps(png_name, dname)
|
changed = check_deps(png_name, dname)
|
||||||
changed = times.check_have_time(changed, png_name)
|
changed = times.check_have_time(changed, png_name)
|
||||||
|
changed = options.have_changed(changed, png_name)
|
||||||
tmp_name = 'tmp.png'
|
tmp_name = 'tmp.png'
|
||||||
if changed:
|
if changed:
|
||||||
print(changed)
|
print(changed)
|
||||||
t = time.time()
|
t = time.time()
|
||||||
openscad.run("-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", "--imgsize=4096,4096", "--autocenter", "--viewall", "-d", dname, "-o", tmp_name, png_maker_name);
|
openscad.run_list(options.list() + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", "--imgsize=4096,4096", "--autocenter", "--viewall", "-d", dname, "-o", tmp_name, png_maker_name]);
|
||||||
times.add_time(png_name, t)
|
times.add_time(png_name, t)
|
||||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
|
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
|
||||||
update_image(tmp_name, png_name)
|
update_image(tmp_name, png_name)
|
||||||
|
@@ -67,7 +67,7 @@ module belt_test() {
|
|||||||
translate([-25, 0])
|
translate([-25, 0])
|
||||||
layout([for(b = belts) belt_width(b)], 10)
|
layout([for(b = belts) belt_width(b)], 10)
|
||||||
rotate([0, 90, 0])
|
rotate([0, 90, 0])
|
||||||
belt(belts[$i], [[0, 0, 20], [0, 1, 20]]);
|
belt(belts[$i], [[0, 0, 20], [0, 1, 20]], belt_colour = $i%2==0 ? grey90 : grey20, tooth_colour = $i%2==0 ? grey70 : grey50);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
|
@@ -35,4 +35,5 @@ module d_connectors()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
d_connectors();
|
let($show_threads = true)
|
||||||
|
d_connectors();
|
||||||
|
30
tests/extrusions.scad
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2020
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
include <../core.scad>
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
|
include <../vitamins/extrusions.scad>
|
||||||
|
|
||||||
|
module extrusions()
|
||||||
|
layout([for(e = extrusions) extrusion_width(e)], 10)
|
||||||
|
extrusion(extrusions[$i], 80);
|
||||||
|
|
||||||
|
if ($preview)
|
||||||
|
extrusions();
|
||||||
|
|
22
tests/hygrometer.scad
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2018
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
use <../vitamins/hygrometer.scad>
|
||||||
|
|
||||||
|
if($preview)
|
||||||
|
hygrometer();
|
@@ -37,4 +37,5 @@ module inserts() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
inserts();
|
let($show_threads = true)
|
||||||
|
inserts();
|
||||||
|
@@ -27,4 +27,5 @@ module leadnuts()
|
|||||||
leadnut(leadnuts[$i]);
|
leadnut(leadnuts[$i]);
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
leadnuts();
|
let($show_threads = true)
|
||||||
|
leadnuts();
|
||||||
|
@@ -22,8 +22,12 @@ use <../utils/layout.scad>
|
|||||||
include <../vitamins/linear_bearings.scad>
|
include <../vitamins/linear_bearings.scad>
|
||||||
|
|
||||||
module linear_bearings()
|
module linear_bearings()
|
||||||
layout([for(b = linear_bearings) 2 * bearing_radius(b)])
|
layout([for(b = linear_bearings) 2 * bearing_radius(b)]) {
|
||||||
linear_bearing(linear_bearings[$i]);
|
linear_bearing(linear_bearings[$i]);
|
||||||
|
|
||||||
|
translate([0, 30])
|
||||||
|
linear_bearing(long_linear_bearings[$i]);
|
||||||
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
linear_bearings();
|
linear_bearings();
|
||||||
|
@@ -56,7 +56,7 @@ module maths() {
|
|||||||
//
|
//
|
||||||
z = [0, 0, 1];
|
z = [0, 0, 1];
|
||||||
v = cross(u, z);
|
v = cross(u, z);
|
||||||
a = acos(u * z);
|
a = angle_between(u, z);
|
||||||
|
|
||||||
|
|
||||||
l = 20;
|
l = 20;
|
||||||
@@ -64,6 +64,11 @@ module maths() {
|
|||||||
translate_z(l)
|
translate_z(l)
|
||||||
vflip()
|
vflip()
|
||||||
arrow(l);
|
arrow(l);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Test Euler
|
||||||
|
//
|
||||||
|
assert(euler(rotate(r)) == r, "euler() failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
rotate(45)
|
rotate(45)
|
||||||
|
@@ -22,13 +22,12 @@ use <../utils/layout.scad>
|
|||||||
include <../vitamins/screws.scad>
|
include <../vitamins/screws.scad>
|
||||||
|
|
||||||
module nuts() {
|
module nuts() {
|
||||||
for(nyloc = [false, true])
|
layout([for(n = nuts) 2 * nut_radius(n)], 5) let(n = nuts[$i]) {
|
||||||
translate([0, nyloc ? 20 : 0])
|
for(nyloc = [false, true])
|
||||||
layout([for(n = nuts) 2 * nut_radius(n)], 5)
|
translate([0, nyloc ? 20 : 0])
|
||||||
nut(nuts[$i], nyloc);
|
nut(n, nyloc);
|
||||||
|
|
||||||
translate([0, 40])
|
translate([0, 40]) {
|
||||||
layout([for(n = nuts) 2 * nut_radius(n)], 5) let(n = nuts[$i]) {
|
|
||||||
if(n == M3_nut)
|
if(n == M3_nut)
|
||||||
nut(n, brass = true);
|
nut(n, brass = true);
|
||||||
|
|
||||||
@@ -45,7 +44,28 @@ module nuts() {
|
|||||||
if(n == M8_nut)
|
if(n == M8_nut)
|
||||||
#nut_trap(M8_cap_screw, n, h = 30);
|
#nut_trap(M8_cap_screw, n, h = 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
translate([0, 60]) {
|
||||||
|
if(n == M3_nut)
|
||||||
|
sliding_t_nut(M3_sliding_t_nut);
|
||||||
|
|
||||||
|
if(n == M4_nut)
|
||||||
|
sliding_t_nut(M4_sliding_t_nut);
|
||||||
|
|
||||||
|
if(n == M5_nut)
|
||||||
|
sliding_t_nut(M5_sliding_t_nut);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([0, 80]) {
|
||||||
|
if(n == M3_nut)
|
||||||
|
hammer_nut(M3_hammer_nut);
|
||||||
|
|
||||||
|
if(n == M4_nut)
|
||||||
|
hammer_nut(M4_hammer_nut);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
nuts();
|
let($show_threads = true)
|
||||||
|
nuts();
|
||||||
|
@@ -29,4 +29,5 @@ module opengrab_test() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
opengrab_test();
|
let($show_threads = true)
|
||||||
|
opengrab_test();
|
||||||
|
35
tests/pcb_mount.scad
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2019
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
include <../core.scad>
|
||||||
|
use <../printed/pcb_mount.scad>
|
||||||
|
|
||||||
|
PI_IO = ["PI_IO", "PI_IO V2", 35.56, 25.4, 1.6, 0, 0, 0, "green", true, [],
|
||||||
|
[[(3.015 - 2.7) * 25.4 - 3.5 /2, (4.5 - 3.685) * 25.4, 90, "term35", 2],
|
||||||
|
[(3.46 - 2.7) * 25.4 - 3.5 /2, (4.5 - 3.69) * 25.4, 90, "term35", 2],
|
||||||
|
[(3.91 - 2.7) * 25.4 - 3.5 /2, (4.5 - 3.69) * 25.4, 90, "term35", 2],
|
||||||
|
[(3.4 - 2.7) * 25.4, (4.5 - 4.15) * 25.4, 0, "2p54socket", 13, 2],
|
||||||
|
], []];
|
||||||
|
|
||||||
|
module pcb_mounts()
|
||||||
|
if($preview)
|
||||||
|
pcb_mount_assembly(PI_IO, 3);
|
||||||
|
else
|
||||||
|
pcb_mount(PI_IO);
|
||||||
|
|
||||||
|
pcb_mounts();
|
@@ -26,4 +26,5 @@ module pillars()
|
|||||||
pillar(pillars[$i]);
|
pillar(pillars[$i]);
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
pillars();
|
let($show_threads = true)
|
||||||
|
pillars();
|
||||||
|
@@ -28,15 +28,18 @@ module pin_headers()
|
|||||||
idc_transition(pin_headers[$i], 10);
|
idc_transition(pin_headers[$i], 10);
|
||||||
|
|
||||||
translate([0, 20])
|
translate([0, 20])
|
||||||
pin_header(pin_headers[$i], 10, 2);
|
pin_header(pin_headers[$i], 10, 2, right_angle = true);
|
||||||
|
|
||||||
translate([0, 40])
|
translate([0, 40])
|
||||||
|
pin_header(pin_headers[$i], 10, 2);
|
||||||
|
|
||||||
|
translate([0, 60])
|
||||||
box_header(pin_headers[$i], 10, 2);
|
box_header(pin_headers[$i], 10, 2);
|
||||||
|
|
||||||
translate([0, 65])
|
translate([0, 80])
|
||||||
pin_socket(pin_headers[$i], 10, 2);
|
pin_socket(pin_headers[$i], 10, 2);
|
||||||
|
|
||||||
translate([0, 95])
|
translate([0, 110])
|
||||||
pin_socket(pin_headers[$i], 10, 2, right_angle = true);
|
pin_socket(pin_headers[$i], 10, 2, right_angle = true);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
BIN
tests/png/extrusions.png
Normal file
After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 121 KiB After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
BIN
tests/png/hygrometer.png
Normal file
After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 52 KiB |
BIN
tests/png/pcb_mount.png
Normal file
After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 153 KiB After Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 95 KiB After Width: | Height: | Size: 188 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 92 KiB |
BIN
tests/png/thread.png
Normal file
After Width: | Height: | Size: 215 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 152 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 93 KiB |
@@ -34,7 +34,7 @@ module rails()
|
|||||||
nut = screw_nut(screw);
|
nut = screw_nut(screw);
|
||||||
washer = screw_washer(screw);
|
washer = screw_washer(screw);
|
||||||
|
|
||||||
rail_assembly(rail, length, rail_travel(rail, length) / 2);
|
rail_assembly(rail, length, rail_travel(rail, length) / 2, $i<2 ? grey20 : "green", $i<2 ? grey20 : "red");
|
||||||
|
|
||||||
rail_screws(rail, length, sheet + nut_thickness(nut, true) + washer_thickness(washer));
|
rail_screws(rail, length, sheet + nut_thickness(nut, true) + washer_thickness(washer));
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ include <../vitamins/ring_terminals.scad>
|
|||||||
|
|
||||||
module ring_terminals()
|
module ring_terminals()
|
||||||
layout([for(t = ring_terminals) ringterm_od(t)], 5)
|
layout([for(t = ring_terminals) ringterm_od(t)], 5)
|
||||||
rotate(90)
|
rotate(180)
|
||||||
ring_terminal_assembly(ring_terminals[$i], 3);
|
ring_terminal_assembly(ring_terminals[$i], 3);
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
|
@@ -21,9 +21,13 @@ use <../utils/layout.scad>
|
|||||||
|
|
||||||
include <../vitamins/rockers.scad>
|
include <../vitamins/rockers.scad>
|
||||||
|
|
||||||
module rockers()
|
module rockers() {
|
||||||
layout([for(r = rockers) rocker_flange_w(r)], 5)
|
layout([for(r = rockers) rocker_flange_w(r)], 5) {
|
||||||
rocker(rockers[$i]);
|
rocker(rockers[$i]);
|
||||||
|
translate([0, 25])
|
||||||
|
rocker(rockers[$i], $i==0 ? "red" : "green");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
rockers();
|
rockers();
|
||||||
|
@@ -24,13 +24,23 @@ include <../vitamins/linear_bearings.scad>
|
|||||||
use <../vitamins/rod.scad>
|
use <../vitamins/rod.scad>
|
||||||
|
|
||||||
module rods()
|
module rods()
|
||||||
layout([for(b = linear_bearings) 2 * bearing_radius(b)]) {
|
layout([for(b = linear_bearings) 2 * bearing_radius(b)]) let(d = bearing_rod_dia(linear_bearings[$i])){
|
||||||
|
|
||||||
rod(bearing_rod_dia(linear_bearings[$i]), 80);
|
rod(d, 80);
|
||||||
|
|
||||||
translate([0, 20])
|
translate([0, 30])
|
||||||
studding(bearing_rod_dia(linear_bearings[$i]), 80);
|
studding(d, 80);
|
||||||
|
|
||||||
|
if(d >= 6)
|
||||||
|
translate([0, 60]) {
|
||||||
|
starts = d > 6 ? 4 : 1;
|
||||||
|
pitch = d > 14 ? 4
|
||||||
|
: d > 10 ? 3 : 2;
|
||||||
|
let($show_threads = true)
|
||||||
|
leadscrew(d, 80, starts * pitch, starts);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
rods();
|
let($show_threads = true)
|
||||||
|
rods();
|
||||||
|
@@ -25,13 +25,15 @@ for(y = [0 : len(screw_lists) -1])
|
|||||||
for(x = [0 : len(screw_lists[y]) -1]) {
|
for(x = [0 : len(screw_lists[y]) -1]) {
|
||||||
screw = screw_lists[y][x];
|
screw = screw_lists[y][x];
|
||||||
if(screw) {
|
if(screw) {
|
||||||
length = screw_max_thread(screw)
|
length = screw_head_type(screw) == hs_grub ? 6
|
||||||
? screw_longer_than(screw_max_thread(screw) + 5)
|
: screw_radius(screw) <= 1.5 ? 10
|
||||||
: screw_head_type(screw) == hs_grub ? 6 : 30;
|
: screw_max_thread(screw) ? screw_longer_than(screw_max_thread(screw) + 5)
|
||||||
|
: 30;
|
||||||
translate([x * 20, y * 20])
|
translate([x * 20, y * 20])
|
||||||
screw(screw, length);
|
screw(screw, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
screws();
|
let($show_threads = true)
|
||||||
|
screws();
|
||||||
|
@@ -23,9 +23,9 @@ use <../utils/layout.scad>
|
|||||||
include <../vitamins/spools.scad>
|
include <../vitamins/spools.scad>
|
||||||
|
|
||||||
module spools()
|
module spools()
|
||||||
layout([for(s = spools) spool_height(s)], 100)
|
layout([for(s = spools) spool_height(s)], 100) let(s = spools[$i])
|
||||||
rotate([90, 0, 90])
|
rotate([90, 0, 90])
|
||||||
spool(spools[$i]);
|
spool(s, filament_depth = spool_depth(s) / 2, filament_colour = [pp1_colour, pp2_colour, pp3_colour, pp4_colour][$i % 4], filament_d = $i ? 3 : 1.75);
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
spools();
|
spools();
|
||||||
|
@@ -44,7 +44,7 @@ knot = [ for(i=[0:.2:359])
|
|||||||
(19*cos(3*i) + 40)*sin(2*i),
|
(19*cos(3*i) + 40)*sin(2*i),
|
||||||
19*sin(3*i) ] ];
|
19*sin(3*i) ] ];
|
||||||
|
|
||||||
sweep(knot, L_points, loop = true, twist = 0);
|
sweep(knot, L_points, loop = true);
|
||||||
|
|
||||||
p = transform_points([[0,0,0], [20,0,5], [10,30,4], [0,0,0], [0,0,20]], scale(10));
|
p = transform_points([[0,0,0], [20,0,5], [10,30,4], [0,0,0], [0,0,20]], scale(10));
|
||||||
n = 100;
|
n = 100;
|
||||||
|
52
tests/thread.scad
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2020
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
include <../core.scad>
|
||||||
|
use <../utils/thread.scad>
|
||||||
|
|
||||||
|
pitch = 2;
|
||||||
|
starts = 4;
|
||||||
|
|
||||||
|
profile = thread_profile(pitch / 2, pitch * 0.366, 30);
|
||||||
|
|
||||||
|
module threads()
|
||||||
|
for(female = [false, true]) translate([0, female ? -20 : 0]) {
|
||||||
|
length = female ? 8 : 40;
|
||||||
|
dia = female ? 8 : 8 - pitch;
|
||||||
|
colour = female ? brass : silver;
|
||||||
|
|
||||||
|
thread(dia, starts * pitch, length, profile, starts = starts, top = 45, bot = 45, female = female, colour = colour);
|
||||||
|
|
||||||
|
color(colour)
|
||||||
|
translate([20, 0])
|
||||||
|
thread(dia, starts * pitch, length, profile, starts = starts, top = 0, bot = 0, female = female);
|
||||||
|
|
||||||
|
translate([40, 0])
|
||||||
|
thread(dia, starts * pitch, length, profile, starts = starts, top = -1, bot = -1, female = female, colour = colour);
|
||||||
|
|
||||||
|
color(colour)
|
||||||
|
translate([60, 0])
|
||||||
|
thread(dia, 2 * pitch, length, profile, starts = 2, top = -1, bot = -1, female = female);
|
||||||
|
|
||||||
|
color(colour)
|
||||||
|
translate([80, 0])
|
||||||
|
thread(dia, pitch, length, profile, starts = 1, top = -1, bot = -1, female = female);
|
||||||
|
}
|
||||||
|
|
||||||
|
let($show_threads = true)
|
||||||
|
threads();
|
@@ -27,4 +27,5 @@ module toggles()
|
|||||||
toggle(toggles[$i], 3);
|
toggle(toggles[$i], 3);
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
toggles();
|
let($show_threads = true)
|
||||||
|
toggles();
|
||||||
|
@@ -43,7 +43,7 @@ module ellipse(xr, yr) scale([1, yr / xr]) circle4n(xr);
|
|||||||
|
|
||||||
module extrude_if(h, center = true) //! Extrudes 2D object to 3D when ```h``` is nonzero, otherwise leaves it 2D
|
module extrude_if(h, center = true) //! Extrudes 2D object to 3D when ```h``` is nonzero, otherwise leaves it 2D
|
||||||
if(h)
|
if(h)
|
||||||
linear_extrude(height = h, center = center) // 3D
|
linear_extrude(height = h, center = center, convexity = 2) // 3D
|
||||||
children();
|
children();
|
||||||
else
|
else
|
||||||
children(); // 2D
|
children(); // 2D
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
//! Maths utilities for minapulating vectors and matrices.
|
//! Maths utilities for manipulating vectors and matrices.
|
||||||
//
|
//
|
||||||
function sqr(x) = x * x;
|
function sqr(x) = x * x;
|
||||||
|
|
||||||
@@ -39,9 +39,9 @@ function rotate(a, v) = //! Generate a 4x4 rotation matrix, ```a``` can be a vec
|
|||||||
sy = sin(av[1]),
|
sy = sin(av[1]),
|
||||||
sz = sin(av[2]))
|
sz = sin(av[2]))
|
||||||
[
|
[
|
||||||
[ cy * cz, cz * sx * sy - cx * sz, cx * cz * sy + sx * sz, 0],
|
[ cy * cz, sx * sy * cz - cx * sz, cx * sy * cz + sx * sz, 0],
|
||||||
[ cy * sz, cx * cz + sx * sy * sz,-cz * sx + cx * sy * sz, 0],
|
[ cy * sz, sx * sy * sz + cx * cz, cx * sy * sz - sx * cz, 0],
|
||||||
[-sy, cy * sx, cx * cy, 0],
|
[-sy, sx * cy, cx * cy, 0],
|
||||||
[ 0, 0, 0, 1]
|
[ 0, 0, 0, 1]
|
||||||
]
|
]
|
||||||
: let(s = sin(a),
|
: let(s = sin(a),
|
||||||
@@ -65,6 +65,7 @@ function scale(v) = let(s = is_list(v) ? v : [v, v, v]) //! Generate a 4x4 matr
|
|||||||
];
|
];
|
||||||
|
|
||||||
function vec3(v) = [v.x, v.y, v.z]; //! Return a 3 vector with the first three elements of ```v```
|
function vec3(v) = [v.x, v.y, v.z]; //! Return a 3 vector with the first three elements of ```v```
|
||||||
|
function vec4(v) = [v.x, v.y, v.z, 1]; //! Return a 4 vector with the first three elements of ```v```
|
||||||
function transform(v, m) = vec3(m * [v.x, v.y, v.z, 1]); //! Apply 4x4 transform to a 3 vector by extending it and cropping it again
|
function transform(v, m) = vec3(m * [v.x, v.y, v.z, 1]); //! Apply 4x4 transform to a 3 vector by extending it and cropping it again
|
||||||
function transform_points(path, m) = [for(p = path) transform(p, m)]; //! Apply transform to a path
|
function transform_points(path, m) = [for(p = path) transform(p, m)]; //! Apply transform to a path
|
||||||
function unit(v) = let(n = norm(v)) n ? v / n : v; //! Convert ```v``` to a unit vector
|
function unit(v) = let(n = norm(v)) n ? v / n : v; //! Convert ```v``` to a unit vector
|
||||||
@@ -74,3 +75,11 @@ function transpose(m) = [ for(j = [0 : len(m[0]) - 1]) [ for(i = [0 : len(m) - 1
|
|||||||
function identity(n, x = 1) = [for(i = [0 : n - 1]) [for(j = [0 : n - 1]) i == j ? x : 0] ]; //! Construct an arbitrary size identity matrix
|
function identity(n, x = 1) = [for(i = [0 : n - 1]) [for(j = [0 : n - 1]) i == j ? x : 0] ]; //! Construct an arbitrary size identity matrix
|
||||||
|
|
||||||
function reverse(v) = let(n = len(v) - 1) n < 0 ? [] : [for(i = [0 : n]) v[n - i]]; //! Reverse a vector
|
function reverse(v) = let(n = len(v) - 1) n < 0 ? [] : [for(i = [0 : n]) v[n - i]]; //! Reverse a vector
|
||||||
|
|
||||||
|
function angle_between(v1, v2) = acos(v1 * v2 / (norm(v1) * norm(v2))); //! Return the angle between two vectors
|
||||||
|
|
||||||
|
// https://www.gregslabaugh.net/publications/euler.pdf
|
||||||
|
function euler(R) = let(ay = asin(-R[2][0]), cy = cos(ay)) //! Convert a rotation matrix to a Euler rotation vector.
|
||||||
|
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];
|
||||||
|
@@ -62,6 +62,7 @@ function rotate_from_to(a, b) =
|
|||||||
function calculate_twist(A, B) = let(D = transpose3(B) * A) atan2(D[1][0], D[0][0]);
|
function calculate_twist(A, B) = let(D = transpose3(B) * A) atan2(D[1][0], D[0][0]);
|
||||||
//
|
//
|
||||||
// Compute a 4x3 matrix to orientate a frame of the sweep given the position and a 3x3 rotation matrix.
|
// Compute a 4x3 matrix to orientate a frame of the sweep given the position and a 3x3 rotation matrix.
|
||||||
|
// Note that the rotation matrix is transposed to allow post multiplication.
|
||||||
//
|
//
|
||||||
function orientate(p, r) =
|
function orientate(p, r) =
|
||||||
let(x = r[0], y = r[1], z = r[2])
|
let(x = r[0], y = r[1], z = r[2])
|
||||||
@@ -79,12 +80,21 @@ function rot3_z(a) =
|
|||||||
[ [ c, -s, 0],
|
[ [ c, -s, 0],
|
||||||
[ s, c, 0],
|
[ s, c, 0],
|
||||||
[ 0, 0, 1] ];
|
[ 0, 0, 1] ];
|
||||||
|
|
||||||
//
|
//
|
||||||
// Calculate the unit tangent at a vertex given the indices before and after. One of these can be the same as i in the case
|
// Calculate the unit tangent at a vertex given the indices before and after. One of these can be the same as i in the case
|
||||||
// of the start and end of a non closed path.
|
// of the start and end of a non closed path. Note that the edges are converted to unit vectors so that their relative lengths
|
||||||
|
// don't affect the direction of the tangent.
|
||||||
//
|
//
|
||||||
function tangent(path, before, i, after) = unit(unit(path[after] - path[i]) - unit(path[before] - path[i]));
|
function tangent(path, before, i, after) = unit(unit(path[i] - path[before]) + unit(path[after] - path[i]));
|
||||||
|
//
|
||||||
|
// Calculate the twist per segment caused by rotate_from_to() instead of a simple Euler rotation around Z.
|
||||||
|
//
|
||||||
|
function helical_twist_per_segment(r, pitch, sides) = //! Calculate the twist around Z that rotate_from_to() introduces
|
||||||
|
let(step_angle = 360 / sides,
|
||||||
|
lt = 2 * r * sin(step_angle), // length of tangent between two facets
|
||||||
|
slope = atan(2 * pitch / sides / lt) // slope of tangents
|
||||||
|
) step_angle * sin(slope); // angle tangent should rotate around z projected onto axis rotate_from_to() uses
|
||||||
|
|
||||||
//
|
//
|
||||||
// Generate all the surface points of the swept volume.
|
// Generate all the surface points of the swept volume.
|
||||||
//
|
//
|
||||||
@@ -111,24 +121,28 @@ function skin_points(profile, path, loop, twist = 0) =
|
|||||||
each profile4 * orientate(path[i], rotations[i] * rot3_z(za))
|
each profile4 * orientate(path[i], rotations[i] * rot3_z(za))
|
||||||
];
|
];
|
||||||
|
|
||||||
function cap(facets, segment = 0) = [for(i = [0 : facets - 1]) segment ? facets * segment + i : facets - 1 - i];
|
function cap(facets, segment = 0, end) = //! Create the mesh for an end cap
|
||||||
|
let(reverse = is_undef(end) ? segment : end)
|
||||||
|
[for(i = [0 : facets - 1]) facets * segment + (reverse ? i : facets - 1 - i)];
|
||||||
|
|
||||||
function quad(p, a, b, c, d) = norm(p[a] - p[c]) > norm(p[b] - p[d]) ? [[b, c, d], [b, d, a]] : [[a, b, c], [a, c, d]];
|
function quad(p, a, b, c, d) = norm(p[a] - p[c]) > norm(p[b] - p[d]) ? [[b, c, d], [b, d, a]] : [[a, b, c], [a, c, d]];
|
||||||
|
|
||||||
function skin_faces(points, segs, facets, loop) = [for(i = [0 : facets - 1], s = [0 : segs - (loop ? 1 : 2)])
|
function skin_faces(points, npoints, facets, loop, offset = 0) = //! Create the mesh for the swept volume without end caps
|
||||||
each quad(points,
|
[for(i = [0 : facets - 1], s = [0 : npoints - (loop ? 1 : 2)])
|
||||||
s * facets + i,
|
let(j = s + offset, k = loop ? (j + 1) % npoints : j + 1)
|
||||||
s * facets + (i + 1) % facets,
|
each quad(points,
|
||||||
((s + 1) % segs) * facets + (i + 1) % facets,
|
j * facets + i,
|
||||||
((s + 1) % segs) * facets + i)];
|
j * facets + (i + 1) % facets,
|
||||||
|
k * facets + (i + 1) % facets,
|
||||||
|
k * facets + i)];
|
||||||
|
|
||||||
function sweep(path, profile, loop = false, twist = 0) = //! Generate the point list and face list of the swept volume
|
function sweep(path, profile, loop = false, twist = 0) = //! Generate the point list and face list of the swept volume
|
||||||
let(
|
let(
|
||||||
segments = len(path),
|
npoints = len(path),
|
||||||
facets = len(profile),
|
facets = len(profile),
|
||||||
points = skin_points(profile, path, loop, twist),
|
points = skin_points(profile, path, loop, twist),
|
||||||
skin_faces = skin_faces(points, segments, facets, loop),
|
skin_faces = skin_faces(points, npoints, facets, loop),
|
||||||
faces = loop ? skin_faces : concat([cap(facets)], skin_faces, [cap(facets, segments - 1)])
|
faces = loop ? skin_faces : concat([cap(facets)], skin_faces, [cap(facets, npoints - 1)])
|
||||||
) [points, faces];
|
) [points, faces];
|
||||||
|
|
||||||
module sweep(path, profile, loop = false, twist = 0) { //! Draw a polyhedron that is the swept volume
|
module sweep(path, profile, loop = false, twist = 0) { //! Draw a polyhedron that is the swept volume
|
||||||
@@ -141,9 +155,9 @@ function path_length(path, i = 0, length = 0) = //! Calculated the length along
|
|||||||
i >= len(path) - 1 ? length
|
i >= len(path) - 1 ? length
|
||||||
: path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
|
: path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
|
||||||
|
|
||||||
function circle_points(r = 1, z = 0) = //! Generate the points of a circle, setting z makes a single turn spiral
|
function circle_points(r = 1, z = 0, dir = -1) = //! Generate the points of a circle, setting z makes a single turn spiral
|
||||||
let(sides = r2sides(r))
|
let(sides = r2sides(r))
|
||||||
[for(i = [0 : sides - 1]) let(a = i * 360 / sides) [r * sin(a), r * cos(a), z * a / 360]];
|
[for(i = [0 : sides - 1]) let(a = dir * i * 360 / sides) [r * cos(a), r * sin(a), z * i / sides]];
|
||||||
|
|
||||||
function rectangle_points(w, h) = [[-w/2, -h/2, 0], [-w/2, h/2, 0], [w/2, h/2, 0], [w/2, -h/2, 0]]; //! Generate the points of a rectangle
|
function rectangle_points(w, h) = [[-w/2, -h/2, 0], [-w/2, h/2, 0], [w/2, h/2, 0], [w/2, -h/2, 0]]; //! Generate the points of a rectangle
|
||||||
|
|
||||||
|
217
utils/thread.scad
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2019
|
||||||
|
// nop.head@gmail.com
|
||||||
|
// hydraraptor.blogspot.com
|
||||||
|
//
|
||||||
|
// This file is part of NopSCADlib.
|
||||||
|
//
|
||||||
|
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||||
|
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
// See the GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
//! Utilities for making threads with sweep. They can be used to model screws, nuts, studding, leadscrews, etc, and also to make printed threads.
|
||||||
|
//!
|
||||||
|
//! The ends can be tapered, flat or chamfered by setting the ```top``` and ```bot``` parameters to -1 for tapered, 0 for a flat cut and positive to
|
||||||
|
//! specify a chamfer angle.
|
||||||
|
//!
|
||||||
|
//! Threads are by default solid, so the male version is wrapped around a cylinder and the female inside a tube. This can be suppressed to just get the helix, for
|
||||||
|
//! example to make a printed pot with a screw top lid.
|
||||||
|
//!
|
||||||
|
//! Threads with a typical 60 degree angle appear too bright with OpenSCAD's primitive lighting model as they face towards the lights more than the top and sides of
|
||||||
|
//! a cylinder. To get around this a colour can be passed to thread that is used to colour the cylinder and then toned down to colour the helix.
|
||||||
|
//!
|
||||||
|
//! Making the ends requires a CGAL intersection, which make threads relatively slow. For this reason they are generally disabled when using the GUI but can
|
||||||
|
//! be enabled by setting ```$show_threads``` to ```true```. When the tests are run, by default, threads are enabled only for things that feature them like screws.
|
||||||
|
//! This behaviour can be changed by setting a ```SHOW_THREADS``` environment variable to ```false``` to disable all threads and ```true``` to enable all threads.
|
||||||
|
//! The same variable also affects the generation of assembly diagrams.
|
||||||
|
//!
|
||||||
|
//! Threads obey the $fn, $fa, $fs variables.
|
||||||
|
//
|
||||||
|
include <../core.scad>
|
||||||
|
use <sweep.scad>
|
||||||
|
use <maths.scad>
|
||||||
|
use <tube.scad>
|
||||||
|
|
||||||
|
thread_colour_factor = 0.8; // 60 degree threads appear too bright due to the angle facing the light sources
|
||||||
|
|
||||||
|
function thread_profile(h, crest, angle, overlap = 0.1) = //! Create thread profile path
|
||||||
|
let(base = crest + 2 * (h + overlap) * tan(angle / 2))
|
||||||
|
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], [crest / 2, h, 0], [base / 2, -overlap, 0]];
|
||||||
|
|
||||||
|
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or femail thread, ends can be tapered, chamfered or square
|
||||||
|
//
|
||||||
|
// Apply colour if defined
|
||||||
|
//
|
||||||
|
module colour(factor) if(is_undef(colour)) children(); else color(colour * factor) children();
|
||||||
|
//
|
||||||
|
// Compress the profile to compensate for it being tilted by the helix angle
|
||||||
|
//
|
||||||
|
scale = cos(atan(pitch / (PI * dia)));
|
||||||
|
sprofile = [for(p = profile) [p.x * scale, p.y, p.z]];
|
||||||
|
//
|
||||||
|
// Extract some properties from the profile, perhaps they should be stored in it.
|
||||||
|
//
|
||||||
|
h = max([for(p = sprofile) p.y]);
|
||||||
|
maxx = max([for(p = sprofile) p.x]);
|
||||||
|
minx = min([for(p = sprofile) p.x]);
|
||||||
|
crest_xmax = max([for(p = sprofile) if(p.x != maxx) p.x]);
|
||||||
|
crest_xmin = min([for(p = sprofile) if(p.x != minx) p.x]);
|
||||||
|
//
|
||||||
|
// If the ends don't taper we need an extra half turn past the ends to be cropped horizontally.
|
||||||
|
//
|
||||||
|
extra_top = top < 0 ? 0 : -minx / pitch;
|
||||||
|
extra_bot = bot < 0 ? 0 : maxx / pitch;
|
||||||
|
turns = length / pitch + extra_top + extra_bot;
|
||||||
|
//
|
||||||
|
// Generate the helix path, possibly with tapered ends
|
||||||
|
//
|
||||||
|
dir = female ? 1 : -1;
|
||||||
|
r = dia / 2;
|
||||||
|
sides = r2sides4n(r);
|
||||||
|
step_angle = 360 / sides;
|
||||||
|
segs = ceil(turns * sides);
|
||||||
|
leadin = ceil(sides / starts);
|
||||||
|
final = floor(turns * sides) - leadin;
|
||||||
|
path = [for(i = [0 : segs],
|
||||||
|
R = i < leadin && bot < 0 ? r + dir * (h - h * i / leadin)
|
||||||
|
: i > final && top < 0 ? r + dir * h * (i - final) / leadin : r,
|
||||||
|
a = i * step_angle - 360 * extra_bot)
|
||||||
|
[R * cos(a), R * sin(a), a * pitch / 360]];
|
||||||
|
//
|
||||||
|
// Generate the skin vertices
|
||||||
|
//
|
||||||
|
facets = len(profile);
|
||||||
|
twist = helical_twist_per_segment(r, pitch, sides);
|
||||||
|
//
|
||||||
|
// For female threads we need to invert the profile
|
||||||
|
//
|
||||||
|
iprofile = female ? reverse([for(p = sprofile) [p.x, -p.y, 0]]) : sprofile;
|
||||||
|
//
|
||||||
|
// If the bottom is tapered then the twist will be greater, so pre-twist the profile to get the straight bit at the correct angle
|
||||||
|
//
|
||||||
|
rprofile = bot < 0 ? transform_points(iprofile, rotate(-dir * (helical_twist_per_segment(r - h, pitch, sides) - twist) * sides / PI))
|
||||||
|
: iprofile;
|
||||||
|
points = skin_points(rprofile, path, false, twist * segs);
|
||||||
|
//
|
||||||
|
// To form the ends correctly we need to use intersection but it is very slow with the full thread so we just
|
||||||
|
// intersect the start and the end and sweep the rest outside of the intersection.
|
||||||
|
//
|
||||||
|
top_chamfer_h = (top > 0 ? h * tan(top) : 0);
|
||||||
|
bot_chamfer_h = (bot > 0 ? h * tan(bot) : 0);
|
||||||
|
top_overlap = max( maxx, top_chamfer_h - crest_xmin) / pitch;
|
||||||
|
bot_overlap = max(-minx, bot_chamfer_h + crest_xmax) / pitch;
|
||||||
|
start = ceil(sides * (bot_overlap + extra_bot));
|
||||||
|
end = segs - ceil(sides * (top_overlap + extra_top));
|
||||||
|
|
||||||
|
start_skin_faces = skin_faces(points, start + 1, facets, false);
|
||||||
|
middle_skin_faces = skin_faces(points, end - start + 1, facets, false, start);
|
||||||
|
end_skin_faces = skin_faces(points, segs - end + 1, facets, false, end);
|
||||||
|
|
||||||
|
start_faces = concat([cap(facets) ], start_skin_faces, [cap(facets, start)]);
|
||||||
|
middle_faces = concat([cap(facets, start, false)], middle_skin_faces, [cap(facets, end)]);
|
||||||
|
end_faces = concat([cap(facets, end, false)], end_skin_faces, [cap(facets, segs)]);
|
||||||
|
|
||||||
|
overlap = - profile[0].y;
|
||||||
|
translate_z((center ? -length / 2 : 0)) {
|
||||||
|
ends_faces = concat(start_faces, end_faces);
|
||||||
|
for(i = [0 : starts - 1])
|
||||||
|
colour(thread_colour_factor)
|
||||||
|
rotate(360 * i / starts + (female ? 180 / starts : 0)) {
|
||||||
|
render() intersection() {
|
||||||
|
polyhedron(points, ends_faces);
|
||||||
|
|
||||||
|
len = length - 2 * eps;
|
||||||
|
rotate_extrude()
|
||||||
|
if(female) {
|
||||||
|
difference() {
|
||||||
|
translate([0, eps])
|
||||||
|
square([r + h + overlap, len]);
|
||||||
|
|
||||||
|
if(top_chamfer_h)
|
||||||
|
polygon([[0, length], [r, length], [r - h, length - top_chamfer_h], [0, length - top_chamfer_h]]);
|
||||||
|
|
||||||
|
if(bot_chamfer_h)
|
||||||
|
polygon([[0, 0], [r, 0], [r - h, bot_chamfer_h], [0, bot_chamfer_h]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
difference() {
|
||||||
|
hull() {
|
||||||
|
translate([0, eps])
|
||||||
|
square([r, len]);
|
||||||
|
|
||||||
|
translate([0, bot_chamfer_h])
|
||||||
|
square([r + h + overlap, len - top_chamfer_h - bot_chamfer_h]);
|
||||||
|
}
|
||||||
|
if(!solid)
|
||||||
|
square([r - overlap, length]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
polyhedron(points, middle_faces);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(solid)
|
||||||
|
colour(1)
|
||||||
|
rotate(90)
|
||||||
|
if(female)
|
||||||
|
tube(or = r + (top < 0 || bot < 0 ? h : 0) + 2 * overlap, ir = r, h = length, center = false);
|
||||||
|
else
|
||||||
|
cylinder(d = dia, h = length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module male_metric_thread(d, pitch, length, center = true, top = -1, bot = -1, solid = true, colour = undef) { //! Create male thread with metric profile
|
||||||
|
H = pitch * sqrt(3) / 2;
|
||||||
|
h = 5 * H / 8;
|
||||||
|
minor_d = d - 2 * h;
|
||||||
|
thread(minor_d, pitch, length, thread_profile(h, pitch / 8, 60), center, top, bot, solid = solid, colour = colour);
|
||||||
|
}
|
||||||
|
|
||||||
|
module female_metric_thread(d, pitch, length, center = true, top = -1, bot = -1, colour = undef) { //! Create female thread with metric profile
|
||||||
|
H = pitch * sqrt(3) / 2;
|
||||||
|
h = 5 * H / 8;
|
||||||
|
thread(d, pitch, length, thread_profile(h, pitch / 4, 60), center, top, bot, solid = false, female = true, colour = colour);
|
||||||
|
}
|
||||||
|
|
||||||
|
function metric_coarse_pitch(d) //! Convert metric diameter to pitch
|
||||||
|
= d == 1.6 ? 0.35 // M1.6
|
||||||
|
: [0.4, // M2
|
||||||
|
0.45,// M2.5
|
||||||
|
0.5, // M3
|
||||||
|
0.6, // M3.5
|
||||||
|
0.7, // M4
|
||||||
|
0,
|
||||||
|
0.8, // M5
|
||||||
|
0,
|
||||||
|
1.0, // M6
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.25, // M8
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.5, // M10
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.75, // M12
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0, // M14
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2.0, // M16
|
||||||
|
][d * 2 - 4];
|
@@ -41,9 +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.
|
// 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.
|
// The belt is then drawn by offseting each side from the pitch line.
|
||||||
//
|
//
|
||||||
module belt(type, points, gap = 0, gap_pt = undef) { //! 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 = 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_colour = grey20;
|
|
||||||
tooth_colour = grey50;
|
|
||||||
width = belt_width(type);
|
width = belt_width(type);
|
||||||
pitch = belt_pitch(type);
|
pitch = belt_pitch(type);
|
||||||
thickness = belt_thickness(type);
|
thickness = belt_thickness(type);
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
|
||||||
RB5015 = ["RM5015", "Blower Runda RB5015", 51.3, 51, 15, 31.5, M4_cap_screw, 26, [27.3, 25.4], 4.5, [[4.3, 45.4], [47.3,7.4]], 20, 14, 1.5, 1.3, 1.2, 15];
|
RB5015 = ["RB5015", "Blower Runda RB5015", 51.3, 51, 15, 31.5, M4_cap_screw, 26, [27.3, 25.4], 4.5, [[4.3, 45.4], [47.3,7.4]], 20, 14, 1.5, 1.3, 1.2, 15];
|
||||||
PE4020 = ["PE4020", "Blower Pengda Technology 4020", 40, 40, 20, 27.5, M3_cap_screw, 22, [21.5, 20 ], 3.2, [[37,3],[3,37],[37,37]], 29.3, 17, 1.7, 1.2, 1.3, 13];
|
PE4020 = ["PE4020", "Blower Pengda Technology 4020", 40, 40, 20, 27.5, M3_cap_screw, 22, [21.5, 20 ], 3.2, [[37,3],[3,37],[37,37]], 29.3, 17, 1.7, 1.2, 1.3, 13];
|
||||||
|
|
||||||
blowers = [PE4020, RB5015];
|
blowers = [PE4020, RB5015];
|
||||||
|