MECHANIK 7/2013 XVII Międzynarodowa Szkoła Komputerowego Wspomagania Projektowania, Wytwarzania i Eksploatacji Dr hab. inż. Jan PIETRASIEŃSKI, prof. WAT Dr inż. Dariusz RODZIK Wojskowa Akademia Techniczna Mgr inż. Paweł SIERGIEJUK Mgr inż. Stanisław GRZYWIŃSKI Centrum Badań i Rozwoju Samsung Polska WYKORZYSTANIE JĘZYKA PROGRAMOWANIA PYTHON I BIBLIOTEKI OPENCASCADE DO WIZUALIZACJI I OBLICZEŃ GEOMETRYCZNYCH Streszczenie: W pracy opisano zasadę wykorzystania języka programowania Python i biblioteki OpenCascade do tworzenia aplikacji realizującej obliczenia graficzne i wizualizacje danych w przestrzeni 3D. USING PYTHON AND OPENCASCADE LIBRARY IN VISUALIZATION AND GEOMETRIC CALCULATIONS Abstract: The paper describe the way of using Python and OpenCascade library during developing application that realizes geometric calculation and 3D data visualization. Słowa kluczowe: Python, biblioteka OpenCascade Keywords: Python, library OpenCascade 1. WPROWADZENIE Na rynku oprogramowania dostępnych jest wiele różnych narzędzi, które dostarczają szeroki zakres możliwości wizualizacji i obliczeń graficznych. Podobna sytuacja dotyczy języków programowania. Często te same biblioteki są dostępne w większości popularnych języków programowania. Dobór języka programowania i wykorzystywanych bibliotek powinien zapewnić pełne spełnienie wymagań stawianych tworzonemu oprogramowaniu. Natomiast sam proces jego tworzenia powinien przebiegać sprawnie i efektywnie. Celem artykułu jest zaprezentowanie zalet, jakie niesie ze sobą jednoczesne stosowanie języka programowania Python i biblioteki OpenCascade (OCC). Zalety te omówione zostaną na przykładzie realizacji wymagań programowych podczas tworzenia aplikacji do modelowania działania zdecentralizowanego systemu lokalizacji miejsca wystrzału. Aby lepiej przedstawić i zrozumieć rozpatrywane zagadnienie, w pierwszej kolejności zdefiniowano wymagania programowe opracowywanej aplikacji: 1. Program powinien posiadać możliwość definiowania położenia czujników pomiarowych (tzw. węzłów lokacyjnych – WL) oraz miejsca i kierunku oddania strzału; 2. Program powinien posiadać możliwość wyznaczania zależności geometrycznych między falą uderzeniową powstającą na skutek przelotu pocisku a obranym WL; 667 MECHANIK 7/2013 XVII Międzynarodowa Szkoła Komputerowego Wspomagania Projektowania, Wytwarzania i Eksploatacji 3. Program powinien symulować działanie dowolnego układu (systemu) lokalizacji miejsca wystrzału poprzez wyznaczanie trajektorii przelotu pocisku między węzłami lokacyjnymi układu; 4. Program powinien posiadać możliwość wizualizacji (3D) rozmieszczenia przestrzennego WL, trajektorii lotu oraz zobrazowania fali uderzeniowej. 2. JĘZYK PROGRAMOWANIA PYHTON Python jest skryptowym językiem programowania wysokiego poziomu, który powstał w 1990 roku [1]. Tworzono go z myślą o zastosowaniu do opracowywania aplikacji serwerowych, jednak dzięki swojej uniwersalności i prostocie bardzo szybko zyskał popularność i jest z powodzeniem wykorzystywany we wszystkich możliwych dziedzinach techniki i nauki. Obecnie Python znajduje się w pierwszej 10 najpopularniejszych języków programowania. Python w porównaniu do innych języków wyróżnia się między innymi składnią, która jest prosta i bardzo czytelna [2]. Przykładowy kod programu napisanego w Pythonie można przedstawić w następujący sposób: i=3 if i < 10: print ‘i mniejsze od 10’ else: print ‘i mniejsze od 10’ W prezentowanym przykładzie w pięciu linijkach kodu udało się zawrzeć przypisanie wartości do zmiennej oraz pełną instrukcję warunkową if...else z wypisaniem na ekran wyniku porównania. W danym programie zilustrowano kilka podstawowych cech tego języka: 1. brak deklaracji typów zmiennych – zmienne są po prostu definiowane i mogą zmieniać swój typ; 2. w najprostszych przypadkach nawiasy przy instrukcjach warunkowych nie są potrzebne; 3. bloki kodu są oznaczane poprzez wcięcia – znacznie zwiększa to czytelność kodu programu; 4. proste intuicyjne słowa kluczowe, które ułatwiają naukę języka. Dodatkowym atutem Pythona jest możliwość uruchomienia tego samego programu na wielu systemach operacyjnych. Jest to bardzo ważna cecha, gdyż program napisany w tym języku można uruchomić bez jakichkolwiek modyfikacji w systemach Windows i Linux oraz mobilnych wersjach systemów operacyjnych na telefonach komórkowych. Python jest też w pełni otwarty, dzięki czemu ma bardzo dużą społeczność, która go rozwija. Oferta dostępnych bibliotek do Pythona jest ogromna, co zdecydowanie ułatwia pracę. Rozwiązanie większości problemów w języku ANSI C zajmowało 1-2 strony kodu, natomiast w Pythonie ogranicza się do 2-4 linii kodu. Przyspiesza to pracę i znacznie niweluje prawdopodobieństwo popełnienia błędu. Oprócz zalet, Python ma też wady. Główną wadą jest prędkość jego działania. Ze względu na skryptowy charakter języka, kod programu jest kompilowany w locie. Znacznie ułatwia to proces tworzenia aplikacji, ale również spowalnia samą szybkość działania programu. W niektórych zastosowaniach jego prędkość jest nawet 20-krotnie mniejsza niż ANSI C. W celu ominięcia tego problemu często krytyczne części algorytmów implementuje się w innych językach, aby później móc zaimportować je z powrotem do Pythona. Dzięki takiemu zabiegowi te różnice praktycznie się zacierają. 668 MECHANIK 7/2013 XVII Międzynarodowa Szkoła Komputerowego Wspomagania Projektowania, Wytwarzania i Eksploatacji Podsumowując, mimo niewielkich braków w wydajności, Python jest bardzo dobrym językiem do zastosowania w omawianym programie. Bardzo często mówi się, że jeden programista Pythona jest w stanie w ciągu miesiąca wykonać pracę porównywalną z pracą dwóch programistów C++ przez 6 miesięcy. Ma to przełożenie w rzeczywistości, nawet duże projekty w Pythonie można wykonać ze znacznie mniejszą ilością kodu źródłowego, a tym samym z mniejszym prawdopodobieństwem popełnienia błędu. 3. BIBLIOTEKA OPENCASCADE OpenCascade jest biblioteką wydaną i rozwijaną przez firmę OPEN CA-SCADE S.A.S. Służy do modelowania, wytwarzania, przeprowadzania obliczeń graficznych oraz wizualizacji obiektów 2D i 3D. Dzięki licznym zaletom jest ona wykorzystywana w wielu programach CAx m. in. FreeCAD (darmowy edytor CAD), czy w popularnym komercyjnym programie Autodesk. Całość biblioteki została wydana pod zmodyfikowaną licencją LGPL, co oznacza że: całość kodu biblioteki jest otwarta; w programie wykorzystującym daną bibliotekę musi zostać zamieszczona informacja o tym, że dana biblioteka została użyta; zabrania się modyfikacji i dystrybuowania zmienionej biblioteki bez zgody autorów. Bibliotekę wraz z jej kodem źródłowym można pobrać bezpłatnie ze strony producenta [3]. Prace nad jej rozwojem zaczęły się w 1990 roku i trwają do dziś. Ostatnia wersja została wydana w marcu bieżącego roku. Biblioteka jest dostępna dla języka C++, ale poprzez wrapery można korzystać z niej również w innych językach m.in. Python. Największą wadą omawianej biblioteki jest wielkość, gdyż tak duże biblioteki są najczęściej słabo opisane i trudne do nauki. Często całość dokumentacji danej metody ogranicza się do jednego lub dwóch zdań opisu parametrów, bez informacji o realizowanej funkcji. Ten fakt bardzo utrudnia wykorzystywanie danej biblioteki, szczególnie na samym początku jej nauki. 4. PRZYKŁAD WYKORZYSTANIA BIBLIOTEKI OCC W PYTHONIE W tej części opisany został przykład wykorzystania biblioteki OCC do implementacji wymagań postawionych na początku artykułu. Ze względu na ograniczenia objętościowe, nie opisano całości procesu implementacji, skupiając się na wybranych aspektach najlepiej opisujących zasady wykorzystania biblioteki OCC w Pythonie. Pierwszym wymaganiem stawianym rozważanemu programowi jest możliwość definiowania położenia WL oraz miejsca położenia i kierunku oddania strzału. W tym przypadku konieczne jest posiadanie dwóch obiektów: punktu i wektora. Oba te obiekty są dostarczane przez bibliotekę OCC. Są one tworzone za pomocą następujących funkcji: gp_Pnt i gp_Vec. Przykładowy program wykorzystujący dane funkcje można przedstawić następująco: from OCC.gp import * punkt_0 = gp_Pnt(0,0,0) punkt_1 = gp_Pnt(1,1,1) vector = gp_Vec(1,1,1) print punkt_0.Distance(punkt_1) punkt_0.Translate(vector) print punkt_0.Distance(punkt_1) 669 MECHANIK 7/2013 XVII Międzynarodowa Szkoła Komputerowego Wspomagania Projektowania, Wytwarzania i Eksploatacji W programie zdefiniowano dwa punkty: (0,0,0) i (1,1,1) oraz jeden wektor [1,1,1]. Dodatkowo zaprezentowano podstawowe metody, jakie posiada obiekt typu „punkt”: Distance – wyznaczanie odległości między dwoma punktami; Translate – przesunięcie punktu o zadany wektor. Kolejnym wymaganiem jest możliwość wyznaczenia zależności geometrycznych między falą uderzeniową i WL systemu. Do zadań związanych z ich wyznaczeniem należą m.in.: zdefiniowanie trajektorii lotu pocisku (prostej) oraz rzut prostopadły punktu lokalizacji WL na prostą. Biblioteka OCC dostarcza już gotowe funkcje, które rozwiązują dane zagadnienia. Przykładowy kod programu, który tworzy prostą na bazie dwóch punktów i rzutuje na nią, trzeci punkt jest następujący: from OCC.gp import * from OCC.GC import * from OCC.GeomAPI import * punkt_0 = gp_Pnt(0,0,0) punkt_1 = gp_Pnt(10,10,10) punkt_2 = gp_Pnt(5,5,10) prosta = GC_MakeSegment(punkt_0, punkt_1).Value() PPC = GeomAPI_ProjectPointOnCurve(punkt_2,prosta) punkt_na_prostej – PPC.NearestPoint() W przykładzie najpierw zaimportowano niezbędne moduły z biblioteki (gp, GC, GeomAPI), a następnie zdefiniowano trzy punkty. Na bazie dwóch pierwszych punktów za pomocą funkcji GC_MakeSegment został utworzony odcinek prostej. Możliwe jest również zdefiniowanie prostej na bazie punktu i wektora lub części wspólnej dwóch płaszczyzn. Następnie za pomocą funkcji GeomAPI_ProjectPointOnCurve wyznaczono rzut prostokątny punktu na prostą. Po wyznaczeniu wzajemnych zależności geometrycznych kolejnym etapem jest określenie trajektorii lotu pocisku. Podczas tego procesu krytyczną fazą jest ustalenie punktu przecięcia trzech płaszczyzn. Kod programu, który wyznacza taki punkt, można zapisać w następujący sposób: from OCC.gp import * from OCC.Utils.Common import * punkt_0 = gp_Pnt(0,0,0) punkt_1 = gp_Pnt(10,10,10) punkt_2 = gp_Pnt(5,5,10) dir_0 = gp_Dir(1,1,1) dir_1 = gp_Dir(1,-1,1) dir_2 = gp_Dir(-1,1,1) planePln_0 = gp_Pln(punkt_0, dir_0) planePln_1 = gp_Pln(punkt_1, dir_1) planePln_2 = gp_Pln(punkt_2, dir_2) pnt_0 = intersection_from_three_planes(planePln_0, planePln_1, planePln_2) Za pomocą funkcji: gp_Pnt i gp_Dir zostały zdefiniowane trzy punkty i trzy wektory jednostkowe. Następnie za pomocą funkcji gp_Pln zdefiniowano trzy płaszczyzny, a wykorzystując funkcję intersection_from_three_planes, wyznaczono punkt przecięcia tych płaszczyzn. Ostatnim wymaganiem, jakie zostało postawione programowi, jest możliwość wizualizacji wzajemnego położenia przestrzennego wszystkich obiektów. Dla przykładu posłużono się programem wyznaczającym punkt przecięcia trzech płaszczyzn, którego kod jest można zapisać w następujący sposób: 670 MECHANIK 7/2013 XVII Międzynarodowa Szkoła Komputerowego Wspomagania Projektowania, Wytwarzania i Eksploatacji from OCC.Display.SimpleGui import * from OCC.BRepPrimAPI import * from OCC.gp import * from OCC.Utils.Common import * display, start_display, add_menu, add_function_to_menu = init_display() punkt_0 = gp_Pnt(0,0,0) punkt_1 = gp_Pnt(10,10,10) punkt_2 = gp_Pnt(5,5,10) dir_0 = gp_Dir(1,1,1) dir_1 = gp_Dir(1,-1,1) dir_2 = gp_Dir(-1,1,1) planePln_0 = gp_Pln(punkt_0, dir_0) planePln_1 = gp_Pln(punkt_1, dir_1) planePln_2 = gp_Pln(punkt_2, dir_2) pnt_0 = intersection_from_three_planes(planePln_0, planePln_1, planePln_2) pi_2 = 3.14*2 circle_0 = BRepBuilderAPI_MakeEdge(gp_Circ(gp_Ax2(punkt_0, dir_0), 25), 0, pi_2).Shape() circle_1 = BRepBuilderAPI_MakeEdge(gp_Circ(gp_Ax2(punkt_1, dir_1), 25), 0, pi_2).Shape() circle_2 = BRepBuilderAPI_MakeEdge(gp_Circ(gp_Ax2(punkt_2, dir_2), 25), 0, pi_2).Shape() point = BRepPrimAPI_MakeSphere(pnt_0,1).Shape() display.DisplayShape((circle_0, circle_1, circle_2, point)) start_display() OCC ma wbudowany moduł tworzenia interfejsu użytkownika oraz wizualizacji. Służy do tego moduł Display.SimpleGui i metoda init_display. Metoda ta zwraca między innymi obiekt display, przez który można przekazywać obiekty do wyświetlenia. W przykładzie są to trzy okręgi i kula o promieniu równym 1 w miejscu położenia punktu przecięcia się płaszczyzn. Okno OCC ma już wbudowaną obsługę myszki, za pomocą której można przekręcać, przesuwać, powiększać i pomniejszać obraz. Wizualizację działania programu przedstawiono na rys. 1. Rys. 1. Wynik działania programu z dodaną wizualizacją OCC umożliwia tworzenie bardziej zaawansowanych interfejsów użytkownika, m.in. z wykorzystaniem dedykowanych bibliotek do ich tworzenia. Przykład wykorzystania OCC z modułem Qt został umieszczony na rys. 2. Jest to ostateczny wygląd stworzonego programu. 671 MECHANIK 7/2013 XVII Międzynarodowa Szkoła Komputerowego Wspomagania Projektowania, Wytwarzania i Eksploatacji Rys. 2. Wygląd programu wykorzystującego współpracę modułu Qt z OCC do tworzenia kompletnego interfejsu użytkownika 5. PODSUMOWANIE W powyższym opracowaniu zostało przedstawione wykorzystanie języka programowania Python i biblioteki OCC do wizualizacji i obliczeń graficznych na przykładzie rozwiązywania zagadnień związanych z modelowaniem właściwości zdecentralizowanego systemu lokalizacji miejsca wystrzału. Ze względu na ograniczone ramy objętościowe przedstawiono tylko wybrane aspekty, które charakteryzują wybrane zasady wykorzystania biblioteki OCC i Pythona. Praca finansowana ze środków na naukę jako projekt badawczo-rozwojowy realizowany w latach 2012-2015. LITERATURA [1] www.python.org [2] Pietrasieński J., Siergiejuk P.: Python w zastosowaniach naukowych, Mechanik, nr 7/2012, CD, s. 755-762. [3] www.opencscade.com 672