INFORMATYKA TECHNICZNA Badanie możliwości wykorzystania interfejsu automatyzacji OLE w systemie CAx 1. WPROWADZENIE Program AutoCAD ma wielu użytkowników i zajmuje znaczące miejsce w graficznym zapisie konstrukcji. W programie AutoCAD istnieją możliwości programowania czynności związanych z obsługą danych, automatyzacją zadań grafiki, wykonywaniem i dzieleniem informacji o rysunku z innymi aplikacjami. Napisanie programu do realizacji szczegółowego zadania zwykle wymaga na początku większego nakładu pracy, jednak wysiłek ten przy późniejszym wielokrotnym wykorzystaniu napisanego programu jest opłacalny. Pisanie aplikacji dla programu AutoCAD w środowisku Windows jest możliwe za pomocą wbudowanych w niego narzędzi programistycznych (np. środowisko programowania VisualLisp oparte na języku AutoLisp) i języków programowania ogólnego zastosowania (Delphi czy C++). 2. INTERFEJS AUTOMATYZACJI OLE Automatyzacja zadań grafiki możliwa jest między innymi za pomocą wykorzystania interfejsu automatyzacji OLE. Przez pojęcie automatyzacji OLE (OLE Automation) definiuje się możliwość programowego sterowania obiektami innego programu oraz protokół, za pomocą którego dany program może uzyskać dostęp do obiektu znajdującego się w innym programie. Automatyzacja zatem umożliwia sterowanie jedną lub wieloma aplikacjami przy użyciu innych aplikacji. Aplikację sterowaną nazywa się serwerem ze względu na to, że to ona udostępnia obiekty automatyzacji OLE. Natomiast aplikację sterującą, wykorzystującą obiekty aplikacji sterowanej, nazywa się klientem. 2.1. Zasady automatyzacji OLE ActiveX Automation używana jest w programie AutoCAD dla określenia automatyzacji OLE. Przy wykorzystaniu technologii ActiveX można tworzyć i oddziaływać na obiekty programu AutoCAD z innej aplikacji, działającej jako sterownik Automatyzacji. Oznacza to, że mechanizm ActiveX umożliwia programowanie zadań wykorzystujących różne aplikacje. Przy jej wykorzystaniu AutoCAD prezentuje obiekty programowalne, opisane przez AutoCAD jako Object Model, które mogą być tworzone, edytowane i poddawane różnym operacjom przez inne aplikacje. Tak utworzone obiekty są nazywane obiektami automatyzacji. Obiekty te są obsługiwane przez tzw. metody, właściwości i zdarzenia. Metody są funkcjami, które określają działanie na obiekcie. Właściwości zaś są funkcjami, które ustalają lub odczytują informacje o stanie obiektu. Zdarzenia są zdefiniowanymi przez użytkownika operacjami lub wystąpieniami, na które program reaguje. Każda aplikacja mająca dostęp do AutoCAD Object Model jest sterownikiem automatyzacji. 2.2. Interfejs automatyzacji OLE programu AutoCAD Za pomocą interfejsu automatyzacji OLE, określanego w programie AutoCAD jako ActiveX Automation, można uzyskać dostęp do poszczególnych obiektów programu AutoCAD. Struktura obiektów interfejsu automatyzacji OLE jest bardzo rozbudowana. Obiektami są między innymi elementy rysunkowe, bloki, kolekcje obiektów (zbiory obiektów) itp. Dostęp do nich można uzyskać za pomocą interfejsu automatyzacji OLE. Głównym obiektem interfejsu jest AutoCAD.Application, do którego przynależą pozostałe
obiekty. Najczęściej używanym przy pracach nad rysunkiem jest obiekt typu Document (w programie AutoCAD jest to aktywne okno z rysunkiem), do którego przynależą między innymi obiekty generujące składniki rysunku oraz ustawienia aktualnego rysunku. Innym bardzo ważnym obiektem jest obiekt Model Space, który jest kolekcją wszystkich elementów w przestrzeni modelu. Nowe obiekty do tej kolekcji można dodawać za pomocą metody AddTypSkładnika. 2.3. Nawiązanie połączenia z serwerem OLE Aby można było korzystać z metod i obiektów interfejsu, używając programu zewnętrznego, niezbędne jest nawiązanie połączenia z serwerem OLE programu AutoCAD 2009. Można to zrealizować za pomocą wywołania funkcji CreateOleObject, która tworzy obiekt udostępniający obiekty programu AutoCAD. Z programu zewnętrznego można uzyskać dostęp do aktualnie otwartego rysunku (otwartego dokumentu) za pomocą funkcji GetOleObject, która udostępnia obiekty aktywnego programu. Uzyskanie połączenia z serwerem OLE dla programów pisanych w Delphi przedstawiono w module PolaczAutoCAD [1]. W module tym procedura PolaczZACAD pozwala uzyskać dostęp do uruchomionego obiektu aplikacji. Zmodyfikowany kod modułu PolaczAutoCAD, który umożliwia dostęp do interfejsu automatyzacji w wersjach 2000, 2002, 2004, 2006, 2007, 2008, 2009 i 2010 programu AutoCAD, przedstawia się następująco:
Rys. 1. Kod modułu PolaczAutoCAD 2.4 Generowanie podstawowych elementów z wykorzystaniem automatyzacji OLE Pierwszy przykład automatyzacji dotyczył będzie wprowadzania w obszarze modelu programu AutoCAD sinusoidy oraz funkcji f(x)= 0.001x2 0.36x+125. Działanie programu pokazane jest na rysunku nr 2, natomiast kody procedur wprowadzających krzywizny w postaci obiektów typu polilinia w programie AutoCAD pokazano na rysunku nr 3 i 4. Rys. 2. Działanie programu AutoCAD SINUS [3]
Rys. 3. Kod procedury wprowadzającej funkcję sinus Rys. 4. Kod procedury wprowadzającej funkcję f(x) Powyższe dwie procedury powodują wprowadzenie w obszarze modelu obiektów typu polilinia. Działają one podobnie, po pierwsze deklarowane są jako typ OLEVariant zmienne pomocnicze definiujące wprowadzane krzywizny i ich węzły (Polilinia_Zarys, Wezel), następnie do pustej polilinii dodawane są nowe węzły według wcześniejszych założeń. 3. JĘZYK AutoLISP i ŚRODOWISKO VisualLISP AutoLISP jest specjalną odmianą języka programowania LISP pracującą w środowisku AutoCADa. W pełnej wersji dołączony został w AutoCadzie 2.18 (Release 6), i od tego czasu możliwości programu i języka są rozszerzane, dodawane są nowe funkcje i rozszerzane stare.
AutoLISP operuje w arytmetyce liczb rzeczywistych, potrafi przetwarzać zmienne liczbowe, tekstowe i listy, obsługiwać pliki i rysować obiekty używając do tego interpretera graficznego AutoCADa. Ogromną zaletą AutoLISPu jest możliwość pisania skryptów rysujących obiekty parametryczne np. na podstawie wyników z bazy danych czy plików tekstowych [2]. W AutoLISPie możemy wykorzystywać komendy AutoCADa, modyfikować już istniejące, tworzyć własne komendy, a także pisać funkcje, które będzie można wywoływać tak jak komendy AutoCADa. Dzięki temu mamy możliwość dostosowania AutoCADa do własnych potrzeb i możliwości. Ponadto AutoLISP pozwala na automatyzację wielokrotnego powtarzania rysowanych elementów, dzięki czemu zwiększa się wydajność i spójność projektów. Niewątpliwą zaletą AutoLISPu jest możliwość sprawdzenia pisanego programu w linii poleceń, co pozwala na bieżąco wprowadzać ewentualne poprawki. Ważną cechą AutoLISPu jest to, że programy napisane dla starszych wersji AutoCADa, będą działały w nowszych wersjach, bez żadnych lub z niewielkimi zmianami. Do pisania programów w języku AutoLISP wystarczy zwykły edytor tekstowy. Do AutoCADa dołączony jest jednak bardzo wygodny edytor Visual LISP, który ma własny edytor i kompilator oraz posiada narzędzia służące do debugowania i podglądania wartości zmiennych. Ułatwiają one np. znajdowanie brakujących nawiasów czy znajdowanie ewentualnych błędów.
Rys. 5. Wybrane elementy środowiska VisualLISP Język programowania AutoLISP i środowisko VisualLISP programu AutoCAD zostały wykorzystane do opracowania przykładowej nowej komendy sinus, która umożliwia automatyczne wprowadzenie w obszarze modelu sinusoidy składającej się z obiektów typu punkt i typu blok. Kod programu Sin_XY.LSP przedstawiony jest poniżej. Rys. 6. Kod programu wprowadzającego funkcję sinus (AutoLISP)
Powyższy program działa w następujący sposób: - po pierwsze tworzona jest nowa komenda programu AutoCAD sinus, która nie posiada żadnych parametrów wejściowych, - zmienna systemowa cmdecho odpowiadająca za wyświetlanie komunikatów programu AutoCAD w linii poleceń jest ustawiana na wartość równą 0 spowoduje to brak wyświetlania historii poleceń w trakcie działania programu, - pod wartość zmiennej pomocniczej STL odczytywane są bieżące ustawienia sposobu naprowadzania na punkty charakterystyczne obiektów (wartość zmiennej osmode ), - zmienna systemowa attdia odpowiadająca za tryb wprowadzania bloków z atrybutami ustawiana jest na wartość 1 spowoduje to że ewentualne wartości atrybutów bloków wprowadzane byłyby z poziomu okna dialogowego a nie z linii poleceń, - zmienna systemowa osmode ustawiane jest na wartość 16384 co spowoduje wyłączenie naprowadzania na stałe tryby lokalizacji obiektów, - dwie następne linie to deklaracja pustych list (DANE_X i DANE_Y), - dwie następne pętle repeat to wprowadzenie do listy DANE_X macierzy danych od 359 do 0, natomiast do listy DANE_Y wartości funkcji sinus o amplitudzie równej 100, - następnie następuje odwrócenie kolejności list (spowodowane jest to tym iż funkcja cons dodawała do list DANE_X i DANE_Y obiekty na początku listy), - ostatnia pętla programu powoduje wprowadzenie trajektorii sinusoidy w postaci punktów oraz wcześniej zdefiniowanego bloku o nazwie a.dwg (przykładowej geometrii z kątem obrotu od 0 do 359 stopni), - ostatnia operacja powoduje przywrócenie wartości początkowych zmiennym cmdecho i osmode. Działanie powyższego programu przedstawione jest na poniższym rysunku. Rys. 7. Działanie programu wprowadzającego funkcję sinus (w kółku wprowadzono powiększony symbol bloku który jest wprowadzany w punktach trajektorii sinusoidy) 3. ZADANIA DO WYKONANIA W RAMACH ĆWICZENIA LABORATORYJNEGO 1. Za pomocą języka programowania AutoLISP i środowiska VisualLISP programu AutoCAD opracować nową komendę sinus. 2. Wykonać analizę czasu działania programów wykorzystujących interfejs automatyzacji OLE na podstawie przykładowych programów przekazanych przez prowadzącego zajęcia.
4. PODSUMOWANIE Do uzyskiwania dostępów do obiektów OLE serwera automatyzacji (programu AutoCAD) służą interfejsy zwane interfejsami automatyzacji OLE. Interfejs automatyzacji OLE udostępnia obiekty rysunkowe, elementy informacyjne, dokumenty, konfiguracje użytkowników i inne elementy programu AutoCAD. Przy pracy z programem AutoCAD można wykorzystać następujące interfejsy automatyzacji: ActiveX Automation, VBA (Visual Basic for Applications), język AutoLISP i środowisko programowania Visual LISP, ObjectARX,.NET. Wybór konkretnego interfejsu uzależniony jest od zadania który ma inżynier czy programista rozwiązać. W przypadku wprowadzania w obszarze modelu obiektów bez wykorzystania wyrafinowanych okien dialogowych czy skomplikowanego interfejsu można wykorzystać język AutoLISP, natomiast w przypadku budowania skomplikowanych aplikacji zalecane jest wykorzystanie interfejsu typu klient-serwer. LITERATURA [1] Czyżyk W., Lisowski E.: Automatyzacja zadań grafiki za pomocą Delphi. Helion 2002. [2] Dudek M.: AutoLISP. Praktyczny kurs. Helion 1997. [3] Warchulski J., Warchulski M.: Program AutoCAD - SINUS, Wojskowa Akademia Techniczna, Warszawa 2010. ZAŁĄCZNIK [1] Jacek Warchulski, Marcin Warchulski, Kod modułu PolaczAutoCAD.pas, Wojskowa Akademia Techniczna, Warszawa, 2012.