2013-07-09 25 views
7

Tôi đang sử dụng wxPython để thử nghiệm một số giao diện hiển thị cho một dự án mà cuối cùng sẽ trở thành một thiết kế nhúng. Vì chúng ta đang lặp lại với một nhà thiết kế đồ họa, nên dễ dàng hơn để chúng hoạt động trong trình soạn thảo WYSIWYG như Inkscape hơn là liên tục viết lại các cuộc gọi vẽ đồ họa 2D. Đối với các thành phần cần hoạt ảnh hoặc văn bản động, các phần tử SVG có thể dễ dàng nhận dạng bằng ID để chúng có thể được cập nhật theo chương trình trước khi hiển thị. Luồng hiển thị trông giống như sau:Lấy tọa độ tuyệt đối để quay các phần tử SVG của Inkscape

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

Tôi muốn tạo hiệu ứng kim xoay quanh trục cố định cho máy đo. Để xác định một cây kim, nhà thiết kế đồ họa vẽ "kim" đồ họa và phần tử "kim_axis" là một hình tròn nhỏ. Sau đó, tôi nghĩ tôi có thể đặt thuộc tính biến đổi bằng cách sử dụng góc mong muốn và tọa độ trung tâm của "needle_axis". Tuy nhiên, vì các vị trí tương đối có thể bị ảnh hưởng do các biến đổi khác, việc xác định vị trí tuyệt đối của trục quay là không nhỏ.

Tôi dường như không thể tìm thấy thư viện Python để xác định tọa độ tuyệt đối của một phần tử và cảm thấy như phát minh lại bánh xe để thử triển khai một phần của thông số SVG. cần thiết để tính toán nó. rsvg API đề cập đến các hàm rsvg_handle_get_dimensions_subarsvg_handle_get_position_sub để có được thứ nguyên và vị trí của các phần tử, nhưng tôi không thể tìm thấy API cho pyRSVG.

Có cách nào tốt hơn để tìm trục quay hơn tính toán thủ công không? Ví dụ Inkscape SVG file and test snippet có sẵn dưới dạng ý chính.

Trả lời

-1

Nếu tôi hiểu chính xác, bạn có tọa độ của kim và tọa độ trục quay và bạn muốn thay đổi "góc" kim của chương trình và sau đó thay đổi hình dạng của kim trong tệp SVG sao cho phù hợp?

Tôi nghĩ đây thực sự là một ý tưởng tồi: thực hiện thay đổi đối với SVG, lưu và sau đó hiển thị SVG mới sẽ lấy quá nhiều tài nguyên và chính xác là tại sao một tác vụ đơn giản như vậy lại phức tạp. Thay vào đó, phân tích SVG của bạn một lần (sử dụng lxml chẳng hạn, đó là một miếng bánh để trích xuất tọa độ chỉ bằng cách thực hiện một số truy vấn XPATH) và tạo hình dạng của bạn thành một mô hình (ví dụ: Needle class)) và sau đó chỉ cần xoay kim bằng cách sử dụng các biến đổi Cairo. Họ đã cung cấp một chức năng rotate sẽ làm những gì bạn đang tìm kiếm!

+0

Bạn có thể cung cấp thêm chi tiết về cách trích xuất tọa độ không? Tôi thực sự bắt đầu làm một cái gì đó dọc theo những dòng nhưng nhận ra tôi phải thực hiện lại tất cả các đặc tả SVG liên quan đến biến đổi và tọa độ tuyệt đối/tương đối. Tôi đang thực sự nhận được "đủ tốt" framerates bằng cách chỉ cần sửa đổi SVG XML giữa các khung. Điều này tránh tập tin này I/O giúp nhưng vẫn có vẻ bẩn vì nó liên quan đến pyRSVG reparsing toàn bộ cây mỗi khung. – superlou

+0

Đúng là bạn có thể gặp một số vấn đề nếu phần mềm SVG của bạn không "áp dụng" các phép biến đổi trên các tọa độ và để chúng thành các biến đổi SVG. Nhưng tôi nghĩ rằng bạn có thể ép buộc hành vi ngược lại trên Inkscape. Sau đó, bạn sẽ "chỉ" phải xây dựng một con đường Cairo (http://www.cairographics.org/manual/cairo-Paths.html) từ đường dẫn SVG. Không ** mà khó nhưng bạn vẫn sẽ phải đọc thông số SVG về đường dẫn: http://www.w3schools.com/svg/svg_path.asp – halflings

+0

Bạn có thể buộc Inkscape xuất mà không sử dụng tọa độ tương đối, nhưng tôi đã không tìm thấy một tùy chọn để ngăn chặn việc sử dụng các biến đổi trong mọi tình huống. Tôi đồng ý rằng sẽ tốt hơn để đưa dữ liệu SVG vào đường dẫn Cairo hoặc một số đối tượng chịu trách nhiệm tạo ra đường dẫn Cairo, nhưng sẽ để lại câu hỏi mở vì tôi không nghĩ rằng cần phải có bản dịch "cuộn của riêng bạn" mã cho mọi người cần chức năng này. – superlou