Daniel Hornung wrote:
Hello, I hope this list is the correct one for this kind of question: Has anyone managed to get http://wiki.inkscape.org/wiki/index.php/PythonEffectTutorial to work without major changes? It failed for me both on a gentoo system and on a pretty vanilla Ubuntu 8.04 box. I don't know if I will find the time to edit the wiki page according to the current lxml behaviour, but I might give it a try. Additionally Ishmal(I think) said on irc/jabber that lxml might not be used in the future anymore anyway.
Now for the list of problems I encountered:
- Simply making the file executable and putting it into ~/.inkscape/extensions/ is not sufficient, it won't find inkex there, but no problem, simply add import sys sys.path.append('/usr/share/inkscape/extensions') # or another path, as appropriate for your installation
Yes, this is the best solution. Copying needed modules to the private extensions dir also works, but is much dirtier.
to the top of it. A minor problem.
- All the getElementsByTagName, getAttribute, createElement,... methods are unknown to lxml, at least in the versions here (1.3.6). Inkscape returns the python error message ending with: File "/home/dhornun/.inkscape/extensions/helloworld.py", line 32, in effect svg = self.document.getElementsByTagName('svg')[0] AttributeError: 'etree._ElementTree' object has no attribute 'getElementsByTagName'
If this is not a problem on the distributions' side, those can probably be fixed by adapting the code to reflect lxml's current API.
You are 100% correct. This tutorial was written before we began using lxml. It teaches the pyxml api not an older lxml api. Off the top of my head (without checking the api docs to be sure):
svg = self.document.getElementsByTagName('svg')[0] width = inkex.unittouu(svg.getAttribute('width')) svg.setAttribute('width', width * 2) text = self.document.createElement('text') value = self.document.createTextNode('Hello %s!' % (what)) text.appendChild(value) svg.appendChild(text)
becomes:
svg = self.document.xpath('//svg:svg',namespaces=inkex.NSS)[0] width = inkex.unittouu(svg.get('width')) svg.set('width', width * 2) text = inkex.etree.Element('text') text.text = 'Hello %s!' % (what) svg.append(text)
if you just want the root node you can replace the xpath with:
svg = self.document.getroot()
Additionally, something like:
text = inkex.etree.Element('text') text.setAttribute('x', '200') svg.append(text)
can be simplified with:
inkex.etree.SubElement(svg, 'text', {'x':'200'})
and actually 'text' probably needs to be inkex.addNS('text','svg') so that it occurs in the proper namespace.
Aaron Spike