/

17 tháng 3, 2013

Bài 4: Vòng đời thực thể


Bây giờ ta đã có thể tạo ra dự án ObjectARX tối thiểu, chúng ta sẽ tiếp tục khóa học với những khái niệm mới.
Như đã nhắc đến từ trước, cơ sở dữ liệu (CSDL) của AutoCAD được tổ chức tốt để có thể thao tác đơn giản và chính xác với các đối tượng. Chúng ta có 2 kiểu cơ bản là: Containers (Khoang chứa) và Objects (Đối tượng).



|--->
AcDbAbstractViewTable
|--->
AcDbViewportTable
AcDbSymbolTable


|--->
AcDbViewTable
|--->
AcDbBlockTable


|--->
AcDbDimStyleTable


|--->
AcDbLayerTable


|--->
AcDbLinetypeTable


|--->
AcDbRegAppTable


|--->
AcDbTextStyleTable


|--->
AcDbUCSTable


 Cây phân cấp đối tượng

Containers là những đối tượng đặc biệt cung cấp một cơ chế đơn giản và hiệu quả để lưu giữ, chỉnh sửa và hơn thế nữa trên các đối tượng hay các tập đối tượng (selection set). Nó được tối ưu hóa để cho phép truy cập nhanh tới đối tượng mà không gặp nhiều khó khăn. Mỗi kiểu đối tượng lại có một khoang chứa thích hợp là nơi bạn luôn luôn lưu trữ đối tượng của mình. CSDL của AutoCAD có vài loại khoang chứa. Thông thường nhất là LayerTable, LinetypeTableBlockTable. Mỗi đối tượng khoang chứa có phương thức truy cập chuẩn và hầu hết chúng yêu cầu một lớp quen thuộc khác để duyệt qua từng thành phần của nó. Mỗi lần bạn tạo ra một đối tượng và muốn lưu trữ trong CSDL của AutoCAD, ban cần phải tuân theo quy tắc nhất định để lưu trữ hay làm bất cứ việc gì một cách đúng nhất.

Mặt khác, đối tượng (bao gồm các thực thể) là những kiểu cơ bản nhất và đại diện cho mỗi phần tử bên trong AutoCAD. Chúng được thực hiện thông qua một số lớp với phương thức chuẩn và đặc biệt. Một vài trong số chúng có thể được dẫn xuất vào trong ứng dụng của bạn để cho phép tùy biến riêng.
Mỗi đối tượng CSDL lưu trú có một mã định danh độc quyền gọi là ObjectId. Mã nhận dạng là "tên" của mỗi đối tượng bên trong CSDL và được dùng để tham chiếu, mở và thao tác trên các đối tượng.

Đây có thể là khái niệm phức tạp với những ai đã quen thuộc với ngôn ngữ C++ vì bên trong ObjectARX bạn không xóa một con trỏ đến đối tượng địa chỉ CSDL. Cái gì? Vâng, đây là một chút khác biệt, nhưng AutoCAD có vài lý do để làm điều đó, bao gồm quá trình, quản lý bộ nhớ và những khía cạnh khác nữa.

Vậy, Chúng ta thao tác trên các đối tượng như thế nào?

Đừng lo sợ. Bạn cần giữ trong đầu vài quy tắc cơ bản nhưng quan trọng sau đây:

  1. Địa chỉ CSDL không bao giờ bị xóa kể cả khi bạn xóa nó!
  2. Nếu bạn tạo ra một đối tượng nhưng không thêm vào CSDL, hãy xóa con trỏ đi!
  3. Nếu bạn cần con trỏ tới đối tượng để quản lý nó, hãy lấy ObjectId và sử dụng phương thức khoang chứa thích hợp để có được con trỏ. Phải không? Không. Bạn cần đóng các đối tượng lại ngay sau khi ngừng sử dụng. Gọi phương thức close()  hoặc kết thúc giao tiếp  để truyền thông tin đến AutoCAD rằng bạn đã hoàn thành! (Không được quên điều này nếu không AutoCAD sẽ ngừng làm việc).
Những lỗi hay gặp nhất mà bạn có thể phải đối mặt trong ứng dụng của mình là do không tuân thủ quy tắc bên trên. Hãy tin tôi đi!

Quyền sở hữu và mối quan hệ đối tượng

Đối tượng có thể liên hệ tới một đối tượng thông qua ObjectId. Nó có thể là quan hệ sở hữu hay chỉ là một quan hệ ngang hàng. Nếu bạn nghĩ về một Layer bạn sẽ hiểu cái gì được suy ra từ khái niệm này. Khoang chứa LayerTable sở hữu các bản ghi của nó (ở đây là các Layer). Mỗi ObjectId của layer được tham chiếu bên trong mỗi thực thể. Chính xác là bạn không thể xóa bỏ một lớp từ file DWG cho tận tới khi mọi thực thể sử dụng layer bị xóa hoặc thay đổi layer của chúng.
Có rất nhiều ví dụ về quyền sở hữu và mối quan hệ bên trong AutoCAD. Trong suốt khóa học bạn sẽ hiểu được khái niệm một cách dễ dàng khi chúng ta thao tác trên một vài đối tượng cơ bản.
Tạo một lớp (layer) mới
Trong bài trước, tôi đã trình bày một đoạn mã giải thích cách thức tạo ra một thực thể line đơn giản. Còn bây giờ tôi sẽ trình bày một đoạn mã đơn giản để tạo mới một layer để cho phép bạn cảm nhận được bao nhiêu quy tắc được sinh ra như trong quá trình này:

AcDbLayerTable* pLayerTbl = NULL;
// Lấy CSDL hiện tại
AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();
// Lấy LayerTable để ghi vì chúng ta sẽ tạo ra một đối tượng mới
pDB->getSymbolTable(pLayerTbl,AcDb::kForWrite);
// Kiểm tra xem lớp đã tồn tại chưa
if (!pLayerTbl->has(_T("MYLAYER"))) {
// Khởi tạo một đối tượng mới và đặt thuộc tính cho nó
AcDbLayerTableRecord *pLayerTblRcd = new AcDbLayerTableRecord;
pLayerTblRcd->setName(_T("MYLAYER"));
pLayerTblRcd->setIsFrozen(0); // Lớp được đặt THAWED
pLayerTblRcd->setIsOff(0); // Lớp được đặt ON
pLayerTblRcd->setIsLocked(0); // Lớp un-locked
AcCmColor color;
color.setColorIndex(7); // Đặt màu cho lớp
pLayerTblRcd->setColor(color);
// Bây giờ ta sẽ thêm lớp mới vào khoang chứa
pLayerTbl->add(pLayerTblRcd);
// Đóng layer mới lại (Không được xóa nó)
pLayerTblRcd->close();
// Đóng khoang chứa lại
pLayerTbl->close();
} else {
// Nếu layer đã tồn tại, hãy đóng khoang chứa và tiếp tục
pLayerTbl->close();
acutPrintf(_T("\nMYLAYER already exists"));
}
Kết thúc bài 4, hy vọng bạn sẽ tạo được cho mình một số đối tượng cơ bản như Layer, TextStyle, DimensionStyle ...!

Link nguồn: Arxdummies

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

Đăng nhận xét