2013-07-09 21 views
7

Używam wxPython do prototypowania niektórych interfejsów wyświetlania dla projektu, który ostatecznie stanie się projektem osadzonym. Ponieważ przeprowadzamy iterację z projektantem graficznym, znacznie łatwiej jest pozwolić im pracować w edytorze WYSIWYG, takim jak Inkscape, niż stale przerabiać wywołania rysunków graficznych 2D. W przypadku elementów wymagających animacji lub tekstu dynamicznego elementy SVG można łatwo zidentyfikować za pomocą identyfikatora, aby można było je programować przed renderowaniem. Przepływ renderowania wygląda następująco:Uzyskaj bezwzględne współrzędne dla rotacji elementów Inkscape SVG

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

chciałbym animować igły obrotowy wokół osi stałej dla skrajni. Aby zdefiniować igłę, grafik rysuje graficzną "igłę" i element "needle_axis", który jest małym kółkiem. Wtedy pomyślałem, że mogę ustawić właściwość transform przy użyciu pożądanego kąta i środkowych współrzędnych "needle_axis". Ponieważ jednak na względne pozycje mogły wpłynąć inne transformacje, określenie bezwzględnej lokalizacji osi obrotu jest nietrywialne.

Nie mogę znaleźć biblioteki Pythona do określania bezwzględnych współrzędnych elementu i wydaje się, że wymyślono na nowo koło, aby wypróbować implementację części specyfikacji SVG. konieczne do obliczenia. rsvg API wymienia funkcje rsvg_handle_get_dimensions_sub i arsvg_handle_get_position_sub, aby uzyskać wymiary i pozycje elementów, ale nie mogę znaleźć interfejsu API dla pyRSVG.

Czy istnieje lepszy sposób na znalezienie osi obrotu niż ręczne jej obliczenie? Przykład Inkscape SVG file and test snippet są dostępne jako istotę.

Odpowiedz

-1

Jeśli dobrze rozumiem, to masz współrzędne igły i współrzędne osi obrotu, a chcesz programowo zmienić "kąt" igły, a następnie odpowiednio zmienić kształt igły w pliku SVG?

Myślę, że to naprawdę zły pomysł: wprowadzanie zmian w SVG, zapisywanie, a następnie renderowanie "nowego SVG" zajmie zbyt dużo zasobów i właśnie dlatego tak proste zadanie wydaje się być skomplikowane.

Zamiast analizować swoje SVG raz (używając lxml na przykład, że to bułka z masłem do wyciągu współrzędne po prostu wykonując kilka XPATH zapytań) i budować swoje kształty w modelu (a Needle klasy, na przykład, ze ścieżkami i centrum), a następnie po prostu obracaj tą igłą za pomocą transformacji Cairo. Już zapewniają funkcję rotate, która zrobi to, czego szukasz!

+0

Czy możesz podać więcej szczegółów na temat wyodrębniania współrzędnych? Właściwie zacząłem robić coś podobnego, ale zdałem sobie sprawę, że będę musiał ponownie wdrożyć wszystkie specyfikacje SVG w odniesieniu do transformacji i współrzędnych bezwzględnych/względnych. W rzeczywistości uzyskuję "wystarczająco dobre" framerates, modyfikując SVG XML między ramkami. Pozwala to uniknąć tego pliku we/wy, który pomaga, ale nadal wydaje się brudny, ponieważ wiąże się z pyRSVG reparowaniem całego drzewa każdej klatki. – superlou

+0

To prawda, że ​​możesz mieć problemy, jeśli twoje oprogramowanie SVG nie "stosuje" transformacji na współrzędnych i pozostawia je jako transformacje SVG. Ale myślę, że możesz wymusić przeciwne zachowanie w Inkscape. Wtedy będziesz musiał "po prostu" zbudować ścieżkę Kairu (http://www.cairographics.org/manual/cairo-Paths.html) ze ścieżki SVG. Nie ** to ** trudne, ale nadal będziesz musiał przeczytać specyfikacje SVG dotyczące ścieżek: http://www.w3schools.com/svg/svg_path.asp – halflings

+0

Możesz wymusić eksportowanie Inkscape'a bez użycia współrzędnych względnych, ale ja nie znalazłem opcji, aby zapobiec użyciu transformacji we wszystkich sytuacjach. Zgadzam się, że lepiej byłoby, gdyby dane SVG zostały umieszczone na ścieżkach w Kairze lub w jakimś obiekcie odpowiedzialnym za generowanie ścieżek w Kairze, ale pozostawi to pytanie otwarte, ponieważ nie uważam, że powinno istnieć tłumaczenie "roll-your-own" kod dla każdego, kto potrzebuje tej funkcjonalności. – superlou

Powiązane problemy