wykorzystanie języka programowania python i biblioteki

advertisement
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
Download