mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-02-18 17:39:37 +00:00
Fix for issue #180. 3D stroke works again.
This commit is contained in:
parent
1da733fd32
commit
ef13137657
2 changed files with 107 additions and 104 deletions
209
shapes2d.scad
209
shapes2d.scad
|
@ -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);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
BOSL_VERSION = [2,0,334];
|
BOSL_VERSION = [2,0,335];
|
||||||
|
|
||||||
|
|
||||||
// Section: BOSL Library Version Functions
|
// Section: BOSL Library Version Functions
|
||||||
|
|
Loading…
Reference in a new issue