2013-07-09 87 views
7

我使用wxPython的原型爲一個項目,最終將成爲嵌入式設計一些顯示界面的旋轉絕對座標。由於我們正在使用圖形設計器進行迭代,因此讓它們在Inkscape等所見即所得編輯器中工作要比不斷重寫2D圖形繪製調用要容易得多。對於需要動畫或動態文本的元素,SVG元素可以通過ID輕鬆識別,以便在渲染之前以編程方式更新它們。渲染流程如下所示:獲取Inkscape的SVG元素

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

我想爲圍繞固定軸的測量頭旋轉針。爲了定義一個針,圖形設計師繪製出一個小圓圈的圖形「針」和「needle_axis」元素。然後,我想我可以使用所需的角度和「needle_axis」的中心座標來設置變換屬性。但是,由於相對位置可能因其他變換而受到影響,因此確定旋轉軸的絕對位置並不重要。

我似乎無法找到確定元素的絕對座標的Python庫,而且感覺就像重新發明輪子儘量工具SVG規範的一部分。計算它是必要的。 rsvg API提到了rsvg_handle_get_dimensions_subarsvg_handle_get_position_sub函數來獲取元素的維度和位置,但我找不到pyRSVG的API。

有沒有更好的方式找到旋轉軸比手動計算呢?示例Inkscape SVG file and test snippet可作爲要點。

回答

-1

如果我理解正確的,你有針的座標和旋轉軸座標,並希望通過編程修改針的「角」,然後相應地改變針的形狀在SVG文件?

我認爲這是一個非常糟糕的主意:在更改SVG,保存和再渲染「新SVG」會耗費太多ressources和就是爲什麼這樣一個簡單的任務顯得複雜。

相反,解析您的SVG一次(使用lxml例如,它是一塊蛋糕,以提取座標,只需做一些XPATH查詢),建立自己的外形在模型(Needle類的實例,與路徑和中心),然後使用Cairo變換簡單地旋轉該針。他們已經提供了一個rotate函數,它可以做你正在尋找的東西!

+0

你能否提供更多關於如何提取座標的細節?我實際上已經開始沿着這些方向做些事情,但意識到我必須重新實現所有關於變換和絕對/相對座標的SVG規範。實際上,通過在幀之間修改SVG XML來獲得「足夠好」的幀率。這避免了這個文件I/O,它幫助但仍然看起來很髒,因爲它涉及pyRSVG每幀重新整理樹。 – superlou

+0

確實,如果您的SVG軟件沒有在座標上「應用」轉換並將其轉換爲SVG轉換,那麼您可能會遇到一些問題。但我認爲你可以在Inkscape上強制執行相反的行爲。然後,您將「僅」必須從SVG路徑創建開羅路徑(http://www.cairographics.org/manual/cairo-Paths.html)。不**但很難,但你仍然必須閱讀有關路徑的SVG規範:http://www.w3schools.com/svg/svg_path.asp – halflings

+0

您可以強制Inkscape導出而不使用相對座標,但是我在所有情況下都沒有找到阻止使用轉換的選項。我同意將SVG數據導入Cairo路徑或負責生成Cairo路徑的某個對象會更好,但由於我不認爲應該「翻閱自己的」翻譯爲需要此功能的每個人編寫代碼。 – superlou