|
|
structdesignpro
Site Admin
Ngày tham gia: 28 2 2009 Số bài: 668 Đến từ: Việt Nam
|
|
|
|
|
Gửi: Tư 3 04, 2009 7:39 pm Tiêu đề: Tổng quan về ObjectARX |
|
|
|
|
Cấu trúc của một ứng dụng ADSRX
Mặc dầu các ứng dụng ADSRX được viết bằng C++, đối với AutoCAD chúng xuất hiện giống như một hàm viết bằng AutoLISP. Một ứng dụng ADSRX được viết như một tập các hàm ngoài được nạp, gọi từ bộ thông dịch AutoLISP.
Các ứng dụng ADSRX hiệu quả hơn AutoLISP về mặt tốc độ và tận dụng bộ nhớ; chúng có thể truy xuất vào các phục vụ mà AutoLISP không thể, như là hệ điều hành, và phần cứng. Điều này làm cho ADSRX rất phù hợp cho một ứng dụng yêu cầu sự tính toán lớn hoặc tương tác vơi môi trường hệ điều hành, nhưng có thể sẽ tốn nhiều thời gian và đắt tiền hơn để phát triển và bảo trì hơn so với AutoLISP. AutoLISP thì phù hợp tốt hơn với các ứng dụng mà sự giá bảo trì và phát triển quan trọng đáng kể hơn so với hiệu suất.
Mỗi ứng dụng ADSRX phải hỗ trợ một giao tiếp(giao diện) với AutoLISP được định nghĩa bởi các môi trương ADSRX. Các giao tiếp yêu cầu ứng dụng gọi một hàm trong thư viện ADSRX nào đó để chuyển giá trị nào đó trong một chuỗi xác định. Phần sau đây mô tả thư viện hàm và chỉ ra một hàm acrrxEntrypoint().
Thư viện liên kết động ADSRX (ADSRX DLLs).
Các ứng dụng ADSRX là các thư viện liên kết động(DLLs) là các thư viện liên kết tới một chương trình ứng dụng khi chúng đã được nạp hay là chạy chứ không phải là được biên dịch ở giai đoạn cuối việc biên dịch một chương trình.
Visual C++ IDE tạo một đuôi .dll cho các tệp DLL một cách ngầm định. Bạn phải đặt lại IDE để sử dụng đuôi .arx cho các tệp ADSRX, hoặc đổi tên sau khi đã được dịch xong. Một cách khác bạn có thể bao gồm(include) các tệp .dll trong đối số tệp được dùng bởi dùng bởi arxload hoặc ads_arxload().
AcrxEntryPoint()
AutoCAD gọi tới môđun ADSRX qua AcrxEntryPoint() tương đương với hàm main() trong một chương trình chạy được. Bạn phải có trách nhiệm trang bị hàm AcrxEntryPoint(), như được trình bày trong phần sau.
Một hàm AcrxEntryPoint() phục vụ không chỉ cho một đầu vào cho việc liên lạc với một ứng dụng ADSRX từ AutoCAD, mà nó còn là một cách để các ứng dụng ADSRX chuyển các thông báo tới ứng dụng và trả về mã trang thái cho AutoCAD. Tất cả các yêu cầu để gọi một hàm qua ads_defun() được tạo ra bởi AcrxEntryPoint(). Nếu bạn định nghĩa một lệnh mới với ADSRX hoặc với ads_regfunc(), AutoCAD lập tức thực hiện hàm kết hợp với lệnh này.
Hàm AcrxEntryPoint() có các dấu hiệu sau đây:
Extern “C”
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void * pkt);
Trong đó:
Msg: biểu dĩên các thông báo gửi từ nhân ADSRX tới ứng dụng.
Pkt : giữ một gói giá trị.
AppRetCode: chứa mã trạng thái trả về cho AutoCAD.
Trong định nghĩa AcrxEntryPoint(), bạn thường phải viết một câu lệnh điều kiện để giải mã các thông báo từ AutoCAD, nhằm thực hiện đúng các công việc liên quan tới thông báo, và để trả về một giá trị trạng thái. Đoạn mã sau đây chỉ ra bộ khung của một câu lệnh điều kiện như thế.
AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch(msg) {
case AcRx::kInitAppMsg:
break;
.
.
.
default:
break;
}
return AcRx::kRetOK;
}
Thông báo của AutoCAD tới các ứng dụng ADSRX.
Bảng sau đây trình bày một số thông báo mà AutoCAD gửi cho các ứng dụng ADSRX.
Thông báo
Mô tả
kInitAppMsg
kUnloadAppMsg
kOleUnloadAppMsg
kLoadDwgMsg
kDependencyMsg
được gửi tới khi một ứng dụng được nạp và mở một liên lạc giữa AutoCAD và ứng dụng
được gửi tới khi một ứng dụng ADSRX bị bỏ (unload) - do người sử dụng hoặc AutoCAD tự ngắt. Đóng các tệp và thực hiện các hoạt động dọp dẹp.
Thông báo này sẽ chỉ được trả lời bởi ứng dụng với ActiveX (OLE) Automation.
được gửi tới khi bản vẽ được mở. Làm cho các hàm thư viện ADSRX có tác dụng với các hàm ứng dụng cần tới.
Thông báo này chỉ được gửi tới khi một ứng dụng đã đăng kí một hàm AutoLISP với ads_defun.
được gửi khi một ứng dụng đã được đăng kí một đối tượng AcRxService, phụ thuộc vào phục vụ thay đổi từ 0 tới 1
được gửi tới để gọi hàm đã đăng kí bởi ads_defun thông báo này chỉ gửi khi ứng dụng đã đăng kí một hàm AutoLISP với ads_defun().
Không thể dùng một hàm ads_command() trong (hay trong lúc) một kLoadDwgMsg.
Xem rxdefs.h xem các hằng được định nghĩa bởi khai báo kiểu AppMsgCode
Hàm xử lí thông điệp thường dùng như sau:
/////////////////////////////////////////////////////////////////////
// acrxEntryPoint(internal)
// This function is the entry point for your application.
/////////////////////////////////////////////////////////////////////
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* ptr)
{
switch (msg) {
case AcRx::kInitAppMsg:
acrxUnlockApplication(ptr);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
case AcRx::kLoadADSMsg:
OnkLoadADSMsg();
break;
case AcRx::kUnloadADSMsg:
OnkUnloadADSMsg();
break;
case AcRx::kInvkSubrMsg:
OnkInvkSubrMsg();
break;
default:
break;
}
return AcRx::kRetOK;
}
ObjectARX
Một ứng dụng ARX là một thư viện liên kết động (DLL), chia sẻ không gian địa chỉ và thực hiện các lời gọi hàm trực tiếp tới AutoCAD. ObjectARX là một môi trường lập trình hướngđối tượng, bằng cách trang bị một bộ thư viện các lớp đối tượng ARX, được thiết kế hướng về với khả năng mở rộng các thư mục ARX bao gồm các macro để làm thuận tiện việc định nghĩa một lớp mới và đưa ra khả năng thêm các chức năng vào các lớp đã tồn tại trong thư viện tại lúc chạy chương trình. Thư viện ARX có thể dùng với phát triển hệ thống cho AutoCAD (ADS) và với các giao diện lập trình ứng dụng AutoLISP.
Dưới đây sẽ phân tích một cái nhìn khái quát đối với các thư viện ARX.
· Môi trường lập trình ARX
· Các thư viện ARX
· Xác định kiểu lúc chạy
1. Môi trường lập trình ARX
Môi trường lập trình ARX trang bị một giao diện lập trình ứng dụng C++ cho phép người phát triển sử dụng, đặc tính hoá, và mở rộng AutoCAD. Các thư viện ARX gồm một bộ công cụ đa năng cho người phát triển ứng dụng để có được các ưu điểm của kiến trúc mở của AutoCAD, cung cấp truy nhập trực tiếp tới cấu trúc cơ sở dữ liệu AutoCAD, đồ hoạ hệ thống, và định nghĩa các lệnh cho AutoCAD. Ngoài ra, những thư viện này được thiết kế để làm việc với các giao diện lập trình ứng dụng AutoLISP và ADS để người phát triển có thể chọn các công cụ lập trình phù hợp nhất với yêu cầu và kinh nghiệm của mình.
2. Các thư viện ARX.
Môi trường lập trình ARX gồm có các thư viện sau đây:
AcRx:
Các lớp dùng cho việc liên kết các ứng dụng và việc đăng kí và xác định các lớp trong thời gian chạy.
AcEd:
Các lớp cho việc đăng kí các lệnh và các thông báo sự kiện hệ thống.
AcDb:
Các lớp về cơ sở dữ liệu AutoCAD.
AcGi:
Giao diện đồ hoạ cho việc tạo ảnh các vật thể AutoCAD.
AcGe:
Thư viện tiện ích về đại số tuyến tính và các đối tượng hình học cơ bản.
ADS:
Một thư viện C dùng để tạo các ứng dụng AutoCAD. Các ứng dụng ARX thường dùng các thư viẹn này cho các hoạt động như chọn vật thể, vận dụng tập chọn, lấy các dữ liệu.
· Thư viện AcRx:
Cung cấp các lớp cấp độ hệ thống để khởi tạo, liên kết thư viện liên kết động (DLL) cho việc xác định và đăng kí các lớp trong thời gian chạy. Lớp cơ sở cho thư viện này là AcRxObject, cung cấp các phương tiện cho:
- Phân tích và xác định thừa kế đối tượng trong thời gian chạy
- Bổ sung các nghi thức mới đối với một lớp trong thời gian chạy.
- Kiểm tra bằng nhau và so sánh đối tượng.
- Sao chép đối tượng.
Thư viện AcRx cũng cung cấp một tập các macro C++ để giúp cho việc tạo các lớp ARX mới mà được dẫn xuất từ các AcRxObject.
AcRxDictionary là một lớp quan trọng khác trong thư viện này. Một từ điển là một ánh xạ từ một chuỗi văn bản vào một đối tượng khác. Thư viện AcRx đặt từ điển các đối tượng, lớp, và các phục vụ của nó trong một đối tượng từ điển toàn cục, là một thể hiện của lớp AcRxDictionary. Các ứng dụng có thể thêm các đối tượng vào thư viện để có thể truy xuất được từ các ứng dụng khác.
Phân cấp lớp cho thư viện AcRx được chỉ ra dưới đây:
AcRxObject
AcRxClass
AcRxDictionary
AcRxDLinkerReactor
AcRxDynamicLinker
AcRxIterator
AcRxDictionaryIterator
AcRxService
· Thư viện AcEd
Thư viện AcEd cung cấp các lớp cho việc định nghĩa và đăng kí các lệnh mới AutoCAD mà hoạt động theo cùng một cách như các lệnh cài đặt trong của AutoCAD. Các lệnh mới định nghĩa được xem như các lệnh “trong” bởi vì chúng thuộc về cùng cấu trúc nội bộ (AcEdCommandStack) như là các lệnh được cài sẵn. Một lớp quan trọng trong thư viện này là AcEditorReactor, điều khiển trạng thái của hệ soạn thảo AutoCAD và thông báo với các ứng dụng khi các sự kiện chỉ định xảy đến, như là khởi động, kết thúc, hoặc huỷ bỏ một lệnh.
Phân cấp lớp cho thư viện AcEd được chỉ ra dưới đây:
AcRxObject
AcEdCommandIterator
AcEdCommandStack
AcEditor
AcEdJig
AcEditorReactor
AcTransaction
AcTransactionManager
AcTransactionReactor
· Thư viện AcDb
Thư viện AcDb cung cấp các lớp mà cho phép truy cập tới các cấu trúc trong cơ sở dữ liệu AutoCAD. Cơ sở dữ liệu này chứa tất cả các thông tin về các đối tượng đồ hoạ, gọi là các vật thể (entities), tạo nên một bản vẽ AutoCAD, cũng như các đối tượng phi đồ hoạ(ví dụ: lớp, kiểu đường, kiểu chữ) cũng là một phần của bản vẽ. Có thể truy vấn và thao tác các thể hiện đã có của các vật thể AutoCAD và các đối tượng cùng với thư viện AcDb cũng như tạo một thể hiện mới của các đối tượng cơ sở dữ liệu.
Cơ sở dữ liệu AutoCAD chứa các phần tử chính như sau:
Một bộ 9 bảng kí hiệu sở hữu các kí hiệu tên riêng đầu vào của đối tượng. Những đối tượng này biểu diễn rất nhiều các đối tượng AcDbDatabase được sử dụng thông thường và các dữ liệu thành phần.
Một đối tượng từ điển có tên(thuộc lớp AcDbDictionary), cung cấp một cơ sở “Bảng mục lục” của một bản vẽ. Khởi đầu, bảng này chứa chỉ 2 mục: Ids của 2 từ điển khác sử dụng bởi AutoCAD. Tuy nhiên các ứng dụng thoả mái thêm các đối tượng vào từ điển.
Một tập hợp cố định khoảng 200 biến tiêu đề được định nghĩa bởi AutoCAD(những biến này không phải là các đối tượng của cơ sở dữ liệu).
Phân cấp lớp cho thư viện AcDb được chỉ ra như dưới đây:
AcDbAuditInfo (kiểm tra và khôi phục bản vẽ)
AcDbRecover
AcDbRecoverCallBack
AcDbHandle (định danh đối tượng)
AcDbObjectId
AcDbHardOwnershipId
AcDbHardPointerId
AcDbSoftOwnershipId
AcDbSoftPointerId
AcDbIdMapping (Dùng cho deep clone)
AcDbIdMappingIter
AcDbIdPair
AcDbSymbolTableIterator (Biến lặp)
AcDbBlockTableIterator
AcDbBlockTableRecordIterator
AcDbDimStyleTableIterator
AcDbLayerTableIterator
AcDbLinetypeTableIterator
AcDbRegAppTableIterator
AcDbTextStyleTableIterator
AcDbUCSTableIterator
AcDbAbstractViewTableIterator
AcDbViewTableIterator
AcDbViewportTableIterator
AcDbGroup Iterator
AcDbExtents
AcDbDate (kiểu dữ liệu cấp thấp)
AcDbIntArray
AcDbObjectIdArray
AcDbVoidPtrArray
AcRxObject
AcDbDatabase (cơ sở dữ liệu AutoCAD)
AcDbDictionaryIterator
AcDbDwgFiler (Các chức năng về tệp)
AcDbDwgCopyFiler
AcDbDeepCloneFiler
AcDbWblockCloneFiler
AcDbDwgUndoFiler
AcDbDxfFiler
(AcRxObject)
AcDbObject
AcDbDictionary
AcDbEntity (Các vật thể AutoCAD)
AcDb3dSolid
AcDbBlockBegin
AcDbBlockEnd
AcDbBlockReference
AcDbMInsertBlock
AcDbBody
AcDbCurve
AcDb2dPolyline
AcDb3dPolyline
AcDbArc
AcDbCircle
AcDbEllipse
AcDbLeader
AcDbLine
AcDbRay
AcDbSpline
AcDbXline
AcDbDimension
AcDb2LineAngularDimension
AcDb3PointAngularDimension
AcDbAlignedDimension
AcDbDiametricDimension
AcDbOrdinateDimension
AcDbRadialDimension
AcDbRotatedDimension
AcDbFace
AcDbFaceRecord
AcDbFcf
AcDbMline
AcDbMText
AcDbOleFrame
AcDbPoint
AcDbPolyFaceMesh
AcDbPolygonMesh
AcDbRegion
AcDbSequenceEnd
AcDbShape
AcDbSolid
AcDbText
AcDbAttribute
AcDbAttributeDefinition
AcDbTrace
AcDbVertex
AcDb2dPolylineVertex
AcDb3dPolylineVertex
AcDbPolyFaceMeshVertex
AcDbPolygonMeshVertex
AcDbViewport
AcDbProxyEntity
(AcRxObject)
(AcDbObject)
AcDbGroup
AcDbMlineStyle
AcDbSymbolTable (Các bảng kí hiệu)
AcDbBlockTable
AcDbDimStyleTable
AcDbLayerTable
AcDbLinetypeTable
AcDbRegAppTable
AcDbTextStyleTable
AcDbUCSTable
AcDbAbstractViewTable
AcDbViewportTable
AcDbViewTable
AcDbSymbolTableRecord (Bản ghi các bảng kí hiệu)
AcDbAbstractViewTableRecord
AcDbViewportTableRecord
AcDbViewTableRecord
AcDbBlockTableRecord
AcDbDimStyleTableRecord
AcDbLayerTableRecord
AcDbLinetypeTableRecord
AcDbRegAppTableRecord
AcDbTextStyleTableRecord
AcDbUCSTableRecord
AcDbProxyObject
AcDbObjectIterator
AcDbObjectReactor (Dùng để gián tiếp thông báo các sự kiện)
AcDbEntityReactor
AcDbDatabaseReactor
· Thư viện AcGi
Thư viện AcGi cung cấp các giao diện đồ hoạ dùng cho các vật thể trong bản vẽ AutoCAD. Thư viện này được sử dụng bởi các hàm thành phần AcDbEntity worldDraw(),viewportDraw(), savaAs() là một phần của các nghi thức chuẩn của các vật thể. Hàm worldDraw() phải được định nghĩa bởi tất cả các lớp vật thể được định nghĩa mới. Đối tượng AcDiWorldDraw cung cấp một giao diện lập trình (API) mà qua đó AcDbEntity::worldDraw() có thể tạo biểu diễn đồ hoạ của nó trong tất cả các cửa sổ một cách đồng thời. Tương tự thế, đối tượng AcGiViewportDraw cung cấp một API mà qua đó, AcDbEntity::viewportDraw() có thể sinh ra các biểu diễn đồ hoạ khác nhau cho mỗi vùng nhìn(viewport).
Phân cấp lớp cho thư viện AcGi được chỉ ra dưới đây:
AcRxObject
AcGiEdgeData
AcGiFaceData
AcGiSubEntityTraits
AcGiTextStyle
AcGiVertexData
AcGiViewport
AcGiViewportDraw
AcGiViewportGeometry
AcGiWorldDraw
AcGiWorldGeometry
· Thư viện AcGe
Thư viện AcGe được dùng bởi thư viện AcDb và cung cấp các lớp tiện ích như là vector, điểm, và ma trận được sử dụng để thực hiện các thao tác hình học thông dụng về 2 chiều và 3 chiều. Nó cũng cung cấp các đối tượng hình học đơn giản như là điểm, đường cong và mặt. Thư viện này gồm có 2 phần phụ: các lớp cho hình học 2 chiều và các lớp cho hình học 3 chiều. Lớp trừu tượng cơ sở chính là AcEntity2d và AcEntity3d. Một số các lớp cơ bản không là dẫn xuất từ bất kì lớp nào gồm có AcGePoint2d, AcGeVector2d, và AcGeMatrix2d(chỉ ra ở đầu phân cấp lớp). Những lớp cơ sơ này có thể dùng để thực hiện nhiều loại thao tác thông dụng như là thêm vector vào một điểm, tính toán điểm hay tích có hướng 2 vector, và tính toán tích của 2 matrận. Các lớp cấp cao hơn trong thư viện này được trang bị bởi dùng các lớp cơ sở. Các dữ liệu thành phần của các lớp cấp cơ sở được khai báo toàn cục. Đây chỉ là các lớp trong thư viện hình học mà có các thành phần toàn cục. Sau đây là phân cấp lớp cho thư viện AcGe:
AcGePoint2d
AcGeVector2d
AcGeMatrix2d
AcGeScale2d
AcGePoint2dArray
AcGeVector2dArray
AcGePoint3d
AcGeVector3d
AcGeMatrix3d
AcGeScale3d
AcGePoint3dArray
AcGeVector3dArray
AcGeTolerance
AcGeInterval
AcGeCurveBoundary
AcGeDoubleArray
AcGeKnotVector
AcGeEntity2d
AcGePointEnt2d
AcGePosition2d
AcGePointOnCurve2d
AcGeCurve2d
AcGeLinearEnt2d
AcGeLine2d
AcGeRay2d
AcGeLineSeg2d
AcGeCircArc2d
AcGeEllipArc2d
AcGeSplineEnt2d
AcGeCubicSpline2d
AcGeNurbCurve2d
AcGePolyLine2d
AcGeExternalCurve2d
AcGeEntity3d
AcGePointEnt3d
AcGePosition3d
AcGePointOnCurve3d
AcGePointOnSurface
AcGeCurve3d
AcGeLinearEnt3d
AcGeLine3d
AcGeRay3d
AcGeLineSeg3d
AcGeCircArc3d
AcGeEllipArc3d
AcGeExternalCurve3d
AcGeSplineEnt3d
AcGeCubicSpline3d
AcGeNurbCurve3d
AcGePolyLine3d
AcGeAugPolyLine3d
AcGeSurface
AcGePlanarEnt
AcGePlane
AcGeBoundedPlane
AcGeCylinder
AcGeCone
AcGeSphere
AcGeTorus
AcGeNurbSurface
AcGeExternalSurface
AcGeOffsetSurface
AcGeExternalBoundedSurface
3. Đồng nhất hoá kiểu trong thời gian chạy
Mỗi lớp con của AcRxObject có thể có một đối tượng mô tả lớp kết hợp(của kiểu AcRxClass) được sử dụng cho đồng nhất hoá kiểu. ARX cung cấp các hàm cho việc thử xem một đối tượng thuộc một lớp hay dẫn xuất của một lớp nào đó hay không, các hàm cho phép bạn xác định 2 đối tượng cùng một lớp và các hàm trả về mô tả lớp của đối tượng. Các hàm quan trọng được cung cấp bởi AcRxObject đồng nhất hoá kiểu trong thời gian chạy bao gồm:
· desc() một hàm thành phần tĩnh mà trả về mô tả lớp đối tượng của một lớp chưa biết
· cast() một hàm thành phần tĩnh trả về một đối tượng của một kiểu chỉ định, hoặc Null nếu như đối tượng không thuộc lớp(hoặc dẫn xuất lớp đó)
· isKindOf() trả về đối tượng có thuộc về hay không một lớp chỉ định(hoặc một lớp dẫn xuất).
· isA() trả về mô tả lớp đối tượng của một đối tượng mà không biết lớp.
Khi bạn muốn biết lớp của một đối tượng là gì, sử dụng AcRxObject::isA(), hàm này trả về mô tả lớp đối tượng(một thể hiện của AcRxClass) cho một đối tượng cơ sở dữ liệu. Dấu hiệu của nó là:
AcRxClass* isA() const;
Khi bạn đã biết lớp của đối tượng là gì, bạn có thể sử dụng hàm desc() để nhận lại mô tả lớp đối tượng:
static AcRxClass* desc();
ví dụ sau đây tìm kiếm thể hiện của AcDbEllipse hay bất kì lớp dẫn xuất nào từ nó sử dụng isKindOf() và hàm thành phần tĩnh AcDbEllipse::desc()
AcDbEntity* curEntity = somehowGetAndOpenAnEntity();
if (curEntity->isKindOf(AcDbEllipse::desc())) {
// Got some kind of AcDbEllipse instance.
}
Ví dụ sau đây chỉ ra một cách khác để tìm kiếm thể hiện của AcDbEllipse, hay bất kì lớp nào dẫn xuất từ nó, sử dụng hàm thành phần tĩnh AcDbEllipse::cast()
AcDbEllipse* ellipseEntity = AcDbEllipse::cast(curEntity);
if (ellipseEntity != NULL) {
// Got some kind of AcDbEllipse instance.
}
Ví dụ sau đây tìm kiếm AcDbEllipse, nhưng không tìm kiếm thể hiện của các lớp dẫn xuất từ AcDbEllipse, sử dụng isA() và AcDbEllipse::desc()
AcDbEllipse::desc().
if (curEntity->isA() == AcDbEllipse::desc()) {
// Got an AcDbEllipse, no more, no less. _________________ Mời bạn đến với bách khoa toàn thư về kết cấu:.
http://vi.ketcau.wikia.com |
|
Về Đầu Trang |
|
|
Bạn không có quyền gửi bài viết Bạn không có quyền trả lời bài viết Bạn không có quyền sửa chữa bài viết của bạn Bạn không có quyền xóa bài viết của bạn Bạn không có quyền tham gia bầu chọn
|
Trang 1 trong tổng số 1 trang |
Thời gian được tính theo giờ [GMT+ 7 giờ]
|
|