/

28 tháng 6, 2013

Lớp đường kích thước AcDbDimension trong AutoCAD

Lớp AcDbDimension là một lớp cơ sở cho các lớp đại diện cho các kiểu đường ghi thước trong AutoCAD. Vẻ ngoài của các đường ghi kích thước được điều khiển bởi các biến cài đặt và kiểu ghi kích thước (dimension styles).

Thừa kế từ
    AcRxObject
      |->AcGiDrawable
        |->AcDbObject
          |->AcDbEntity
            |->AcDbDimension 
Tệp tin kèm (Include File)

dbdim.h
Mẹo nhỏ
 Mặc dù lớp này có hàm tạo, nó chỉ có thể dùng như một lớp cơ bản - không có đối tượng nào của lớp được tạo ra. Không thể thêm một đối tượng được khởi tạo từ chính AcDbDimension vào trong cơ sở dữ liệu. Nếu một đường kích thước dimension được tạo ra từ một lớp dẫn suất của nó, bắt buộc phải phải gọi phương thức AcDbDimension::worldDraw() trước tiên để tạo ra bất kì phương  hình học AcGiWorldGeometry hay AcGiViewportGeometry
Nguyên nhân là do phương thức của đường kích thước gốc worldDraw() tạo lời gọi đến hàm AcGiSubEntityTraits::setSelectionMarker().
Only objects instantiated from a class derived from AcDbDimension can be added to the database. If a dimension object from a derived class wishes to call AcDbDimension::worldDraw(), it must do so before any calls are made to any of the AcGiWorldGeometry or AcGiViewportGeometry geometry creation methods (including mesh() or shell()). This is because the parent dimensions worldDraw() method makes a call to AcGiSubEntityTraits::setSelectionMarker().
Nếu bạ không thay đổi text ghi kích thước , text sẽ trở thành giá trị đo của đường kích thước. Việc sử dụng phương thức AcDbDimension::setDimensionText sẽ đè lền giá trị mặc định. Bạn có thể chuyển về giá trị mặc định bằng cách để lại một ký tự trống "" .
Chỉnh sửa một đường kích thước không phải ở cơ sở dữ liệu hiện thời làm cho dimBlockId bị đặt thành NULL. Nó đảm bảo cho lần tải cơ sở dữ liệu tiếp theo cùng với bản vẽ hiện thời, một khối đường kích thước sẽ được tạo và khối cũ sẽ bị thanh lọc. Việc này là hết sức cần thiết bởi khối đường ghi kích thước trong cơ sở dữ liệu không hiện hành không thể được tạo hay có thể bị thay đổi. Một dimension được mở để ghi trong cơ sở dữ liệu không hiện hành sẽ có ID dimBlockId được đặt bằng NULL cho đến khi được đóng lại
Nó có thể sinh ra vấn đề khác cho ứng dụng. Ví dụ, một khi dimBlockId được đặt thành NULL, một lời gọi hàm đến geoExtents trên đường dim sẽ thất bại.
This may generate problems for applications. For example, once the dimBlockId has been set to NULL, a call to geomExtents on the dimension will fail.
Hành động có thể được ghi đè. Bằng cách gọi hàm recordGraphicsModified(Adesk::kFalse) trước khi đóng đường kích thước  sẽ ngăn cản ID dimBlockId bị đặt bằng NULL. Mặc dù nó sẽ làm reset lại bit điểu khiển hình họa, nhưng lại không gây hại bởi vì quá trình xảy ra trên cơ sở dữ liệu không hiện hành. Kết quả của việc ghi đè hành vi sẽ là như sau:
Tạo ra một đường kích thước mới không có dimBlock. Bởi vậy, sẽ không có hiệu quả. Bạn không thể tạo một đường kích thước trong cơ sở dữ liệu như thế và mang đặt cho nó một Block.
Nếu thay đổi tới thực thể AcDbDimension không ảnh hưởng đến thông tin của dimBlock, sẽ không có tạo ra những tác dụng phụ. Thực hiện workaround được khuyến nghị trong trường hợp này, khi nó ngăn cản một sự tái cấu trúc không cần thiết với dimBlock.
Nếu cần thiết phải thay đổi AcDbDimension gây ra nhu cầu phải cập nhật lại dimBlock, quá trình update sẽ không xảy ra cho tận đến khi bản vẽ được tải và một vài
If the modifications to the AcDbDimension entity do cause a need for the dimBlock to be updated, the update will not occur until after the drawing is loaded and some subsequent action causes the dimBlock to be updated. In other words, the dimension will appear unchanged when the drawing is next loaded. Then, when some subsequent action causes a change to the dimension (this does not include a regen), all the changes will become visible.
To work around this problem, just before saving the noncurrent database, reopen the dimension for write, call recordGraphicsModified(Adesk::kTrue), and close it. This will set dimBlockId to NULL and the changes will be applied the next time the database is loaded as the current drawing.
This class supports Dimension Style Overrides, which means that it has a dimension style and that it honors certain dimension variables.
This class overrides AcDbEntity::subSetDatabaseDefaults() to set the object’s dimension style (dimstyle) to the current style for the database. Typically objects of this class are initialized with a call to setDatabaseDefaults() followed by a call to setDimstyleData() using data obtained by a call to AcDbDatabase::getDimstyleData().

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

Đăng nhận xét