mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-07 12:49:46 +00:00
Merge pull request #673 from revarbat/revarbat_dev
Added dots args to stroke().
This commit is contained in:
commit
7895cd14b2
1 changed files with 59 additions and 47 deletions
106
drawing.scad
106
drawing.scad
|
@ -44,34 +44,40 @@
|
||||||
// path = The path to draw along.
|
// path = The path to draw along.
|
||||||
// width = The width of the line to draw. If given as a list of widths, (one for each path point), draws the line with varying thickness to each point.
|
// width = The width of the line to draw. If given as a list of widths, (one for each path point), draws the line with varying thickness to each point.
|
||||||
// closed = If true, draw an additional line from the end of the path to the start.
|
// closed = If true, draw an additional line from the end of the path to the start.
|
||||||
// joints = Specifies the joint shape for each joint of the line. If a 2D path is given, use that to draw custom joints.
|
// joints = Specifies the joint shape for each joint of the line. If a 2D polygon is given, use that to draw custom joints.
|
||||||
// endcaps = Specifies the endcap type for both ends of the line. If a 2D path is given, use that to draw custom endcaps.
|
// endcaps = Specifies the endcap type for both ends of the line. If a 2D polygon is given, use that to draw custom endcaps.
|
||||||
// endcap1 = Specifies the endcap type for the start of the line. If a 2D path is given, use that to draw a custom endcap.
|
// endcap1 = Specifies the endcap type for the start of the line. If a 2D polygon is given, use that to draw a custom endcap.
|
||||||
// endcap2 = Specifies the endcap type for the end of the line. If a 2D path is given, use that to draw a custom endcap.
|
// endcap2 = Specifies the endcap type for the end of the line. If a 2D polygon is given, use that to draw a custom endcap.
|
||||||
|
// dots = Specifies both the endcap and joint types with one argument. If given `true`, sets both to "dot". If a 2D polygon is given, uses that to draw custom dots.
|
||||||
// joint_width = Some joint shapes are wider than the line. This specifies the width of the shape, in multiples of the line width.
|
// joint_width = Some joint shapes are wider than the line. This specifies the width of the shape, in multiples of the line width.
|
||||||
// endcap_width = Some endcap types are wider than the line. This specifies the size of endcaps, in multiples of the line width.
|
// endcap_width = Some endcap types are wider than the line. This specifies the size of endcaps, in multiples of the line width.
|
||||||
// endcap_width1 = This specifies the size of starting endcap, in multiples of the line width.
|
// endcap_width1 = This specifies the size of starting endcap, in multiples of the line width.
|
||||||
// endcap_width2 = This specifies the size of ending endcap, in multiples of the line width.
|
// endcap_width2 = This specifies the size of ending endcap, in multiples of the line width.
|
||||||
|
// dots_width = This specifies the size of the joints and endcaps, in multiples of the line width.
|
||||||
// joint_length = Length of joint shape, in multiples of the line width.
|
// joint_length = Length of joint shape, in multiples of the line width.
|
||||||
// endcap_length = Length of endcaps, in multiples of the line width.
|
// endcap_length = Length of endcaps, in multiples of the line width.
|
||||||
// endcap_length1 = Length of starting endcap, in multiples of the line width.
|
// endcap_length1 = Length of starting endcap, in multiples of the line width.
|
||||||
// endcap_length2 = Length of ending endcap, in multiples of the line width.
|
// endcap_length2 = Length of ending endcap, in multiples of the line width.
|
||||||
|
// dots_length = Length of both joints and endcaps, in multiples of the line width.
|
||||||
// joint_extent = Extents length of joint shape, in multiples of the line width.
|
// joint_extent = Extents length of joint shape, in multiples of the line width.
|
||||||
// endcap_extent = Extents length of endcaps, in multiples of the line width.
|
// endcap_extent = Extents length of endcaps, in multiples of the line width.
|
||||||
// endcap_extent1 = Extents length of starting endcap, in multiples of the line width.
|
// endcap_extent1 = Extents length of starting endcap, in multiples of the line width.
|
||||||
// endcap_extent2 = Extents length of ending endcap, in multiples of the line width.
|
// endcap_extent2 = Extents length of ending endcap, in multiples of the line width.
|
||||||
// joint_angle = Extra rotation given to joint shapes, in degrees. If not given, the shapes are fully spun.
|
// dots_extent = Extents length of both joints and endcaps, in multiples of the line width.
|
||||||
// endcap_angle = Extra rotation given to endcaps, in degrees. If not given, the endcaps are fully spun.
|
// joint_angle = Extra rotation given to joint shapes, in degrees. If not given, the shapes are fully spun (for 3D lines).
|
||||||
// endcap_angle1 = Extra rotation given to a starting endcap, in degrees. If not given, the endcap is fully spun.
|
// endcap_angle = Extra rotation given to endcaps, in degrees. If not given, the endcaps are fully spun (for 3D lines).
|
||||||
// endcap_angle2 = Extra rotation given to a ending endcap, in degrees. If not given, the endcap is fully spun.
|
// endcap_angle1 = Extra rotation given to a starting endcap, in degrees. If not given, the endcap is fully spun (for 3D lines).
|
||||||
|
// endcap_angle2 = Extra rotation given to a ending endcap, in degrees. If not given, the endcap is fully spun (for 3D lines).
|
||||||
|
// dots_angle = Extra rotation given to both joints and endcaps, in degrees. If not given, the endcap is fully spun (for 3D lines).
|
||||||
// trim = Trim the the start and end line segments by this much, to keep them from interfering with custom endcaps.
|
// trim = Trim the the start and end line segments by this much, to keep them from interfering with custom endcaps.
|
||||||
// trim1 = Trim the the starting line segment by this much, to keep it from interfering with a custom endcap.
|
// trim1 = Trim the the starting line segment by this much, to keep it from interfering with a custom endcap.
|
||||||
// trim2 = Trim the the ending line segment by this much, to keep it from interfering with a custom endcap.
|
// trim2 = Trim the the ending line segment by this much, to keep it from interfering with a custom endcap.
|
||||||
// color = If given, sets the color of the line segments, joints and endcap.
|
// color = If given, sets the color of the line segments, joints and endcap.
|
||||||
// endcap_color = If given, sets the color of both endcaps. Overrides `color=`.
|
// endcap_color = If given, sets the color of both endcaps. Overrides `color=` and `dots_color=`.
|
||||||
// endcap_color1 = If give, sets the color of the starting endcap. Overrides `color=` and `endcap_color=`.
|
// endcap_color1 = If give, sets the color of the starting endcap. Overrides `color=`, `dots_color=`, and `endcap_color=`.
|
||||||
// endcap_color2 = If given, sets the color of the ending endcap. Overrides `color=` and `endcap_color=`.
|
// endcap_color2 = If given, sets the color of the ending endcap. Overrides `color=`, `dots_color=`, and `endcap_color=`.
|
||||||
// joint_color = If given, sets the color of the joints. Overrides `color=`.
|
// joint_color = If given, sets the color of the joints. Overrides `color=` and `dots_color=`.
|
||||||
|
// dots_color = If given, sets the color of the endcaps and joints. Overrides `color=`.
|
||||||
// convexity = Max number of times a line could intersect a wall of an endcap.
|
// convexity = Max number of times a line could intersect a wall of an endcap.
|
||||||
// hull = If true, use `hull()` to make higher quality joints between segments, at the cost of being much slower. Default: true
|
// hull = If true, use `hull()` to make higher quality joints between segments, at the cost of being much slower. Default: true
|
||||||
// Example(2D): Drawing a Path
|
// Example(2D): Drawing a Path
|
||||||
|
@ -122,24 +128,28 @@
|
||||||
// color="lightgreen", joint_color="red", endcap_color="blue",
|
// color="lightgreen", joint_color="red", endcap_color="blue",
|
||||||
// joint_width=2.0, endcap_width2=3, $fn=18
|
// joint_width=2.0, endcap_width2=3, $fn=18
|
||||||
// );
|
// );
|
||||||
|
// Example: Simplified Plotting
|
||||||
|
// path = [for (i=[0:15:360]) [(i-180)/3,20*cos(2*i)]];
|
||||||
|
// stroke(path, width=2, dots=true, color="lightgreen", dots_color="red", $fn=18);
|
||||||
function stroke(
|
function stroke(
|
||||||
path, width=1, closed=false,
|
path, width=1, closed=false,
|
||||||
endcaps, endcap1, endcap2, joints,
|
endcaps, endcap1, endcap2, joints, dots,
|
||||||
endcap_width, endcap_width1, endcap_width2, joint_width,
|
endcap_width, endcap_width1, endcap_width2, joint_width, dots_width,
|
||||||
endcap_length, endcap_length1, endcap_length2, joint_length,
|
endcap_length, endcap_length1, endcap_length2, joint_length, dots_length,
|
||||||
endcap_extent, endcap_extent1, endcap_extent2, joint_extent,
|
endcap_extent, endcap_extent1, endcap_extent2, joint_extent, dots_extent,
|
||||||
endcap_angle, endcap_angle1, endcap_angle2, joint_angle,
|
endcap_angle, endcap_angle1, endcap_angle2, joint_angle, dots_angle,
|
||||||
trim, trim1, trim2, color,
|
endcap_color, endcap_color1, endcap_color2, joint_color, dots_color, color,
|
||||||
|
trim, trim1, trim2,
|
||||||
convexity=10, hull=true
|
convexity=10, hull=true
|
||||||
) = no_function("stroke");
|
) = no_function("stroke");
|
||||||
module stroke(
|
module stroke(
|
||||||
path, width=1, closed=false,
|
path, width=1, closed=false,
|
||||||
endcaps, endcap1, endcap2, joints,
|
endcaps, endcap1, endcap2, joints, dots,
|
||||||
endcap_width, endcap_width1, endcap_width2, joint_width,
|
endcap_width, endcap_width1, endcap_width2, joint_width, dots_width,
|
||||||
endcap_length, endcap_length1, endcap_length2, joint_length,
|
endcap_length, endcap_length1, endcap_length2, joint_length, dots_length,
|
||||||
endcap_extent, endcap_extent1, endcap_extent2, joint_extent,
|
endcap_extent, endcap_extent1, endcap_extent2, joint_extent, dots_extent,
|
||||||
endcap_angle, endcap_angle1, endcap_angle2, joint_angle,
|
endcap_angle, endcap_angle1, endcap_angle2, joint_angle, dots_angle,
|
||||||
color, endcap_color, endcap_color1, endcap_color2, joint_color,
|
endcap_color, endcap_color1, endcap_color2, joint_color, dots_color, color,
|
||||||
trim, trim1, trim2,
|
trim, trim1, trim2,
|
||||||
convexity=10, hull=true
|
convexity=10, hull=true
|
||||||
) {
|
) {
|
||||||
|
@ -158,12 +168,12 @@ module stroke(
|
||||||
cap=="round"? [1.00, 1.00, 0.00] :
|
cap=="round"? [1.00, 1.00, 0.00] :
|
||||||
cap=="chisel"? [1.00, 1.00, 0.00] :
|
cap=="chisel"? [1.00, 1.00, 0.00] :
|
||||||
cap=="square"? [1.00, 1.00, 0.00] :
|
cap=="square"? [1.00, 1.00, 0.00] :
|
||||||
cap=="block"? [3.00, 1.00, 0.00] :
|
cap=="block"? [2.00, 1.00, 0.00] :
|
||||||
cap=="diamond"? [3.50, 1.00, 0.00] :
|
cap=="diamond"? [2.50, 1.00, 0.00] :
|
||||||
cap=="dot"? [3.00, 1.00, 0.00] :
|
cap=="dot"? [2.00, 1.00, 0.00] :
|
||||||
cap=="x"? [3.50, 0.40, 0.00] :
|
cap=="x"? [2.50, 0.40, 0.00] :
|
||||||
cap=="cross"? [4.50, 0.22, 0.00] :
|
cap=="cross"? [3.00, 0.33, 0.00] :
|
||||||
cap=="line"? [4.50, 0.22, 0.00] :
|
cap=="line"? [3.50, 0.22, 0.00] :
|
||||||
cap=="arrow"? [3.50, 0.40, 0.50] :
|
cap=="arrow"? [3.50, 0.40, 0.50] :
|
||||||
cap=="arrow2"? [3.50, 1.00, 0.14] :
|
cap=="arrow2"? [3.50, 1.00, 0.14] :
|
||||||
cap=="tail"? [3.50, 0.47, 0.50] :
|
cap=="tail"? [3.50, 0.47, 0.50] :
|
||||||
|
@ -201,9 +211,11 @@ module stroke(
|
||||||
width = is_num(width)? [for (x=path) width] : width;
|
width = is_num(width)? [for (x=path) width] : width;
|
||||||
assert(all([for (w=width) w>0]));
|
assert(all([for (w=width) w>0]));
|
||||||
|
|
||||||
endcap1 = first_defined([endcap1, endcaps, "round"]);
|
dots = dots==true? "dot" : dots;
|
||||||
endcap2 = first_defined([endcap2, endcaps, "round"]);
|
|
||||||
joints = first_defined([joints, "round"]);
|
endcap1 = first_defined([endcap1, endcaps, dots, "round"]);
|
||||||
|
endcap2 = first_defined([endcap2, endcaps, if (!closed) dots, "round"]);
|
||||||
|
joints = first_defined([joints, dots, "round"]);
|
||||||
assert(is_bool(endcap1) || is_string(endcap1) || is_path(endcap1));
|
assert(is_bool(endcap1) || is_string(endcap1) || is_path(endcap1));
|
||||||
assert(is_bool(endcap2) || is_string(endcap2) || is_path(endcap2));
|
assert(is_bool(endcap2) || is_string(endcap2) || is_path(endcap2));
|
||||||
assert(is_bool(joints) || is_string(joints) || is_path(joints));
|
assert(is_bool(joints) || is_string(joints) || is_path(joints));
|
||||||
|
@ -212,29 +224,29 @@ module stroke(
|
||||||
endcap2_dflts = _shape_defaults(endcap2);
|
endcap2_dflts = _shape_defaults(endcap2);
|
||||||
joint_dflts = _shape_defaults(joints);
|
joint_dflts = _shape_defaults(joints);
|
||||||
|
|
||||||
endcap_width1 = first_defined([endcap_width1, endcap_width, endcap1_dflts[0]]);
|
endcap_width1 = first_defined([endcap_width1, endcap_width, dots_width, endcap1_dflts[0]]);
|
||||||
endcap_width2 = first_defined([endcap_width2, endcap_width, endcap2_dflts[0]]);
|
endcap_width2 = first_defined([endcap_width2, endcap_width, dots_width, endcap2_dflts[0]]);
|
||||||
joint_width = first_defined([joint_width, joint_dflts[0]]);
|
joint_width = first_defined([joint_width, dots_width, joint_dflts[0]]);
|
||||||
assert(is_num(endcap_width1));
|
assert(is_num(endcap_width1));
|
||||||
assert(is_num(endcap_width2));
|
assert(is_num(endcap_width2));
|
||||||
assert(is_num(joint_width));
|
assert(is_num(joint_width));
|
||||||
|
|
||||||
endcap_length1 = first_defined([endcap_length1, endcap_length, endcap1_dflts[1]*endcap_width1]);
|
endcap_length1 = first_defined([endcap_length1, endcap_length, dots_length, endcap1_dflts[1]*endcap_width1]);
|
||||||
endcap_length2 = first_defined([endcap_length2, endcap_length, endcap2_dflts[1]*endcap_width2]);
|
endcap_length2 = first_defined([endcap_length2, endcap_length, dots_length, endcap2_dflts[1]*endcap_width2]);
|
||||||
joint_length = first_defined([joint_length, joint_dflts[1]*joint_width]);
|
joint_length = first_defined([joint_length, dots_length, joint_dflts[1]*joint_width]);
|
||||||
assert(is_num(endcap_length1));
|
assert(is_num(endcap_length1));
|
||||||
assert(is_num(endcap_length2));
|
assert(is_num(endcap_length2));
|
||||||
assert(is_num(joint_length));
|
assert(is_num(joint_length));
|
||||||
|
|
||||||
endcap_extent1 = first_defined([endcap_extent1, endcap_extent, endcap1_dflts[2]*endcap_width1]);
|
endcap_extent1 = first_defined([endcap_extent1, endcap_extent, dots_extent, endcap1_dflts[2]*endcap_width1]);
|
||||||
endcap_extent2 = first_defined([endcap_extent2, endcap_extent, endcap2_dflts[2]*endcap_width2]);
|
endcap_extent2 = first_defined([endcap_extent2, endcap_extent, dots_extent, endcap2_dflts[2]*endcap_width2]);
|
||||||
joint_extent = first_defined([joint_extent, joint_dflts[2]*joint_width]);
|
joint_extent = first_defined([joint_extent, dots_extent, joint_dflts[2]*joint_width]);
|
||||||
assert(is_num(endcap_extent1));
|
assert(is_num(endcap_extent1));
|
||||||
assert(is_num(endcap_extent2));
|
assert(is_num(endcap_extent2));
|
||||||
assert(is_num(joint_extent));
|
assert(is_num(joint_extent));
|
||||||
|
|
||||||
endcap_angle1 = first_defined([endcap_angle1, endcap_angle]);
|
endcap_angle1 = first_defined([endcap_angle1, endcap_angle, dots_angle]);
|
||||||
endcap_angle2 = first_defined([endcap_angle2, endcap_angle]);
|
endcap_angle2 = first_defined([endcap_angle2, endcap_angle, dots_angle]);
|
||||||
assert(is_undef(endcap_angle1)||is_num(endcap_angle1));
|
assert(is_undef(endcap_angle1)||is_num(endcap_angle1));
|
||||||
assert(is_undef(endcap_angle2)||is_num(endcap_angle2));
|
assert(is_undef(endcap_angle2)||is_num(endcap_angle2));
|
||||||
assert(is_undef(joint_angle)||is_num(joint_angle));
|
assert(is_undef(joint_angle)||is_num(joint_angle));
|
||||||
|
@ -242,9 +254,9 @@ module stroke(
|
||||||
endcap_shape1 = _shape_path(endcap1, width[0], endcap_width1, endcap_length1, endcap_extent1);
|
endcap_shape1 = _shape_path(endcap1, width[0], endcap_width1, endcap_length1, endcap_extent1);
|
||||||
endcap_shape2 = _shape_path(endcap2, last(width), endcap_width2, endcap_length2, endcap_extent2);
|
endcap_shape2 = _shape_path(endcap2, last(width), endcap_width2, endcap_length2, endcap_extent2);
|
||||||
|
|
||||||
endcap_color1 = first_defined([endcap_color1, endcap_color, color]);
|
endcap_color1 = first_defined([endcap_color1, endcap_color, dots_color, color]);
|
||||||
endcap_color2 = first_defined([endcap_color2, endcap_color, color]);
|
endcap_color2 = first_defined([endcap_color2, endcap_color, dots_color, color]);
|
||||||
joint_color = first_defined([joint_color, color]);
|
joint_color = first_defined([joint_color, dots_color, color]);
|
||||||
|
|
||||||
trim1 = width[0] * first_defined([
|
trim1 = width[0] * first_defined([
|
||||||
trim1, trim,
|
trim1, trim,
|
||||||
|
|
Loading…
Reference in a new issue