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

17/06/2015

Получение образцов, текстов и форм, используемых в типах линий

Как вам возможно уже известно, тип линии в AutoCAD состоит из серий значений, представляющих образцы, которые могут содержать тексты и формы. Ниже пример кода, который проходится по типам линий, загруженным в базу и показывающий их определения. В случае вложенных форм создаются формы в Пространстве Модели.

Код - C++: [Выделить]
  1. static void MyGroupListPatterns()
  2. {
  3.   Acad::ErrorStatus es;
  4.  
  5.   double  previewOffset = 5.0;
  6.   AcGePoint3d pos = AcGePoint3d::kOrigin;
  7.  
  8.   AcApDocument *pActiveDoc = acDocManager->mdiActiveDocument();
  9.   AcDbDatabase *pDB = pActiveDoc->database();
  10.  
  11.   AcDbLinetypeTable* pLineTypeTable = NULL;
  12.   if  (pDB->getLinetypeTable(pLineTypeTable, AcDb::kForRead) != Acad::eOk)
  13.     return ;
  14.  
  15.   es = acDocManager->lockDocument(pActiveDoc);
  16.   AcDbBlockTableRecordPointer pMS(ACDB_MODEL_SPACE, pDB, AcDb::kForWrite);
  17.  
  18.   AcDbLinetypeTableIterator* pIter = NULL;
  19.   es = pLineTypeTable->newIterator( pIter);
  20.   es = pLineTypeTable->close();
  21.  
  22.   for (;! pIter->done(); pIter->step())
  23.   {
  24.     AcDbLinetypeTableRecord* pLinetype = NULL;
  25.  
  26.     if  ( pIter->getRecord( pLinetype, AcDb::kForRead) == Acad::eOk)
  27.     {
  28.       const  ACHAR *pLinetypeName = NULL;
  29.       es = pLinetype->getName(pLinetypeName);
  30.       acutPrintf(_T("\nТип линии : %s" ), pLinetypeName);
  31.  
  32.       for ( int  dash = 0; dash < pLinetype->numDashes(); ++dash)
  33.       {
  34.         int  shapeNumber = pLinetype->shapeNumberAt(dash);
  35.         double  dashLen = pLinetype->dashLengthAt(dash);
  36.  
  37.         AcDbObjectId objIdShape(pLinetype->shapeStyleAt( dash));
  38.         if  (objIdShape == AcDbObjectId::kNull)
  39.         {
  40.           const ACHAR *pText = NULL;
  41.           es = pLinetype->textAt(dash, pText);
  42.           if (pText == NULL)
  43.             acutPrintf(_T("\nШтрих : %d Длина штриха : %lf" ), dash,  dashLen);
  44.           else
  45.             acutPrintf(_T("\nШтрих : %d Текст : %s" ), dash,  pText);
  46.  
  47.           continue ;
  48.         }
  49.  
  50.         // Есть форма - посмотрим на неё...
  51.         AcDbObject* pObject = NULL;
  52.         es = acdbOpenAcDbObject(pObject, objIdShape, AcDb::kForRead);
  53.  
  54.         AcDbTextStyleTableRecord* pTextSyleTableRec
  55.           = AcDbTextStyleTableRecord::cast( pObject);
  56.         Adesk::Boolean isShapeFile = pTextSyleTableRec->isShapeFile();
  57.         if (isShapeFile)
  58.         {
  59.           // Создаём форму
  60.           AcDbShape *pShape = new AcDbShape (AcGePoint3d::kOrigin, 1.0);
  61.           if ( pShape->setShapeNumber(shapeNumber) != Acad::eOk ||
  62.             pShape->setStyleId(objIdShape) != Acad::eOk)
  63.           {
  64.             delete  pShape;
  65.             pShape = NULL;
  66.           }
  67.           if (pShape)
  68.           {
  69.             es = pShape->setWidthFactor(1.0);
  70.             AcDbObjectId id;
  71.             es = pMS->appendAcDbEntity(id, pShape);
  72.             es = pShape->setPosition(pos);
  73.             pos += AcGeVector3d::kXAxis * previewOffset;
  74.  
  75.             es = pShape->setSize(1);
  76.             es = pShape->setRotation(0);
  77.             es=pShape->close();
  78.  
  79.             const  ACHAR *pShapeFileName = NULL;
  80.             Acad::ErrorStatus es = pTextSyleTableRec->fileName(pShapeFileName);
  81.  
  82.             acutPrintf(_T("\nШтрих : %d Номер формы : %d Имя формы : %s Имя файла формы : %s"),
  83.                       dash, shapeNumber, pShape->name(), pShapeFileName);
  84.           }
  85.         }
  86.         else
  87.         {
  88.           const  ACHAR *pText = NULL;
  89.           es = pLinetype->textAt(dash, pText);
  90.           acutPrintf(_T("\nШтрих : %d Текст : %s" ),
  91.             dash,  pText);
  92.         }
  93.         pObject->close();
  94.       }
  95.       pLinetype->close();
  96.     }
  97.   }
  98.   delete  pIter;
  99.  
  100.   es = acDocManager->unlockDocument(pActiveDoc);
  101.  
  102. }

 

Источник: http://adndevblog.typepad.com/autocad/2015/06/extracting-pattern-text-and-shapes-used-in-linetypes.html

Автор перевода: Александр Ривилис

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

Опубликовано 17.06.2015