Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
744ebc2935 | ||
|
99a5570e24 | ||
|
b70911dc13 | ||
|
2d20fb130a | ||
|
738c7914e2 | ||
|
7596bcacf4 | ||
|
943deededf | ||
|
c8f16f4cdb | ||
|
a30aff9613 | ||
|
c0d9067b74 | ||
|
7e8f03df2e |
10
CHANGELOG.md
@@ -3,6 +3,16 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
#### [v20.1.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.1.0...v20.1.1 "diff with v20.1.0")
|
||||
* 2022-02-25 [`943deed`](https://github.com/nophead/NopSCADlib/commit/943deededfe2b258f23ca64001ae7c010ed626bc "show commit") [C.P.](# "Chris Palmer") Updated the readme.
|
||||
|
||||
* 2022-02-24 [`c0d9067`](https://github.com/nophead/NopSCADlib/commit/c0d9067b740fc5ea4a41e696c88613a284685118 "show commit") [M.B.](# "Martin Budden") Fixed typos.
|
||||
|
||||
* 2022-02-25 [`a30aff9`](https://github.com/nophead/NopSCADlib/commit/a30aff9613f51092bbad7052bfe1194a61557efc "show commit") [C.P.](# "Chris Palmer") Fixed missing brackets for sheets with chamfered corners.
|
||||
|
||||
### [v20.1.0](https://github.com/nophead/NopSCADlib/releases/tag/v20.1.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v20.0.1...v20.1.0 "diff with v20.0.1")
|
||||
* 2022-02-23 [`f173284`](https://github.com/nophead/NopSCADlib/commit/f173284709acdbd32de21f0d27cb3ab10b42eb2a "show commit") [C.P.](# "Chris Palmer") Can now inhibit exploded lines for issue [#220](https://github.com/nophead/NopSCADlib/issues/220 "show issue").
|
||||
|
||||
#### [v20.0.1](https://github.com/nophead/NopSCADlib/releases/tag/v20.0.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v20.0.0...v20.0.1 "diff with v20.0.0")
|
||||
* 2022-02-23 [`0206b2e`](https://github.com/nophead/NopSCADlib/commit/0206b2e868119b3b5fdea6111839bf5055eae438 "show commit") [C.P.](# "Chris Palmer") Updated images.
|
||||
|
||||
|
@@ -31,7 +31,7 @@
|
||||
//! Star washers can be omitted by setting `star_washers` to false.
|
||||
//!
|
||||
//! A 2screw_block is a thinner version with two screws and two mating surfaces. It can be used as an alternative to fixing blocks when
|
||||
//! high lateral rigity is not required.
|
||||
//! high lateral rigidity is not required.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../vitamins/insert.scad>
|
||||
|
@@ -20,7 +20,7 @@
|
||||
//
|
||||
//! Parametric knobs for potentiometers and encoders.
|
||||
//!
|
||||
//! A knob can be constructed by specififying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
//! A knob can be constructed by specifying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
//! An optional skirt and / or a pointer can be specified.
|
||||
//!
|
||||
//! The STL includes a support membrane that needs to be cut out and a thread needs to be tapped for the grub screw.
|
||||
|
@@ -20,7 +20,7 @@
|
||||
//
|
||||
//! Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
//!
|
||||
//! * When `ways` is a scalar number the slot is sized for one rubbon cable and a PP strip.
|
||||
//! * When `ways` is a scalar number the slot is sized for one ribbon cable and a PP strip.
|
||||
//! * When `ways` is a two element vector the second element indicates the number of cables and the slot is size for just the cables.
|
||||
//
|
||||
include <../core.scad>
|
||||
|
32
readme.md
@@ -4382,7 +4382,7 @@ If a washer is given a child, usually a screw or a nut, then it is placed on its
|
||||
---
|
||||
<a name="Wire"></a>
|
||||
## Wire
|
||||
Just a BOM entry at the moment and cable bundle size functions for holes, plus cable ties.
|
||||
Utilities for adding wires to the BOM and optionally drawing them and cable bundle size functions for holes, plus cable ties.
|
||||
|
||||
[vitamins/wire.scad](vitamins/wire.scad) Implementation.
|
||||
|
||||
@@ -4391,21 +4391,25 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| `cable(wires, size, colours, ribbon = false)` | Cable constructor |
|
||||
| `cable_bundle(cable)` | Arrangement of a bundle in a flat cable clip |
|
||||
| `cable(wires, size, colours, ribbon = false, tlen = 25)` | Cable constructor |
|
||||
| `cable_bundle(cable)` | Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip |
|
||||
| `cable_bundle_positions(cable)` | Positions of wires in a bundle to go through a cable strip |
|
||||
| `cable_height(cable)` | Height in flat clip |
|
||||
| `cable_is_ribbon(cable)` | Is a ribbon cable? |
|
||||
| `cable_radius(cable)` | Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>. |
|
||||
| `cable_tlen(cable)` | Twisted cable twist length |
|
||||
| `cable_twisted_radius(cable)` | Approximate radius of a cable when twisted |
|
||||
| `cable_width(cable)` | Width in flat clip |
|
||||
| `cable_wire_colours(cable)` | Individual wire colours |
|
||||
| `cable_wire_size(cable)` | Size of each wire in a bundle |
|
||||
| `cable_wires(cable)` | Number of wires in a bundle |
|
||||
| `twisted_cable(cable, path, irot = 0, frot = 0)` | Return the paths for a twisted cable, `irot` is the initial rotation and frot the final rotation |
|
||||
| `wire_hole_radius(cable)` | Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| `cable(cable, paths)` | Draw a cable, given a list of paths |
|
||||
| `cable_tie(cable_r, thickness)` | A ziptie threaded around cable radius `cable_r` and through a panel with specified `thickness`. |
|
||||
| `cable_tie_holes(cable_r, h = 100)` | Holes to thread a ziptie through a panel to make a cable tie. |
|
||||
| `mouse_hole(cable, h = 100, teardrop = false)` | A mouse hole to allow a panel to go over a wire bundle. |
|
||||
@@ -4417,13 +4421,13 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | | Wire black 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire blue 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire brown 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire green 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire orange 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire red 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire yellow 7/0.2mm strands, length 90mm |
|
||||
| 1 | | Wire black 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire blue 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire brown 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire green 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire orange 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire red 7/0.2mm strands, length 60mm |
|
||||
| 1 | | Wire yellow 7/0.2mm strands, length 60mm |
|
||||
| 1 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||
|
||||
|
||||
@@ -4890,7 +4894,7 @@ This allows the block and one set of fasteners to be on one assembly and the oth
|
||||
Star washers can be omitted by setting `star_washers` to false.
|
||||
|
||||
A 2screw_block is a thinner version with two screws and two mating surfaces. It can be used as an alternative to fixing blocks when
|
||||
high lateral rigity is not required.
|
||||
high lateral rigidity is not required.
|
||||
|
||||
[printed/corner_block.scad](printed/corner_block.scad) Implementation.
|
||||
|
||||
@@ -5449,7 +5453,7 @@ Printed handle that can be printed without needing support material due to its t
|
||||
## Knob
|
||||
Parametric knobs for potentiometers and encoders.
|
||||
|
||||
A knob can be constructed by specififying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
A knob can be constructed by specifying all the parameters or the potentiometer can be specified to customise it for its shaft with a recess to clear the nut, washer and thread.
|
||||
An optional skirt and / or a pointer can be specified.
|
||||
|
||||
The STL includes a support membrane that needs to be cut out and a thread needs to be tapped for the grub screw.
|
||||
@@ -5847,7 +5851,7 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
||||
## Ribbon_clamp
|
||||
Clamp for ribbon cable and polypropylene strip or one or more ribbon cables.
|
||||
|
||||
* When `ways` is a scalar number the slot is sized for one rubbon cable and a PP strip.
|
||||
* When `ways` is a scalar number the slot is sized for one ribbon cable and a PP strip.
|
||||
* When `ways` is a two element vector the second element indicates the number of cables and the slot is size for just the cables.
|
||||
|
||||
[printed/ribbon_clamp.scad](printed/ribbon_clamp.scad) Implementation.
|
||||
@@ -6807,7 +6811,7 @@ The `pose()` module allows assembly views in the readme to be posed differently
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | `insert(F1BM3)` | Heatfit insert M3 |
|
||||
| 1 | `widget(3)` | Rivit like thing for 3mm sheets |
|
||||
| 1 | `widget(3)` | Rivet like thing for 3mm sheets |
|
||||
| 1 | `screw(M3_cap_screw, 8)` | Screw M3 cap x 8mm |
|
||||
| 1 | `sheet(PMMA3, 20, 20, 1)` | Sheet acrylic 20mm x 20mm x 3mm |
|
||||
| 1 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||
|
@@ -422,7 +422,7 @@ def views(target, do_assemblies = None):
|
||||
times.add_time(html_name, t)
|
||||
times.print_times(pngs + [html_name])
|
||||
#
|
||||
# Make the printme.html by replacing empty spans that invisbly mark the page breaks by page break divs.
|
||||
# Make the printme.html by replacing empty spans that invisibly mark the page breaks by page break divs.
|
||||
#
|
||||
with open(html_name, 'rt') as src:
|
||||
lines = src.readlines()
|
||||
|
@@ -32,7 +32,7 @@ height = 10;
|
||||
insert = screw_insert(screw);
|
||||
|
||||
module widget(thickness) {
|
||||
vitamin(str("widget(", thickness, "): Rivit like thing for ", thickness, "mm sheets"));
|
||||
vitamin(str("widget(", thickness, "): Rivet like thing for ", thickness, "mm sheets"));
|
||||
t = 1;
|
||||
color("silver") {
|
||||
cylinder(d = 3, h = thickness + 2 * eps, center = true);
|
||||
@@ -85,7 +85,7 @@ assembly("widget_top") {
|
||||
module widget_assembly()
|
||||
assembly("widget") {
|
||||
|
||||
widget_base_assembly(); // Note this is not exloded because it is sub-assembly
|
||||
widget_base_assembly(); // Note this is not exploded because it is sub-assembly
|
||||
|
||||
translate_z(height) {
|
||||
translate_z(sheet_thickness(sheet))
|
||||
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 130 KiB |
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 103 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 181 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 218 KiB |
@@ -17,18 +17,25 @@
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/sweep.scad>
|
||||
use <../utils/bezier.scad>
|
||||
|
||||
use <../vitamins/wire.scad>
|
||||
|
||||
bundle = [7, 1.4];
|
||||
twist_len = 25; // [5 : 50]
|
||||
wires = 7; // [1 : 7]
|
||||
irot = -60; // [-90 : 0]
|
||||
|
||||
/* [Hidden] */
|
||||
wire_d = 1.4;
|
||||
bundle = cable(wires, wire_d);
|
||||
bundle_r = cable_radius(bundle);
|
||||
|
||||
thickness = 2;
|
||||
w = 60;
|
||||
d = 20;
|
||||
h = 40;
|
||||
wire_l = 90;
|
||||
h = 10;
|
||||
wire_l = 60;
|
||||
mouse_y = 10;
|
||||
cable_pitch = 7;
|
||||
|
||||
@@ -49,6 +56,7 @@ module wires() {
|
||||
translate([bundle_r - d / 2, 0]) {
|
||||
colour = ["black", "brown", "red", "orange", "yellow", "blue", "purple"][i];
|
||||
wire(colour, 7, wire_l);
|
||||
|
||||
color(colour)
|
||||
cylinder(d = d, h = wire_l, center = true);
|
||||
}
|
||||
@@ -66,7 +74,7 @@ module wires() {
|
||||
mouse_hole(bundle, 0, true);
|
||||
|
||||
for(i = [1 : 6])
|
||||
let(cable = [i, 1.4], bundle = cable_bundle(cable))
|
||||
let(cable = cable(i, wire_d), bundle = cable_bundle(cable))
|
||||
translate([mouse_y + cable_pitch * i - bundle.x / 2, -eps])
|
||||
square([bundle.x, bundle.y]);
|
||||
}
|
||||
@@ -81,18 +89,28 @@ module wires() {
|
||||
cable_tie_holes(bundle_r, 0);
|
||||
}
|
||||
}
|
||||
|
||||
translate([-15, mouse_y])
|
||||
cable_tie(bundle_r, thickness);
|
||||
|
||||
for(i = [1 : 6]) let(cable = [i, 1.4])
|
||||
translate([0, mouse_y + cable_pitch * i])
|
||||
let(positions = cable_bundle_positions(cable))
|
||||
for(i = [0 : len(positions) - 1])
|
||||
let(p = positions[i])
|
||||
translate([0, p.x, p.y])
|
||||
rotate([0, 90, 0])
|
||||
color([grey(10), "blue", "red", "orange", "yellow", "green"][i])
|
||||
cylinder(d = cable_wire_size(cable), h = 60, center = true);
|
||||
for(i = [1 : 6]) let(cable = cable(i, wire_d, [grey(10), "blue", "red", "orange", "yellow", "green"], tlen = twist_len))
|
||||
translate([0, mouse_y + cable_pitch * i]) {
|
||||
tr = cable_twisted_radius(cable);
|
||||
bend_r = 5;
|
||||
x = -d + thickness - bend_r;
|
||||
path = [
|
||||
[-5, 0, tr],
|
||||
[x, 0, tr],
|
||||
bend_r, [x, 0, -25]
|
||||
];
|
||||
rpath = rounded_path(path);
|
||||
tpaths = twisted_cable(cable, rpath, irot = irot, frot = -irot);
|
||||
positions = cable_bundle_positions(cable);
|
||||
|
||||
ends = [for(p = positions) [[30, p.x, p.y], [0, p.x, p.y]]];
|
||||
paths = [for(i = [0 : len(tpaths) - 1]) bezier_join(ends[i], tpaths[i], 1.3, 3)];
|
||||
cable(cable, paths, $fn = 32);
|
||||
}
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -16,14 +16,23 @@
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
wire_r = 5; // [1 : 20]
|
||||
t = 0; // [0 : 3]
|
||||
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/zipties.scad>
|
||||
|
||||
module zipties()
|
||||
layout([for(z = zipties) 9], 10)
|
||||
ziptie(zipties[$i], 5);
|
||||
layout([for(z = zipties) 9], 2 * wire_r) {
|
||||
ziptie(zipties[$i], wire_r, t);
|
||||
|
||||
if(t)
|
||||
color(grey(20))
|
||||
cylinder(r = wire_r, h = 10, center = true);
|
||||
|
||||
}
|
||||
|
||||
if($preview)
|
||||
zipties();
|
||||
|
@@ -241,8 +241,7 @@ function segmented_path(path, min_segment) = [ //! Add points to a path to enfo
|
||||
|
||||
function spiral_paths(path, n, r, twists, start_angle) = let( //! Create a new paths which sprial around the given path. Use for making twisted cables
|
||||
segment = twists ? path_length(path) / twists / r2sides(2 * r) : inf,
|
||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists),
|
||||
initial = [r, 0, 0, 1] * rotate(start_angle)
|
||||
transforms = sweep_transforms(segmented_path(path, segment), twist = 360 * twists)
|
||||
) [for(i = [0 : n - 1]) let(initial = [r, 0, 0, 1] * rotate(start_angle + i * 360 / n)) [for(t = transforms) initial * t]];
|
||||
|
||||
function rounded_path_vertices(path) = [path[0], for(i = [1 : 2 : len(path) - 1]) path[i]]; //! Show the unrounded version of a rounded_path for debug
|
||||
|
@@ -52,7 +52,7 @@ module corner(r) {
|
||||
if(r < 0)
|
||||
translate([-r, r])
|
||||
rotate(45)
|
||||
square(-r * sqrt(2), -r * sqrt(2), center = true);
|
||||
square([-r * sqrt(2), -r * sqrt(2)], center = true);
|
||||
else
|
||||
translate([0.5, -0.5])
|
||||
square(1, center = true);
|
||||
|
@@ -18,9 +18,11 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! Just a BOM entry at the moment and cable bundle size functions for holes, plus cable ties.
|
||||
//! Utilities for adding wires to the BOM and optionally drawing them and cable bundle size functions for holes, plus cable ties.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <../utils/sweep.scad>
|
||||
use <../utils/maths.scad>
|
||||
include <zipties.scad>
|
||||
|
||||
module wire(colour, strands, length, strand = 0.2) //! Add stranded wire to the BOM
|
||||
@@ -35,15 +37,16 @@ module ribbon_cable(ways, length) //! Add ribbon cable to the
|
||||
function cable_wires(cable) = cable[0]; //! Number of wires in a bundle
|
||||
function cable_wire_size(cable) = cable[1]; //! Size of each wire in a bundle
|
||||
function cable_is_ribbon(cable) = len(cable) > 2 && cable[2]; //! Is a ribbon cable?
|
||||
function cable_wire_colours(cable) = assert(len(cable[3]) == cable_wires(cable)) cable[3]; //! Individual wire colours
|
||||
function cable(wires, size, colours, ribbon = false) = [wires, size, ribbon, colours]; //! Cable constructor
|
||||
function cable_wire_colours(cable) = assert(len(cable[3]) >= cable_wires(cable)) cable[3]; //! Individual wire colours
|
||||
function cable_tlen(cable) = cable[4]; //! Twisted cable twist length
|
||||
function cable(wires, size, colours, ribbon = false, tlen = 25) = [wires, size, ribbon, colours, tlen]; //! Cable constructor
|
||||
|
||||
// numbers from http://mathworld.wolfram.com/CirclePacking.html
|
||||
function cable_radius(cable) = [0, 1, 2, 2.15, 2.41, 2.7, 3, 3, 3.3][cable_wires(cable)] * cable_wire_size(cable) / 2; //! Radius of a bundle of wires, see <http://mathworld.wolfram.com/CirclePacking.html>.
|
||||
|
||||
function wire_hole_radius(cable) = ceil(4 * cable_radius(cable) + 1) / 4; //! Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size
|
||||
|
||||
function cable_bundle(cable) = //! Arrangement of a bundle in a flat cable clip
|
||||
function cable_bundle(cable) = //! Dimensions of the bounding rectangle of a bundle of wires in a flat cable clip
|
||||
(cable_is_ribbon(cable) ? [cable_wires(cable), 1] :
|
||||
[[0,0], [1,1], [2,1], [2, 1 + sin(60)], [2,2], [3, 1 + sin(60)], [3,2]][cable_wires(cable)]) * cable_wire_size(cable);
|
||||
|
||||
@@ -53,12 +56,42 @@ function cable_bundle_positions(cable) = let( //! Positions of wires in a bundle
|
||||
top = wires - bottom
|
||||
)
|
||||
[for(i = [0 : 1 : bottom - 1]) [i - (bottom - 1) / 2, 0.5],
|
||||
for(i = [0 : 1 : top - 1]) [i - (top - 1) / 2, top == bottom ? 1.5 : 0.5 + sin(60)]
|
||||
for(i = [top - 1 : -1 : 0]) [i - (top - 1) / 2, top == bottom ? 1.5 : 0.5 + sin(60)]
|
||||
] * cable_wire_size(cable);
|
||||
|
||||
function cable_width(cable) = cable_bundle(cable).x; //! Width in flat clip
|
||||
function cable_height(cable) = cable_bundle(cable).y; //! Height in flat clip
|
||||
|
||||
function cable_twisted_radius(cable) = let( //! Approximate radius of a cable when twisted
|
||||
tlen = cable_tlen(cable), // Twist length
|
||||
a = cable_wire_size(cable) / 2, // Ellipse minor axis
|
||||
R = cable_radius(cable) - a, // Radius of wire centres when not twisted
|
||||
angle = atan2(tlen, 2 * PI * R), // Slope angle of the spiral
|
||||
b = a / sin(angle), // Ellipse major axis
|
||||
grad = tan(180 / cable_wires(cable)), // Gradient at contact point between elipses
|
||||
x = a^2 / sqrt(a^2 + (b / grad)^2), // Contact point of the ellipse tangent
|
||||
y = b * sqrt(1 - x^2 / a^2)
|
||||
) R ? x + y / grad + a : a; // Where the tangent meets the X axis plus radius
|
||||
|
||||
function twisted_cable(cable, path, irot = 0, frot = 0) = let( //! Return the paths for a twisted cable, `irot` is the initial rotation and frot the final rotation
|
||||
tlen = cable_tlen(cable), // Twist length
|
||||
r = cable_wire_size(cable) / 2,
|
||||
pitch = cable_twisted_radius(cable) - r,
|
||||
wires = cable_wires(cable),
|
||||
bottom = wires > 4 ? 3 : 2,
|
||||
irot = irot + 90 - 180 * (bottom - 1) / wires
|
||||
)
|
||||
spiral_paths(path, wires, pitch, round(path_length(path) / tlen) - frot / 360, irot);
|
||||
|
||||
module cable(cable, paths) { //! Draw a cable, given a list of paths
|
||||
wires = cable_wires(cable);
|
||||
assert(len(paths) == wires);
|
||||
r = cable_wire_size(cable) / 2;
|
||||
for(i = [0 : wires - 1])
|
||||
color(cable_wire_colours(cable)[i])
|
||||
sweep(paths[i], circle_points(r), convexity = 5);
|
||||
}
|
||||
|
||||
module mouse_hole(cable, h = 100, teardrop = false) { //! A mouse hole to allow a panel to go over a wire bundle.
|
||||
r = wire_hole_radius(cable);
|
||||
|
||||
|
@@ -33,17 +33,16 @@ function ziptie_tail(type) = type[5]; //! The length without teeth
|
||||
module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t`
|
||||
{
|
||||
latch = ziptie_latch(type);
|
||||
lx = latch.x / 2;
|
||||
zt = ziptie_thickness(type);
|
||||
cr = zt; // sharp corner radius
|
||||
lx = min(latch.x / 2, r + zt / 2);
|
||||
right_bulge = (r > lx - zt / 2) || !t;
|
||||
cr = zt / 2; // sharp corner radius
|
||||
z = r + t - cr;
|
||||
x = r - cr;
|
||||
inside_corners = t ? [ [0, 0, r], [-x, z, cr], [x, z, cr] ] : [];
|
||||
outside_corners = t ? [ [0, 0, r + zt], [-x, z, cr + zt], [x, z, cr + zt] ] : [];
|
||||
x1 = lx - zt / 2;
|
||||
x2 = x1 + x1 * zt / r;
|
||||
inside_path = concat([ [0, 0, r], [x1, -r, eps] ], inside_corners);
|
||||
outside_path = concat([ [0, 0, r + zt], [x2, -r - zt, eps] ], outside_corners);
|
||||
outside_path = concat([ if(right_bulge) [0, 0, r + zt], [x2, -r - zt, eps] ], outside_corners);
|
||||
|
||||
tangents = rounded_polygon_tangents(outside_path);
|
||||
length = ceil(rounded_polygon_length(outside_path, tangents) + ziptie_tail(type) + latch.z + 1);
|
||||
@@ -56,7 +55,9 @@ module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radiu
|
||||
linear_extrude(width, center = true)
|
||||
difference() {
|
||||
rounded_polygon(outside_path, tangents);
|
||||
rounded_polygon(inside_path);
|
||||
|
||||
offset(-zt)
|
||||
rounded_polygon(outside_path, tangents);
|
||||
}
|
||||
|
||||
translate([lx, -r])
|
||||
|