xenogenesi::blog
memento
3d adt android apache2 app apt aria2 build bullet cflags chromium codeigniter debian demoscene dependencies dpkg driver emulator freeglut gcc gfx git glut htaccess javascript json kernel linux make metalink minimal mysql opengl php python raspbian realtime rpi specs template toolchain update-alternatives video wifi wordpress

scripting inkscape with python

I needed a way to create many layers at once in inkscape, it support scripting with any language, the .inx file allow to define input parameters to insert with a GUI, they will be passed to the script as command line arguments

Place the .inx file and the python script in the inkscape directory

$HOME/.config/inkscape/extensions/create_layers.inx
$HOME/.config/inkscape/extensions/create_layers.py

create_layers.inx:

<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
  <_name>Create Layers</_name>
  <id>org.xenogenesi.filter.create_layers</id>
  <dependency type="executable" location="extensions">create_layers.py</dependency>
  <dependency type="executable" location="extensions">inkex.py</dependency>
  <param name="basename" type="string" _gui-text="Base name of the new layer">New Layer {0}</param>
  <param name="count" type="string" _gui-text="Number of layers to create">10</param>
  <effect>
    <object-type>all</object-type>
    <effects-menu>
       <submenu _name="Layers"/>
    </effects-menu>
  </effect>
  <script>
    <command reldir="extensions" interpreter="python">create_layers.py</command>
  </script>
</inkscape-extension>

create_layers.py:

#!/usr/bin/env python

import inkex

class CreateLayersEffect(inkex.Effect):

    def __init__(self):

        inkex.Effect.__init__(self)

        self.OptionParser.add_option('-b', '--basename', action = 'store',
          type = 'string', dest = 'basename', default = 'New Layer {0}',
          help = 'Base name of the new layer')
        self.OptionParser.add_option('-c', '--count', action = 'store',
          type = 'string', dest = 'count', default = '10',
          help = 'Number of layers to create')

    def effect(self):
        basename = self.options.basename
        count = int(self.options.count)

        svg = self.document.getroot()

        for i in range(0, count):
            layer = inkex.etree.SubElement(svg, 'g')
            layer.set(inkex.addNS('label', 'inkscape'), basename.format(i))
            layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')

effect = CreateLayersEffect()
effect.affect()

github.com/xenogenesi/inkscape-pyext (one more extension to create layers for each selected object)

Here some great reference wiki.inkscape/Script_extensions