Bảng các biến trạng thái (header variables) : Các biến biểu diễn trạng thái hiện thời của bản vẽ như ELEVATION, FILLMODE, LIMMIN
+ Các bảng ký hiệu (symbol tables): trong một bản vẽ luôn có 9 bảng ký hiệu
+ Các dictionary (từ điển) : Trong từ điển gốc (named object dictionary), AutoCAD cho phép các chương trình ứng dụng định nghĩa các bảng ký hiệu khác ngoài các bảng do AutoCAD định nghĩa trước.
+Hai bảng chứa entity (MODEL _SPACE và PAPER _SPACE):
Bảng MODEL_SPACE chứa các entity nằm trong không gian mô hình (model space) của bản vẽ
Các entity của không gian giấy vẽ (paper space) được chứa trong bảng PAPER_SPACE
38 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 452 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng AutoCad - Vũ Văn Thiên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
08 September 2021ObjectARX1Vũ Văn ThiênCơ điện tử 1_K50Tổng Quan về AutoCad Phần mềm Cad đầu tiên là Sketchpad xuất hiện vào năm 1962 được viết bởi Ivan Sutherland thuộc trường kĩ thuật Massachsetts.Chức năng:Thiết kế các bản vẽ hai chiều Thiết kế các bản vẽ 3D Đặc điểm nổi bật:Chính xácNăng suất caoTrao đổi dữ liệu với phần mềm khác08 September 2021ObjectARX2Vũ Văn ThiênCơ điện tử 1_K50Các ngôn ngữ phát triển trên AutoCadAutoLISP : (LISt Processing :ngôn ngữ xử lý danh sách) Lập trình viên có thể mở rộng tính năng của AutoCAD bằng cách viết các lệnh của chính họADS (AutoCAD Development System) : từ AutoCAD R 10, do AutoLISP không áp ứng được tốc độ cao. Một chương trình ADS thực chất là một file khả thi (executable) chứa các hàm định nghĩa theo một quy tắc nhất định để có thể gọi từ trong AutoCAD.ADSRX (RX : Runtime Extension) : từ AutoCAD R13, nhằm tăng khả năng giao tiếp với AutoCadMột chương trình ADSRX là một thư viện liên kết động (DLL) chứa các hàm có thể thực hiện từ trong AutoCAD08 September 2021ObjectARX3Vũ Văn ThiênCơ điện tử 1_K50Các ngôn ngữ phát triển trên AutoCadObjectARX : (Mở rộng hướng đối tượng của thư viện ARX) xuất hiện cùng AutoCAD R14. Thay vì cung cấp một thư viện các hàm như trong ARX, giờ đây một thư viện các lớp đối tượng tương ứng với các đối tượng (object) trong bản vẽ AutoCAD cho phép thao tác dể dàng hơn rất nhiều. Do đó các chương ứng dụng có thể dễ quản lý và chạy ổn định hơnVBA :Từ phiên bản R14, cho phép phát triển ứng dụng AutoCAD bằng Visual Basic for Application. Nhờ đó một đội ngũ rất lớn các lập trình viên Basic cùng với hiểu biết về môi trường AutoCADcó thể phát triển các ứng dụng phục vụ thiết kế kỹ thuậtVisualLISP : từ AutoCAD R14. Ngoài những cải tiến về ngôn ngữ so với AutoLISP, VisualLISP còn cung cấp một môi trương phát triển (IDE : Intergrated Development Environment) hoàn chỉnh, cho phép soạn thảo , chạy thử , gỡ rối và dịch chương trình LISP dễ dàng hơn08 September 2021ObjectARX4Vũ Văn ThiênCơ điện tử 1_K50Phân loại các ngôn ngữ lập trình API phát triển AutoCAD thông dịch (interpreted)biên dịch (compiled) AutoLISP, VBA và VisualLISPADS, ADS/ARX và ObjectARX08 September 2021ObjectARX5Vũ Văn ThiênCơ điện tử 1_K50ObjectARX là gì ?ObjectARX là một thư viện lập trình ứng dụng hướng đối tượng cho môi trường AutoCAD Phục vụ các hầu hết các nhu cầu cần thiết để phát triển AutoCAD :Truy cập tới cơ sở dữ liệu bản vẽTương tác với AutoCad EditorTạo giao diện người dùng sử dụng MFCĐịnh nghĩa đối tượng mới (Custom Objects)Tương tác môi trường lập trình khác .....08 September 2021ObjectARX6Vũ Văn ThiênCơ điện tử 1_K50Yêu cầu khi lập trình ObjectARXChương trình AutoCad: Thao tác tạo ra bản vẽ,hiểu cấu trúc dữ liệu bản vẽ...Kỹ thuật lập trình hướng đối tượng và môi trương Visual C++Kỹ thuật lập trình ứng dụng trên Microsoft Windows với MFC(Microsoft Foundation Class) bởi chương trình ARX thực chất là một thư viện liên kết động (DLL) trong các hệ điều hành Windows 32-bit. Lập trình viên phải nắm vững các khái niệm quan trọng của lập trình hướng đối tượng như kế thừa (inheritance) , đóng gói dữ liệu (data encapsulation) , đa hình (polymorphism), hàm ảo(virtual function) ...Ðồng thời phải nắm được các thức tạo và thay đổi thiết lập các project trong môi trường Visual C++ , các thao tác soạn thảo , biên dịch, gỡ rối các chương trình ...08 September 2021ObjectARX7Vũ Văn ThiênCơ điện tử 1_K50Cài đặt ObjectARX1.AutoCAD 2.ObjectARX SDK 3.Microsoft Visual C++ .NET 4.ObjectARX Wizard Sử dụng ArxWizards.msi "\utils\ObjARXWiz\" AutoCAD 2000,2000i and 2002 (plus verticals): ObjectARX 2000 and Microsoft Visual C++ 6.0AutoCAD 2004, 2005 and 2006 (plus verticals): ObjectARX 2004 and Microsoft Visual C.NET 2002 (7.0)AutoCAD 2007, 2008 and 2009 (plus verticals): ObjectARX 2007 and Microsoft Visual C.NET 2005 (8.0)08 September 2021ObjectARX8Vũ Văn ThiênCơ điện tử 1_K50Cấu trúc thư viện ObjectARXThư viện ObjectARX gồm nhiều thư viện con khác nhau tuỳ theo yêu cầu lập trình :AcDb Các lớp cung cấp các thao tác truy cập cơ sở dữ liệu bản vẽ AutoCAD AcGi Thư viện các lớp đối tượng dùng để thể hiện đối tượng do người sử dụng định nghĩa (custom object)AcGe Các lớp tiện ích hình học và đại số : điểm, véc tơ , ma trận , biểu diễn đường cong, mặt cong ...AcRx Phục vụ đăng ký các lớp đối tượng mới, định kiểu khi chạy chương trình ...AcEd Dùng khi đăng ký các lệnh, xử lý các message của AutoCAD , xử lý transactionADS Thu viện các hàm C dựng trong các thao tác liên quan đến select đối tượng, nhập số liệu ...08 September 2021ObjectARX9Vũ Văn ThiênCơ điện tử 1_K50Cấu trúc một chương trình ObjectARXMột chương trình ObjectARX thực chất là một thư viện liên kế động trong đó có chứa một điểm nhập (entry point) tuân theo những quy tắc nhất định cho phép AutoCAD tương tác với chương trìnhTương tác giữa AutoCAD và ứng dụng ARX được thực hiện thông qua các message và entry point là nơi xử lý các message này.Entry point này đóng vai trò như hàm main() trong một chương trình C/C++ hay một Message Loop trong một chương trình ứng dụng WindowsEntryPointMessages Loop AutoCADObjectArx Modules08 September 2021ObjectARX10Vũ Văn ThiênCơ điện tử 1_K50Một số Messages của AutoCad08 September 2021ObjectARX11Vũ Văn ThiênCơ điện tử 1_K50Tạo một Project ObjectARX mớiBước 1:Khởi động VS 2005 và tạo một project mới như hình vẽBước 2: Chọn ứng dụng cần tạo là W32 Project08 September 2021ObjectARX12Vũ Văn ThiênCơ điện tử 1_K50Bước 3: Do ObjectArx thực chất là một DLL nên ở đây ta chọn DLL08 September 2021ObjectARX13Vũ Văn ThiênCơ điện tử 1_K50Bước 4: Cài đặt biên dịch+ Click vào tên Project chọn Properties + Chọn General >Addtional Include Directoris để thay đổi như hình08 September 2021ObjectARX14Vũ Văn ThiênCơ điện tử 1_K50+ Chọn Code General >Runtime Library để thay đổi như hình+ Chọn Linker > input>Addtional Dependencies"rxapi.lib acdb17.lib acge17.lib acad.lib acedapi.lib"08 September 2021ObjectARX15Vũ Văn ThiênCơ điện tử 1_K50+ Chuyển dịch từ *.dll sang *.arx để sau đó load vào AutocadBước 5: Thêm mã vào chương trình08 September 2021ObjectARX16Vũ Văn ThiênCơ điện tử 1_K50//Thêm các file Header#include "stdafx.h"#include #include //Đăng ký 2 hàmvoid initApp(); //Sẽ được gọi khi AutoCad load ứng dụngvoid unloadApp(); //Sẽ được gọi khi gỡ bỏ ứng dụng khỏi AutoCadvoid helloWorld(); //Hàm này thực hiện xuất hiện dòng chữ void initApp(){ // Đăng kí dòng lệnh trong AutoCadacedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"), _T("Hello"), _T("Bonjour"), ACRX_CMD_TRANSPARENT, helloWorld);}// Gỡ bỏ dòng lệnh khi thoát khỏi ứng dụngvoid unloadApp(){ acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));}void helloWorld(){ acutPrintf(_T("\nHello World!"));}08 September 2021ObjectARX17Vũ Văn ThiênCơ điện tử 1_K50extern "C" AcRx::AppRetCodeacrxEntryPoint(AcRx::AppMsgCode msg, void* pkt){ switch (msg){case AcRx::kInitAppMsg:acrxDynamicLinker->unlockApplication(pkt);acrxRegisterAppMDIAware(pkt);initApp(); //Ham khoi tao duoc goibreak;case AcRx::kUnloadAppMsg:unloadApp(); //Go bo ung dungbreak;default:break;}return AcRx::kRetOK;}Nhớ rằng ObjectARX là một ứng dụng DLL nên nó không có hàm main() là điểm vàoAutoCAD gọi hàm acrxEntryPoint() ,module ObjectArx để truyền thông điệp đến các ứng dụng08 September 2021ObjectARX18Vũ Văn ThiênCơ điện tử 1_K50Đưa Module vào trong AutoCadKhởi động AutoCadTrong Command Line gõ lệnh ap hoặc arxTa tìm đến thư mục chứa file module Objectarx(arx hoặc dbx) rồi click vào load08 September 2021ObjectARX19Vũ Văn ThiênCơ điện tử 1_K50ObjectARX Wizard Installing ObjectARX Wizard \utils\ObjARXWiz\ArxWizards.msiCreating an ObjectARX Project using Application Wizard Trong hộp thoại thêm Project mới củaVC++ .NET IDE tại nút "Visual C++" và chọn "ObjectARX". Click vào the template "ObjectARX/DBX/OMF Project"08 September 2021ObjectARX20Vũ Văn ThiênCơ điện tử 1_K50Đăng ký một lệnh dễ dàng hơn rất nhiều.Click vào a> ngay góc trên trái 08 September 2021ObjectARX21Vũ Văn ThiênCơ điện tử 1_K50Click OK.ObjectARX sẽ thêm những mã cần thiết trong file acrxEntryPoint.cpp để thực thi.Và ta vào đây để thêm mã .// ----- AsdkStep02._myInput command (do not rename)static void AsdkStep02_myInput(void){// Add your code for command AsdkStep02._myInput hereacutPrinf(_T(“Bat dau bàng ObjectArx Wizard”)) ;}// ----- AsdkStep02._mySelect command (do not rename)static void AsdkStep02_mySelect(void){// Add your code for command AsdkStep02._mySelect here}} ;//-----------------------------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CStep02App)ACED_ARXCOMMAND_ENTRY_AUTO(CStep02App, AsdkStep02, _mySelect, mySelect, ACRX_CMD_TRANSPARENT, NULL)ACED_ARXCOMMAND_ENTRY_AUTO(CStep02App, AsdkStep02, _myInput, myInput, ACRX_CMD_TRANSPARENT, NULL)Ví dụ ở đây ta thêm 2 lệnh là myInput và mySelect thì nó tự sinh đoạn mã sau: 08 September 2021ObjectARX22Vũ Văn ThiênCơ điện tử 1_K50Cơ sở dữ liệu của bản vẽ AutoCadBản vẽ AutoCAD là một cơ sở dữ liệu (CSDL) chứa các đối tượng tạo nên bản vẽ. Các đối tượng trong bản vẽ thuộc một trong hai loại sau :Entity (thực thể) : các đối tượng có thể hiện hình học, như các đối tượng LINE, CIRCLE, POLYLINENonentity (phi thực thể) : đối tượng kiểu đường (linetype), kiểu chữ (text style) hay lớp (layer) ... Cấu trúc cơ sở dữ liệu 08 September 2021ObjectARX23Vũ Văn ThiênCơ điện tử 1_K50DatabaseModelSpace TablePaperSpace TableEntitiesEntitiesDictionaryObjectsDictionaryDictionaryLayerTableLayer RecordsTextstyleTableTextstyle RecordsBlockTableBlockRecordsViewTableView Records9 Bảng ký hiệu08 September 2021ObjectARX24Vũ Văn ThiênCơ điện tử 1_K50Bảng các biến trạng thái (header variables) : Các biến biểu diễn trạng thái hiện thời của bản vẽ như ELEVATION, FILLMODE, LIMMIN + Các bảng ký hiệu (symbol tables): trong một bản vẽ luôn có 9 bảng ký hiệu + Các dictionary (từ điển) : Trong từ điển gốc (named object dictionary), AutoCAD cho phép các chương trình ứng dụng định nghĩa các bảng ký hiệu khác ngoài các bảng do AutoCAD định nghĩa trước.+Hai bảng chứa entity (MODEL _SPACE và PAPER _SPACE):Bảng MODEL_SPACE chứa các entity nằm trong không gian mô hình (model space) của bản vẽCác entity của không gian giấy vẽ (paper space) được chứa trong bảng PAPER_SPACE08 September 2021ObjectARX25Vũ Văn ThiênCơ điện tử 1_K50Tc có thể dùng tiện ích dbview.arx để xem database của bản vẽ AutoCadTrước khi vẽ LineSau khi vẽ Line08 September 2021ObjectARX26Vũ Văn ThiênCơ điện tử 1_K50 // create two points and the line AcGePoint3d startPt (1.0, 1.0, 0.0); AcGePoint3d endPt (10.0, 10.0, 0.0); AcDbLine* pLine = new AcDbLine (startPt, endPt); // open the proper entity container AcDbBlockTable* pBlock = NULL; AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase(); pDB->getSymbolTable(pBlock,AcDb::kForRead); AcDbBlockTableRecord* pBTR = NULL; pBlock->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite); pBlock->close(); // now, add the entity to container AcDbObjectId Id; pBTR->appendAcDbEntity(Id, pLine); pBTR->close(); pLine->close();08 September 2021ObjectARX27Vũ Văn ThiênCơ điện tử 1_K50Truy cập cơ sở dữ liệu1.Truy cập vào các biến trạng tháiKhi lấy được con trỏ tới đối tượng cơ sở dữ liệu một bản vẽ, có thể truy cập các biến trạng thái của bản vẽ bằng cách sử dụng các phương thức của lớp AcDbDatabase Adesk::Boolean fillmode() const;double elevation() const;AcGePoint2d limmin() const;Hay để thay đổi giá trịAcad::ErrorStatus setFillmode(Adesk::Boolean mode) ;Acad::ErrorStatus setElevation(double elev) ;Acad::ErrorStatus setLimmin(const AcGePoint2d& limmin) ;08 September 2021ObjectARX28Vũ Văn ThiênCơ điện tử 1_K50BảngTên lớp containerTên lớp IteratorBlock AcDbBlockTableAcDbBlockTableIteratorLayer AcDbLayerTableAcDbLayerTableIteratorText style AcDbTextStyleTableAcDbTextStyleTableIteratorLinetype AcDbLinetypeTableAcDbLinetypeTableIteratorView AcDbViewTableAcDbViewTableIteratorUCS AcDbUCSTableAcDbUCSTableIteratorViewport AcDbViewportTableAcDbViewportTableIteratorRegistered applications AcDbRegAppTableAcDbRegAppTableIteratorDimension stylesAcDbDimStyleTableAcDbDimStyleTableIterator2. Truy cập vào bảng ký hiệu(Symbol Table)Bảng ký hiệu trong cơ sở dữ liệu được biểu diễn tương ứng bằng các lớp và các bộ lặp dùng để truy cập sau3. Truy cập DictionaryDictionary (lớp AcDbDictionary) được truy cập thông qua các iterator (lớp AcDbDictionaryIterator)08 September 2021ObjectARX29Vũ Văn ThiênCơ điện tử 1_K50void iterateLinetypes(){ AcDbLinetypeTable *pLinetypeTbl; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pLinetypeTbl, AcDb::kForRead); // Create a new iterator that starts at table // beginning and skips deleted. // AcDbLinetypeTableIterator *pLtIterator; pLinetypeTbl->newIterator(pLtIterator); // Walk the table, getting every table record and // printing the linetype name. // AcDbLinetypeTableRecord *pLtTableRcd; const TCHAR *pLtName; for (; !pLtIterator->done(); pLtIterator->step()) { pLtIterator->getRecord(pLtTableRcd, AcDb::kForRead); pLtTableRcd->getName(pLtName); pLtTableRcd->close(); acutPrintf(_T("\nLinetype name is: %s"), pLtName); } delete pLtIterator; pLinetypeTbl->close();}08 September 2021ObjectARX30Vũ Văn ThiênCơ điện tử 1_K50Các đối tượng cơ sở dữ liệu (database objects)1.Đối tượng và IDTương tác với các đối tượng thì ta phải thông qua OBjectID của chúng.08 September 2021ObjectARX31Vũ Văn ThiênCơ điện tử 1_K502.Mở và đóng đối tượngAcad::ErrorStatus AcDbDatabase::acdbOpenObject(AcDbObject*& pObj, AcDbObjectId objId,AcDb::OpenMode mode,Adesk::Boolean openErasedObject = Adesk::kFalse)2.1.MởMột đối tượng có thể mở ở một trong các chế độ AcDb::kForRead : để đọc, không thay đổi thuộc tínhAcDb::kForWrite : để ghi, thay đổi thuộc tínhAcDb::kForNotify : để gửi message 2.1.Đóng đối tượngÐể đóng đối tượng , sử dụng phương thức close()pObj->close();Một đối tượng mở tối đa là 256 lần để đọc, tối đa là một lần để ghiEXLine08 September 2021ObjectARX32Vũ Văn ThiênCơ điện tử 1_K503.Xóa đối tượngMuốn xoá đối tượng, cần phải mở chúng ở chế độ kForWrite và gọi phương thức erase(). Chú ý là sau đó vẫn phải đóng đối tượngpObj->erase();pObj->close();4. Định kiểu thời gian chạy (Run-Time Type Identification - RTTI)Xác định kiểu của một đối tượng hay một biểu thức4.1.Xác định kiểu của một đối tượngdesc() : Trả về thông tin kiểu (descriptor object ) của đối tượngcast() : Ep một con trỏ đối tượng về một kiểu con trỏ nhất định. Nếu không đúng kiểu, trả về NULLisKindOf() : Kiểm tra một đối tượng có thuộc kiểu nhất định (hay các lớp kế thừa từ đó) hay khôngAcDbEntity* pEntity;acdbOpenAcDbEntity (pEntity, objId, AcDb::kForRead); //Mở đối tượng kiểu AcDbEntity tổng quátif (pEntity ->isKindOf(AcDbEllipse::desc())) //Nếu con trỏ đúng là thuộc kiểu AcDbEllipse *Acutprintf(_T(“Day la hinh Ellipse”));08 September 2021ObjectARX33Vũ Văn ThiênCơ điện tử 1_K504.2.Xác định kiểu C++ chuẩnThư viện C++ chuẩn (Standard C++ Library) cung cấp toán tử typeid để xác định kiểu của một đối tượng hau một biểu thức (expression) #include "typeinfo.h"class BigWorld // Kiểu tự định nghĩa{ double Area; int Population;};void CmdT4(){ double d; char c; int i; BigWorld world; ads_printf("\nType : %s", typeid(i).name()); ads_printf("\nType : %s", typeid(d*10/i).name()); ads_printf("\nType : %s", typeid(c).name()); ads_printf("\nType : %s", typeid(world).name());}Type : intType : doubleType : charType : class BigWorld08 September 2021ObjectARX34Vũ Văn ThiênCơ điện tử 1_K505.Dữ liệu bổ sungCác ứng dụng ObjectARX có thể gắn các dữ liệu của chúng vào các đối tượng của cơ sở dữ liệu bản vẽ AutoCAD bằng nhiều cách khác nhau5.1.Extended Data(Xdata)Xdata là một danh sách móc nối thuộc kiểu resbuf do các ứng dụng AutoCAD gắn vào các đối tượng của bản vẽunion ads_u_val { ads_real rreal; ads_real rpoint[3]; short rint; // Must be declared short, not int. char *rstring; long rlname[2]; long rlong; struct ads_binary rbinary; }; struct resbuf { struct resbuf *rbnext; // Linked list pointer short restype; union ads_u_val resval; }; 08 September 2021ObjectARX35Vũ Văn ThiênCơ điện tử 1_K505.1.Extension Dictionary Mỗi đối tượng trong cơ sở dữ liệu có thể có một extension Dictionary trong đó có thể chứa bất kỳ đối tượng kế thừa từ AcDbObject08 September 2021ObjectARX36Vũ Văn ThiênCơ điện tử 1_K50Thực thể (Entity)1.Định nghĩaLà các đối tượng CSDL có thể hiện hình học (graphical Object)2.Phân loạiCác Entity đơn giản là bản thân nó chứa đầy đủ thuộc tính của mìnhCác Entity phức tạp còn chứa thêm các tham chiếu đến đối tượng khác để định nghĩa dầy đủ đối tượng.Ví dụ: Đối tượng POLYLINE là một đối tương phức hợp vì nó tham chiếu đến các đối tượng VERTEX để định nghĩa các tọa độ đỉnh.3.Các thuộc tính chung Color :Biễu diễn màu sắc đối tượngLinetype :Kiểu đường củađối tượngLayer :Lớp củađối tượng08 September 2021ObjectARX37Vũ Văn ThiênCơ điện tử 1_K503.Các điểm bắt dính trên đối tượngkOsModeEnd : Điểm cuốikOsModeMid : Điểm giữakOsModeCen : Điểm tâmkOsModeNode : Điểm nútkOsModeQuad : Điểm góc 1/4kOsModeIns : Điểm chènkOsModePerp : Điểm kéo dài vuông góckOsModeTan : Điểm kéo dài tiếp tuyếnkOsModeNear : Điểm gần nhất4.Ma trận chuyển (Transformation Matrix)AutoCad sử dụng phép biến đổi affine trong phép biến đổi hình học đối tượng08 September 2021ObjectARX38Vũ Văn ThiênCơ điện tử 1_K50Thanks for attention
Các file đính kèm theo tài liệu này:
- bai_giang_autocad_phan_1_vu_van_thien.ppt