AutoCAD... AutoLISP... VisualLISP...

  [26] Nie tylko command...

index  

  Tworzenie elementów graficznych w rysunku AutoCAD-a przy pomocy AutuLISP-a może być wykonywane na trzy sposoby:
  • wywołując funkcję command z argumentami bedącymi odpowiednimi wywołaniami polecenia AutoCAD-a
  • wywołując funkcję entmake z argumentem w postaci listy kodow DXF elementu
  • wywolując funkcję vla-add... bedącą metodą ActiveX z odpowiednimi argumentami.
Można zadać pytanie - ktory z tych sposobów jest najlepszy? Postaram sie w możliwie skrócony sposób dokonać porownania tych trzech sposobów - będzie to próba odpowiedzi na to pytanie.

command

W środowisku "lispowych wyjadaczy" używanie command jest trakowane jako działanie "mało lispowe" oraz widziane jest jako przejaw nieznajomości rzeczy, zarezerwowany dla początkujących. Trudno nie zgodzic sie z tą opinią, głównie z nastepujących powodow:
  • używanie command nie jest właściwie programowaniem a jedynie pisaniem troche bardziej skomplikowanych skryptow.
  • command ograniczony jest tylko do działań możliwych w ramach opcji polecenia.
  • składnia poleceń może zmieniać się w różnych wersjach AutoCAD-a, przez co zapewnienie zgodności wykonywania działań, nie jest całkowicie zapewniona.
  • cześć poleceń wykorzystujących okna dialogowe, utrudnia, a czasem uniemożliwia zastosowanie jako funkcji command.
  • wykorzystywanie command wymaga wprowadzenia dodatkowych czynności (wyłączenie trybow lokalizacji, echa linii polecen, itp.)
  • wywolanie command jest możliwe dla działań tylko w aktywnym obszarze.
Pomimo powyżej wymienionych wad, stosowanie command usprawiedliwione jest w wielu przypadkach:
  • wykonanie działania nie jest możliwe (lub jest bardzo utrudnione) innymi sposobami.
  • w fazie testowania innych niż rysujące zadań programu, z założeniem zastąpienia command innym wyrażeniem w przyszłości.
Warto przejrzeć przykładowe (a nawet standardowe) programy lispowe AutoCAD-a, widac w nich ze nawet programiści Autodesku nie stronią od uzywania command.

»  entmake

Jeszcze przed pojawieniem sie Visual LISP-a, funkcja entmake byla jedynym alternatywnym do command sposobem tworzenia elementow rysunku w AutoLISP-ie. Przez fakt ingerowania bezpośrednio w rysunkową baze danych, znacznie szybsza od command. W skrócie działanie entmake sprowadza sie do wywołania funkcji z argumentem w postaci listy par kropkowych kodow DXF rysowanego obiektu. Część kodow i wartości z nimi związanych dodaje automatycznie AutoCAD (ename, handle, wartości opcjonalne (niewymagane - trakowane jako domyślne)). Entmake ignoruje tryby lokalizacji i nie wyświetla w linii poleceń żadnych zgłoszeń. Wymaga znajomości struktury DXF rysunku i z tego powodu, używanie jej uważane jest za wyższy stopień lispowego wtajemniczenia. Dodatkowe zalety entmake to:
  • mozliwość tworzenia obiektow niedostepnych z command (np. bloki anonimowe (BLOCK), ich wstawienia (INSERT)).
  • tworzenie obiektow w innym obszarze niż aktualny.
  • obiekty mogą być tworzone w dowolnym układzie współrzędnych.
  • tworzenie obiektow już (od razu) z pewnymi cechami (kolor, rodzlin, warstwa itp.)
Pewne ograniczenia entmak'e, utrudniają (a czasem uniemożliwiają) jego wykorzystanie (tworzenie skomplikowanych kreskowań, regionów, brył, rzutni obszaru papieru itp.)

»  activeX

Wraz z pojawieniem sie VBA dla AutoCAD-a, stworzony model obiektów AutoCAD-a, oraz umożliwienie dostepu do niego z poziomu Visual LISP-a, to nastepny (przełomowy?) krok w programowaniu AutoCAD-a. Wykorzystywanie metod służących do tworzenia obiektow rysunkowych, jest teraz łatwiejsze niż entmake'm, bardziej elastyczne niż command'em, dodatkowo posiada nastepujące mozliwości:
  • tworzenie obiektów w dowolnym obszarze (model, papier, definicja bloku) rysunku
  • obiekty mogą być sytuowane w dowolnym układzie współrzędnych
  • przez ObjectDBX dostęp do rysunkowej bazy danych, innych rysunków (niekoniecznie otwartych)
  • obiekty mogą być tworzone podczas aktywności okna dialogowego (dcl)
Ze wzgledu na hierarchiczność obiektowego modelu rysunku AutoCAD-a, stosowanie metod tworzących obiekty, wymaga zrozumienia budowy tego modelu, przez co wydawać się może ono trudniejsze niż stosowanie entmake'a czy command. Rownocześnie wymaga umiejetności przekształcania typow danych

»  kiedy i co stosować?

Pierwszym i najważniejszym kryterium przy doborze techniki tworzenia obiektu rysunkowego za pomocą AutoLISP-a, są możliwości jakimi dysponuje programujący. Oczywistym jest ze początkujący użytkownik, nawet posługując się najprostszą techniką (command), napotka i tak dużo problemow z napisaniem bezbłędnie dzialającego programu (zobacz: pułapki command). Bez podstawowej wiedzy na temat struktury formatu DXF, opanowania technik manipulacji na listach, nie jest możliwe wykorzystywanie entmake'a. Podobnie rzecz ma sie ze stosowaniem techniki ActiveX.
Drugim (po spełnieniu pierwszego) kryterium wyboru jest określenie możliwości programu. W wiekszości (najprostszych) zastosowań, te same zadania mogą być realizowane zamiennie przez command, entmake czy metody AciveX. Jednak w szczegolnych przypadkach, wykorzystuje się techniki ktore w ogóle mogą zrealizowac to zadanie, mogą je wykonać najlepiej (najefektywniej, najszybciej...), i jednocześnie są skonstruowane tak aby zbudowac jak najmniej skomplikowany kod programu. Innymi słowy należy wykorzystywać wszystko to co daje najlepszy rezultat.
Przykladowo:
Prezentowany tutaj program rysujący strzałki (Strzałka), musiał spełnić warunek rysowania (rodzaj strzałki, położenie końca i początku, wielkości), zmiany cech (kolor) podczas aktywności okna dialogowego (aby uzytkownik mógł wykonać zmiany i obserwować rezultat zmian). Warunek ten mógł zostać spełniony tylko przy wykorzystaniu techniki opartej na ActiveX. Zarowno tworzenie, jak tez zmiana geomerii (tutaj polilinii) i koloru, było by możliwe przy zastosowaniu entmake (+ entmod), (nie mowiąc już o command) dopiero po zamknięciu okna. Podobnie inny program: (Elipsa jako plinia) - wykorzystuje (command "_DXFOUT" ...), po to wlaśnie aby nie pisać (przeciez jak najbardziej możliwe) programu rysującego elipsę skladającą się z kilkuset łukowych segmentow.