/

17 tháng 3, 2013

Bài 6: Các thực thể

Giới thiệu

Thực thể là những đối tượng có đại diện hình học. Chúng có thể đơn giản hay phức tạp dựa vào việc có bao nhiêu đặc tính và chức năng chúng mang theo. Thực thể được lữu trữ trong đối tượng khoang BlockTableRecord. Mỗi một khoang chứa sẽ lưu trữ thực thể của nó cho đến khi chúng bị xóa hoặc CSDL bị phá hủy. Như mọi đối tượng trong CSDL, mỗi thực thể có thể được truy nhập thông qua mã định danh duy nhất là ObjectId. Bằng ObjectId chúng ta có thể lấy được con trỏ (để Đọc, Ghi hoặc Thông báo như đã thấy trong bài trước). và tiến hành cách quá trình từ các lớp dẫn xuất.
Một vài thực thể đặc biệt có thể chứa các đối tượng khác để quản lý và thực thi một cách đơn giản. Ví dụ như AcDb3dPolyline có một tập hợp các đối tượng AcDb3dPolylineVertex được thể hiện bằng các đỉnh của đa tuyến.

Thuộc tính của thực thể

Thực thể AutoCAD có một vài thuộc tính và một số trong đó lại là chung cho tất cả các loại thực thể. Những thuộc tính đó được lưu trữ bên trong lớp thực thể cơ sở gọi là AcDbEntity. Lớp này được dẫn xuất từ AcDbObject, nó thực hiện một số chức năng chung được sử dụng trong mọi lớp dẫn xuất và thực thể có liên quan.
Ví dụ, khi chúng ta tạo một hình tròn (AcDbCircle), nó sẽ mang một vài thuộc tính đến từ AcDbEntity. Đó là:
  • Color                  //Màu sắc
  • Linetype              //Đường nét
  • Linetype scale     //Tỉ lệ đường nét
  • Visibility              //Hiện hữu
  • Layer                  //Lớp
  • Line weight         //Bề rộng đường nét
  • Plot style name   //Tên kiểu in ấn.
Những thuộc tính này có phương thức đặc biệt cho phép bạn đọc hoặc chỉnh sửa chúng bằng việc truy nhập đến lớp cơ sở AcDbEntity. Vì vậy nếu chúng ta có được hình tròn AcDbCircle và muốn thay đổi màu sắc, chúng ta cần phải mở nó dưới dạng Ghi, gọi ra các phương thức thích hợp và sau đó là đóng hình tròn lại.
Nếu chúng ta xây dựng một ứng dụng chỉ truy nhập đến những thuộc tính này, chúng ta sẽ không cần phân biệt thực thể thuộc loại nào khi mở chúng. Trong trường hợp này chúng ta chỉ mở thực thể, lấy con trỏ của nó dưới dạng AcDbEntity và truy cập các phương thức dẫn suất.

Giao dịch với thực thể

Mỗi thực thể AutoCAD được đặt trong không gian 3D. Bạn đã  biết rằng chúng ta có thể di chuyển, xoay, scale, định hướng và nhiều thay đổi khác trên một thực thể. AutoCAD thực hiện hầu hết những quá trình này thông qua hình học giải tích sử dụng ma trận. Hãy nhớ rằng chúng ta đã nói về các lớp trong ObjectARX, và đặc biệt là lớp có tiền tố AcGe. AcGe là lớp hình học cho phép bạn thực hiện các quá trình hình học đơn giản hay phức tạp bên trong AutoCAD.

Vậy hãy  giả sử phải quay một vài đối tượng (hình tròn, đa tuyến, đường thẳng, ...) và bạn cần làm việc đó với lượng kiến thức hình học cơ bản. Không thành vấn đề! Bạn chỉ cần xây dựng một ma trận giao dịch và gọi phương thức thích hợp transformBy() có trong lớp AcDbEntity. Vâng, mọi thực thể đều có khả năng chuyển đổi được như thế!
Hàm này nhận được một đối tượng thuộc lớp AcGeMatrix3d đại diện cho một ma trận được áp dụng vào thực thể để thực thi một vài quá trình hình học. Nó có thể là một ma trận chuyển đổi, một ma trận xoay ...
Lớp AcGeMatrix3d với những tiện ích tuyệt vời làm giảm rất nhiều công việc. Một trong số chức năng tôi muốn giới thiệu là:
  • setToRotation: Bạn đưa vào một góc đo (radian), vector trục xoay và điểm xoay. Với các thông số đó, hàm sẽ điền vào AcGeMatrix3d với tất cả các phần tử. Sau đó, gọi phương thức transformBy() của thực thể trong ma trận.
  • setToTranlation: Bạn cung cấp một vector 3D (AcGeVector3d) đại diện cho phép biến đổi bạn muốn thực hiện. Sau đó, thực hiện quá trình giống như đã đề cập ở trên;
  • setToMirroring: Hàm hày có 3 phiên bản khác nhau, nhận tham số là 1 điểm (AcGePoint3d), một đoạn thẳng (AcGeLine3d) hoặc mặt phẳng (AcGePlane). Tùy thuộc vào loại tham số số đầu vào mà nó sẽ xây dựng ma trận để đối xứng thực thể của bạn. Tuyệt vời không?

Giao cắt thực thể

Một chức năng quan trọng được thực thi trên cấp cơ sở AcDbEntity là giao cắt thực thể. Có lẽ một lúc nào đó sản phẩn của bạn sẽ cần phải phân tích sự giao cắt giữa các thực thể. Phương thức intersectionWith() sẽ đáp ứng yêu cầu của bạn.
Khai báo thông thường nhất của phương thức này là:
virtual Acad::ErrorStatus
intersectWith(
const AcDbEntity* pEnt,
AcDb::Intersect intType,
AcGePoint3dArray& points,
int thisGsMarker = 0,
int otherGsMarker = 0) const;
Tham số đầu tiên là con trỏ pEnt trỏ đến thực thể muốn tìm giao cắt với nó. Tiếp đến là kiểu giao cắt intType, mảng các điểm 3D points để chứa các giao điểm nếu có và cuối cùng là hai tham số tùy chọn.

Kiểu giao cắt intType nhận một trong 4 giá trị sau:
  • kOnBothOperands: không kéo dài các đối tượng;
  • kExtendThis: kéo dài đối tượng tìm giao cắt;
  • kExtendArg: kéo dài đối tượng kia;
  • kExtendBoth: kéo dài cả hai đối tượng.
Nếu hai đối tượng cắt nhau (tùy thuộc vào kiểu giao cắt bạn chọn) mảng điểm 3D sẽ nhận được các giao điểm. Vì sử dụng tính toán hình học của AutoCAD nên hàm cho kết quả nhanh và đáng tin cậy.


Trong bài tới, chúng ta sẽ thực hiện ví dụ demo và tôi muốn dành cho bạn vài ngày để hoàn thành, sau đó tôi sẽ đưa ra giải pháp của mình. Hãy tiếp tục theo dõi!

Link nguồn: Arxdummies

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

Đăng nhận xét