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

30/05/2013

Чтение размерного текста в ARX

Размерный текст нельзя прочитать непосредственно, т.к. информация хранится в примитиве AcDbMText, содержащемся в записи таблицы блоков. Из AcDbDimension (или производных классов) можно получить идентификатор записи таблицы блоков при помощи метода dimBlockId(). Затем можно в записи таблицы блоков AcDbBlockTableRecord  найти примитив AcDbMText и вызвать его метод contents(). Смотрите следующий код:

Код - C++: [Выделить]
  1. AcDbEntity *pEnt;
  2. AcDbObjectId id;
  3. AcGePoint3d ptPick;
  4. ads_name eName;
  5.  if (acedEntSel (_T("Select a dimension: ") ,
  6.   eName, asDblArray (ptPick)) != RTNORM )
  7.   return;
  8. acdbGetObjectId (id, eName);
  9. acdbOpenAcDbEntity (pEnt, id, AcDb::kForRead);
  10.  //----- Получим идентификатор записи таблицы блоков,
  11.  // которая содержит текстовый примитив
  12. AcDbDimension *pDim =AcDbDimension::cast (pEnt);
  13.  if (pDim == NULL)
  14. {
  15.   pEnt->close ();
  16.   return;
  17. }
  18. id =pDim->dimBlockId ();
  19. pDim->close ();
  20. AcDbBlockTableRecord *pr;
  21. acdbOpenAcDbObject ((AcDbObject *&) pr,
  22.   id, AcDb::kForRead);
  23.  //----- Пройдемся по примитивам в записи таблицы блоков
  24. AcDbBlockTableRecordIterator *pi;
  25. pr->newIterator (pi);
  26.  while (!pi->done ())
  27. {
  28.   pi->getEntity (pEnt, AcDb::kForRead);
  29.   if (pEnt->isKindOf (AcDbMText::desc ()))
  30.   {
  31.    AcDbMText *pt = (AcDbMText *) pEnt;
  32.    ACHAR *s = pt->contents ();
  33.    acutPrintf (s);
  34.    delete s;
  35.   }
  36.   pEnt->close();
  37.   pi->step();
  38. }
  39. delete pi;
  40. pr->close();

 

Источник: http://adndevblog.typepad.com/autocad/2012/12/reading-dimension-text-in-arx.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=92.0

Опубликовано 30.05.2013
Отредактировано 09.06.2013 в 04:03:33