SVGFile
Part of wslib
see also: SVG
** requires DOMDocument classes v0-2 from the swiki **
http://swiki.hfbk-hamburg.de/MusicTechnology/750
The SVGFile object contains all data of an SVG file. SVGFile can read and write SVG files and the data inside can be processed.
SVGFiles can be viewed in:
FireFox 2.0
Safari (only embedded)
browsers with Adobe SVG Viewer plugin installed
...
SVGFiles can be edited in:
Adobe Illustrator ®
InkScape (open source)
...
SVG is the standard vector file-type for WikiPedia
creation
SVGFile ( path, objects, width, height )
creates a new SVGFile object
path : the path to the file. Nothing will be written to file until the write method is used.
The path can be relative and doesn't need to have a valid extension.
objects : An Array of SVGObjects. May be empty or nil at creation
width, height : the width and height of the file's artboard in pixels
(
f = SVGFile( "~/Desktop/test-sc",
[ SVGEllipse( 200, 200, 75, 50, strokeColor: "red" ),
SVGText( "circle", 200, 200, "Helvetica", 24 )
.transform_( SVGTransform( "skewX( -0.25 )" ) ),
] );
)
f.plot;
SVGFile.read ( path )
reads an SVG file from disk
f = SVGFile.read( Document.current.path.dirname ++ "/example.svg" );
// example.svg is an SVG file created with Adobe Illustrator CS2 as SVG1.1
// containing a rect, a line, a text ("test svg file") and a filled circle
f.objects;
f.postTree; ""; // posts the tree of objects
f.plot; // plots the file in a window ( works for SwingOSC as well )
f.format; // returns the (reformatted) xml data
f.path_( "~/Desktop/from-sc" ).write; // write a new file to the desktop
"~/Desktop/from-sc.svg".openWith( "Firefox.app" ); // in case you have FireFox 2.0 installed
SVGFile.parseXML ( xml, path )
parses raw SVG formatted XML data into a new SVGFile.
(
f = SVGFile.parseXML(
"<svg width='300' height='250'>
<rect stroke-width='1' x='10' y='32' width='281' fill='none' height='168' stroke='red' />
</svg>" );
)
f.plot;
instance variables
objects
all SVGObjects in an array. The order of the array is the order of execution; the last item is always the frontmost layer.
path
the file path. Can be relative and doesn't need to contain a ".svg" extension. The extension will be changed to that when write is called.
width, height
width and height
userUnit
defaults to 'px', which is the only supported unit right now
instance methods
write ( overwrite, ask, postFormat )
writes the file to disk, on the path specified in the path variable.
overwrite : write checks if the file exists.
true : existing file will be overwritten without notice
false (default) : behaviour depends on ask
ask : only used when overwrite == false
true (default) : will show a SCAlert with several renaming options
false : will automatically generate a new name and save to that
postFormat : if true (default) will post the formatted xml data as saved in the file
If the path variable is nil no file will be written, but the data will still be posted
f = SVGFile.read( Document.current.path.dirname ++ "/example.svg" );
f.write; // a dialog should appear
read ( replaceObjects )
reads the file specified in the path variable.
replaceObjects : if true (default) replaces the current object sin the SVGFile with the ones read from disk/
if false the objects read from disk are added to the objects that are already in the objects array.
parseXML ( xml, replaceObjects )
same as creation version, but overwrites or adds to objects in the SVGFile.
plot
creates a SCWindow and plots the file in it.
draw
to be used inside a drawHook or drawFunc; draws all objects in the file.
asRect
returns a Rect derrived from the outer bounds of all objects inside the SVGFile
f = SVGFile.read( Document.current.path.dirname ++ "/example.svg" );
f.asRect;
asGUICode ( penClass )
returns a string with executable GUI-style pen code. If you copy the code to a file, enclose it in curly brackets ( { } ) and use it as a drawHook function for a GUI.window it will display the file again. Can also be called upon individual SVGObjects
asPostScript, writePostScript ( argPath )
returns postscript code as string or writes it to a file (.eps). If no path is specified the path will be the same as that of the SVGFile, but with a ".ps" extension. Note that PostScript doesn't support transparencies, and SVGPathSegments of type 'arc' are currently not supported. For all other objects it should work as well as the SVGFile:plot function works. Reading from PostScript files is not supported, and probably never will be.
PostScript files can be viewed in Preview.app (OSX) and from there converted to PDF.
Note: asPostScript and writePostScript can also be called upon regular drawHook functions, as long as they are written in GUI.pen style. This wslib feature is not yet documented (based on ColPen), but works very well.
writePDF ( argPath )
Based on the above method SFGFile can also create PDF files. But only if the GhostScript unix executable is installed. If it's not, or not found, this method will display a message in the postwindow and create a PostScript file instead. If the GhostScript excutable (/usr/local/bin/gs) is found however, this method will first create a PostScript file in the /tmp directory, then convert it to PDF and then delete the PostScript file again. Much faster then the conversion used by Preview.app, but sometimes less solid.
The GhostScript library can be downloaded at http://www.ghostscript.com/awki
(
f = SVGFile( "~/Desktop/scribbly.svg", [ ] );
10.do({
f.add( SVGPath([[\M, 200, 200]] ++ ({ [\s] ++ ({50.rand2}!4) }!10), strokeColor: Color.rand) );
});
)
f.plot;
f.writePDF; // will produce a .ps file instead if GhostScript is not installed
Note: in the current version of gs (8.57) there seems to be a problem with the /findfont command, causing errors when text is involved.
accessing / testing
at ( index ), copySeries ( first, second, last ), put (index, item )
calls .at and copySeries on objects, also to provide compatibility with the ..[..] syntax in SC
f = SVGFile.read( Document.current.path.dirname ++ "/example.svg" );
f[0];
f[1..];
f[[0,3]];
allObjects
returns a flat array with all SVGObjects including the ones inside SVGGroups.
hasCurves
tests if there are any SVGPath objects in the SVGFile which contain \curveTo or \sCurveTo operations
postTree
post a tre-like structure with all objects and groups contained in the objects array