Voglio rendere parti di un file SVG per nome ma per la vita di me non riesco a capire come farlo (usando python + gtk).Come posso rendere * le parti * di un file SVG?
Ecco il file in formato SVG in questione: http://david.bellot.free.fr/svg-cards/files/SVG-cards-2.0.1.tar.gz (Aggiornamento: questo file non esiste più, ma è possibile rintracciarlo in http://svg-cards.sourceforge.net/)
Sul suo sito, David, dice:
È possibile disegnare una scheda tramite rendendo il file su una pixmap e ritagliando ciascuna scheda manualmente o tramite utilizzando il nome della scheda tramite un'interfaccia DOM . Tutte le carte sono incorporate in un gruppo SVG.
Non so cosa intenda per interfaccia DOM. Ho fatto qualche ricerca e il miglior risultato ho trovato che sembra adattarsi quello che voglio fare è:
QSvgRenderer *renderer = new QSvgRenderer(QLatin1String("SvgCardDeck.svg"));
QGraphicsSvgItem *black = new QGraphicsSvgItem();
QGraphicsSvgItem *red = new QGraphicsSvgItem();
black->setSharedRenderer(renderer);
black->setElementId(QLatin1String("black_joker"));
red->setSharedRenderer(renderer);
red->setElementId(QLatin1String("red_joker"));
Avviso però che è per Qt e non è nemmeno scritto in python.
Questo è quello che ho finora:
#!/usr/bin/env python
from __future__ import absolute_import
import cairo
import gtk
import rsvg
from xml import xpath
from xml.dom import minidom
window = gtk.Window()
window.set_title("Foo")
window.set_size_request(256, 256)
window.set_property("resizable", False)
window.set_position(gtk.WIN_POS_CENTER)
window.connect("destroy", gtk.main_quit)
window.show()
document = minidom.parse("cards.svg")
element = xpath.Evaluate("//*[@id='1_club']", document)[0]
xml = element.toxml()
svg = rsvg.Handle()
svg.write(xml)
pixbuf = svg.get_pixbuf()
image = gtk.Image()
image.set_from_pixbuf(pixbuf)
image.show()
window.add(image)
gtk.main()
non funziona, naturalmente.
Cosa mi manca?
In realtà ho provato anche in questo modo e non sono riuscito a capire perché stava facendo quello che stava facendo (di conseguenza, ho provato altre soluzioni per vedere se avrei ottenuto un risultato simile). Nonostante la dimensione della finestra sia la dimensione dell'intero canvas SVG, questa soluzione risponde alla mia domanda (mentre, naturalmente, sollevando un'altra domanda). :) –
Questo è stato super-utile, anche se più aiuto sarebbe stato utile. Per eseguire il rendering di parte di un'immagine SVG puoi usare handle.render_cairo (cr = c, id = "# layer_5") dove "c" è un contesto cairo. La parte che per me non era affatto ovvia è che è necessario il "#" all'inizio dell'ID. Il mio SVG ha id come 'id = "layer_1"' e posso renderizzare singoli layer con render_cairo (cr = c, id = "# layer_1") – bodgesoc