isDerivedFrom, isKindOf и isA

Автор Тема: isDerivedFrom, isKindOf и isA  (Прочитано 3352 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
isDerivedFrom, isKindOf и isA
« : 16-02-2017, 10:40:41 »
Вопрос о идентификации класса объекта по его AcDbObjectId.

Из AcDbObjectId получаю AcRxClass* методом objectClass()
На сколько я понял из справки то:
  • bool isDerivedFrom(const AcRxClass* pOtherClass) const - указывает что наш клас это екземпляр типа pOtherClass или унаследованный от него.
  • bool AcRxObject::isKindOf(const AcRxClass* pOtherClass) const - указывает что наш клас это екземпляр типа pOtherClass или какой то его наследник.
  • virtual AcRxClass* isA() const - описание класса.

Мой код:
Код - 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
Прикрепляю скрин каллстека


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: isDerivedFrom, isKindOf и isA
« Ответ #1 : 16-02-2017, 11:31:29 »
Распечатай свойство name объекта isAClass. Подозреваю, что ты получишь L"AcRxImpClass" вместо ожидаемого тобой L"AcDbLayerTableRecord"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 23-03-2017, 20:31:06

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: isDerivedFrom, isKindOf и isA
« Ответ #2 : 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
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение