Получение ID Объектного Реактора
Каждый объект базы данных обслуживает{*поддерживает*} список реакторов на себе. Некоторые - переходные реакторы, и некоторые постоянны. Переходные реакторы - образцы классов, полученных из AcDbObjectReactor, принимая во внимание, что постоянные реакторы - объект IDs объектов резидента базы.
Следующий код показывает, как перерыть список реакторов, чтобы найти ваш переходный или постоянный реактор. Чрезвычайно важно, что Вы проверяете специфический вход в реакторном списке, чтобы быть постоянным реактором, используя функцию AcDbIsPersistentReactor. Если это - постоянный реактор, Вы можете использовать соответствующую функцию, чтобы получить ее объект ID. Если это - не постоянный реактор, Вы можете приводить вход в 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");
}