2013-07-09 18 views
7

Sto usando wxPython per prototipare alcune interfacce di visualizzazione per un progetto che alla fine diventerà un progetto incorporato. Dal momento che stiamo iterando con un designer grafico, è molto più facile lasciarli lavorare in un editor WYSIWYG come Inkscape piuttosto che riscrivere costantemente le chiamate di disegno grafiche 2D. Per gli elementi che richiedono animazione o testo dinamico, gli elementi SVG sono facilmente identificabili tramite ID in modo che possano essere aggiornati in modo programmatico prima del rendering. Il flusso di rendering si presenta così:Ottieni coordinate assolute per la rotazione degli elementi Inkscape SVG

Inkscape SVG as XML --> Python modification of XML --> Drawing onto wxPython buffered canvas using Cairo and pyRSVG 

mi piacerebbe per animare un ago di rotazione attorno ad un asse fisso per un calibro. Per definire un ago, il progettista grafico disegna l'elemento grafico "ago" e un "ago_assiale" che è un piccolo cerchio. Quindi, pensavo di poter impostare la proprietà di trasformazione utilizzando l'angolo desiderato e le coordinate del centro di "needle_axis". Tuttavia, poiché le posizioni relative potrebbero essere state influenzate a causa di altre trasformazioni, determinare la posizione assoluta dell'asse di rotazione non è banale.

Non riesco a trovare una libreria Python per determinare le coordinate assolute di un elemento e mi sembra di dover reinventare la ruota per provare a implementare la parte delle specifiche SVG. necessario per calcolarlo. Il rsvg API menziona le funzioni rsvg_handle_get_dimensions_sub e arsvg_handle_get_position_sub per ottenere le dimensioni e le posizioni degli elementi, ma non riesco a trovare un'API per pyRSVG.

C'è un modo migliore per trovare l'asse di rotazione che calcolarlo manualmente? Un esempio Inkscape SVG file and test snippet è disponibile come sintesi.

risposta

-1

Se ho capito bene, hai le coordinate dell'ago e le coordinate dell'asse di rotazione, e vuoi modificare programmaticamente l'angolo "dell'ago" e quindi modificare la forma dell'ago nel file SVG di conseguenza?

Penso che questa sia una pessima idea: apportare modifiche all'SVG, salvare e quindi rendere il "nuovo SVG" richiederà troppe risorse ed è esattamente il motivo per cui un compito così semplice sembra complicato.

Invece, analizza la tua SVG volta (usando lxml per esempio, è un pezzo di torta per estrarre le coordinate solo facendo alcune XPATH query) e costruire le forme in un modello (una classe Needle per esempio, con i percorsi e il centro) e quindi ruotare semplicemente l'ago usando le trasformazioni Cairo. Forniscono già una funzione rotate che farà ciò che stai cercando!

+0

Potrebbe fornire ulteriori dettagli su come estrarre le coordinate? In realtà ho iniziato a fare qualcosa di simile, ma ho realizzato che avrei dovuto ri-implementare tutte le specifiche SVG per quanto riguarda le trasformazioni e le coordinate assolute/relative. Sto ottenendo framerate "abbastanza buone" semplicemente modificando l'XML SVG tra i frame. Questo evita questo I/O di file che aiuta ma sembra ancora sporco poiché coinvolge pyRSVG che ripete l'intero albero ogni fotogramma. – superlou

+0

È vero che potresti avere alcuni problemi se il tuo software SVG non "applica" le trasformazioni sulle coordinate e le lascia come intere trasformazioni SVG. Ma penso che tu possa forzare il comportamento opposto su Inkscape. Quindi dovrai "solo" costruire un percorso del Cairo (http://www.cairographics.org/manual/cairo-Paths.html) dal percorso SVG. Non ** che ** difficile ma dovrai comunque leggere le specifiche SVG sui percorsi: http://www.w3schools.com/svg/svg_path.asp – halflings

+0

Puoi forzare Inkscape ad esportare senza utilizzare le coordinate relative, ma io non ho trovato un'opzione per impedire l'utilizzo di trasformazioni in tutte le situazioni. Sono d'accordo che sarebbe meglio portare i dati SVG nei percorsi del Cairo o qualche oggetto responsabile della generazione dei percorsi del Cairo, ma lascerò aperta la domanda poiché non penso che ci debba essere una traduzione "roll-your-own" codice per tutti coloro che hanno bisogno di questa funzionalità. – superlou

Problemi correlati