That's a pretty exciting tool for me. I have almost exactly the same problem for one of my extensions - jigsaw - that needs to make hundreds of boolean ops to pairs of paths.
The python is great too.
So while it's a halfway solution and full python integration would be preferred - IMHO its worth adding this to get the functionality sooner.
Cheers...

On 6/26/2013 1:16 AM, Eric Greveson wrote:
Hi all,

This is my first post to the Inkscape developer list, so - hello! I've been using Inkscape for various server-side operations as part of a project I'm currently working on, and I believe I've run into the limits of the existing scripting / extensions capability. However, I'll describe my requirements, problem, current solution, and proposed improvements, and see what you think.


The requirements: I wish to perform "deep subtraction" of one pre-defined path (let's call it P) from an SVG - that is, to perform a Boolean difference operation against each path within the SVG (let's call them S1, S2, ... Sn) such that a 'hole' (in the shape of my path) is punched through all of the SVG layers.


The problem: Inkscape Boolean difference operations operate on pairs of paths, such that the uppermost of the two paths is subtracted from the lower path. The operation may only be performed on selections of two paths (i.e. you can't select 10 paths and have the uppermost path be subtracted from all of the lower 9 simultaneously).


My current solution: The obvious approach is to simply perform the Boolean operation once for each path in the SVG, cloning the path P to allow it to be subtracted again each time. That is:

Create P
Perform S1 - P
Create P
Perform S2 - P
...
Create P
Perform Sn - P

This results in every path in the SVG having P subtracted, which is exactly what I want. To implement the "Create P" operation, I've written a Python extension that inserts a <path> element into the document (i.e. I can create P by simply executing this extension script within Inkscape). To perform a difference operation, I can use the (somewhat maligned?) command line interface with

--select <id of S1> --select <id of P> --verb SelectionDiff

and I can automatically call my "create P" extension with --verb <my.extension.name.noprefs>.

I therefore just have to ensure all paths in the source SVG have IDs, extract these IDs, and then chain a big long command line together to perform all the creation, selection, and Boolean subtractions. I accomplish the ID extraction with my own Python script (running independently from Inkscape, simply using normal XML parsing code) and get that script to concoct a long string of command-line arguments.

The obvious problem here is that for files with more than a few IDs, I run into the command-line argument length limit. I have hacked around this by editing Inkscape's main.cpp file and allowing it to take --select / --verb arguments from a text file instead (note that --shell does not do the same thing - it still requires all commands to be on one shell-line, and the line length has a limit). Clearly this is not particularly clever, although it does work - it means I have my own special build of Inkscape and it uses an extremely clunky "scripting" mechanism.


The proposed improvements: I have looked at alternative solutions and have come up with the following:
 - I could edit the C++ code for Boolean operations such that the difference operation works on more than one path. However this is very specific to my problem, and it's likely that I'll want to perform other Inkscape automation tasks in future that don't use the Boolean ops.
 - There appeared to be some DBus API at one point but it seems to have fizzled out (http://comments.gmane.org/gmane.comp.graphics.inkscape.devel/40384 was a useful discussion) - and DBus isn't really ideal for this kind of scripting anyway.
 - Allow further scripting of Inkscape through a Python API - this is my preferred solution, and also, it seems, several other peoples'. The major drawback is that this is likely to be more coding work. However, I have a suggestion that will solve my immediate problem and potentially be useful to others. If I wrote a Python API that allowed Inkscape extension scripts to execute Inkscape verbs and selections, then I could perform all of the necessary operations inside a single Python extension. I could then run the extension from the command line in the usual way (--verb my.extension.name.noprefs). Initially this might take the form of an extra couple of functions on the Python inkex.Effect object:
 - do_verb(verb_name)
 - select_ids(id_list)

Then any Inkscape Effect extensions can execute verbs and modify selections as they see fit.

Does this sound like a good plan? Any other input? I'm happy to write the code for this if you think it would be generally useful, it seems a bit limiting at the moment that effects essentially have to modify the raw XML document themselves to get any useful work done. If the "do_verb" function was modified to take an argument list (along with the appropriate C++ functions), then it would allow for even richer GUI-free interaction (e.g. automation of "Save As" operations and so on).

Thanks for reading such a long message,

Eric


------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev


_______________________________________________
Inkscape-devel mailing list
Inkscape-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/inkscape-devel