/

17 tháng 3, 2013

Bài 2: Cơ sở dữ liệu AutoCAD

Giới thiệu

Cấu trúc cơ sở dữ liệu AutoCAD

Mỗi bản vẽ AutoCAD đại diện cho một cấu trúc Cơ sở dữ liệu được cất giữ trong một vài kiểu đối tượng. Khi mở bản vẽ, AutoCAD đã tự tạo ra một Cơ sở dữ liệu có tổ chức và làm việc hiệu quả. Cơ sở dữ liệu này có đủ dữ liệu tối thiểu cho bạn tạo ra một bản vẽ cơ bản.

Lượng dữ liệu tối thiểu này đại diện bởi các đối tượng như các Layers, Linetypes, Text styles, v.v. Nhờ đó bạn có Layer 0, kiểu chữ Standard, kiểu nét Continuous và những cái khác nữa.
Từ AutoCAD phiên bản 2000 bạn có thể làm việc với nhiều bản vẽ cùng lúc với là môi trường MDI. Chức năng này mang đến tính linh hoạt cao nhưng cũng gây ra ra đôi chút phiền toái khi làm việc với nhiều hơn một bản vẽ. Chúng ta không thảo luận về những khía cạnh MDI trong khóa học này nhưng có thể sẽ được đòi hỏi trong các ứng dụng ObjectARX.

Dữ liệu được lưu trữ như thế nào

Cơ sở dữ liệu duy trì mọi loại đối tượng một bản vẽ cần thiết phải có. Các đối tượng này được cất giữ trong những khoang lưu trữ (container) là những đối tượng đặc biệt được tạo ra để quản lý đối tượng cùng kiểu. Bằng cách này chúng ta có các phương thức và thủ tục lưu trữ thích hợp để lưu trữ các thực thể, các lớp, kiểu chữ, v.v.

Mỗi đối tượng lưu trữ trong Cơ sở dữ liệu nhận được một mã định danh gọi là ObjectId. Mã định danh này là duy nhất trong cùng một phiên làm việc của AutoCAD và nó hợp lệ trong suốt vòng đời của mỗi đối tượng. ObjectId sinh ra bởi Cơ sở dữ liệu của nó và bạn không phải quan tâm về cách thức mà nó được tạo ra.

Bên trong ObjectARX ta có 3 loại đối tượng cơ bản:
  1. Entities (thực thể): Đối tượng đồ họa (lines, arcs, texts, ...);
  2. Containers (khoang): Đối tượng đặc biệt để lưu giữ và quản lý các bộ đối tượng (bảng lớp, bảng đường nét,...);
  3. Tập đối tượng: Các đối tượng phi đồ họa (groups, layouts, ...).

Tạo các đối tượng

Để tạo ra một đối tượng bằng ObjectARX chúng ta có một vài công thức dựa vào kiểu đối tượng và nơi chúng ta muốn lưu giữ nó (hầu hết thời gian chúng ta cần lưu giữ các đối tượng bên trong chính các khoang của nó). Về cơ bản, bạn sẽ theo các thao tác sau:
  1. Khai bao con trỏ tới đối tượng muốn tạo và gọi nó là toán tử (operator) mới; 
  2. Với con trỏ này, gọi các phương thức thích hợp của đối tượng để thay đổi các đặc tính của nó; 
  3. Lấy một con trỏ tới Cơ sở dữ liệu nơi bạn muốn tạo đối tượng (hầu hết là CSDL hiện hành); 
  4. Mở một khoang chứa nơi chứa dữ liệu đó;
  5. Gọi chính xác phương thức khoang lưu trữ đối tượng thông qua con trỏ của nó; 
  6. Nhận mã định danh (ObjectId) của đối tượng (được tự động sinh ra bởi container); 
  7. Hoàn thành tiến trình đóng tất cả các tập đối tượng bao gồm khoang và đối tượng vừa tạo ra.
Rõ ràng là bạn có thể khéo léo tạo ra một vài đối tượng (class) cho phép tự động hóa quá trình này bởi chúng mang tính đồng nhất và có thể sử dụng lại dễ dàng. Ý tưởng chính là để tạo ra một loại hàm tiện ích Cơ sở dữ liệu như: Addlayer, AddLine, AddTextStyle, v.v.

* Điều quan trọng là không được phép quên đóng tập đối tượng lại vì nó sẽ làm AutoCAD chấp dứt hoạt động ngay lập tức.

 Ví dụ đơn giản để tạo ra một đoạn thẳng line (AcDbLine)

Đoạn mã sau trình bày cách tạo một đường thẳng giữa 2 điểm. Ở quy trình đơn giản này, đoạn mã không thực hiện bắt lỗi, mà mục đích chính là để bạn làm quen với các khái niệm. Nó cần được nhúng bên trong cấu trúc ứng dụng ObjectARX để có thể làm việc. Chú ý một chút tới lệnh của quá trình mở và đóng.
// Đầu tiên ta phải khai báo một cặp điểm
AcGePoint3d startPt(1.0, 1.0, 0.0);
AcGePoint3d endPt(10.0, 10.0, 0.0);
// Bây giờ ta sẽ khởi tạo một con trỏ AcDbLine
// Trường hợp này, phương thức khởi tạo cho phép thông qua 2 điểm

AcDbLine *pLine = new AcDbLine(startPt, endPt); 
// Ta sẽ mở khoang thích hợp bên trong BlockTable
AcDbBlockTable *pBlockTable = NULL;
// Đầu tiên, lấy database hiện tại và sau đó là BlockTable
AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();
pDB->
getSymbolTable(pBlockTable, AcDb::kForRead);
// Bên trong BlockTable, mở ra ModelSpace
AcDbBlockTableRecord* pBlockTableRecord = NULL;
pBlockTable->getAt(
ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
// Sau khi có ModelSpace chúng ta có thể đóng BlockTable
pBlockTable->
close();
// Sửu dụng con trỏ ModelSpace ta có thể thêm line mới
AcDbObjectId lineId = AcDbObjectId::kNull;
pBlockTableRecord->
appendAcDbEntity(lineId, pLine);
// Để hoàn thành tiến trình, đóng ModelSpace và thực thể vừa tạo
pBlockTableRecord->close();
pLine->
close(); 

Trong bài tiếp, ta sẽ tìm hiểu cấu trúc ứng dụng ObjectARX, để xây dựng và biên dịch một ứng dụng nhỏ với đoạn mã trên. Hẹn gặp lại ở đó!  

Link nguồn: Arxdummies

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

Đăng nhận xét