mirror of
https://github.com/nophead/NopSCADlib.git
synced 2025-09-04 04:35:29 +02:00
Compare commits
39 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8ca4bb5adc | ||
|
53e3378efe | ||
|
888199f698 | ||
|
f51e93969d | ||
|
757b808f07 | ||
|
eca8f2eccc | ||
|
450224ec39 | ||
|
dcd2624a12 | ||
|
83e8502ecb | ||
|
a722df0b2b | ||
|
6d223c8d1f | ||
|
6d59ea2bc8 | ||
|
8243b244af | ||
|
1a2e04367d | ||
|
abc38f2744 | ||
|
f97070099e | ||
|
729891b675 | ||
|
4b533cffd2 | ||
|
a40a2190dc | ||
|
6556d14a11 | ||
|
c7d12b20c9 | ||
|
545329b875 | ||
|
760e3a890d | ||
|
bd4f7b155b | ||
|
16c1eeef27 | ||
|
800bb89921 | ||
|
41a0723362 | ||
|
6b8ea9685e | ||
|
0cf8cb7d28 | ||
|
7c439a687f | ||
|
4a95ce528e | ||
|
138f45730b | ||
|
8d1ff3584c | ||
|
26b2b63b6e | ||
|
611772d960 | ||
|
b6e648b485 | ||
|
3e4eedc25f | ||
|
7449857ab7 | ||
|
49f6da767a |
BIN
libtest.png
BIN
libtest.png
Binary file not shown.
Before Width: | Height: | Size: 860 KiB After Width: | Height: | Size: 862 KiB |
@@ -351,7 +351,7 @@ modules_y = iecs_y + 60;
|
|||||||
ssrs_y = modules_y + 80;
|
ssrs_y = modules_y + 80;
|
||||||
blowers_y = ssrs_y + 60;
|
blowers_y = ssrs_y + 60;
|
||||||
batteries_y = blowers_y + 100;
|
batteries_y = blowers_y + 100;
|
||||||
steppers_y = batteries_y + 70;
|
steppers_y = batteries_y + 55;
|
||||||
panel_meters_y = steppers_y + 70;
|
panel_meters_y = steppers_y + 70;
|
||||||
extrusions_y = panel_meters_y + 80;
|
extrusions_y = panel_meters_y + 80;
|
||||||
|
|
||||||
|
@@ -251,7 +251,7 @@ module drag_chain_link(type, start = false, end = false, check_kids = true) { //
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Need to use a wrapper because can't define nested modules in an assembly
|
// Need to use a wrapper because can't define nested modules in an assembly
|
||||||
module _drag_chain_assembly(type, pos = 0) {
|
module _drag_chain_assembly(type, pos = 0, render = false) {
|
||||||
s = drag_chain_size(type);
|
s = drag_chain_size(type);
|
||||||
x = (1 + exploded()) * s.x;
|
x = (1 + exploded()) * s.x;
|
||||||
r = drag_chain_radius(type) * x / s.x;
|
r = drag_chain_radius(type) * x / s.x;
|
||||||
@@ -278,8 +278,11 @@ module _drag_chain_assembly(type, pos = 0) {
|
|||||||
module link(n) // Position and colour link with origin at the hinge hole
|
module link(n) // Position and colour link with origin at the hinge hole
|
||||||
translate([-z / 2, 0, -z / 2]) {
|
translate([-z / 2, 0, -z / 2]) {
|
||||||
stl_colour(n < 0 || n == npoints - 1 ? pp3_colour : n % 2 ? pp1_colour : pp2_colour)
|
stl_colour(n < 0 || n == npoints - 1 ? pp3_colour : n % 2 ? pp1_colour : pp2_colour)
|
||||||
drag_chain_link(type, start = n == -1, end = n == npoints - 1, check_kids = false)
|
render_if(render)
|
||||||
let($fasteners = 0) children();
|
drag_chain_link(type, start = n == -1, end = n == npoints - 1, check_kids = false)
|
||||||
|
let($fasteners = 0)
|
||||||
|
children();
|
||||||
|
|
||||||
let($fasteners = 1) children();
|
let($fasteners = 1) children();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -307,15 +310,15 @@ module _drag_chain_assembly(type, pos = 0) {
|
|||||||
|
|
||||||
//! 1. Remove the support material from the links with side cutters.
|
//! 1. Remove the support material from the links with side cutters.
|
||||||
//! 1. Clip the links together with the special ones at the ends.
|
//! 1. Clip the links together with the special ones at the ends.
|
||||||
module drag_chain_assembly(type, pos = 0) //! Drag chain assembly
|
module drag_chain_assembly(type, pos = 0, render = false) //! Drag chain assembly
|
||||||
assembly(str(drag_chain_name(type), "_drag_chain"), big = true)
|
assembly(str(drag_chain_name(type), "_drag_chain"), big = true)
|
||||||
if($children == 2)
|
if($children == 2)
|
||||||
_drag_chain_assembly(type, pos) {
|
_drag_chain_assembly(type, pos, render) {
|
||||||
children(0);
|
children(0);
|
||||||
children(1);
|
children(1);
|
||||||
}
|
}
|
||||||
else if($children == 1)
|
else if($children == 1)
|
||||||
_drag_chain_assembly(type, pos)
|
_drag_chain_assembly(type, pos, render)
|
||||||
children(0);
|
children(0);
|
||||||
else
|
else
|
||||||
_drag_chain_assembly(type, pos);
|
_drag_chain_assembly(type, pos, render);
|
||||||
|
60
readme.md
60
readme.md
@@ -313,7 +313,7 @@ Models of radial blowers.
|
|||||||
| 4 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
|
| 4 | `screw(M2_cap_screw, 8)` | Screw M2 cap x 8mm |
|
||||||
| 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 |
|
||||||
| 1 | `blower(BL40x10)` | Square radial 4010 |
|
| 1 | `blower(BL40x10)` | Square radial fan 4010 |
|
||||||
| 4 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
| 4 | `washer(M2_washer)` | Washer M2 x 5mm x 0.3mm |
|
||||||
| 3 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
| 3 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||||
| 2 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
| 2 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||||
@@ -1102,17 +1102,17 @@ Needs updating as mostly obsolete versions.
|
|||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 2 | `tubing(HSHRNK16)` | Heatshrink sleeving ID 1.6mm x 15mm |
|
| 2 | `tubing(HSHRNK16)` | Heatshrink sleeving ID 1.6mm x 15mm - not shown |
|
||||||
| 4 | `tubing(HSHRNK64, 60)` | Heatshrink sleeving ID 6.4mm x 60mm |
|
| 4 | `tubing(HSHRNK64, 60)` | Heatshrink sleeving ID 6.4mm x 60mm |
|
||||||
| 1 | `e3d_hot_end(E3Dv5, 3)` | Hot end E3D V5 direct 3mm |
|
| 1 | `e3d_hot_end(E3Dv5, 3)` | Hot end E3D V5 direct 3mm |
|
||||||
| 1 | `e3d_hot_end(E3Dv6, 3)` | Hot end E3D V6 direct 3mm |
|
| 1 | `e3d_hot_end(E3Dv6, 3)` | Hot end E3D V6 direct 3mm |
|
||||||
| 1 | `e3d_hot_end(E3D_clone, 3)` | Hot end E3D clone aliexpress 3mm |
|
| 1 | `e3d_hot_end(E3D_clone, 3)` | Hot end E3D clone aliexpress 3mm |
|
||||||
| 1 | `jhead_hot_end(JHeadMk5, 3)` | Hot end JHead MK5 3mm |
|
| 1 | `jhead_hot_end(JHeadMk5, 3)` | Hot end JHead MK5 3mm |
|
||||||
| 2 | `tubing(PTFE07, 62)` | PTFE sleeving OD 1.2mm ID 0.71mm x 62mm |
|
| 2 | `tubing(PTFE07, 62)` | PTFE sleeving OD 1.2mm ID 0.71mm x 62mm - not shown |
|
||||||
| 2 | `tubing(PTFE20, 45)` | PTFE sleeving OD 2.6mm ID 2mm x 45mm |
|
| 2 | `tubing(PTFE20, 45)` | PTFE sleeving OD 2.6mm ID 2mm x 45mm - not shown |
|
||||||
| 1 | `resistor(RIE1212UB5C5R6)` | Resistor UB5C 5R6F 5R6 3W vitreous enamel |
|
| 1 | `resistor(RIE1212UB5C5R6)` | Resistor UB5C 5R6F 5R6 3W vitreous enamel - not shown |
|
||||||
| 1 | | Tape self amalgamating silicone 110mm x 25mm |
|
| 1 | | Tape self amalgamating silicone 110mm x 25mm |
|
||||||
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% |
|
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% - not shown |
|
||||||
| 2 | | Wire Red PTFE 16/0.2mm strands, length 170mm |
|
| 2 | | Wire Red PTFE 16/0.2mm strands, length 170mm |
|
||||||
| 4 | `ziptie(small_ziptie, 8)` | Ziptie 2.5mm x 100mm min length |
|
| 4 | `ziptie(small_ziptie, 8)` | Ziptie 2.5mm x 100mm min length |
|
||||||
|
|
||||||
@@ -1687,6 +1687,13 @@ Cylindrical and ring magnets.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
### Vitamins
|
||||||
|
| Qty | Module call | BOM entry |
|
||||||
|
| ---:|:--- |:---|
|
||||||
|
| 1 | `magnet(MAG484)` | Magnet 6.35mm diameter, 6.35mm high, 3.175mm bore |
|
||||||
|
| 1 | `magnet(MAG8x4x4p2)` | Magnet 8mm diameter, 4mm high, 4.2mm bore |
|
||||||
|
| 1 | `magnet(MAG5x8)` | Magnet 8mm diameter, 5mm high |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
@@ -1771,6 +1778,7 @@ Used for limit switches.
|
|||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `microswitch_lower_extent(type)` | How far legs extend downwards |
|
| `microswitch_lower_extent(type)` | How far legs extend downwards |
|
||||||
| `microswitch_right_extent(type)` | How far legs extend right |
|
| `microswitch_right_extent(type)` | How far legs extend right |
|
||||||
|
| `microswitch_size(type)` | Body size |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
@@ -2650,6 +2658,8 @@ Linear rails with carriages.
|
|||||||
| `rail_carriage(type)` | Carriage type |
|
| `rail_carriage(type)` | Carriage type |
|
||||||
| `rail_end(type)` | Minimum distance screw can be from the end |
|
| `rail_end(type)` | Minimum distance screw can be from the end |
|
||||||
| `rail_end_screw(type)` | Screw used for ends only (Countersink used for better location) |
|
| `rail_end_screw(type)` | Screw used for ends only (Countersink used for better location) |
|
||||||
|
| `rail_groove_offset(type)` | Offset of centre of groove from top of rail |
|
||||||
|
| `rail_groove_width(type)` | Groove width |
|
||||||
| `rail_height(type)` | Height of rail section |
|
| `rail_height(type)` | Height of rail section |
|
||||||
| `rail_hole(type)` | Screw hole diameter |
|
| `rail_hole(type)` | Screw hole diameter |
|
||||||
| `rail_pitch(type)` | Distance between screws |
|
| `rail_pitch(type)` | Distance between screws |
|
||||||
@@ -2670,10 +2680,10 @@ Linear rails with carriages.
|
|||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `carriage(type, rail, end_colour = grey(20)` | Draw the specified carriage |
|
| `carriage(type, rail, end_colour = grey(20)` | 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, colour = grey(90)` | Draw the specified rail |
|
||||||
| `rail_assembly(type, length, pos, carriage_end_colour = grey(20)` | Rail and carriage assembly |
|
| `rail_assembly(type, length, pos, carriage_end_colour = grey(20)` | Rail and carriage assembly |
|
||||||
| `rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)` | Position children over screw holes |
|
| `rail_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, index_screws = undef)` | Place screws in the rail |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -2785,11 +2795,17 @@ Rocker switch. Also used for neon indicator in the same form factor.
|
|||||||
| `rocker_spades(type)` | Spade types and positions |
|
| `rocker_spades(type)` | Spade types and positions |
|
||||||
| `rocker_width(type)` | Body width |
|
| `rocker_width(type)` | Body width |
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `rocker_size(type)` | Width, height, and depth in a vector |
|
||||||
|
| `rocker_slot(type)` | Rocker slot in a vector |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `rocker(type, colour)` | 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, rounded = true)` | Make a hole to accept a rocker switch, by default 2D, set h for 3D |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -3455,15 +3471,16 @@ NEMA stepper motor model.
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
|
| 4 | `ring_terminal(M3_ringterm)` | Ring terminal 3mm |
|
||||||
| 15 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
|
| 20 | `screw(M3_pan_screw, 8)` | Screw M3 pan x 8mm |
|
||||||
| 1 | `NEMA(NEMA14)` | Stepper motor NEMA14 x 36mm |
|
| 1 | `NEMA(NEMA14)` | Stepper motor NEMA14 x 36mm |
|
||||||
| 1 | `NEMA(NEMA16)` | Stepper motor NEMA16 x 19.2mm |
|
| 1 | `NEMA(NEMA16)` | Stepper motor NEMA16 x 19.2mm |
|
||||||
|
| 1 | `NEMA(NEMA17P)` | Stepper motor NEMA17 x 26.5mm |
|
||||||
| 1 | `NEMA(NEMA17S)` | Stepper motor NEMA17 x 34mm |
|
| 1 | `NEMA(NEMA17S)` | Stepper motor NEMA17 x 34mm |
|
||||||
| 1 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
|
| 1 | `NEMA(NEMA17M)` | Stepper motor NEMA17 x 40mm |
|
||||||
| 1 | `NEMA(NEMA17)` | Stepper motor NEMA17 x 47mm |
|
| 1 | `NEMA(NEMA17)` | Stepper motor NEMA17 x 47mm |
|
||||||
| 1 | `NEMA(NEMA23)` | Stepper motor NEMA22 x 51.2mm |
|
| 1 | `NEMA(NEMA23)` | Stepper motor NEMA22 x 51.2mm |
|
||||||
| 11 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
| 16 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||||
| 15 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
| 20 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -3761,6 +3778,7 @@ Veroboard with mounting holes, track breaks, removed tracks, solder points and c
|
|||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `vero_length(type)` | Length of the board |
|
| `vero_length(type)` | Length of the board |
|
||||||
|
| `vero_size(type)` | Board size |
|
||||||
| `vero_thickness(type)` | Thickness of the substrate |
|
| `vero_thickness(type)` | Thickness of the substrate |
|
||||||
| `vero_track_thickness(type)` | Thickness of the tracks |
|
| `vero_track_thickness(type)` | Thickness of the tracks |
|
||||||
| `vero_track_width(type)` | The width of the tracks |
|
| `vero_track_width(type)` | The width of the tracks |
|
||||||
@@ -4543,7 +4561,7 @@ to the assembly, for example to add inserts.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `drag_chain_assembly(type, pos = 0)` | Drag chain assembly |
|
| `drag_chain_assembly(type, pos = 0, render = false)` | Drag chain assembly |
|
||||||
| `drag_chain_link(type, start = false, end = false, check_kids = true)` | One link of the chain, special case for start and end |
|
| `drag_chain_link(type, start = false, end = false, check_kids = true)` | One link of the chain, special case for start and end |
|
||||||
| `drag_chain_screw_positions(type, end)` | Place children at the screw positions, end = 0 for the start, 1 for the end |
|
| `drag_chain_screw_positions(type, end)` | Place children at the screw positions, end = 0 for the start, 1 for the end |
|
||||||
| `screw_lug(screw, h = 0)` | Create a D shaped lug for a screw |
|
| `screw_lug(screw, h = 0)` | Create a D shaped lug for a screw |
|
||||||
@@ -5721,7 +5739,8 @@ Cylinder with a rounded end.
|
|||||||
---
|
---
|
||||||
<a name="Rounded_polygon"></a>
|
<a name="Rounded_polygon"></a>
|
||||||
## Rounded_polygon
|
## Rounded_polygon
|
||||||
Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius. Radius can be negative for a concave corner.
|
Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius in clockwise order.
|
||||||
|
Radius can be negative for a concave corner.
|
||||||
|
|
||||||
Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
|
Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
|
||||||
|
|
||||||
@@ -5732,6 +5751,7 @@ Because the tangents need to be calculated to find the length these can be calcu
|
|||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `circle_tangent(p1, p2)` | Compute the clockwise tangent between two circles represented as [x,y,r] |
|
||||||
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by ` rounded_polygon_tangents` |
|
| `rounded_polygon_length(points, tangents)` | Calculate the length given the point list and the list of tangents computed by ` rounded_polygon_tangents` |
|
||||||
| `rounded_polygon_tangents(points)` | Compute the straight sections needed to draw and to compute the lengths |
|
| `rounded_polygon_tangents(points)` | Compute the straight sections needed to draw and to compute the lengths |
|
||||||
|
|
||||||
@@ -6165,12 +6185,12 @@ do not intrude into the circle. See <https://hydraraptor.blogspot.com/2020/07/ho
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false)` | A semi teardrop in the positive Y domain |
|
| `semi_teardrop(h, r, d = undef, center = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | A semi teardrop in the positive Y domain |
|
||||||
| `teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false)` | For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging |
|
| `teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging |
|
||||||
| `teardrop_chamfer(h, center, chamfer)` | Helper module for adding chamfer to a teardrop |
|
| `teardrop_chamfer(h, center, chamfer, chamfer_both_ends)` | Helper module for adding chamfer to a teardrop |
|
||||||
| `teardrop_plus(h, r, center = true, truncate = true, chamfer = 0)` | Slightly elongated teardrop to allow for the 3D printing staircase effect |
|
| `teardrop_plus(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true)` | Slightly elongated teardrop to allow for the 3D printing staircase effect |
|
||||||
| `tearslot(h, r, w, center = true, chamfer = 0, plus = false)` | A horizontal slot that doesn't need support material |
|
| `tearslot(h, r, w, center = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | A horizontal slot that doesn't need support material |
|
||||||
| `vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false)` | A vertical slot that doesn't need support material |
|
| `vertical_tearslot(h, r, l, center = true, chamfer = 0, chamfer_both_ends = true, plus = false)` | A vertical slot that doesn't need support material |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@@ -25,7 +25,7 @@ from __future__ import print_function
|
|||||||
import subprocess, sys
|
import subprocess, sys
|
||||||
|
|
||||||
def run_list(args, silent = False, verbose = False):
|
def run_list(args, silent = False, verbose = False):
|
||||||
cmd = ["openscad.exe"] + args
|
cmd = ["openscad"] + args
|
||||||
if not silent:
|
if not silent:
|
||||||
for arg in cmd:
|
for arg in cmd:
|
||||||
print(arg, end=" ")
|
print(arg, end=" ")
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 154 KiB |
Binary file not shown.
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 107 KiB |
@@ -22,9 +22,9 @@ include <../vitamins/stepper_motors.scad>
|
|||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module stepper_motors()
|
module stepper_motors()
|
||||||
layout([for(s = stepper_motors) NEMA_width(s)], 5) let(m = stepper_motors[$i]) {
|
layout([for(s = stepper_motors) NEMA_width(s)], 5, no_offset = true) let(m = stepper_motors[$i]) {
|
||||||
rotate(180)
|
rotate(180)
|
||||||
NEMA(m, 0, m == NEMA17M || m == NEMA17M8);
|
NEMA(m, 0, m == NEMA17P || m == NEMA17M || m == NEMA17M8);
|
||||||
|
|
||||||
translate_z(4)
|
translate_z(4)
|
||||||
NEMA_screws(m, M3_pan_screw, n = $i, earth = $i > 4 ? undef : $i - 1);
|
NEMA_screws(m, M3_pan_screw, n = $i, earth = $i > 4 ? undef : $i - 1);
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
//! Using teardrop_plus() or setting the plus option on other modules will elongate the teardrop vertically by the layer height, so when sliced the staircase tips
|
//! Using teardrop_plus() or setting the plus option on other modules will elongate the teardrop vertically by the layer height, so when sliced the staircase tips
|
||||||
//! do not intrude into the circle. See <https://hydraraptor.blogspot.com/2020/07/horiholes-2.html>
|
//! do not intrude into the circle. See <https://hydraraptor.blogspot.com/2020/07/horiholes-2.html>
|
||||||
//
|
//
|
||||||
module teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging
|
module teardrop(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! For making horizontal holes that don't need support material, set `truncate = false` to make traditional RepRap teardrops that don't even need bridging
|
||||||
module teardrop_2d(r, truncate) {
|
module teardrop_2d(r, truncate) {
|
||||||
er = layer_height / 2 - eps; // Extrustion edge radius
|
er = layer_height / 2 - eps; // Extrustion edge radius
|
||||||
R = plus ? r + er : r; // Corrected radius
|
R = plus ? r + er : r; // Corrected radius
|
||||||
@@ -52,7 +52,7 @@ module teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false)
|
|||||||
extrude_if(h, center)
|
extrude_if(h, center)
|
||||||
teardrop_2d(r, truncate);
|
teardrop_2d(r, truncate);
|
||||||
|
|
||||||
teardrop_chamfer(h, center, chamfer) {
|
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||||
linear_extrude(eps, center = true)
|
linear_extrude(eps, center = true)
|
||||||
teardrop_2d(r + chamfer / 2, truncate);
|
teardrop_2d(r + chamfer / 2, truncate);
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ module teardrop(h, r, center = true, truncate = true, chamfer = 0, plus = false)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false) { //! A semi teardrop in the positive Y domain
|
module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! A semi teardrop in the positive Y domain
|
||||||
module semi_teardrop_2d(r, d)
|
module semi_teardrop_2d(r, d)
|
||||||
intersection() {
|
intersection() {
|
||||||
R = is_undef(d) ? r : d / 2;
|
R = is_undef(d) ? r : d / 2;
|
||||||
@@ -77,7 +77,7 @@ module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false)
|
|||||||
extrude_if(h, center)
|
extrude_if(h, center)
|
||||||
semi_teardrop_2d(r, d);
|
semi_teardrop_2d(r, d);
|
||||||
|
|
||||||
teardrop_chamfer(h, center, chamfer) {
|
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||||
linear_extrude(eps, center = true)
|
linear_extrude(eps, center = true)
|
||||||
semi_teardrop_2d(r + chamfer / 2, d);
|
semi_teardrop_2d(r + chamfer / 2, d);
|
||||||
|
|
||||||
@@ -87,10 +87,10 @@ module semi_teardrop(h, r, d = undef, center = true, chamfer = 0, plus = false)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module teardrop_plus(h, r, center = true, truncate = true, chamfer = 0) //! Slightly elongated teardrop to allow for the 3D printing staircase effect
|
module teardrop_plus(h, r, center = true, truncate = true, chamfer = 0, chamfer_both_ends = true) //! Slightly elongated teardrop to allow for the 3D printing staircase effect
|
||||||
teardrop(h, r, center, truncate, chamfer, plus = true);
|
teardrop(h, r, center, truncate, chamfer, chamfer_both_ends, plus = true);
|
||||||
|
|
||||||
module tearslot(h, r, w, center = true, chamfer = 0, plus = false) { //! A horizontal slot that doesn't need support material
|
module tearslot(h, r, w, center = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! A horizontal slot that doesn't need support material
|
||||||
module tearslot_2d(r, w)
|
module tearslot_2d(r, w)
|
||||||
hull()
|
hull()
|
||||||
for(x = [-1, 1])
|
for(x = [-1, 1])
|
||||||
@@ -99,7 +99,7 @@ module tearslot(h, r, w, center = true, chamfer = 0, plus = false) { //! A horiz
|
|||||||
extrude_if(h, center)
|
extrude_if(h, center)
|
||||||
tearslot_2d(r, w);
|
tearslot_2d(r, w);
|
||||||
|
|
||||||
teardrop_chamfer(h, center, chamfer) {
|
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||||
linear_extrude(eps, center = true)
|
linear_extrude(eps, center = true)
|
||||||
tearslot_2d(r + chamfer / 2, w);
|
tearslot_2d(r + chamfer / 2, w);
|
||||||
|
|
||||||
@@ -109,7 +109,7 @@ module tearslot(h, r, w, center = true, chamfer = 0, plus = false) { //! A horiz
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false) { //! A vertical slot that doesn't need support material
|
module vertical_tearslot(h, r, l, center = true, chamfer = 0, chamfer_both_ends = true, plus = false) { //! A vertical slot that doesn't need support material
|
||||||
module vertical_tearslot_2d(r, l)
|
module vertical_tearslot_2d(r, l)
|
||||||
hull()
|
hull()
|
||||||
for(y = [-1, 1])
|
for(y = [-1, 1])
|
||||||
@@ -119,7 +119,7 @@ module vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false) { //
|
|||||||
extrude_if(h, center)
|
extrude_if(h, center)
|
||||||
vertical_tearslot_2d(r, l);
|
vertical_tearslot_2d(r, l);
|
||||||
|
|
||||||
teardrop_chamfer(h, center, chamfer) {
|
teardrop_chamfer(h, center, chamfer, chamfer_both_ends) {
|
||||||
linear_extrude(eps, center = true)
|
linear_extrude(eps, center = true)
|
||||||
vertical_tearslot_2d(r + chamfer / 2, l);
|
vertical_tearslot_2d(r + chamfer / 2, l);
|
||||||
|
|
||||||
@@ -129,10 +129,10 @@ module vertical_tearslot(h, r, l, center = true, chamfer = 0, plus = false) { //
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module teardrop_chamfer(h, center, chamfer) { //! Helper module for adding chamfer to a teardrop
|
module teardrop_chamfer(h, center, chamfer, chamfer_both_ends) { //! Helper module for adding chamfer to a teardrop
|
||||||
if(h && chamfer)
|
if(h && chamfer)
|
||||||
translate_z(center ? 0 : h / 2)
|
translate_z(center ? 0 : h / 2)
|
||||||
for(m = [0, 1])
|
for(m = chamfer_both_ends ? [0, 1] : [1])
|
||||||
mirror([0, 0, m])
|
mirror([0, 0, m])
|
||||||
translate_z((h - eps ) / 2)
|
translate_z((h - eps ) / 2)
|
||||||
hull()
|
hull()
|
||||||
|
@@ -18,13 +18,14 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
//
|
//
|
||||||
//! Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius. Radius can be negative for a concave corner.
|
//! Draw a polygon with rounded corners. Each element of the vector is the XY coordinate and a radius in clockwise order.
|
||||||
|
//! Radius can be negative for a concave corner.
|
||||||
//!
|
//!
|
||||||
//! Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
|
//! Because the tangents need to be calculated to find the length these can be calculated separately and re-used when drawing to save calculating them twice.
|
||||||
//
|
//
|
||||||
include <../utils/core/core.scad>
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
function circle_tangent(p1, p2) =
|
function circle_tangent(p1, p2) = //! Compute the clockwise tangent between two circles represented as [x,y,r]
|
||||||
let(
|
let(
|
||||||
r1 = p1[2],
|
r1 = p1[2],
|
||||||
r2 = p2[2],
|
r2 = p2[2],
|
||||||
@@ -32,11 +33,8 @@ function circle_tangent(p1, p2) =
|
|||||||
dy = p2.y - p1.y,
|
dy = p2.y - p1.y,
|
||||||
d = sqrt(dx * dx + dy * dy),
|
d = sqrt(dx * dx + dy * dy),
|
||||||
theta = atan2(dy, dx) + acos((r1 - r2) / d),
|
theta = atan2(dy, dx) + acos((r1 - r2) / d),
|
||||||
xa = p1.x +(cos(theta) * r1),
|
v = [cos(theta), sin(theta)]
|
||||||
ya = p1.y +(sin(theta) * r1),
|
)[ p1 + r1 * v, p2 + r2 * v ];
|
||||||
xb = p2.x +(cos(theta) * r2),
|
|
||||||
yb = p2.y +(sin(theta) * r2)
|
|
||||||
)[ [xa, ya], [xb, yb] ];
|
|
||||||
|
|
||||||
function rounded_polygon_tangents(points) = //! Compute the straight sections needed to draw and to compute the lengths
|
function rounded_polygon_tangents(points) = //! Compute the straight sections needed to draw and to compute the lengths
|
||||||
let(len = len(points))
|
let(len = len(points))
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
// h h s t t
|
// h h s t t
|
||||||
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];
|
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];
|
||||||
BL40x10 =["BL40x10","Square radial 4010", 40, 40,9.5, 27, M2_cap_screw, 16, [24, 20 ], 2.4, [[2,2],[38,2],[2,38],[38,38]], 30 , 9.5, 1.5, 1.5, 1.1, 1.5];
|
BL40x10 =["BL40x10","Square radial fan 4010", 40, 40,9.5, 27, M2_cap_screw, 16, [24, 20 ], 2.4, [[2,2],[38,2],[2,38],[38,38]], 30 , 9.5, 1.5, 1.5, 1.1, 1.5];
|
||||||
|
|
||||||
blowers = [BL40x10, PE4020, RB5015];
|
blowers = [BL40x10, PE4020, RB5015];
|
||||||
|
|
||||||
|
@@ -34,15 +34,16 @@ hygrometer_hole_r = 21.3;
|
|||||||
slot_w = 5.5;
|
slot_w = 5.5;
|
||||||
|
|
||||||
module hygrometer_hole(h = 0) { //! Drill the hole for a hygrometer
|
module hygrometer_hole(h = 0) { //! Drill the hole for a hygrometer
|
||||||
round(cnc_bit_r) {
|
extrude_if(h)
|
||||||
intersection() {
|
round(cnc_bit_r) {
|
||||||
drill(hygrometer_hole_r, h);
|
intersection() {
|
||||||
|
drill(hygrometer_hole_r, 0);
|
||||||
|
|
||||||
rotate(30)
|
rotate(30)
|
||||||
square([slot_w + 2 * cnc_bit_r, 100], center = true);
|
square([slot_w + 2 * cnc_bit_r, 100], center = true);
|
||||||
|
}
|
||||||
|
drill((od + 0.2) / 2, 0);
|
||||||
}
|
}
|
||||||
drill((od + 0.2) / 2, h);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function hygrometer_or() = flange_d / 2; //! The outside radius of a hygrometer
|
function hygrometer_or() = flange_d / 2; //! The outside radius of a hygrometer
|
||||||
@@ -54,13 +55,13 @@ module hygrometer() { //! Draw a hygrometer
|
|||||||
color(grey(30))
|
color(grey(30))
|
||||||
rotate_extrude()
|
rotate_extrude()
|
||||||
polygon([
|
polygon([
|
||||||
[0, 0],
|
[0, 0],
|
||||||
[aperture_d / 2, 0],
|
[aperture_d / 2, 0],
|
||||||
[aperture_d / 2, flange_t],
|
[aperture_d / 2, flange_t],
|
||||||
[flange_d2 / 2, flange_t2],
|
[flange_d2 / 2, flange_t2],
|
||||||
[flange_d / 2, flange_t],
|
[flange_d / 2, flange_t],
|
||||||
[flange_d / 2, 0],
|
[flange_d / 2, 0],
|
||||||
[od / 2, 0],
|
[od / 2, 0],
|
||||||
[od / 2, -h],
|
[od / 2, -h],
|
||||||
[0, -h]
|
[0, -h]
|
||||||
]);
|
]);
|
||||||
|
@@ -194,12 +194,14 @@ module jhead_hot_end_assembly(type, filament, naked = false) { //! Assembly with
|
|||||||
if(exploded())
|
if(exploded())
|
||||||
heater_components();
|
heater_components();
|
||||||
else
|
else
|
||||||
intersection() {
|
if(naked) // hide the wires when not exploded
|
||||||
heater_components();
|
intersection() {
|
||||||
|
heater_components();
|
||||||
|
|
||||||
if(naked)
|
color("grey")
|
||||||
color("grey") cylinder(r = 12, h = 100, center = true);
|
cylinder(r = 12, h = 100, center = true);
|
||||||
else
|
}
|
||||||
cube(1, true); // hide the wires when not exploded
|
else
|
||||||
}
|
hidden() // hidden by the tape
|
||||||
|
heater_components();
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@ module magnet(type) { //! Draw specified magnet
|
|||||||
h = magnet_h(type);
|
h = magnet_h(type);
|
||||||
r = magnet_r(type);
|
r = magnet_r(type);
|
||||||
|
|
||||||
//vitamin(str("magnet(", type[0], "): Magnet ", od, "mm diameter, ", h, "mm high", id ? str(", ", id, "mm bore") : "" ));
|
vitamin(str("magnet(", type[0], "): Magnet ", od, "mm diameter, ", h, "mm high", id ? str(", ", id, "mm bore") : "" ));
|
||||||
|
|
||||||
or = od / 2;
|
or = od / 2;
|
||||||
ir = id / 2;
|
ir = id / 2;
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
// od, id, h, r
|
// od, id, h, r
|
||||||
MAG8x4x4p2 = ["MAG8x4x4p2", 8, 4.2, 4, 0.5];
|
MAG8x4x4p2 = ["MAG8x4x4p2", 8, 4.2, 4, 0.5];
|
||||||
MAG484 = ["MAG484", inch(1/4), inch(1/8), inch(1/4), 0.5];
|
MAG484 = ["MAG484", inch(1/4), inch(1/8), inch(1/4), 0.5];
|
||||||
MAG5x8 = ["MAG484", 8, 0, 5, 0.5];
|
MAG5x8 = ["MAG5x8", 8, 0, 5, 0.5];
|
||||||
|
|
||||||
magnets = [MAG8x4x4p2, MAG484, MAG5x8];
|
magnets = [MAG8x4x4p2, MAG484, MAG5x8];
|
||||||
|
|
||||||
|
@@ -41,6 +41,8 @@ function microswitch_button_clr(type)= type[14]; //! Button colour
|
|||||||
function microswitch_lower_extent(type) = let(leg = microswitch_leg(type)) min([for(pos = microswitch_legs(type)) pos.y - leg.y / 2]); //! How far legs extend downwards
|
function microswitch_lower_extent(type) = let(leg = microswitch_leg(type)) min([for(pos = microswitch_legs(type)) pos.y - leg.y / 2]); //! How far legs extend downwards
|
||||||
function microswitch_right_extent(type) = let(leg = microswitch_leg(type)) max([microswitch_length(type) / 2, for(pos = microswitch_legs(type)) pos.x + leg.x / 2]); //! How far legs extend right
|
function microswitch_right_extent(type) = let(leg = microswitch_leg(type)) max([microswitch_length(type) / 2, for(pos = microswitch_legs(type)) pos.x + leg.x / 2]); //! How far legs extend right
|
||||||
|
|
||||||
|
function microswitch_size(type) = [microswitch_length(type), microswitch_width(type), microswitch_thickness(type)]; //! Body size
|
||||||
|
|
||||||
module microswitch_hole_positions(type) //! Place children at the hole positions
|
module microswitch_hole_positions(type) //! Place children at the hole positions
|
||||||
{
|
{
|
||||||
for(hole = microswitch_holes(type))
|
for(hole = microswitch_holes(type))
|
||||||
|
@@ -64,6 +64,7 @@ module pulley(type) { //! Draw a pulley
|
|||||||
hl = pulley_hub_length(type);
|
hl = pulley_hub_length(type);
|
||||||
w = pulley_width(type);
|
w = pulley_width(type);
|
||||||
r1 = pulley_bore(type) / 2;
|
r1 = pulley_bore(type) / 2;
|
||||||
|
screw_z = pulley_screw_z(type);
|
||||||
|
|
||||||
or = od / 2;
|
or = od / 2;
|
||||||
ir = pulley_ir(type);
|
ir = pulley_ir(type);
|
||||||
@@ -100,33 +101,42 @@ module pulley(type) { //! Draw a pulley
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module screw_holes() {
|
module hub()
|
||||||
if(pulley_screws(type))
|
rotate_extrude() translate([r1, 0]) {
|
||||||
translate_z(pulley_screw_z(type))
|
if(hl)
|
||||||
for(i = [0 : pulley_screws(type) - 1])
|
square([pulley_hub_dia(type) / 2 - r1, hl]);
|
||||||
rotate([-90, 0, i * -90])
|
|
||||||
cylinder(r = screw_radius(pulley_screw(type)), h = 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
color("silver") {
|
for(z = [pulley_hub_length(type), hl + ft + w])
|
||||||
render() difference() {
|
translate([0, z])
|
||||||
rotate_extrude() translate([r1, 0]) {
|
square([pulley_flange_dia(type) / 2 - r1, ft]);
|
||||||
if(hl)
|
|
||||||
square([pulley_hub_dia(type) / 2 - r1, hl]);
|
|
||||||
|
|
||||||
for(z = [pulley_hub_length(type), hl + ft + w])
|
|
||||||
translate([0, z])
|
|
||||||
square([pulley_flange_dia(type) / 2 - r1, ft]);
|
|
||||||
}
|
|
||||||
if(pulley_screw_z(type) < hl)
|
|
||||||
screw_holes();
|
|
||||||
}
|
}
|
||||||
render() difference() { // T5 pulleys have screw through the teeth
|
|
||||||
|
module screw_holes()
|
||||||
|
translate_z(screw_z)
|
||||||
|
for(i = [0 : pulley_screws(type) - 1])
|
||||||
|
rotate([-90, 0, i * -90])
|
||||||
|
cylinder(r = screw_radius(pulley_screw(type)), h = 100);
|
||||||
|
|
||||||
|
color(silver) {
|
||||||
|
if(screw_z && screw_z < hl)
|
||||||
|
render()
|
||||||
|
difference() {
|
||||||
|
hub();
|
||||||
|
|
||||||
|
screw_holes();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hub();
|
||||||
|
|
||||||
|
if(screw_z && screw_z > hl) // T5 pulleys have screw through the teeth
|
||||||
|
render()
|
||||||
|
difference() {
|
||||||
|
core();
|
||||||
|
|
||||||
|
screw_holes();
|
||||||
|
}
|
||||||
|
else
|
||||||
core();
|
core();
|
||||||
|
|
||||||
if(pulley_screw_z(type) > hl)
|
|
||||||
screw_holes();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -33,6 +33,9 @@ function rail_bore_depth(type) = type[7]; //! Counter bore depth
|
|||||||
function rail_screw(type) = type[8]; //! Screw type
|
function rail_screw(type) = type[8]; //! Screw type
|
||||||
function rail_carriage(type) = type[9]; //! Carriage type
|
function rail_carriage(type) = type[9]; //! Carriage type
|
||||||
function rail_end_screw(type) = type[10]; //! Screw used for ends only (Countersink used for better location)
|
function rail_end_screw(type) = type[10]; //! Screw used for ends only (Countersink used for better location)
|
||||||
|
function rail_groove_offset(type)=type[11]; //! Offset of centre of groove from top of rail
|
||||||
|
function rail_groove_width(type)=type[12]; //! Groove width
|
||||||
|
|
||||||
function rail_screw_height(type, screw) = rail_height(type) - rail_bore_depth(type) + screw_head_depth(screw, rail_hole(type)); //! Position screw taking into account countersink into counterbored hole
|
function rail_screw_height(type, screw) = rail_height(type) - rail_bore_depth(type) + screw_head_depth(screw, rail_hole(type)); //! Position screw taking into account countersink into counterbored hole
|
||||||
function rail_travel(type, length) = length - carriage_length(rail_carriage(type)); //! How far the carriage can travel
|
function rail_travel(type, length) = length - carriage_length(rail_carriage(type)); //! How far the carriage can travel
|
||||||
|
|
||||||
@@ -53,7 +56,7 @@ function rail_holes(type, length) = //! Number of holes in a rail given its `len
|
|||||||
module rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true) { //! Position children over screw holes
|
module rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true) { //! Position children over screw holes
|
||||||
pitch = rail_pitch(type);
|
pitch = rail_pitch(type);
|
||||||
holes = rail_holes(type, length);
|
holes = rail_holes(type, length);
|
||||||
last = first + screws;
|
last = first + min(screws, both_ends ? ceil(holes / 2) : holes);
|
||||||
for(i = [first : holes - 1], j = holes - 1 - i)
|
for(i = [first : holes - 1], j = holes - 1 - i)
|
||||||
if(i < last || both_ends && (j >= first && j < last))
|
if(i < last || both_ends && (j >= first && j < last))
|
||||||
translate([i * pitch - length / 2 + (length - (holes - 1) * pitch) / 2, 0])
|
translate([i * pitch - length / 2 + (length - (holes - 1) * pitch) / 2, 0])
|
||||||
@@ -134,43 +137,45 @@ module carriage(type, rail, end_colour = grey(20), wiper_colour = grey(20)) { //
|
|||||||
carriage_end(type, end_w, end_h, end_l);
|
carriage_end(type, end_w, end_h, end_l);
|
||||||
}
|
}
|
||||||
|
|
||||||
module rail(type, length) { //! Draw the specified rail
|
module rail(type, length, colour = grey(90), use_polycircles = false) { //! Draw the specified rail
|
||||||
width = rail_width(type);
|
width = rail_width(type);
|
||||||
height = rail_height(type);
|
height = rail_height(type);
|
||||||
|
|
||||||
vitamin(str("rail(", type[0], ", ", length, "): Linear rail ", type[0], " x ", length, "mm"));
|
vitamin(str("rail(", type[0], ", ", length, "): Linear rail ", type[0], " x ", length, "mm"));
|
||||||
|
|
||||||
color(grey(90)) {
|
color(colour) {
|
||||||
|
rbr = rail_bore(type) / 2;
|
||||||
|
w = corrected_radius(rbr) * 2 + 2 * eps; // width of core big enough for the holes
|
||||||
linear_extrude(height - rail_bore_depth(type)) difference() {
|
linear_extrude(height - rail_bore_depth(type)) difference() {
|
||||||
square([length, width], center = true);
|
square([length, w], center = true);
|
||||||
|
|
||||||
rail_hole_positions(type, length)
|
rail_hole_positions(type, length)
|
||||||
circle(d = rail_hole(type));
|
if (use_polycircles)
|
||||||
|
poly_circle(rail_hole(type) / 2);
|
||||||
|
else
|
||||||
|
circle(d = rail_hole(type));
|
||||||
}
|
}
|
||||||
|
translate_z(rail_height(type) - rail_bore_depth(type))
|
||||||
|
linear_extrude(rail_bore_depth(type)) difference() {
|
||||||
|
square([length, w], center = true);
|
||||||
|
|
||||||
translate_z(rail_height(type) - rail_bore_depth(type)) {
|
|
||||||
h1 = rail_bore_depth(type) > 2 ? rail_bore_depth(type) / 3 : rail_bore_depth(type) / 2;
|
|
||||||
h0 = rail_bore_depth(type) > 2 ? (rail_bore_depth(type) - h1) / 2 : 0;
|
|
||||||
h2 = rail_bore_depth(type) - h1 - h0;
|
|
||||||
|
|
||||||
linear_extrude(h0) difference() {
|
|
||||||
square([length, width], center = true);
|
|
||||||
rail_hole_positions(type, length)
|
rail_hole_positions(type, length)
|
||||||
circle(d = rail_bore(type));
|
if (use_polycircles)
|
||||||
|
poly_circle(rbr);
|
||||||
|
else
|
||||||
|
circle(rbr);
|
||||||
}
|
}
|
||||||
translate_z(h0)
|
|
||||||
linear_extrude(h1) difference() {
|
go = height - rail_groove_offset(type);
|
||||||
w1 = max(width - 2, rail_bore(type));
|
gw = rail_groove_width(type);
|
||||||
square([length, w1], center = true);
|
gd = gw / 2;
|
||||||
rail_hole_positions(type, length)
|
sw = (width - w) / 2;
|
||||||
circle(d = rail_bore(type));
|
for (m = [0, 1])
|
||||||
}
|
mirror([0, m, 0])
|
||||||
translate_z(h0 + h1)
|
translate([0, -width / 2])
|
||||||
linear_extrude(h2) difference() {
|
rotate([0, -90, 0])
|
||||||
square([length, width], center = true);
|
linear_extrude(length, center = true)
|
||||||
rail_hole_positions(type, length)
|
polygon([ [0, 0], [0, sw], [height, sw], [height, 0], [go + gw/2, 0], [go, gd], [go - gw/2, 0] ]);
|
||||||
circle(d = rail_bore(type));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,19 +186,19 @@ module rail_assembly(type, length, pos, carriage_end_colour = grey(20), carriage
|
|||||||
carriage(rail_carriage(type), type, carriage_end_colour, carriage_wiper_colour);
|
carriage(rail_carriage(type), type, carriage_end_colour, carriage_wiper_colour);
|
||||||
}
|
}
|
||||||
|
|
||||||
module rail_screws(type, length, thickness, screws = 100) { //! Place screws in the rail
|
module rail_screws(type, length, thickness, screws = 100, index_screws = undef) { //! Place screws in the rail
|
||||||
screw = rail_screw(type);
|
screw = rail_screw(type);
|
||||||
end_screw = rail_end_screw(type);
|
end_screw = rail_end_screw(type);
|
||||||
screw_len = screw_longer_than(rail_screw_height(type, screw) + thickness);
|
screw_len = screw_longer_than(rail_screw_height(type, screw) + thickness);
|
||||||
end_screw_len = screw_longer_than(rail_screw_height(type, end_screw) + thickness);
|
end_screw_len = screw_longer_than(rail_screw_height(type, end_screw) + thickness);
|
||||||
|
|
||||||
index_screws = screws > 2 ? 1 : 2;
|
index_screws = is_undef(index_screws) ? screws > 2 ? 1 : 2 : index_screws;
|
||||||
|
|
||||||
translate_z(rail_screw_height(type, end_screw))
|
translate_z(rail_screw_height(type, end_screw))
|
||||||
rail_hole_positions(type, length, 0, index_screws)
|
rail_hole_positions(type, length, 0, index_screws)
|
||||||
screw(end_screw, end_screw_len);
|
screw(end_screw, end_screw_len);
|
||||||
|
|
||||||
translate_z(rail_screw_height(type, screw))
|
translate_z(rail_screw_height(type, screw))
|
||||||
rail_hole_positions(type, length, index_screws, min(screws, rail_holes(type, length)) - 2 * index_screws)
|
rail_hole_positions(type, length, index_screws, screws - index_screws)
|
||||||
screw(screw, screw_len);
|
screw(screw, screw_len);
|
||||||
}
|
}
|
||||||
|
@@ -32,14 +32,14 @@ SSR15_carriage = [ 40.3, 23.3, 34, 24, 4.5, 0, 26, M4_cap_screw ];
|
|||||||
// Rails
|
// Rails
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
// Wr Hr E P D d h
|
// Wr Hr E P D d h go gw
|
||||||
MGN5 = [ "MGN5", 5, 3.6, 5, 15, 3.6, 2.4, 0.8, M2_cs_cap_screw, MGN5_carriage, M2_cs_cap_screw ]; // Screw holes too small for M2 heads
|
MGN5 = [ "MGN5", 5, 3.6, 5, 15, 3.6, 2.4, 0.8, M2_cs_cap_screw, MGN5_carriage, M2_cs_cap_screw, 1, 1 ]; // Screw holes too small for M2 heads
|
||||||
MGN7 = [ "MGN7", 7, 5, 5, 15, 4.3, 2.4, 2.6, M2_cap_screw, MGN7_carriage, M2_cs_cap_screw ];
|
MGN7 = [ "MGN7", 7, 5, 5, 15, 4.3, 2.4, 2.6, M2_cap_screw, MGN7_carriage, M2_cs_cap_screw, 1.5, 1.5 ];
|
||||||
MGN9 = [ "MGN9", 9, 6, 7.5, 20, 6.0, 3.5, 3.5, M3_cap_screw, MGN9_carriage, M3_cs_cap_screw ];
|
MGN9 = [ "MGN9", 9, 6, 7.5, 20, 6.0, 3.5, 3.5, M3_cap_screw, MGN9_carriage, M3_cs_cap_screw, 1.5, 1.5 ];
|
||||||
MGN12= [ "MGN12", 12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12_carriage, M3_cs_cap_screw ];
|
MGN12= [ "MGN12", 12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12_carriage, M3_cs_cap_screw, 2.25, 2.75 ];
|
||||||
MGN12H=[ "MGN12H",12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12H_carriage,M3_cs_cap_screw ];
|
MGN12H=[ "MGN12H",12, 8, 10, 25, 6.0, 3.5, 4.5, M3_cap_screw, MGN12H_carriage,M3_cs_cap_screw, 2.25, 2.75];
|
||||||
MGN15= [ "MGN15", 15, 10, 10, 40, 6.0, 3.5, 5.0, M3_cap_screw, MGN15_carriage, M3_cs_cap_screw ];
|
MGN15= [ "MGN15", 15, 10, 10, 40, 6.0, 3.5, 5.0, M3_cap_screw, MGN15_carriage, M3_cs_cap_screw, 2.5, 2.75 ];
|
||||||
SSR15= [ "SSR15", 15, 12.5,10, 60, 7.5, 4.5, 5.3, M4_cap_screw, SSR15_carriage, M4_cs_cap_screw ];
|
SSR15= [ "SSR15", 15, 12.5,10, 60, 7.5, 4.5, 5.3, M4_cap_screw, SSR15_carriage, M4_cs_cap_screw, 2.5, 2.75 ];
|
||||||
|
|
||||||
rails = [MGN5, MGN7, MGN9, MGN12, MGN12H, MGN15, SSR15];
|
rails = [MGN5, MGN7, MGN9, MGN12, MGN12H, MGN15, SSR15];
|
||||||
|
|
||||||
|
@@ -36,6 +36,8 @@ function rocker_bezel(type) = type[10]; //! Bezel width
|
|||||||
function rocker_pivot(type) = type[11]; //! Pivot distance from the back of the flange
|
function rocker_pivot(type) = type[11]; //! Pivot distance from the back of the flange
|
||||||
function rocker_button(type) = type[12]; //! How far the button extends from the bezel
|
function rocker_button(type) = type[12]; //! How far the button extends from the bezel
|
||||||
function rocker_spades(type) = type[13]; //! Spade types and positions
|
function rocker_spades(type) = type[13]; //! Spade types and positions
|
||||||
|
function rocker_size(type) = [rocker_width(type), rocker_height(type), rocker_depth(type)]; //! Width, height, and depth in a vector
|
||||||
|
function rocker_slot(type) = [rocker_slot_w(type), rocker_slot_h(type)]; //! Rocker slot in a vector
|
||||||
|
|
||||||
module rocker(type, colour) { //! Draw the specified rocker switch
|
module rocker(type, colour) { //! Draw the specified rocker switch
|
||||||
vitamin(str("rocker(", type[0], "): ", rocker_part(type)));
|
vitamin(str("rocker(", type[0], "): ", rocker_part(type)));
|
||||||
@@ -87,6 +89,6 @@ module rocker(type, colour) { //! Draw the specified rocker switch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module rocker_hole(type, h = 0) //! Make a hole to accept a rocker switch, by default 2D, set h for 3D
|
module rocker_hole(type, h = 0, rounded = true) //! Make a hole to accept a rocker switch, by default 2D, set h for 3D
|
||||||
extrude_if(h)
|
extrude_if(h)
|
||||||
rounded_square([rocker_slot_w(type), rocker_slot_h(type)], 1, center = true);
|
rounded_square([rocker_slot_w(type), rocker_slot_h(type)], rounded ? 1 : 0, center = true);
|
||||||
|
@@ -262,7 +262,7 @@ module screw_countersink(type, drilled = true) { //! Countersink shape
|
|||||||
if(drilled)
|
if(drilled)
|
||||||
cylinder(h = head_height + eps, r1 = 0, r2 = head_rad + head_t);
|
cylinder(h = head_height + eps, r1 = 0, r2 = head_rad + head_t);
|
||||||
else
|
else
|
||||||
intersection() {
|
render() intersection() {
|
||||||
cylinder(h = head_height + eps, r1 = 0, r2 = head_rad + head_t);
|
cylinder(h = head_height + eps, r1 = 0, r2 = head_rad + head_t);
|
||||||
|
|
||||||
cylinder(h = head_height + eps, r = head_rad + eps);
|
cylinder(h = head_height + eps, r = head_rad + eps);
|
||||||
|
@@ -27,10 +27,11 @@ NEMA17 = ["NEMA17", 42.3, 47, 53.6/2, 25, 11, 2, 5, 24,
|
|||||||
NEMA17M = ["NEMA17M", 42.3, 40, 53.6/2, 25, 11, 2, 5, 20, 31, [12.5, 11]];
|
NEMA17M = ["NEMA17M", 42.3, 40, 53.6/2, 25, 11, 2, 5, 20, 31, [12.5, 11]];
|
||||||
NEMA17M8= ["NEMA17M8", 42.3, 40, 53.6/2, 25, 11, 2, 8, [280, 8, 4], 31, [12.5, 11]];
|
NEMA17M8= ["NEMA17M8", 42.3, 40, 53.6/2, 25, 11, 2, 8, [280, 8, 4], 31, [12.5, 11]];
|
||||||
NEMA17S = ["NEMA17S", 42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31, [8, 8]];
|
NEMA17S = ["NEMA17S", 42.3, 34, 53.6/2, 25, 11, 2, 5, 24, 31, [8, 8]];
|
||||||
|
NEMA17P = ["NEMA17P", 42.3, 26.5, 53.6/2, 25, 11, 2, 5, 26.5, 31, [10, 8]];
|
||||||
NEMA16 = ["NEMA16", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5, 12, 31, [8, 8]];
|
NEMA16 = ["NEMA16", 39.5, 19.2, 50.6/2, 50.6/2, 11, 2, 5, 12, 31, [8, 8]];
|
||||||
NEMA14 = ["NEMA14", 35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26, [8, 8]];
|
NEMA14 = ["NEMA14", 35.2, 36, 46.4/2, 21, 11, 2, 5, 21, 26, [8, 8]];
|
||||||
NEMA23 = ["NEMA23", 56.4, 51.2, 75.7/2, 35, 38.1/2, 1.6, 6.35, 24, 47.1, [8, 8]];
|
NEMA23 = ["NEMA23", 56.4, 51.2, 75.7/2, 35, 38.1/2, 1.6, 6.35, 24, 47.1, [8, 8]];
|
||||||
|
|
||||||
stepper_motors = [NEMA14, NEMA16, NEMA17S, NEMA17M, NEMA17, NEMA23];
|
stepper_motors = [NEMA14, NEMA16, NEMA17P, NEMA17S, NEMA17M, NEMA17, NEMA23];
|
||||||
|
|
||||||
use <stepper_motor.scad>
|
use <stepper_motor.scad>
|
||||||
|
@@ -41,6 +41,8 @@ function vero_track_width(type) = vero_pitch(type) * 0.8; //! The width of th
|
|||||||
function vero_length(type) = vero_holes(type) * vero_pitch(type); //! Length of the board
|
function vero_length(type) = vero_holes(type) * vero_pitch(type); //! Length of the board
|
||||||
function vero_width(type) = vero_strips(type) * vero_pitch(type); //! Width of the board
|
function vero_width(type) = vero_strips(type) * vero_pitch(type); //! Width of the board
|
||||||
|
|
||||||
|
function vero_size(type) = [vero_length(type), vero_width(type), vero_thickness(type)]; //! Board size
|
||||||
|
|
||||||
module solder_meniscus(type) {
|
module solder_meniscus(type) {
|
||||||
h = 1;
|
h = 1;
|
||||||
r = vero_track_width(type) / 2;
|
r = vero_track_width(type) / 2;
|
||||||
|
Reference in New Issue
Block a user