SVGPath
Part of wslib
superclass : SVGObject
related classes : SVGPathSegment
The SVGPath object contains data of the most complex and powerful SVG object: the path. An SVGPath is constructed out of SVGPathSegment objects, wich each describe one step in the path.
The SVG plotting option dosn't yet display all known types of SVGPathSegments.
creation
SVGPath ( segments, name, strokeColor, fillColor, strokeWidth, transform )
creates a new object with the instance variables as described below and in the SVGObject helpfile
segments : segments is an Array of objects wich should all respond to the asSVGPathSegment method.
these can be:
SVGPathSegment
Point : will be converted to an SVGPathSegment of type 'LineTo', or will be added to
the previous item if that has less arguments then it can have
Array : [ type, ...values ] where type should be a Symbol.
If type starts with an upper case char, the segment is absolute, lowercase is relative to the
previous segment. See the SVGPathSegment helpfile for details about types.
SVGPath internally cleans up the array, which makes the input more flexible.
segments can also be a String, formatted according to the standard SVG 1.1 implementation
(
SVGPath( [
[ \MoveTo, 10, 10 ],
100@100, // becomes 'LineTo' in this case
[ \CurveTo, 150, 150, 150, 250, 100, 300 ],
[ \closePath ] ],
"my path", "purple" ).plot;
)
( // same thing:
SVGPath( [ [ \M, 10, 10 ], [ \L, 100, 100 ], [ \C, 150, 150, 150, 250, 100, 300 ], [ \z ] ],
"my path", "purple" ).plot;
)
// same thing:
SVGPath( [ \M, 10@10, \L, 100@100, \C, 150@150, 150@250, 100@300, \z ], "my path", "purple" ).plot;
// same thing:
SVGPath( "M10,10 L100,100 C150,150 150,250 100,300z", "my path", "purple" ).plot;
( // same thing:
SVGPath( [
SVGPathSegment( \MoveTo, 10, 10 ),
SVGPathSegment( \LineTo, 100, 100 ),
SVGPathSegment( \CurveTo, 150, 150, 150, 250, 100, 300 ),
SVGPathSegment( \closePath ) ],
"my path", "purple" ).plot;
)
(
SVGPath( [[ \M, 200, 200 ]] ++ ({ [ \sCurveTo ] ++ ({ 50.rand2 }!4); }!10), "randomwalk",
strokeColor: "dark_blue" ).plot;
)
(
SVGPath( [[\M,200,200]] ++ ({|i|[[ \HLineTo, \VLineTo ].wrapAt(i), 400.rand] }! 50), "rectrand",
strokeColor: "yellow",
fillColor: "navy" ).plot
)
asSVGPath
this message can be called on a number of classes:
Collection, String
uses the Collection as segments argument
[[ \M, 10, 10 ],[ \l, 200, 20 ],[ \c, 10,100, -100, 10, -100, 50 ],[ \z ]].asSVGPath.plot;
SVGCircle, SVGEllipse, SVGLine, SVGPolyLine, SVGPolygon, SVGRect
for these classes an extra argument "relative" is available, which defaults to 'true'. If relative is true
all path segments are relative to the first \MoveTo element
(
r = SVGEllipse( 120, 100, 100, 80, strokeColor: "blue" );
p = r.asSVGPath( true ).strokeColor_( "red" );
p[0].xy = p[0].xy + [10,10]; // changing the first element moves the whole path (relative)
SVGGroup( [ r, p ] ).plot;
p.asArray.dopost; // post the segments as an array
)
instance variables
segments
an Array with SVGPathSegment objects, describing the segments of the path
strokeColor, fillColor
colors for stroke and fill. These can be
a Color
a String or Symbol with a color name ( e.g. "light_blue" or "#0000FF" )
"none" or nil
strokeWidth
defaults to 1.
instance methods
absoluteSegments
returns segments converted to absolute segments
add ( segment ), addAll ( segmentsArray )
add SVGPathSegments to the segments
++ anSVGPath
Concatenate the segments of 2 SVGPaths to the first SVGPath.
at ( index ), copySeries ( first, second, last ), put (index, item )
calls .at and copySeries on points, also to provide compatibility with the ..[..] syntax in SC
asXYArray
returns an array containing arrays with x and y values
asArray
returns an with SVGPathElement arrays, in a format which could be used as input for SVGPath.
SVGPath( [[ \M, 200, 200 ]] ++ ( { [ \sCurveTo ] ++ ({ 50.rand2 }!4); }!10) ).asArray;