Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Dziubyna от 16-02-2017, 10:40:41

Название: isDerivedFrom, isKindOf и isA
Отправлено: Dziubyna от 16-02-2017, 10:40:41
Вопрос о идентификации класса объекта по его AcDbObjectId.

Из AcDbObjectId получаю AcRxClass* методом objectClass()
На сколько я понял из справки то:

Мой код:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus CLayerCloneRenameFiler::writeHardPointerId(const AcDbHardPointerId& val)
  2. {      
  3.         AcRxClass* objClass = val.objectClass();
  4.         AcRxClass* isAClass = objClass->isA();
  5.         AcRxClass* etalClass = AcDbLayerTableRecord::desc();   
  6.         bool isA = isAClass == etalClass;       // false
  7.         bool isKinOf = objClass->isKindOf(etalClass); // false
  8.         bool isDerFrom = objClass->isDerivedFrom(etalClass); // true
  9.         const ACHAR* pName = objClass->name(); // L"AcDbLayerTableRecord"       const wchar_t *
  10.         acutPrintf(pName);
  11.  
  12.         if (!isDerFrom)
  13.                 return AcDbWblockCloneFiler::writeHardPointerId(val);
  14.         // DO SMTH
  15. }
  16.  

И вот. Почему такие результаты? Если это и есть класс AcDbLayerTableRecord
Прикрепляю скрин каллстека
(https://s14.postimg.org/wd9ur2mf1/Image.jpg) (https://postimg.org/image/wd9ur2mf1/)
Название: Re: isDerivedFrom, isKindOf и isA
Отправлено: Александр Ривилис от 16-02-2017, 11:31:29
Распечатай свойство name объекта isAClass. Подозреваю, что ты получишь L"AcRxImpClass" вместо ожидаемого тобой L"AcDbLayerTableRecord"
Название: Re: isDerivedFrom, isKindOf и isA
Отправлено: Александр Ривилис от 16-02-2017, 11:57:44
Вот для простой проверки:
Код - C++ [Выбрать]
  1. AcDbLayerTablePointer pLT(acdbCurDwg(), AcDb::kForRead);
  2. AcDbObjectId id;
  3. if (pLT->getAt(L"0",id) == Acad::eOk) {
  4.   AcRxClass *pEtalonClass = AcDbLayerTableRecord::desc();
  5.   const ACHAR *pEtalonClassName = pEtalonClass->name();
  6.   AcRxClass *pClass = id.objectClass();
  7.   const ACHAR *pClassName = pClass->name();
  8.   AcRxClass *pClassRef = pClass->isA();
  9.   const ACHAR *pClassRefName = pClassRef->name();
  10.   acutPrintf(L"\nEtalonClass=%s, Class=%s, ClassRef=%s",
  11.     pEtalonClassName, pClassName,pClassRefName);
  12.   bool bIs = (pClass == pEtalonClass);
  13.   acutPrintf(L"\n(pClass == pEtalonClass)=%s", bIs ? L"Yes": L"No");
  14.   bool bIsKindOf = pClass->isKindOf(pEtalonClass);
  15.   acutPrintf(L"\npClass->isKindOf(pEtalonClass) = %s", bIsKindOf ? L"Yes": L"No");
  16.   bool bIsDerived = pClass->isDerivedFrom(pEtalonClass);
  17.   acutPrintf(L"\npClass->isDerivedFrom(pEtalonClass) = %s", bIsDerived ? L"Yes": L"No");
  18. }


EtalonClass=AcDbLayerTableRecord, Class=AcDbLayerTableRecord,
ClassRef=AcRxImpClass
(pClass == pEtalonClass)=Yes
pClass->isKindOf(pEtalonClass) = No // Тут понятно, т.к. AcDbLayerTableRecord не производный от AcRxImpClass
pClass->isDerivedFrom(pEtalonClass) = Yes // Здесь идёт анализ дерева классов начиная с AcDbLayerTableRecord