Fix for issue . 3D stroke works again.

This commit is contained in:
Revar Desmera 2020-06-14 18:32:59 -07:00
parent 1da733fd32
commit ef13137657
2 changed files with 107 additions and 104 deletions

View file

@ -173,7 +173,7 @@ module stroke(
} else { } else {
translate(path[0]) sphere(d=width[0]); translate(path[0]) sphere(d=width[0]);
} }
} else if (len(path[0]) == 2) { } else {
spos = path_pos_from_start(path,trim1,closed=false); spos = path_pos_from_start(path,trim1,closed=false);
epos = path_pos_from_end(path,trim2,closed=false); epos = path_pos_from_end(path,trim2,closed=false);
path2 = path_subselect(path, spos[0], spos[1], epos[0], epos[1]); path2 = path_subselect(path, spos[0], spos[1], epos[0], epos[1]);
@ -185,22 +185,32 @@ module stroke(
start_vec = select(path,0) - select(path,1); start_vec = select(path,0) - select(path,1);
end_vec = select(path,-1) - select(path,-2); end_vec = select(path,-1) - select(path,-2);
// Straight segments
for (i = idx(path2,end=-2)) { if (len(path[0]) == 2) {
seg = select(path2,i,i+1); // Straight segments
delt = seg[1] - seg[0]; for (i = idx(path2,end=-2)) {
translate(seg[0]) { seg = select(path2,i,i+1);
rot(from=BACK,to=delt) { delt = seg[1] - seg[0];
trapezoid(w1=widths[i], w2=widths[i+1], h=norm(delt), anchor=FRONT); translate(seg[0]) {
rot(from=BACK,to=delt) {
trapezoid(w1=widths[i], w2=widths[i+1], h=norm(delt), anchor=FRONT);
}
} }
} }
}
// Joints // Joints
for (i = [1:1:len(path2)-2]) { for (i = [1:1:len(path2)-2]) {
$fn = quantup(segs(widths[i]/2),4); $fn = quantup(segs(widths[i]/2),4);
if (hull) { if (hull) {
hull() { hull() {
translate(path2[i]) {
rot(from=BACK, to=path2[i]-path2[i-1])
circle(d=widths[i]);
rot(from=BACK, to=path2[i+1]-path2[i])
circle(d=widths[i]);
}
}
} else {
translate(path2[i]) { translate(path2[i]) {
rot(from=BACK, to=path2[i]-path2[i-1]) rot(from=BACK, to=path2[i]-path2[i-1])
circle(d=widths[i]); circle(d=widths[i]);
@ -208,64 +218,64 @@ module stroke(
circle(d=widths[i]); circle(d=widths[i]);
} }
} }
} else { }
// Endcap1
translate(path[0]) {
start_vec = select(path,0) - select(path,1);
rot(from=BACK, to=start_vec) {
polygon(endcap_shape1);
}
}
// Endcap2
translate(select(path,-1)) {
rot(from=BACK, to=end_vec) {
polygon(endcap_shape2);
}
}
} else {
quatsums = Q_Cumulative([
for (i = idx(path2,end=-2)) let(
vec1 = i==0? UP : unit(path2[i]-path2[i-1]),
vec2 = unit(path2[i+1]-path2[i]),
axis = vector_axis(vec1,vec2),
ang = vector_angle(vec1,vec2)
) Quat(axis,ang)
]);
rotmats = [for (q=quatsums) Q_Matrix4(q)];
sides = [
for (i = idx(path2,end=-2))
quantup(segs(max(widths[i],widths[i+1])/2),4)
];
// Straight segments
for (i = idx(path2,end=-2)) {
dist = norm(path2[i+1] - path2[i]);
w1 = widths[i]/2;
w2 = widths[i+1]/2;
$fn = sides[i];
translate(path2[i]) { translate(path2[i]) {
rot(from=BACK, to=path2[i]-path2[i-1]) multmatrix(rotmats[i]) {
circle(d=widths[i]); cylinder(r1=w1, r2=w2, h=dist, center=false);
rot(from=BACK, to=path2[i+1]-path2[i]) }
circle(d=widths[i]);
} }
} }
}
// Endcap1 // Joints
translate(path[0]) { for (i = [1:1:len(path2)-2]) {
start_vec = select(path,0) - select(path,1); $fn = sides[i];
rot(from=BACK, to=start_vec) { translate(path2[i]) {
polygon(endcap_shape1); if (hull) {
} hull(){
} multmatrix(rotmats[i]) {
sphere(d=widths[i]);
// Endcap2 }
translate(select(path,-1)) { multmatrix(rotmats[i-1]) {
rot(from=BACK, to=end_vec) { sphere(d=widths[i]);
polygon(endcap_shape2); }
} }
} } else {
} else {
quatsums = Q_Cumulative([
for (i = idx(path2,end=-2)) let(
vec1 = i==0? UP : unit(path2[i]-path2[i-1]),
vec2 = unit(path2[i+1]-path2[i]),
axis = vector_axis(vec1,vec2),
ang = vector_angle(vec1,vec2)
) Quat(axis,ang)
]);
rotmats = [for (q=quatsums) Q_Matrix4(q)];
sides = [
for (i = idx(path2,end=-2))
quantup(segs(max(widths[i],widths[i+1])/2),4)
];
// Straight segments
for (i = idx(path2,end=-2)) {
dist = norm(path2[i+1] - path2[i]);
w1 = widths[i]/2;
w2 = widths[i+1]/2;
$fn = sides[i];
translate(path2[i]) {
multmatrix(rotmats[i]) {
cylinder(r1=w1, r2=w2, h=dist, center=false);
}
}
}
// Joints
for (i = [1:1:len(path2)-2]) {
$fn = sides[i];
translate(path2[i]) {
if (hull) {
hull(){
multmatrix(rotmats[i]) { multmatrix(rotmats[i]) {
sphere(d=widths[i]); sphere(d=widths[i]);
} }
@ -273,51 +283,44 @@ module stroke(
sphere(d=widths[i]); sphere(d=widths[i]);
} }
} }
} else {
multmatrix(rotmats[i]) {
sphere(d=widths[i]);
}
multmatrix(rotmats[i-1]) {
sphere(d=widths[i]);
}
} }
} }
}
// Endcap1 // Endcap1
translate(path[0]) { translate(path[0]) {
multmatrix(rotmats[0]) { multmatrix(rotmats[0]) {
$fn = sides[0]; $fn = sides[0];
if (is_undef(endcap_angle1)) { if (is_undef(endcap_angle1)) {
rotate_extrude(convexity=convexity) { rotate_extrude(convexity=convexity) {
right_half(planar=true) { right_half(planar=true) {
polygon(endcap_shape1); polygon(endcap_shape1);
}
} }
} } else {
} else { rotate([90,0,endcap_angle1]) {
rotate([90,0,endcap_angle1]) { linear_extrude(height=widths[0], center=true, convexity=convexity) {
linear_extrude(height=widths[0], center=true, convexity=convexity) { polygon(endcap_shape1);
polygon(endcap_shape1); }
} }
} }
} }
} }
}
// Endcap2 // Endcap2
translate(select(path,-1)) { translate(select(path,-1)) {
multmatrix(select(rotmats,-1)) { multmatrix(select(rotmats,-1)) {
$fn = select(sides,-1); $fn = select(sides,-1);
if (is_undef(endcap_angle2)) { if (is_undef(endcap_angle2)) {
rotate_extrude(convexity=convexity) { rotate_extrude(convexity=convexity) {
right_half(planar=true) { right_half(planar=true) {
polygon(endcap_shape2); polygon(endcap_shape2);
}
} }
} } else {
} else { rotate([90,0,endcap_angle2]) {
rotate([90,0,endcap_angle2]) { linear_extrude(height=select(widths,-1), center=true, convexity=convexity) {
linear_extrude(height=select(widths,-1), center=true, convexity=convexity) { polygon(endcap_shape2);
polygon(endcap_shape2); }
} }
} }
} }

View file

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