Trang chủ

June 30, 2013

Sử dụng đối tượng phản ứng Object Reactor (phần 1)

Sử dụng đối tượng Object Reactor 

Cơ chế này cho phép bạn định nghĩa các phụ thuộc (dependencies) bên trong cơ sở dữ liệu cái mà được bảo toàn khi CSDL được ghi và được tái tạo lại mỗi khi đóng mở bản vẽ (reinstantiated).

Để tạo ra một đối tượng CSDL để phản hồi với một đối tượng khác:
  1. Dẫn xuất một lớp từ AcDbObject (hoặc bất kỳ lớp con nào khác).
  2. Thực thi các hàm thông báo.
  3. Khởi tạo một đối tượng của lớp mới.
  4. Thêm đối tượng vào CSDL, và đăng ký chủ sở hữu cho nó.
  5. Thêm nó vào đối tượng notifier với hàm AcDbObject::addPersistentReactor() .
Sử dụng macros ObjectARX khi dẫn xuất một lớp đối tượng reactor mới để tạo ra đối tượng mô tả lớp cho nó. (Nếu không sử dụng macro, lớp của bạn sẽ thừa kế bộ mô tả lớp của lớp cơ bản bên trên khi nó được ghi lại, và mã định danh của nó sẽ mất đi khi tệp tin được đọc trong nó.

Lấy mã định danh ID của reactor đối tượng (Object Reactor)

Tất cả các đối tượng CSDL đều mang một danh sách các reactor cho riêng mình. Một trong số đó là reactor nhất thời, và một số là liên tục. Reactor nhất thời là đại diện cho các lớp dẫn xuất từ AcDbObjectReactor, trong khi reactor liên tục lại là các mã định danh IDs của đối tượng thường trú CSDL.
Đoạn mã dưới đây thể hiện cách tìm trong danh sách reactor để lọc các reactor nhất thời hay liên tục. Việc xác nhận từng đầu mục trong danh sách reactor bằng hàm AcDbIsPersistentReactor là thực sự quan trọng. Nếu nó là một reactor nhất thời, bạn có thể sử dụng các hàm thích hợp để lấy mã ObjectId. Còn nếu không, bạn có thể đổi kiểu (cast) đầu mục thành AcDbObjectReactor.
AcDbVoidPtrArray *pReactors;
void *pSomething;
AcDbObjectReactor *pObjReactor;
AcDbObjectId persObjId;
AcDbObject *pPersReacObj;

pReactors = pEnt->reactors();

if (pReactors != NULL && pReactors->length() > 0) {
for (int i = 0; i < pReactors->length(); i++) {
pSomething = pReactors->at(i);

// Is it a persistent reactor?
//
if (acdbIsPersistentReactor(pSomething)) {
persObjId = acdbPersistentReactorObjectId(
pSomething);
acutPrintf("\n\nPersistent reactor found.");

// Echo the keyname to the user.
//
char *keyname = NULL;
getPersReactorKey(keyname, persObjId);
if (keyname) {
acutPrintf("\nThis is the reactor named %s",
keyname);
free (keyname);
}
// Open it up and see if it's one of ours. If it is,
// fire the custom notification.
//
if ((retStat =
acdbOpenAcDbObject(pPersReacObj,
persObjId, AcDb::kForNotify))
!= Acad::eOk)
{
acutPrintf("\nFailure for"
" openAcDbObject: retStat==%d\n",
retStat);
return;
}

AsdkPersReactor *pTmpPers;
if ((pTmpPers =
AsdkPersReactor::cast((AcRxObject*)
pPersReacObj)) != NULL)
{
pTmpPers->custom();
}
pPersReacObj->close();
} else {
// Or is it transient?
//
pObjReactor = (AcDbObjectReactor *)
(pReactors->at(i));
acutPrintf("\n\nTransient Reactor found");

// Report what kind we found.
//
if (pObjReactor->isKindOf(
AsdkSimpleObjReactor::desc()))
{
acutPrintf(" of type"
" AsdkSimpleObjReactor");
} else if (pObjReactor->isKindOf(
AcDbEntityReactor::desc()))
{
acutPrintf(" of type"
" AcDbEntityReactor");
} else if (pObjReactor->isKindOf(
AcDbObjectReactor::desc()))
{
acutPrintf(" of type"
" AcDbObjectReactor");
} else {
acutPrintf(" of unknown type.");
}
}
}
} else {
acutPrintf("\nThis entity has no reactors.\n");
}

No comments:

Post a Comment