mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-15 17:09:40 +00:00
Compare commits
19 commits
5499750efe
...
a555e423f0
Author | SHA1 | Date | |
---|---|---|---|
|
a555e423f0 | ||
|
fdda08e071 | ||
|
7b56835903 | ||
|
38f9a9b40c | ||
|
d8214cc0e1 | ||
|
456fcd8d8a | ||
|
8a930d5495 | ||
|
eda0cd75b5 | ||
|
53af9121e7 | ||
|
736fad321b | ||
|
cc08eb3323 | ||
|
78ea8e4770 | ||
|
8383d360cc | ||
|
9145c0961f | ||
|
ebb98b47d2 | ||
|
8ea8ebf341 | ||
|
17e307fdb4 | ||
|
67f0004773 | ||
|
76d09271c1 |
3 changed files with 30 additions and 28 deletions
|
@ -2960,7 +2960,7 @@ module corner_profile(corners=CORNERS_ALL, except=[], r, d, convexity=10) {
|
||||||
// recolor("blue") cyl(d=5,h=5);
|
// recolor("blue") cyl(d=5,h=5);
|
||||||
|
|
||||||
module attachable(
|
module attachable(
|
||||||
anchor=CENTER, spin=0, orient,
|
anchor, spin, orient,
|
||||||
size, size2, shift,
|
size, size2, shift,
|
||||||
r,r1,r2, d,d1,d2, l,h,
|
r,r1,r2, d,d1,d2, l,h,
|
||||||
vnf, path, region,
|
vnf, path, region,
|
||||||
|
@ -2975,10 +2975,12 @@ module attachable(
|
||||||
) {
|
) {
|
||||||
dummy1 =
|
dummy1 =
|
||||||
assert($children==2, "attachable() expects exactly two children; the shape to manage, and the union of all attachment candidates.")
|
assert($children==2, "attachable() expects exactly two children; the shape to manage, and the union of all attachment candidates.")
|
||||||
assert(is_vector(anchor) || is_string(anchor), str("Invalid anchor: ",anchor))
|
assert(is_undef(anchor) || is_vector(anchor) || is_string(anchor), str("Invalid anchor: ",anchor))
|
||||||
assert(is_finite(spin), str("Invalid spin: ",spin))
|
assert(is_undef(spin) || is_finite(spin), str("Invalid spin: ",spin))
|
||||||
assert(is_undef(orient) || is_vector(orient,3), str("Invalid orient: ",orient));
|
assert(is_undef(orient) || is_vector(orient,3), str("Invalid orient: ",orient));
|
||||||
assert(in_list(axis,[UP,RIGHT,BACK]), "axis must be a positive coordinate direction, either UP, BACK or RIGHT");
|
assert(in_list(v_abs(axis),[UP,RIGHT,BACK]), "axis must be a coordinate direction");
|
||||||
|
anchor = default(anchor,CENTER);
|
||||||
|
spin = default(spin,0);
|
||||||
orient = is_def($anchor_override)? UP : default(orient, UP);
|
orient = is_def($anchor_override)? UP : default(orient, UP);
|
||||||
region = !is_undef(region)? region :
|
region = !is_undef(region)? region :
|
||||||
!is_undef(path)? [path] :
|
!is_undef(path)? [path] :
|
||||||
|
@ -3120,7 +3122,7 @@ module attachable(
|
||||||
// axis = The vector pointing along the axis of a geometry. Default: UP
|
// axis = The vector pointing along the axis of a geometry. Default: UP
|
||||||
// p = The VNF, path, or point to transform.
|
// p = The VNF, path, or point to transform.
|
||||||
function reorient(
|
function reorient(
|
||||||
anchor=CENTER, spin=0, orient=UP,
|
anchor, spin, orient,
|
||||||
size, size2, shift,
|
size, size2, shift,
|
||||||
r,r1,r2, d,d1,d2, l,h,
|
r,r1,r2, d,d1,d2, l,h,
|
||||||
vnf, path, region,
|
vnf, path, region,
|
||||||
|
@ -3133,10 +3135,13 @@ function reorient(
|
||||||
geom,
|
geom,
|
||||||
p=undef
|
p=undef
|
||||||
) =
|
) =
|
||||||
assert(is_vector(anchor) || is_string(anchor), str("Invalid anchor: ",anchor))
|
assert(is_undef(anchor) || is_vector(anchor) || is_string(anchor), str("Invalid anchor: ",anchor))
|
||||||
assert(is_finite(spin), str("Invalid spin: ",spin))
|
assert(is_undef(spin) || is_finite(spin), str("Invalid spin: ",spin))
|
||||||
assert(is_vector(orient,3), str("Invalid orient: ",orient))
|
assert(is_undef(orient) || is_vector(orient,3), str("Invalid orient: ",orient))
|
||||||
let(
|
let(
|
||||||
|
anchor = default(anchor, CENTER),
|
||||||
|
spin = default(spin, 0),
|
||||||
|
orient = default(orient, UP),
|
||||||
region = !is_undef(region)? region :
|
region = !is_undef(region)? region :
|
||||||
!is_undef(path)? [path] :
|
!is_undef(path)? [path] :
|
||||||
undef,
|
undef,
|
||||||
|
@ -3613,11 +3618,14 @@ function _attach_geom_edge_path(geom, edge) =
|
||||||
/// geom = The geometry description of the shape.
|
/// geom = The geometry description of the shape.
|
||||||
/// p = If given as a VNF, path, or point, applies the affine3d transformation matrix to it and returns the result.
|
/// p = If given as a VNF, path, or point, applies the affine3d transformation matrix to it and returns the result.
|
||||||
|
|
||||||
function _attach_transform(anchor=CENTER, spin=0, orient=UP, geom, p) =
|
function _attach_transform(anchor, spin, orient, geom, p) =
|
||||||
assert(is_vector(anchor) || is_string(anchor), str("Invalid anchor: ",anchor))
|
assert(is_undef(anchor) || is_vector(anchor) || is_string(anchor), str("Invalid anchor: ",anchor))
|
||||||
assert(is_finite(spin), str("Invalid spin: ",spin))
|
assert(is_undef(spin) || is_finite(spin), str("Invalid spin: ",spin))
|
||||||
assert(is_vector(orient,3), str("Invalid orient: ",orient))
|
assert(is_undef(orient) || is_vector(orient,3), str("Invalid orient: ",orient))
|
||||||
let(
|
let(
|
||||||
|
anchor=default(anchor,CENTER),
|
||||||
|
spin=default(spin,0),
|
||||||
|
orient=default(orient,UP),
|
||||||
two_d = _attach_geom_2d(geom),
|
two_d = _attach_geom_2d(geom),
|
||||||
m = ($attach_to != undef) ? // $attach_to is the attachment point on this object
|
m = ($attach_to != undef) ? // $attach_to is the attachment point on this object
|
||||||
( // which will attach to the parent
|
( // which will attach to the parent
|
||||||
|
|
|
@ -466,12 +466,15 @@ function bezpath_curve(bezpath, splinesteps=16, N=3, endpoint=true) =
|
||||||
assert(len(bezpath)%N == 1, str("A degree ",N," bezier path should have a multiple of ",N," points in it, plus 1."))
|
assert(len(bezpath)%N == 1, str("A degree ",N," bezier path should have a multiple of ",N," points in it, plus 1."))
|
||||||
let(
|
let(
|
||||||
segs = (len(bezpath)-1) / N,
|
segs = (len(bezpath)-1) / N,
|
||||||
step = 1 / splinesteps
|
step = 1 / splinesteps,
|
||||||
) [
|
path = [
|
||||||
for (seg = [0:1:segs-1])
|
for (seg = [0:1:segs-1])
|
||||||
each bezier_points(select(bezpath, seg*N, (seg+1)*N), [0:step:1-step/2]),
|
each bezier_points(select(bezpath, seg*N, (seg+1)*N), [0:step:1-step/2]),
|
||||||
if (endpoint) last(bezpath)
|
if (endpoint) last(bezpath)
|
||||||
];
|
],
|
||||||
|
is_closed = approx(path[0], last(path)),
|
||||||
|
out = path_merge_collinear(path, closed=is_closed)
|
||||||
|
) out;
|
||||||
|
|
||||||
|
|
||||||
// Function: bezpath_closest_point()
|
// Function: bezpath_closest_point()
|
||||||
|
|
|
@ -47,22 +47,13 @@ include <BOSL2/std.scad>
|
||||||
cube([50,40,20], anchor=TOP+FRONT+LEFT);
|
cube([50,40,20], anchor=TOP+FRONT+LEFT);
|
||||||
```
|
```
|
||||||
|
|
||||||
You can use `spin=` to rotate around the Z axis:
|
You can use `spin=` to rotate around the Z axis **after** anchoring:
|
||||||
|
|
||||||
```openscad-3D
|
```openscad-3D
|
||||||
include <BOSL2/std.scad>
|
include <BOSL2/std.scad>
|
||||||
cube([50,40,20], anchor=FRONT, spin=30);
|
cube([50,40,20], anchor=FRONT, spin=30);
|
||||||
```
|
```
|
||||||
|
|
||||||
3D objects also gain the ability to use an extra trick with `spin=`;
|
|
||||||
if you pass a list of `[X,Y,Z]` rotation angles to `spin=`, it will
|
|
||||||
rotate by the three given axis angles, similar to using `rotate()`:
|
|
||||||
|
|
||||||
```openscad-3D
|
|
||||||
include <BOSL2/std.scad>
|
|
||||||
cube([50,40,20], anchor=FRONT, spin=[15,0,30]);
|
|
||||||
```
|
|
||||||
|
|
||||||
3D objects also can be given an `orient=` argument as a vector, pointing
|
3D objects also can be given an `orient=` argument as a vector, pointing
|
||||||
to where the top of the shape should be rotated towards.
|
to where the top of the shape should be rotated towards.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue