/

17 tháng 3, 2013

Bài 11: Đối tượng ObjectARX tự tạo

Tổng quan


Theo quan điểm của tôi, đặc tính tuyệt vời nhất mà ObjectARX mang lại đó là khả năng phát triển những đối tượng và thực thể mới cho riêng bạn. Đặc tính mạnh này cho phép tạo ra những chương trình cao cấp và cho người dùng những trải nghiệm riêng mà chỉ chương trình của bạn mới có.

Đặc tính này có ngay từ lúc ObjectARX xuất hiện (chính thức ở phiên bản AutoCAD R13). Kể từ khi hãng AutoDesk cung cấp tính năng này, lập trình viên của họ nghĩ có thể phát triển các giải pháp trực tiếp (vertical solutions) cho những lĩnh vực thị trường khác nhau. Vào thời điểm đó, các sản phẩm như MAP, MCAD và ADT bắt đầu được trình làng.
Ngày nay có rất nhiều các sản phẩm dựa trên nền tảng AutoCAD được tạo ra bởi AutoDesk và rất nhiều các hãng thứ 3 khác.

Có khả thi hay không?


ObjectARX có toàn bộ thế mạnh của ngôn ngữ C++ như tính thừa kế, polymorphism và overriding ... Nó cho phép AutoDesk cung cấp một phần mã nguồn AutoCAD thông qua SDK giống như gói thư viện library và header.
Dựa vào đó, ObjectARX đưa ra một số class cho phép bạn dẫn xuất từ chúng và thực thi thao tác.
(Beyond this point, ObjectARX exports some classes allowing you to derive from them and implement your own behavior taking advantage of all ready-to-use methods and overriding those ones you need.)

Bằng cách này, class của bạn được định nghĩa và thực thi, chương trình sẽ được biên dịch và liên kết đến các thư viện và header nguyên bản của AutoCAD. Bạn có thể tải module (DLL) vào runtime để sử dụng đối tượng bên trong AutoCAD! Tuyệt vời phải không?

Khi nào sử dụng và khi nào không sử dụng đối tượng mới?

Tuy là đặc tính mạnh của ObjectARX, đối tượng mới không hẳn là lựa chọn tối ưu cho mọi hệ thống. Đôi khi sử dụng giải pháp XData hoặc XRecords lại tốt hơn. Nó phụ thuộc vào việc chương trình của bạn phức tạp đến đâu và cách người dùng tương tác với chương trình phức tạp như thế nào.

Bạn cần phải cân nhắc khi nào sử dụng hoặc không sử dụng đối tượng mới trong ObjectARX. Một vài câu hỏi sau đây sẽ giúp bạn phân định:

- Phần tử trong sản phẩm của mình là đơn giản hay phức tạp?
- Các phần tử chỉ phức tạp trong phần dữ liệu phi hình học hay nó đòi hỏi thể hiện hình học phức tạp?
- Có cần phải bảo vệ dữ liệu của phần tử khi đưa bản vẽ ra ngoài công ty hay không?
- Các phần tử có thể hiện tương tác phức tạp với người dùng khác xa so với thực thể nguyên bản của AutoCAD hay không?
- Will my elements present a complex interaction with users very different from AutoCAD native entities?
- Ta có cần chia sẻ thông tin chung giữa các phần tử hay không?
Những câu hỏi trên thực sự sẽ giúp bạn quyết được khi nào thì nên sử dụng đối tượng mới.

Sử dụng đối tượng mới như thế nào?

Bước đầu tiên là lựa chọn class cơ bản. Nó dựa vào việc loại đối tượng mới bạn sẽ sẵn sàng để thi hành. Bạn cần phải lựa chọn rằng nó đại diện cho một thực thể hay là một đối tượng dữ liệu. Nếu là một thực thể, bàn cần phải dẫn xuất nó từ AcDbEntity hoặc các lớp khác mà nó được dẫn xuất. Hay nó sẽ không có thể hiện hình học, bận cần dẫn xuất nó từ AcDbObject. Có vài lớp ObjectARX không chấp nhận việc dẫn xuất. Hãy xem lại tài liệu ObjectARX để có danh sách đầy đủ nhất.
The first step is to choose your base class. This will depend on what type of custom object are you willing to implement. Basically you need to choose if it will represent an entity or a data object. If it will be an entity you will need to derive it from AcDbEntity or other of its derived classes. In other hand, if it will not have graphical appearance, you will derive it from AcDbObject. There are some ObjectARX classes that does not allow you to derive from. Take a look at ObjectARX documentation for a complete list.

Việc phân biệt sự khác nhau giữa AcDbEntity và AcDbObject là hết sức quan trọng. Hãy nhớ rằng mọi AcDbEntity đều là AcDbOject nhưng không phải tất cả AcDbOject cũng là AcDbEntity. Bởi vì đơn giản AcDbEntity được dẫn xuất từ AcDbObject.

Tôi thực sự muốn bạn tìm hiểu qua cấu trúc phân lớp của ObjectARX để định vị trong đầu cây phân cấp và hiểu rõ những gì chúng ta đang nói tới. Có một tệp tin DWG có tên là classsmap.dwg nằm trong thư mục \classsmap bộ SDK của ObjectARX.

Runtime nhận diện

AutoCAD yêu cầu mọi đối tượng mới đều phải có kiểu runtime nhận diện cho riêng mình. Nó được sử dụng bởi AutoCAD và bởi chương trình của bạn. Bạn không cần phải quan tâm đến nó vì đã có MACROS làm việc này cho bạn. Lớp AcRxObject sẽ chịu trách nhiệm thực hiện chức năng này.

Runtime nhận diện được tạo ra bởi một vài hàm như sau:
  • desc(), hàm thành viên tĩnh trả về đối tượng ký hiệu (descriptor object) của class (đã biết).
  • cast(), hàm thành viên tĩnh trả về đối tượng của kiểu được chỉ ra, hoặc NULL nếu đối tượng không thuộc class yêu cầu (hoặc class dẫn xuất).

  • isKindOf() trả về  returns liệu đối tượng có thuộc về class được chỉ ra (hoặc class dẫn xuất).
  • isA() trả về đối tượng ký hiệu class (descriptor object) của đối tượng thuộc class không biết. (returns the class descriptor object of an object whose class is unknown.)
Những hàm trên khá hữu dụng vì chúng giúp cho ta có được thông tin quan trọng runtime (runtime important information) từ đối tượng nguyên bản của AutoCAD và đối tượng của riêng bạn. Một ví dụ hay là khi bạn trỏ tới AcDbEntity và muốn biết nó là AcDbCircle hay một AcDbLine. Bằng cách nào? Hãy sử dùng các hàm trên để lấy thông tin, hay thậm chí là cố gắng lấy con trỏ cho chính xác.

Để khai báo các hàm bạn cần phải sử dụng MACRO trong lớp khai báo:


ACRX_DECLARE_MEMBERS(CLASS_NAME);

Để thực thi hàm, bạn cần sử dụng một trong các MACRO sau:
  • ACRX_NO_CONS_DEFINE_MEMBERS (CLASS_NAME, PARENT_CLASS): Sử dụng cho lớp tóm tắt (abstract classes) và các lớp khác chưa được khởi tạo.
  • ACRX_CONS_DEFINE_MEMBERS (CLASS_NAME, PARENT_CLASS, VERNO): Dùng cho lớp nhất thời (transient classes) có thể được khởi tạo nhưng không được ghi vào tệp tin.
  • ACRX_DXF_DEFINE_MEMBERS (CLASS_NAME,PARENT_CLASS, DWG_VERSION, MAINTENANCE_VERSION, PROXY_FLAGS, DXF_NAME, APP): Dùng cho các lớp có thể ghi và đọc từ tệp tin DWG và DXF
Đồng thời, bạn cần phải khởi tạo và xóa class của mình trong lúc chạy ứng dụng ObjectARX. Bạn có thể thực hiện việc đó khi bắt đầu tải kInitAppMsg và khi kết thúc kUnloadAppMsg. Sử dụng những hàm sau thực thi bởi các MACRO trên:
// Inside kInitAppMsg function handler
MyClass::rxInit();
// Call this only once for all of your custom classes
acrxBuildClassHierarchy();

// Inside kUnloadAppMsg function handler
deleteAcRxClass(MyClass::desc());

Nó đảm bảo khi tải ứng dụng, AutoCAD nhận diện được class và khi unload, AutoCAD sẽ chuyển đổi class đại diện thành thực thể Proxy. Thực thể Proxy là gói nhị phân được bảo vệ và cách ly trong khi bản vẽ DWG vẫn làm việc mà không có chương trình của bạn.

Link nguồn: Arxdummies

Không có nhận xét nào:

Đăng nhận xét