mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-02-18 17:39:37 +00:00
Added "sideN" named anchors for Ngons.
This commit is contained in:
parent
33c8d80432
commit
ef7acd1c10
4 changed files with 42 additions and 17 deletions
|
@ -328,10 +328,8 @@ function attach_transform(anchor=CENTER, spin=0, orient=UP, geom, p) =
|
||||||
pos = anch[1]
|
pos = anch[1]
|
||||||
) two_d? (
|
) two_d? (
|
||||||
assert(two_d && is_num(spin))
|
assert(two_d && is_num(spin))
|
||||||
let(
|
affine3d_zrot(spin) *
|
||||||
ang = vector_angle(anch[2], BACK)
|
rot(to=FWD, from=point3d(anch[2])) *
|
||||||
)
|
|
||||||
affine3d_zrot(ang+spin) *
|
|
||||||
affine3d_translate(point3d(-pos))
|
affine3d_translate(point3d(-pos))
|
||||||
) : (
|
) : (
|
||||||
assert(is_num(spin) || is_vector(spin,3))
|
assert(is_num(spin) || is_vector(spin,3))
|
||||||
|
@ -633,7 +631,7 @@ function reorient(
|
||||||
anchors=[],
|
anchors=[],
|
||||||
two_d=false,
|
two_d=false,
|
||||||
p=undef
|
p=undef
|
||||||
) = let(
|
) = (anchor==CENTER && spin==0 && orient==UP && p!=undef)? p : let(
|
||||||
geom = attach_geom(
|
geom = attach_geom(
|
||||||
size=size, size2=size2, shift=shift,
|
size=size, size2=size2, shift=shift,
|
||||||
r=r, r1=r1, r2=r2, h=h,
|
r=r, r1=r1, r2=r2, h=h,
|
||||||
|
@ -641,7 +639,8 @@ function reorient(
|
||||||
vnf=vnf, path=path, extent=extent,
|
vnf=vnf, path=path, extent=extent,
|
||||||
offset=offset, anchors=anchors,
|
offset=offset, anchors=anchors,
|
||||||
two_d=two_d
|
two_d=two_d
|
||||||
)
|
),
|
||||||
|
$attach_to = undef
|
||||||
) attach_transform(anchor,spin,orient,geom,p);
|
) attach_transform(anchor,spin,orient,geom,p);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -878,6 +878,8 @@ function oval(r, d, realign=false, circum=false, anchor=CENTER, spin=0) =
|
||||||
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
||||||
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
||||||
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
||||||
|
// Extra Anchors:
|
||||||
|
// "side0", "side1", etc. = The center of each side has an anchor, pointing outwards.
|
||||||
// Example(2D): by Outer Size
|
// Example(2D): by Outer Size
|
||||||
// regular_ngon(n=5, or=30);
|
// regular_ngon(n=5, or=30);
|
||||||
// regular_ngon(n=5, od=60);
|
// regular_ngon(n=5, od=60);
|
||||||
|
@ -914,8 +916,17 @@ function regular_ngon(n=6, r, d, or, od, ir, id, side, rounding=0, realign=false
|
||||||
maxx_idx = max_index(subindex(path2,0)),
|
maxx_idx = max_index(subindex(path2,0)),
|
||||||
path3 = polygon_shift(path2,maxx_idx)
|
path3 = polygon_shift(path2,maxx_idx)
|
||||||
) path3
|
) path3
|
||||||
)
|
),
|
||||||
) reorient(anchor,spin, two_d=true, path=path, extent=false, p=path);
|
anchors = !is_string(anchor)? [] : [
|
||||||
|
for (i = [0:1:n-1]) let(
|
||||||
|
a1 = 360 - i*360/n - (realign? 180/n : 0),
|
||||||
|
a2 = a1 - 360/n,
|
||||||
|
p1 = polar_to_xy(r,a1),
|
||||||
|
p2 = polar_to_xy(r,a2),
|
||||||
|
pos = (p1+p2)/2
|
||||||
|
) anchorpt(str("side",i), pos, unit(pos), 0)
|
||||||
|
]
|
||||||
|
) reorient(anchor,spin, two_d=true, path=path, extent=false, p=path, anchors=anchors);
|
||||||
|
|
||||||
|
|
||||||
module regular_ngon(n=6, r, d, or, od, ir, id, side, rounding=0, realign=false, anchor=CENTER, spin=0) {
|
module regular_ngon(n=6, r, d, or, od, ir, id, side, rounding=0, realign=false, anchor=CENTER, spin=0) {
|
||||||
|
@ -923,7 +934,16 @@ module regular_ngon(n=6, r, d, or, od, ir, id, side, rounding=0, realign=false,
|
||||||
r = get_radius(r1=ir*sc, r2=or, r=r, d1=id*sc, d2=od, d=d, dflt=side/2/sin(180/n));
|
r = get_radius(r1=ir*sc, r2=or, r=r, d1=id*sc, d2=od, d=d, dflt=side/2/sin(180/n));
|
||||||
assert(!is_undef(r), "regular_ngon(): need to specify one of r, d, or, od, ir, id, side.");
|
assert(!is_undef(r), "regular_ngon(): need to specify one of r, d, or, od, ir, id, side.");
|
||||||
path = regular_ngon(n=n, r=r, rounding=rounding, realign=realign);
|
path = regular_ngon(n=n, r=r, rounding=rounding, realign=realign);
|
||||||
attachable(anchor,spin, two_d=true, path=path, extent=false) {
|
anchors = [
|
||||||
|
for (i = [0:1:n-1]) let(
|
||||||
|
a1 = 360 - i*360/n - (realign? 180/n : 0),
|
||||||
|
a2 = a1 - 360/n,
|
||||||
|
p1 = polar_to_xy(r,a1),
|
||||||
|
p2 = polar_to_xy(r,a2),
|
||||||
|
pos = (p1+p2)/2
|
||||||
|
) anchorpt(str("side",i), pos, unit(pos), 0)
|
||||||
|
];
|
||||||
|
attachable(anchor,spin, two_d=true, path=path, extent=false, anchors=anchors) {
|
||||||
polygon(path);
|
polygon(path);
|
||||||
children();
|
children();
|
||||||
}
|
}
|
||||||
|
@ -950,6 +970,8 @@ module regular_ngon(n=6, r, d, or, od, ir, id, side, rounding=0, realign=false,
|
||||||
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
||||||
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
||||||
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
||||||
|
// Extra Anchors:
|
||||||
|
// "side0" ... "side4" = The center of each side has an anchor, pointing outwards.
|
||||||
// Example(2D): by Outer Size
|
// Example(2D): by Outer Size
|
||||||
// pentagon(or=30);
|
// pentagon(or=30);
|
||||||
// pentagon(od=60);
|
// pentagon(od=60);
|
||||||
|
@ -990,6 +1012,8 @@ module pentagon(r, d, or, od, ir, id, side, rounding=0, realign=false, anchor=CE
|
||||||
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
||||||
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
||||||
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
||||||
|
// Extra Anchors:
|
||||||
|
// "side0" ... "side5" = The center of each side has an anchor, pointing outwards.
|
||||||
// Example(2D): by Outer Size
|
// Example(2D): by Outer Size
|
||||||
// hexagon(or=30);
|
// hexagon(or=30);
|
||||||
// hexagon(od=60);
|
// hexagon(od=60);
|
||||||
|
@ -1030,6 +1054,8 @@ module hexagon(r, d, or, od, ir, id, side, rounding=0, realign=false, anchor=CEN
|
||||||
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
// realign = If false, a tip is aligned with the Y+ axis. If true, the midpoint of a side is aligned with the Y+ axis. Default: false
|
||||||
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
||||||
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
||||||
|
// Extra Anchors:
|
||||||
|
// "side0" ... "side7" = The center of each side has an anchor, pointing outwards.
|
||||||
// Example(2D): by Outer Size
|
// Example(2D): by Outer Size
|
||||||
// octagon(or=30);
|
// octagon(or=30);
|
||||||
// octagon(od=60);
|
// octagon(od=60);
|
||||||
|
|
|
@ -103,13 +103,13 @@ constants defined:
|
||||||
|
|
||||||
Constant | Direction | Value
|
Constant | Direction | Value
|
||||||
-------- | --------- | -----------
|
-------- | --------- | -----------
|
||||||
`LEFT` | X- | `[-1,0,0]`
|
`LEFT` | X- | `[-1, 0, 0]`
|
||||||
`RIGHT` | X+ | `[1,0,0]`
|
`RIGHT` | X+ | `[ 1, 0, 0]`
|
||||||
`FRONT`/`FORWARD`/`FWD` | Y- | `[0,-1,0]`
|
`FRONT`/`FORWARD`/`FWD` | Y- | `[ 0,-1, 0]`
|
||||||
`BACK` | Y+ | `[0,1,0]`
|
`BACK` | Y+ | `[ 0, 1, 0]`
|
||||||
`BOTTOM`/`BOT`/`BTM`/`DOWN` | Z- | `[0,0,-1]` (3D only.)
|
`BOTTOM`/`BOT`/`BTM`/`DOWN` | Z- | `[ 0, 0,-1]` (3D only.)
|
||||||
`TOP`/`UP` | Z+ | `[0,0,1]` (3D only.)
|
`TOP`/`UP` | Z+ | `[ 0, 0, 1]` (3D only.)
|
||||||
`CENTER`/`CTR` | Centered | `[0,0,0]`
|
`CENTER`/`CTR` | Centered | `[ 0, 0, 0]`
|
||||||
|
|
||||||
Note that even though these are 3D vectors, you can use most of them,
|
Note that even though these are 3D vectors, you can use most of them,
|
||||||
(except `UP`/`DOWN`, of course) for anchors in 2D shapes:
|
(except `UP`/`DOWN`, of course) for anchors in 2D shapes:
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
BOSL_VERSION = [2,0,294];
|
BOSL_VERSION = [2,0,295];
|
||||||
|
|
||||||
|
|
||||||
// Section: BOSL Library Version Functions
|
// Section: BOSL Library Version Functions
|
||||||
|
|
Loading…
Reference in a new issue