Technologie » Komputery
Programowanie w środowisku CAD
Co to jest CAD?
Słowo CAD wywodzi się z angielskiego „Computer Aided Design" czyli projektowanie wspomagane komputerowo.
Zamów artykuły sponsorowane na serwisie CentrumPR.pl w kilka minut, poprzez platformę Link Buildingu np.:
Programy CAD służą do tego aby ułatwić inżynierom takich branż jak budownictwo, mechanika, elektronika i pokrewne, sporządzanie dokumentacji technicznej niezbędnej przy wszelkiego rozdzaju projektach.
Przejście od rysowania na desce kreślarskiej do projektowania na komputerze było wielką rewolucją ponieważ przyspieszyło wielokrotnie ich pracę.
Programy CAD
Istnieje wiele programów CAD ale napopularniejszym programem na świecie jest Autocad firmy Autodesk.
Autocad umożliwia projektowanie w dwu i trzywymiarowym układzie współrzędnych oraz zapis rysunków do pliku DWG.
Pliki DWG są standardem zapisu dla aplikacji CAD. Niestety ze względu na to iż jest to zamknięty format binarny zastrzeżony przez Autodesk to do operacji na plikach DWG wymagane jest Autocad. Na szczęście można też wykorzystać łamiące monopol biblioteki programistyczne tworzone przez inne firmy np. Open Design Alliance (dawniej OpenDWG).
Na fali popularności programu powstaje wiele „klonów" programu Autocad, które zyskują część rynku bijąc go „na głowę" często podstawowym kryterium wyboru - ceną.
Takie programy to między innymi:
- ITC Intellicad - amerykańska wersja CAD'a z umożliwiająca rozpowszechniająca się w dużej mierze na sprzedaży licencji innym firmom. Dzięki temu powstaje wiele wersji językowych o różnych nazwach opartych na tym samym programie (np. ArCADia-Intellicad, progeCAD). ITC Intellicad oparty był do wersji 7 na bibiotece OpenDWG, od wersji 7 wprowadzono bibliotekę ODA Teigha do obsługi formatu DWG
- ZWCAD - początkowo był programem na licencji ITC Intellicada, ale ostatnio firma ZWSoft porzuciła to rozwiązanie wprowadzając na rynek własną wersję ZWCAD+, napisaną od podstaw na bazie biblioteki ODA Teigha z Open Design Alliance
- BricsCAD - program typu CAD popularny wśród polskich inżynierów
Wszystkie klony dążą do jak największej kompatybilności z Autocadem, tworzonymi przez niego plikami DWG (każda wersja Autocada ma pewne różnice w zapisie tych plików) oraz interfejsami programistycznymi.
Rozszerzanie funkcjonalności
Podstawowa wersja systemu (chodzi o Autocad'a bez rozszerzeń) może być używana przez każdego inżyniera dowolnej specjalności, ale największą siłą Autocada jest możliwość tworzenia oprogramowania specjalistyczne dla węższej grupy odbiorców.
Firma Autodesk wydała wiele specjalistycznych „nakładek" jak AutoCAD Electrical, AutoCAD Mechanical, Mechanical Desktop, Architectural Desktop, Civil Design, które do działania wymagają AutoCADa jako „silnika" zarządzającego ich pracą.
Oprócz tego udostępniła też wiele interfejsów programistycznych umożliwiających pisanie własnych rozszerzeń dla Autocada.
W trakcie wydawania nowych wersji programu zmieniały się też technologie programistyczne, jedne języki traciły na znaczeniu inne zyskiwały w związku z czym Autocad opracował cały zestaw interfejsów umozliwiających współpracę z nakładkami.
Opis poszczególnych interfejsów znajdą Państwo poniżej:
AutoLisp
Jest odmianą języka skryptowego Lisp zaadaptowaną na potrzeby Autocada w celu automatyzacji powtarzalnych działań i zwiększenia produktywności.
Na przykład obliczanie całkowitej długości wszystkich linii na rysunku - wyobraźcie sobie ile czasu zajęło by takie liczenie?
Dużą zaletą Autolisp'a jest to, że aby go używać nie trzeba mieć dużej wiedzy programistycznej. Nawet początkujący użytkownik Autocada może przy jego pomocy stworzyć prosty algorytm, który oszczędzi mu godziny lub dni pracy.
Dodatkową zaletą jest jego przenośność, jako że jego Autocad nie rozwijał go przenosząc swoją uwagę na kolejny język VisualLisp, to został on zaimplementowany w takiej samej formie w większości „klonów", tak więc aplikacja napisana w Autolispie równie dobrze powinna działać na Autocadzie co na Intellicadzie czy ZWCADZie.
AutoLisp posiada również wady dyskwalifikującego jako profesjonalny język pisania nakładek.
Ma dostęp jedynie do ograniczonej funkcjonalności Autocada.
Jest językiem skryptowym co z jednej strony można traktować jako zaletę (nie potrzeba żadnego specjalistycznego środowiska programistycznego), z drugiej zaś strony jest dużą wadą. Ponieważ język skryptowy jest interpretowany w trakcie wykonywania więc rozszerzenia w nim tworzone charkteryzują się wolnym działaniem.
Cały kod aplikacji pisanych w AutoLispie jest widoczny dla każdego kto otworzy pliki z kodem co stanowi duży minus przy programach komercyjnych, nikt nie chce żeby jego ciężka praca została wykorzystywana bezprawnie przez inne osoby.
Podsumowując AutoLisp stanowi raczej udogodnienie dla inżynierów pragnących przyśpieszyć nużące czynności niż jezyk umożliwiający pisanie aplikacji na sprzedaż.
Przykład kodu rysującego linię w AutoLisp:
(defun c:myline ()
(prompt "\nWybierz punkty aby narysować linię.")
(if (and (setq p1 (getpoint "\nPierwszy punkt linii."))
(setq p2 (getpoint p1 "\nDrugi punkt linii."))
)
(command "._line" p1 p2 "")
)
(princ)
)
(prompt "\nNapisz myline aby uruchomić funkcję.")
(princ)
VisualLisp
VisualLisp był zaprojektowany jako rozszerzenie funkcjonalności AutoLisp'a. Jego możliwości są o wiele potężniejsze w stosunku do AutoLisp'a,np. ma dostęp do modelu obiektu Autocada. Dodatkowo środowisko deweloperskie zostało zaimplementowane w samym Autocadzie więc nie trzeba już korzystać z zewnętrznych edytorów (w przeciwieństwie do AutoLispa).
Został on wprowadzony w wersji Autocad 14 jako płatny dodatek, który w wersji Autocad 200 został wprowadznoy na stałe. Jednak od tego czasu nie był zbytnio rozwijany przez Autodesk, który skupiał wysiłki na wydajniejszych interfejsach programistycznych.
VisualLisp jako kontynuacja AutoLisp'a powiela większość jego ograniczeń, w związku z czym też nadaje się do profesjonalnych zastosowań.
DCL
Przy okazji języków AutoLisp i VisualLisp nie sposób nie wspomnieć o jezyku DCL (Dialog Control Language), który za pomocą prostych znaczników umożliwiał budowanie okien dialogowych.
Jakkolwiek DCL ma bardzo ograniczone możliwości to bez tego języka obsługa programów „lispowych" możliwa była jedynie z linii poleceń Autocada.
Przykładowy kod napisany w DCL'u:
helloWorld : dialog {
label = "Okno hello world";
: text {
key = "hello world";
}
ok_only;
}
Taki kod zapisuje się w pliku z rozszerzeniem DCL a następnie wykonuję z pomocą „lispa":
(setq helloWorld (load_dialog "helloWorld.dcl"))
(new_dialog "helloWorld" helloWorld)
(start_dialog)
(unload_dialog helloWorld)
Widać, że kod DCL też jest formatem tekstowym w żaden sposób niezabezpieczonym.
VBA
Visual Basic for Application wywodzi się z języka Visual Basic firmy Microsoft i używany był w wielu różnych aplikacjach wliczając w to Autocada. W Autocadzie uzyskuje dostep do obiektów poprzez interfejs ActiveX.
ActiveX Automotion został wprowadzony do Autocada w tym samym czasie co VisualLisp.
Brak dalszego rozwoju VisualLisp'a można sobie tłumaczyć tym, że VBA miał nad nim przewagę w postaci wbudowanego mechanizmu do tworzenia okien dialogowych.
W roku 2007 Microsoft przestał wspierać Autodesk w dystrybucji tej technologii zachęcając twórców do korzystania z .Net API.
Autodesk kontunował nieautoryzowane przez Microsoft wsparcie do roku 2010, aktualnie w programie nie ma już środowiska deweloperskiego do VBA a język nie jest już rozwijany.
Konkludując, nie piszcie programów w VBA.
Przykład kodu VBA wstawiającego tekst do rysunku Autocada:
Sub AddTextExample()
Dim TextValue As String
TextValue = "Programowanie jest łatwe" 'tekst jaki zostanie wstawiony do rysunku Autocada
Dim Point(2) As Double 'współrzędne punktu wstawienia tekstu
Point(0) = 10 'Położenie na osi X
Point(1) = 20 'Położenie na osi Y
Point(2) = 0 'Położenie na osi Z
Dim TextHeight As Double 'zmienna określająca wysokość tekstu
TextHeight = 10 'ustawmy wysokość na 10
ThisDrawing.ModelSpace.AddText(MyString, Point, TextHeight) 'dodajemy tekst do rysunku
End Sub
ADS
Autocad Development System jest to zestaw bibliotek napisanych w języku C. Interfejs ten umożliwia umożliwiającym tworzenie aplikacji na Autocada w językach C oraz C++.
Do stworzenia nakładki przy wykorzystaniu ADS konieczne jest zewnętrzne środowisko programistyczne oraz wiedza z zakresu programowania.
W porównaniu do poprzednich technologii prędkość działania programów napisanych w języku C/C++ znacznie wzrasta, a możliwości tworzenia aplikacji są wręcz nieograniczone. Można nie tylko wstawiać parametryzowane bloki, ale również „podłączać" się pod pętle komunikatów Autocada czy nadpisywać domyślne działanie wbudowanych funkcji.
Dużym plusem tej technologii było do niedawna to, że większość „klonów" implementowała różne jej odmiany, większość funkcji pokrywała się - więc podczas pisania nakładki istniało bardzo duże prawdopodobieństwo, że bez większych problemów (osobna kompilacja z właściwymi dla wybranego CAD'a bibliotekami) progam zadziała na Autocadzie oraz Intellicadzie. Oczywiście i w „klonach" pojawiają się implementacje kolejnych interfejsów, ale mają one duże opóźnienie w stosunku do orginału firmy Autodesk.
Podstawową strukturą danych w ADS jest resbuf, który zawiera wiadomości na temat typu danych jakie są w nim zapisane, wartości zapisanych w postaci „union" oraz wskaźnika do następnego elementu resbuf (jeśli taki istnieje).
union ads_u_val {
ads_real rreal;
ads_real rpoint[3];
short rint;
char *rstring;
long rlname[2];
long rlong;
struct ads_binary rbinary;
};
struct resbuf {
struct resbuf *rbnext;
short restype;
union ads_u_val resval;
};
Dane zapisywane są w postaci łańcuchów resbuf'ów a obiekty tworzone w oparciu o specyfikację DXF (która też ulega modyfikacją wraz z wersjami Autocada).
Przykładowy kod wstawiający linię w ADS:
resbuf * entlist=ads_buildlist(RTDXF0, "line", // typ obiektu
8, "Warstwa", // Nazwa warstwy na której bedzie wstawiona linia
6, "dashdot", //typ linii: dashdot, continuous itd.
62, 0, // Numer koloru, wartości od 0 do 255
48, 1, //skala linii
10, p1, // punkt startowy linii
11, p2, // punkt końcowy linii
RTNONE);
ads_entmake(entlist); //wstawienie obiektu linia do rysunku
Możliwe jest także inny sposób tworzenia elementów - używanie wbudowanych komend Autocada.
Poniższy przykład wstawiania linii pomiędzy punktami p1 i p2.
ads_point p1 = {1.0, 1.0, 0.0}, p2 = {5.0, 5.0, 0.0};
ads_command(RTSTR, "._LINE", RT3DPOINT, p1, RT3DPOINT, p2, RTSTR, "", NULL);
Technologia ADS pomimo swoich niezaprzeczalnych zalet ustąpiła pola swojemu następcy - ObjectARX, który udostępnia programowanie w bardziej przystępny sposób i jest wydajniejszy.
ObjectARX
Autocad Runtime eXtension to API, stanowi kolejne stadium w rozszerzaniu funkcjonalności Autocada w jego skład wchodzi zestaw bibliotek i plików nagłówkowych dla języka C++. Całe SDK można pobrać za darmo ze stron firmy Autodesk.
ObjectARX jest najpotężniejszym ze wszystkich dostępnych interfejsów, zawiera w sobie wszystkie elementy dostępne w ADS i rozwija je o dodatkowe funkcjonalności.
Wydajność tej technologii jest taka sama jak wydajność własnych funkcji Autocada, może o tym stanowić też fakt, że Autodesk używa jej do tworzenia własnych rozszerzeń Autocada takich jak Autodesk MAP czy Architectural Desktop.
Oczywiście, depcząca Autocadowi po piętach konkurencja stara się umożliwić przenośność nakładek. Klony oparte na bibliotece DWGDirect z Open Design Alliance mają możliwość korzystania z API emulującego ObjectARX - DRX (np. Intellicad od wersji 7, poprzednie wersje implementowały jedynie ADS).
Niektórzy twierdzą, że ObjectARX jest najtrudniejszym interfejsem dla programisty chociaż ja jednak obstawiałbym, że łatwiejszy niż ADS. Jednakże aby rozpocząć z nim pracę wymagane jest wiedza z zakresu programowania w języku C++ oraz zewnętrzne środowisko programistyczne (np. Microsoft Visual Studio).
Przykład wstawiania linii do rysunku:
//Pobieramy aktualną bazę z aktywnego rysunku
AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();
//Teraz musimy pobrać właściwy kontener dla rysowanego obiektu
AcDbBlockTable *pBlockTable = NULL;
pDB->getSymbolTable(pBlockTable, AcDb::kForRead);
//Wewnątrz BlockTable otwieramy ModelSpace do zapisu
AcDbBlockTableRecord* pBlockTableRecord = NULL;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
//Jak już mamy pobrany wskaźnik do modelu możemy zamknąć tablicę bloków
pBlockTable->close();
//Teraz można stworzyć linię więc deklarujemy punkty linii
AcGePoint3d p1(1.0, 1.0, 0.0);
AcGePoint3d p2(10.0, 10.0, 0.0);
//Tworzymy instancje linii
AcDbLine *pLine = new AcDbLine(p1, p2);
//i wstawiamy ją we właściwe miejsce
AcDbObjectId lineId = AcDbObjectId::kNull;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
//Aby zakończyć operację należy po sobie posprzątać więc zamykamy ModelSpace i utworzony obiekt
pBlockTableRecord->close();
pLine->close();
.NET API
Kolejnym sposobem tworzenia nakłądek dla CAD'a jest .Net API.
Autodesk uczynił w ten sposób ukłon w stronę programistów korzystającej z .Net Framework. Teraz można tworzyć nakładki dla Autocada korzystając z języka C# lub VB.NET korzystając z wszelkich udogodnień dostępnych dla tych technologii - takich jak dużo łatwiejsza komunikacja z programami z serii Microsoft Office czy proste tworzenie niestandardowych okien dialogowych przy użyciu technologii WPF.
Jeżeli chodzi o wydajność to .Net API jest interfejsem przekazującym dane z bibliotek ObjectARX do .Net Framework więc prędkość jest nieznacznie mniejsza niż w ObjectARX. Jednak wydaję mi się, że możliwości platformy .Net dobrze rekompensują tę stratę.
Podobnie jak z poprzednimi technologiami tak i tutaj konkurencja nie próżnuję i oczywiście Open Design Alliance wprowadziło bibliotekę Teigha.Net, jednak w tym wypadku nie sprawdzałem przeności kodu pomiędzy tymi platfomami.
Standardowo kod wstawiający linię:
//Atrybut określający, że jest to funkcja która jest komendą, czyli może być wywołana z linii poleceń
[CommandMethod("AddLine")]
public static void AddLine()
{
//Pobieramy aktualny dokument i jego bazę danych
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
// Tworzymy transakcję
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
//Pobieramy BlockTable
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
//Otwieramy ModelSpace w trybie zapisu
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
//Tworzymy instancję linii na podstawie 2 punktów
Line acLine = new Line(new Point3d(1, 1, 0), new Point3d(10, 10, 0));
acLine.SetDatabaseDefaults();
//Dodajemy nowy obiekt do ModelSpace i transakcji
acBlkTblRec.AppendEntity(acLine);
acTrans.AddNewlyCreatedDBObject(acLine, true);
//Wysyłamy dane do zapisu w bazie
acTrans.Commit();
}
}
Podsumowanie
Ciągle rosnąca liczba projektantów korzystających z programów CAD oraz wielkie pieniądze inwestowane rozwój budownictwa czy energetykę wpływają na zwiększenie popytu rozszerzeń dla platfomy CAD.
Nakładki Autocada nie zapełniają całego rynku ponieważ są bardzo rozbudowane (co nie każdemu pasuje) i nie dostosowane do norm technicznych obowiązujących w różnych krajach.
Ciekawą niszą w tej materii są też programy narzędziowe wydawane przez firmy produkujące elementy konieczne do realizacji projektów, umożliwiające korzystanie z dedykowanych baz elementów zawierających obiekty danej firmy.
Warto więc zastanowić się nad zgłębieniem technologii udostepnionych przez firmę Autodesk.
Do tworzenia komercyjnych programów opartych na CAD'zie najbardziej elastyczna wydaję mi się technologia ObjectARX. Przenośność kodu programu między Autocadem a klonami jest dość istotna gdyż cena Autocada oscyluje w granicach kilkunastu tysięcy natomiast jego klony kosztują około 2-3 tysięcy złotych co jest dość znaczącą różnicą dla projektantów. Trzeba tu wspomnieć o tym, że najtańsza wersja Autocada - Autocad LT nie wspiera rozszerzeń.
Jeżeli interesuje Was efektowny wygląd programu i głównie "mainstream cadowy" czyli AutoCAD to polecam .Net API.
Oczywiście dobrym wyjściem przy tworzeniu programów dla CAD jest skorzystanie z usług profesjonalisty.
Ekspert programowania CAD
Radosław Dąbrowicz
Komentarze (0)