Тип AcDbObject

Автор Тема: Тип AcDbObject  (Прочитано 9189 раз)

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

Оффлайн Грасмик АлексейАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Тип AcDbObject
« : 21-04-2015, 05:59:37 »
доброе утро. хочу задать один вопрос по базовым знаниям в ObjectARX. сильно не ругайтесь.
как проверить тип объекта в AcDbObject*? по этому указателю же может быть, в принципе, любой объект.
я смотрю o->isA()->name(), там в текстовом виде находится тип. соответственно проверяю так же - !wcscmp(o->isA()->name(),L"Тип").
выглядит не правильно. есть другой метод?

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: Тип AcDbObject
« Ответ #1 : 21-04-2015, 10:40:45 »
Всё зависит от цели. если нужно обработать какие-то конкретные типы примитивов, то проще сделать так
Код - C++ [Выбрать]
  1. AcDbCurve * pCurve = NULL; //<- базовый объект
  2. acdbOpenObject(pCurve, eId, AcDb::kForRead);
  3. AcDbSpline * pSpline = AcDbSpline::cast(pCurve);
  4. if (pSpline != NULL)
  5. {
  6.   // обработка сплайна
  7. }
  8. pCurve->close();
  9.  

а если нужно посчитать сколько каких объектов у нас в чертеже и выкинуть списочек с количеством, то проще это делать через сравнение строк.

И еще, если речь идет о графических примитивах автокада, то лучше пользоваться AcDbEntity.

Оффлайн Грасмик АлексейАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Тип AcDbObject
« Ответ #2 : 21-04-2015, 10:46:09 »
про ::КАСТ не знал, спасибо.
это типа "безопасный каст"? если это не тот тип - то вернет нуль?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Тип AcDbObject
« Ответ #3 : 21-04-2015, 11:40:51 »
если это не тот тип - то вернет нуль?
Да. Но учти, что такой способ проверки вернёт тебе не NULL не только для объекта базового класса, но и у унаследованного.
Например, для AcDbTable ближайший базовый класс AcDbBlockReference
Код - C++ [Выбрать]
  1. AcDbEntity *pEnt = NULL;
  2. pEnt = new AcDbTable();
  3. AcDbBlockReference *pBref = AcDbBlockReference::cast(pEnt);
  4. if (pBref != NULL) {
  5. // Это вставка блока, но и при этом это таблица
  6. }

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Грасмик АлексейАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Тип AcDbObject
« Ответ #4 : 21-04-2015, 11:50:08 »
а как правильно проверять? через isA->name()? или там еще DXFname есть...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Тип AcDbObject
« Ответ #5 : 21-04-2015, 12:23:35 »
Давай сначала разберёмся что ты хочешь проверить. Нарисуй в чертеже AutoCAD два примитива. Один командой _TEXT, второй командой _ATTDEF. И запусти следующий код:
Код - C++ [Выбрать]
  1.     static void ArxProject4MyCommand1(void)
  2.     {
  3.        ads_name en; ads_point p;
  4.        if (acedEntSel(_T("\nВыберите объект: "),en,p) != RTNORM)
  5.          return;
  6.        AcDbObjectId eId; acdbGetObjectId(eId, en);
  7.        AcDbEntityPointer pEnt(eId, AcDb::kForRead);
  8.        if (pEnt.openStatus() != Acad::eOk) return;
  9.        acutPrintf(_T("\nКласс: %s"), pEnt->isA()->name());
  10.        if (pEnt->isA()->comparedTo(AcDbText::desc()) == AcRx::kEqual) {
  11.          acutPrintf(_T("\nЭто точно AcDbText"));
  12.        }
  13.        if (AcDbText::cast(pEnt)) {
  14.          acutPrintf(_T("\nЭто AcDbText или его наследник"));
  15.        }
  16.     }
  17.  

Сравни результаты при выборе одного и другого примитива:

Цитировать
Command: MYCOMMAND1

Выберите объект:
Класс: AcDbText
Это точно AcDbText
Это AcDbText или его наследник
Command: MYCOMMAND1

Выберите объект:
Класс: AcDbAttributeDefinition
Это AcDbText или его наследник
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Грасмик АлексейАвтор темы

  • ADN OPEN
  • Сообщений: 29
  • Карма: 0
Re: Тип AcDbObject
« Ответ #6 : 21-04-2015, 12:30:53 »
о, спасибо, я про comparedTo не знал - оно мне подходит.
второй вариант не очень - можно промахнуться.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Тип AcDbObject
« Ответ #7 : 21-04-2015, 12:36:16 »
второй вариант не очень - можно промахнуться.
Это очень зависит от того, что ты собираешься делать. Например если нужно найти точки начала и конца AcDbCurve, то не обязательно проверять на все унаследованные классы, которых множество.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение