Fixed attachable() anchors for vnf's with extent=false.

This commit is contained in:
Garth Minette 2020-08-16 23:10:43 -07:00
parent c465a5b746
commit 25841bda73
2 changed files with 14 additions and 23 deletions

View file

@ -458,10 +458,9 @@ function find_anchor(anchor, geom) =
eps = 1/2048,
points = vnf[0],
faces = vnf[1],
rpts = rot(from=anchor, to=RIGHT, p=move(point3d(-cp), p=points)),
rpts = apply(rot(from=anchor, to=RIGHT) * move(point3d(-cp)), points),
hits = [
for (i = idx(faces)) let(
face = faces[i],
for (face = faces) let(
verts = select(rpts, face)
) if (
max(subindex(verts,0)) >= -eps &&
@ -470,35 +469,27 @@ function find_anchor(anchor, geom) =
min(subindex(verts,1)) <= eps &&
min(subindex(verts,2)) <= eps
) let(
pt = polygon_line_intersection(
select(points, face),
[CENTER,anchor], eps=eps
)
) if (!is_undef(pt)) [norm(pt), i, pt]
poly = select(points, face),
pt = polygon_line_intersection(poly, [cp,cp+anchor], bounded=[true,false], eps=eps)
) if (!is_undef(pt)) let(
plane = plane_from_polygon(poly),
n = plane_normal(plane)
)
[norm(pt-cp), n, pt]
]
)
assert(len(hits)>0, "Anchor vector does not intersect with the shape. Attachment failed.")
let(
furthest = max_index(subindex(hits,0)),
pos = point3d(cp) + hits[furthest][2],
dist = hits[furthest][0],
nfaces = [for (hit = hits) if(approx(hit[0],dist,eps=eps)) hit[1]],
n = unit(
sum([
for (i = nfaces) let(
faceverts = select(points, faces[i]),
faceplane = plane_from_points(faceverts),
nrm = plane_normal(faceplane)
) nrm
]) / len(nfaces),
UP
)
pos = hits[furthest][2],
n = unit(sum([for (hit = hits) if (approx(hit[0],dist,eps=eps)) hit[1]]))
)
[anchor, pos, n, oang]
) : type == "vnf_extent"? ( //vnf
let(
vnf=geom[1],
rpts = rot(from=anchor, to=RIGHT, p=move(point3d(-cp), p=vnf[0])),
rpts = apply(rot(from=anchor, to=RIGHT) * move(point3d(-cp)), vnf[0]),
maxx = max(subindex(rpts,0)),
idxs = [for (i = idx(rpts)) if (approx(rpts[i].x, maxx)) i],
mm = pointlist_bounds(select(rpts,idxs)),
@ -849,7 +840,7 @@ module attachable(
// Module: position()
// Usage:
// position(from, [overlap]) ...
// position(from) ...
// Description:
// Attaches children to a parent object at an anchor point.
// Arguments:

View file

@ -8,7 +8,7 @@
//////////////////////////////////////////////////////////////////////
BOSL_VERSION = [2,0,403];
BOSL_VERSION = [2,0,404];
// Section: BOSL Library Version Functions