Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
42fccc1afb | ||
|
76aa613093 | ||
|
0e2778e13d | ||
|
50e23e5f81 | ||
|
59eeb2c5d4 | ||
|
7ea4dbe6cb | ||
|
0d062c24fa |
20
CHANGELOG.md
@@ -3,6 +3,26 @@
|
||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||
|
||||
|
||||
### [v19.20.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.20.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.9.1...v19.20.0 "diff with v19.9.1")
|
||||
* 2022-02-15 [`0e2778e`](https://github.com/nophead/NopSCADlib/commit/0e2778e13de2e68fc21a7b4c706aada27a17842c "show commit") [C.P.](# "Chris Palmer") Cables can now have a list of wire colours.
|
||||
Added a constructor for cables.
|
||||
|
||||
* 2022-02-15 [`50e23e5`](https://github.com/nophead/NopSCADlib/commit/50e23e5f818077e3661e25852dc959c34e6c8b4a "show commit") [C.P.](# "Chris Palmer") Added silkscreen text to PCBs.
|
||||
|
||||
#### [v19.9.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.9.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.9.0...v19.9.1 "diff with v19.9.0")
|
||||
* 2022-02-15 [`59eeb2c`](https://github.com/nophead/NopSCADlib/commit/59eeb2c5d4c7cf9da1f219c2b01fabcf450085f3 "show commit") [C.P.](# "Chris Palmer") Trimmed the ribbon clamp tape.
|
||||
|
||||
* 2022-02-15 [`7ea4dbe`](https://github.com/nophead/NopSCADlib/commit/7ea4dbe6cbbc23256d23f7aea87e8aac8d1000a9 "show commit") [C.P.](# "Chris Palmer") Fixed double application of `r2sides()` in `rounded_path()`.
|
||||
Added check for radius too big for corner in `rounded_path()`.
|
||||
Spiral paths can now have 0 twists.
|
||||
|
||||
### [v19.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v19.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v19.8.1...v19.9.0 "diff with v19.8.1")
|
||||
* 2022-02-11 [`95b6771`](https://github.com/nophead/NopSCADlib/commit/95b6771811fd48af46b5c2d426c42c04cd8e5af3 "show commit") [C.P.](# "Chris Palmer") Added printed cable clips.
|
||||
|
||||
* 2022-02-11 [`ed46cbb`](https://github.com/nophead/NopSCADlib/commit/ed46cbb1470587d4fa3ee4e0e8e0513c82693b1b "show commit") [C.P.](# "Chris Palmer") Fixed `cable_bundle()` bugs and added test.
|
||||
Added `cable_bundle_positions()`.
|
||||
Can now mark cables as ribbon to force a flat layout.
|
||||
|
||||
#### [v19.8.1](https://github.com/nophead/NopSCADlib/releases/tag/v19.8.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v19.8.0...v19.8.1 "diff with v19.8.0")
|
||||
* 2022-02-09 [`2a2b7d8`](https://github.com/nophead/NopSCADlib/commit/2a2b7d8bd60f0ea8ad2c428593e7aea1dfa06e9c "show commit") [C.P.](# "Chris Palmer") Added a second example project.
|
||||
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 982 KiB After Width: | Height: | Size: 982 KiB |
@@ -105,7 +105,7 @@ assembly(let(screw_d = screw_radius(screw) * 2)str("ribbon_clamp_", str_ways(way
|
||||
|
||||
module ribbon_clamp_fastened_assembly(ways, thickness, screw = screw) { //! Clamp with fasteners in place
|
||||
tape_l = floor(ribbon_clamp_slot(ways));
|
||||
tape_width = 25;
|
||||
tape_width = ribbon_clamp_width(screw) + 2;
|
||||
tape_thickness = 0.5;
|
||||
|
||||
vitamin(str(": Tape self amalgamating silicone ",tape_l," x 25mm"));
|
||||
|
@@ -4391,12 +4391,14 @@ 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_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_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 |
|
||||
| `wire_hole_radius(cable)` | Radius of a hole to accept a bundle of wires, rounded up to standard metric drill size |
|
||||
@@ -6128,6 +6130,10 @@ Annotation used in this documentation
|
||||
## Bezier
|
||||
Bezier curves and function to get and adjust the length or minimum z point.
|
||||
|
||||
`bezier_join()` joins two paths with a Bezier curve that starts tangential to the end of `path1` and ends tangential to the end of `path2`.
|
||||
To do this the outer control points are the path ends and the inner two control points are along the tangents to the path ends.
|
||||
The only degree of freedom is how far along those tangents, which are the `d` and optional `d2` parameters.
|
||||
|
||||
[utils/bezier.scad](utils/bezier.scad) Implementation.
|
||||
|
||||
[tests/bezier.scad](tests/bezier.scad) Code for this example.
|
||||
@@ -6138,6 +6144,7 @@ Bezier curves and function to get and adjust the length or minimum z point.
|
||||
| `adjust_bezier_length(v, l, eps = 0.001, r1 = 1.0, r2 = 1.5, l1, l2)` | Adjust Bezier control points `v` to get the required curve length `l` |
|
||||
| `adjust_bezier_z(v, z, eps = 0.001, r1 = 1, r2 = 1.5, z1, z2)` | Adjust Bezier control points `v` to get the required minimum `z` |
|
||||
| `bezier(t, v)` | Returns a point at distance `t` [0 - 1] along the curve with control points `v` |
|
||||
| `bezier_join(path1, path2, d, d2 = undef)` | Join two paths with a Bezier curve, control points are the path ends are `d` and `d2` from the ends in the same direction. |
|
||||
| `bezier_length(v, delta = 0.01, t = 0, length = 0)` | Calculate the length of a Bezier curve from control points `v` |
|
||||
| `bezier_min_z(v, steps = 100, z = inf, i = 0)` | Calculate the minimum z coordinate of a Bezier curve from control points `v` |
|
||||
| `bezier_path(v, steps = 100)` | Returns a Bezier path from control points `v` with `steps` segments |
|
||||
@@ -6428,6 +6435,7 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| `map(v, func)` | make a new vector where the func function argument is applied to each element of the vector v |
|
||||
| `mapi(v, func)` | make a new vector where the func function argument is applied to each element of the vector v. The func will get the index number as first argument, and the element as second argument. |
|
||||
| `nearly_zero(x)` | True if x is close to zero |
|
||||
| `path_length(path, i = 0, length = 0)` | Calculated the length along a path |
|
||||
| `quadratic_real_roots(a, b, c)` | Returns real roots of a quadratic equation, biggest first. Returns empty list if no real roots |
|
||||
| `radians(degrees)` | Convert radians to degrees |
|
||||
| `reduce(v, func, unity)` | reduce a vector v to a single entity by applying the func function recursively to the reduced value so far and the next element, starting with unity as the initial reduced value |
|
||||
@@ -6648,7 +6656,6 @@ Each vertex, apart from the first and the last, has an associated radius and the
|
||||
| `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 |
|
||||
| `rectangle_points(w, h)` | Generate the points of a rectangle |
|
||||
| `rounded_path(path)` | Convert a rounded_path, consisting of a start coordinate, vertex / radius pairs and then an end coordinate, to a path of points for sweep. |
|
||||
| `rounded_path_vertices(path)` | Show the unrounded version of a rounded_path for debug |
|
||||
|
@@ -89,6 +89,7 @@ test_pcb = ["test_pcb", "Test PCB",
|
||||
[ 8, 155, 180, "usb_B"],
|
||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 218, 0, "buzzer"],
|
||||
[ 38, 190, -90, "text", 25, 4, "Silkscreen", "Liberation Sans:style=Bold"],
|
||||
[ 8, 190, 180, "jack"],
|
||||
[ 6, 200, 180, "barrel_jack"],
|
||||
[ 5, 218, 180, "hdmi"],
|
||||
|
@@ -77,6 +77,17 @@ module beziers() {
|
||||
|
||||
translate(control_points[1] - [0, 0, 2])
|
||||
label(str("bezier_length = ", length, ", bezier_min_z = ", bezier_min_z(curve)), valign = "top");
|
||||
|
||||
path1 = [[20, 20, 0], [40, 20, 0]];
|
||||
path2 = [[70, 40, -5], [60, 40, 0]];
|
||||
|
||||
color("green")
|
||||
for(p = concat(path1, path2))
|
||||
translate(p)
|
||||
sphere(1);
|
||||
|
||||
color("orange")
|
||||
sweep(bezier_join(path1, path2, 10), circle_points(0.5, $fn = 64));
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 184 KiB |
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
@@ -19,8 +19,13 @@
|
||||
|
||||
//
|
||||
//! Bezier curves and function to get and adjust the length or minimum z point.
|
||||
//!
|
||||
//! `bezier_join()` joins two paths with a Bezier curve that starts tangential to the end of `path1` and ends tangential to the end of `path2`.
|
||||
//! To do this the outer control points are the path ends and the inner two control points are along the tangents to the path ends.
|
||||
//! The only degree of freedom is how far along those tangents, which are the `d` and optional `d2` parameters.
|
||||
//
|
||||
include <../global_defs.scad>
|
||||
include <maths.scad>
|
||||
|
||||
function bezier(t, v) = //! Returns a point at distance `t` [0 - 1] along the curve with control points `v`
|
||||
(len(v) > 2) ? bezier(t, [for (i = [0 : len(v) - 2]) v[i] * (1 - t) + v[i + 1] * (t)])
|
||||
@@ -55,3 +60,16 @@ function adjust_bezier_z(v, z, eps = 0.001, r1 = 1, r2 = 1.5, z1, z2) = //! Adju
|
||||
: let(r = r1 + (z - z1) * (r2 - r1) / (z2 - z1))
|
||||
abs(r - r1) < abs(r - r2) ? adjust_bezier_z(v, z, eps, r, r1, undef, z1)
|
||||
: adjust_bezier_z(v, z, eps, r, r2, undef, z2);
|
||||
|
||||
function bezier_join(path1, path2, d, d2 = undef) = let( //! Join two paths with a Bezier curve, control points are the path ends are `d` and `d2` from the ends in the same direction.
|
||||
d2 = is_undef(d2) ? d : d2,
|
||||
l = len(path1),
|
||||
p0 = path1[l - 1],
|
||||
p1 = p0 + unit(p0 - path1[l - 2]) * d,
|
||||
p3 = path2[0],
|
||||
p2 = p3 + unit(path2[0] - path2[1]) * d2,
|
||||
v = [p0, p1, p2, p3],
|
||||
segs = path_length(v) / $fs,
|
||||
path = [for(i = [1 : segs - 1], t = i / segs) bezier(t, v)],
|
||||
len = len(path)
|
||||
) concat(path1, path, path2);
|
||||
|
@@ -187,3 +187,7 @@ function cubic_real_roots(a, b, c, d) = //! Returns real roots of cubic equation
|
||||
) roots == 1 ? [x] :
|
||||
roots == 2 ? [3 * q /p + inflection, -3 * q / p / 2 + inflection] :
|
||||
[for(i = [0 : roots - 1]) 2 * sqrt(-p / 3) * cos(acos(3 * q * sqrt(-3 / p) / p / 2) - i * 120) + inflection];
|
||||
|
||||
function path_length(path, i = 0, length = 0) = //! Calculated the length along a path
|
||||
i >= len(path) - 1 ? length
|
||||
: path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
|
||||
|
@@ -177,10 +177,6 @@ module sweep(path, profile, loop = false, twist = 0, convexity = 1) { //! Draw a
|
||||
polyhedron(points = mesh[0], faces = mesh[1], convexity = convexity);
|
||||
}
|
||||
|
||||
function path_length(path, i = 0, length = 0) = //! Calculated the length along a path
|
||||
i >= len(path) - 1 ? length
|
||||
: path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
|
||||
|
||||
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))
|
||||
[for(i = [0 : sides - 1]) let(a = dir * i * 360 / sides) [r * cos(a), r * sin(a), z * i / sides]];
|
||||
@@ -215,12 +211,16 @@ function rounded_path(path) = //! Convert a rounded_path, consisting of a start
|
||||
p0 - p1, // Calculate vectors between vertices
|
||||
v2 = p2 - p1,
|
||||
a = angle_between(v1, -v2), // Angle turned through
|
||||
arc_start = p1 + unit(v1) * r * tan(a / 2), // Calc the start position
|
||||
d = r * tan(a / 2), // Distance from vertex to tangents
|
||||
room = min(norm(v1), norm(v2)), // Maximum distance
|
||||
arc_start = assert(d <= room,
|
||||
str("Can't fit radius ", r, " into corner at vertex path[", i, "] = ", p1, " only room for radius ", room / tan(a / 2)))
|
||||
p1 + unit(v1) * d, // Calc the start position
|
||||
z_axis = unit(cross(v1, v2)), // z_axis is perpendicular to both vectors
|
||||
centre = arc_start + unit(cross(z_axis, v1)) * r, // Arc center is a radius away, and perpendicular to v1 and the z_axis.
|
||||
x_axis = arc_start - centre, // Make the x_axis along the radius to the start point, includes radius a scale factor
|
||||
y_axis = cross(x_axis, z_axis), // y_axis perpendicular to the other two
|
||||
sides = r2sides(ceil(r2sides(r) * a / 360)) // Sides needed to make the arc
|
||||
sides = ceil(r2sides(r) * a / 360) // Sides needed to make the arc
|
||||
)
|
||||
for(j = [0 : sides], t = a * j / sides) // For each vertex in the arc
|
||||
cos(t) * x_axis + sin(t) * y_axis + centre, // Circular arc in the tiled xy plane.
|
||||
@@ -240,7 +240,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 = path_length(path) / twists / r2sides(2 * r),
|
||||
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)
|
||||
) [for(i = [0 : n - 1]) let(initial = [r, 0, 0, 1] * rotate(start_angle + i * 360 / n)) [for(t = transforms) initial * t]];
|
||||
|
@@ -1091,6 +1091,8 @@ module pcb_component(comp, cutouts = false, angle = undef) { //! Draw pcb compon
|
||||
if(show(comp, "smd_sot")) smd_sot(comp[4], comp[5]);
|
||||
if(show(comp, "vero_pin")) vero_pin(param(4, false));
|
||||
if(show(comp, "terminal")) terminal_block(comp[5], comp[4]);
|
||||
if(show(comp, "text")) color("white") linear_extrude(eps) resize([comp[4], comp[5]]) text(comp[6], font = param(7, "Liberation Mono"), valign = "center", halign = "center");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -153,7 +153,7 @@ module smd_sot(type, value) { //! Draw an SMD transistor
|
||||
ls = smd_sot_lead_size(type);
|
||||
|
||||
r = ls.z;
|
||||
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]]);
|
||||
gullwing = rounded_path([[0, 0, ls.z / 2], [0, ls.y - ls.z, ls.z / 2], r, [0, ls.y -ls.z + z1 - ls.z, z1 - ls.z / 2], r, [0, span / 2, z1 - ls.z / 2]], $fn = 32);
|
||||
|
||||
color(grey(20))
|
||||
hull()
|
||||
|
@@ -35,6 +35,8 @@ 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
|
||||
|
||||
// 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>.
|
||||
|