6
votes

Comment puis-je rendu * parties * d'un fichier SVG?

Je veux rendre des parties d'un fichier SVG par nom mais pour la vie de moi, je ne peux pas comprendre comment le faire (en utilisant Python + GTK).

Voici le fichier SVG en question: http://david.bellot.free.fr/svg -Cards / fichiers / cartes SVG-2.0.1.tar.gz ( Mise à jour: Ce fichier n'existe plus, mais vous pouvez le suivre sur http://svg-cards.sourceforge.net/ )

sur son site, David, dit:

Vous pouvez dessiner une carte soit par rendant le fichier sur un pixmap et Coupure chaque carte manuellement ou par Utiliser le nom de la carte via un DOM interface. Toutes les cartes sont intégrées à un groupe SVG.

Je ne sais pas ce qu'il veut dire par une interface DOM. J'ai fait des recherches et le meilleur résultat que j'ai trouvé qui semble convenir à ce que je veux faire est: xxx

remarque cependant qu'il est pour qt et n'est même pas écrit dans python.

C'est ce que j'ai jusqu'à présent: xxx

Ça ne fonctionne pas, bien sûr.

Qu'est-ce que je suis Je manque?


0 commentaires

5 Réponses :


2
votes

Je crois que ce qu'il veut dire par "via une interface DOM", c'est que, puisque SVG est XML, vous pouvez charger le fichier SVG dans Minidom ou un autre parseur XML Python XML et extraire le XML nœud avec le nom spécifique que vous recherchez. Ce nœud XML devrait représenter un élément pouvant être rendu.


1 commentaires

Comment rendez-vous le nœud XML?



0
votes

Vous pouvez le faire en édité la balise. Éditez la largeur et la hauteur, définissez l'attribut VIEWBOX sur l'élément SVG principal au rectangle que vous souhaitez, rendu, répéter.

voir Comment montrer une sous-section ou une "tranche" d'un graphique SVG? et http://dingoskidneys.com/~dholth/svg/


2 commentaires

Cela ne m'aidait pas à récupérer des parties du fichier SVG par son nom, puis de les rendre.


Vous pourrez peut-être obtenir la boîte de sélection pour nommer des parties du fichier SVG et définir la zone de vue en conséquence.



9
votes

La bibliothèque GTK pour le rendu SVG est appelée RSVG. Il a des liaisons python, mais elles sont sans papiers et ils n'enveloppent pas le rsvg_handle_get_pixbuf_sub () et rsvg_handle_render_cairo_sub () fonction que vous utiliseriez normalement à cet effet dans C. Voici ce que vous devez faire aussi loin que je peux dire. Vous extrayez le nœud XML lorsque Adam Crossland a suggéré. Pour le rendre, vous devez faire quelque chose comme ceci: xxx

c'est si vous le souhaitez dans un gtk.image , sinon quelque chose d'autre avec le pixbuf. Vous pouvez également le rendre à un contexte du Caire avec gérer.render_caire (Cr) cr est votre contexte du Caire.

EDIT: < / Strong>

Désolé, je n'ai pas lu la reliure de Python assez étroitement au début. Les fonctions _SUB () sont implémentées à l'aide de l'argument ID = . Votre programme peut donc bouillir à ceci: xxx

J'ai testé cela et ça marche. Cependant, la fenêtre est la taille de l'ensemble de la toile SVG et est coupée à la taille de l'écran (c'est pourquoi j'ai rendu les 3 diamants au lieu de l'as des clubs qui se trouvent dans le coin.) Vous aurez donc toujours Pour trouver un moyen de récolter le Pixbuf autour de la carte que vous voulez, mais cela ne devrait pas être trop difficile.


2 commentaires

J'ai effectivement essayé de cette façon et je ne pouvais pas comprendre pourquoi il faisait ce qu'il faisait (d'où je tente d'autres solutions de voir si j'aurais un résultat similaire). Malgré la taille de la fenêtre étant la taille de l'ensemble de la toile SVG, cette solution répond à ma question (bien sûr, soulevant une autre question). :)


C'était super-utile, bien que plus d'aide aurait été utile. Pour rendant une partie d'une image SVG, vous pouvez utiliser la poignée.Render_CAIROO (CR = C, ID = "# Layer_5") où "C" est un contexte du Caire. La partie qui n'était pas du tout évident pour moi est que le "#" au début de l'identifiant est requis. Mon SVG a des identifiants comme 'id = "calify_1"' et je peux rendre des couches individuelles avec rendu_caire (cr = c, id = "# couche_1")



1
votes

Voici ma réponse au problème de la culture en blanc. C'est un hack raté mais ça a fonctionné très bien. Cela servirait également de bon point de départ pour obtenir des cartes pour quiconque faisant un jeu de cartes à Python.

import gtk
import rsvg
svg = rsvg.Handle(file="/usr/share/gnome-games-common/cards/gnomangelo_bitmap.svg")
w, h = 202.5, 315
card_names = map(str, range(1,11)) + ["jack", "queen", "king"]
suites = ["club", "diamond", "heart", "spade"]
specials = [{"name":"black_joker","x":0, "y":4}, {"name":"red_joker","x":1, "y":4}, {"name":"back","x":2, "y":4}]
for suite_number, suite in enumerate(suites):
    for card_number, card in enumerate(card_names):
        print "processing", suite, card, '#'+card+'_'+suite
        pixbuf = svg.get_pixbuf(id='#'+card+'_'+suite)
        pixbuf.subpixbuf(int(w*card_number), int(h*suite_number), int(w), int(h)).save("./"+card+"_"+suite+".png","png", {})
for special in specials:
    print "processing", special["name"]
    pixbuf = svg.get_pixbuf(id='#'+special["name"])
    card_number = special["x"]
    suite_number = special["y"]
    pixbuf.subpixbuf(int(w*card_number), int(h*suite_number), int(w), int(h)).save("./"+special["name"]+".png","png", {})


0 commentaires

1
votes

grave-creuser un peu ici, mais la réponse de Ptomato à partir de 2010 fonctionne également en 2019 pour GTK3 avec de légères modifications. Le code ci-dessous ne rendra que les 3 diamants SVG ID.

#!/usr/bin/env python

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Rsvg', '2.0')

from gi.repository import Gtk, Rsvg

svg = Rsvg.Handle.new_from_file('svg-cards.svg')

pixbuf = svg.get_pixbuf_sub('#3_diamond')

image = Gtk.Image()
image.set_from_pixbuf(pixbuf)
image.show()

window = Gtk.Window()
window.set_title("Foo")
window.connect("destroy", Gtk.main_quit)
window.show()
window.add(image)

Gtk.main()


0 commentaires