Pythoneffecttutorial: Effect Extension Script
Pythoneffecttutorial: Effect Extension Script
wiki.inkscape.org/wiki/index.php/PythonEffectTutorial
Effect extensions in Inkscape means a simple programs or scripts that reads an SVG file
from standard input, transforms it somehow and prints it to the standard output. Usually
Inkscape sits on both ends, providing the file with some parameters as input first and finally
reading the output, which is then used for further work.
We will write a simple effect extension script in Python that will create a new "Hello World!"
or "Hello <value of --what option>!" string in the center of document and inside a new layer.
Contents
#!/usr/bin/env python
If you're going to put the file somewhere else than into Inkscape's installation directory, we
need to add a path so that python can find the necessary modules:
import sys
sys.path.append('/usr/share/inkscape/extensions') # or another path, as necessary
Import the inkex.py file with the Effect base class that will do most of the work for us and
the simplestyle.py module with support functions for working with CSS styles, for more
information on these modules see Python modules for extensions. We will use just the
formatStyle function from this module:
import inkex
from simplestyle import *
Declare a HelloWordEffect class that inherits from Effect and write a constructor where the
base class is initialized and script options for the option parser are defined:
class HelloWorldEffect(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
self.OptionParser.add_option('-w', '--what', action = 'store',
type = 'string', dest = 'what', default = 'World',
help = 'What would you like to greet?')
1/5
The complete documentation for the OptionParser class can be found at docs.python.org.
Here we just use the add_option method which has as first argument a short option name,
as second argument a long option name and then a few other arguments with this meaning:
action - An action which should be done with option value. In this case we use action
store which will store option value in self.options. attribute.
type - Type of option value. We use string here.
dest - Destination of option action specified by action argument. Using what value we
say that we want to store option value to self.options.what attribute.
default - Defalut value for this option if it is not specified.
help - A help string that will be displayed if script will be given no arguments or some
option or argument will have wrong syntax.
Inkscape will create a GUI form with widgets for all specified options and prefill them with
the default values specified using the .inx file for this extension which we will write later.
We need to override only one Effect class method to provide the desired effect functionality:
def effect(self):
what = self.options.what
As you can imagine we just stored the --what option value to the what variable.
Now we will finally start to do something. We will have to work with the XML representation
of the SVG document that we can access via Effect's self.document attribute. It is of lxml's
_ElementTree class type. Complete documentation for the lxml package can be found at
lxml.de.
svg = self.document.getroot()
# or alternatively
# svg = self.document.xpath('//svg:svg',namespaces=inkex.NSS)[0]
The xpath function returns a list of all matching elements so we just use the first one of
them.
We now create an SVG group element ( 'g' ) and "mark" it as a layer using Inkscape' SVG
extensions:
This creates inkscape:label and inkscape:groupmode attributes, which will only be read by
Inkscape or compatible applications. To all other viewers, this new element looks just like a
plain SVG group.
Now we create an SVG text element with a text value containing the "Hello World" string:
2/5
text = inkex.etree.Element(inkex.addNS('text','svg'))
text.text = 'Hello %s!' % (what)
If we want to center the text on its position we need to define the CSS style of the SVG text
element. Actually we use the text-anchor SVG extension to CSS styles to do that work:
Finally we connect all created elements together and put them into the SVG document:
layer.append(text)
We just defined a class that inherited from the original effect extension so we have to create
an instance of it and execute it in the main control flow:
effect = HelloWorldEffect()
effect.affect()
Create element for every option of a script and for every included module which is not from
Python standard library. Inkscape will search for this modules in directory with script.
element and its descendants defines name of menu item evoking our new "Hello World!"
extension.
3/5
If the inx file isn't well formed or if any of the dependencies wasn't met, the extension won't
show up in the menu. If your extension doesn't show up, take a look at extension-errors.log,
which may give you a hint why it wasn't loaded.
Installation
To install a new extenstion just put hello_world.py and hello_world.inx files with all
dependency modules to the /extensions or ~/.config/inkscape/extensions directory. On
Linux you will probably have to make the python script executable first if you haven't done
this yet. This is usually done by the usual command (or in your preferred file manager):
Now start Inkscape. A new menu item Hello World! in Extensions->Examples menu should
appear.
#!/usr/bin/env python
# These two lines are only needed if you don't put the script directly into
# the installation directory
import sys
sys.path.append('/usr/share/inkscape/extensions')
# We will use the inkex module with the predefined Effect base class.
import inkex
# The simplestyle module provides functions for style parsing.
from simplestyle import *
class HelloWorldEffect(inkex.Effect):
"""
Example Inkscape effect extension.
Creates a new layer with a "Hello World!" text centered in the middle of the
document.
"""
def __init__(self):
"""
Constructor.
Defines the "--what" option of a script.
"""
# Call the base class constructor.
inkex.Effect.__init__(self)
# Define string option "--what" with "-w" shortcut and default value
"World".
self.OptionParser.add_option('-w', '--what', action = 'store',
type = 'string', dest = 'what', default = 'World',
help = 'What would you like to greet?')
def effect(self):
"""
4/5
Effect behaviour.
Overrides base class' method and inserts "Hello World" text into SVG
document.
"""
# Get script's "--what" option value.
what = self.options.what
# Get access to main SVG document element and get its dimensions.
svg = self.document.getroot()
# or alternatively
# svg = self.document.xpath('//svg:svg',namespaces=inkex.NSS)[0]
Last edited by --Rubikcube 21:18, 7 August 2008 (UTC), based on a version by Blackhex
11:59, 26 April 2007 (UTC)
5/5