Daniel Hornung wrote:
Thank you very much for your advice, I'll use the following tips as a cheat sheet and try to get the same results for myself :-) Oh, and maybe you could add a small note to http://www.ekips.org/comp/inkscape/ that most things there are included already and/or not the current state of the art? Your page is google's #1 for "inkscape python".
Good idea. I've done so now. I've been reluctant to delete the pages because they are so well indexed by google and most of the concepts involved have remained the same.
On Wednesday 30 July 2008, Aaron Spike wrote:
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'))
Either that or svg.attrib['width']
Yes. I think I read somewhere that attrib collects all the attributes into a dictionary. get() and set() operate on the attributes without that initial step. I suppose attrib may be slower if there are a large number of attributes or a large number of objects for which you want to change attributes. Some one should profile it and tell us. :-)
it's probably just a matter of taste
svg.set('width', width * 2) text = inkex.etree.Element('text') text.text = 'Hello %s!' % (what) svg.append(text)
Rather: layer.append(text)
Well layer.append() if you are following the tutorial. I altered the example to try to pack in as much lxml as possible in a small space.
if you just want the root node you can replace the xpath with:
svg = self.document.getroot()
yes, simpler in this case, they should be mentioned both in the tutorial.
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'})
So the attributes come as a dictionary? Great!
and actually 'text' probably needs to be inkex.addNS('text','svg') so that it occurs in the proper namespace.
Ok, I found out about the necessity of namespaces the hard way, because lxml complained about the colons in 'inkscape:label', luckily http://sourceforge.net/mailarchive/message.php?msg_name=1204520414.7055.4.ca... pointed to the correct line in dimension.py.
I'll try to find the time to update the wiki page a bit in a week or so, I probably won't have time the next days.
That would be much appreciated. I wonder if we should make a copy of that old page and update the copy for the lxml api.
Is there something I can read up about changes to the python scripting interface (inkex.py and a few other modules, afaict at the moment) that might be planned or will it stay more or less as it is for the near future?
I don't think there are any major changes planned unless someone with a lot of energy steps forward. Many people have said they wanted to clean up and extend the python scripts, but thus far no one has followed through.
Aaron Spike