17/06/2015
Получение образцов, текстов и форм, используемых в типах линий
Как вам возможно уже известно, тип линии в AutoCAD состоит из серий значений, представляющих образцы, которые могут содержать тексты и формы. Ниже пример кода, который проходится по типам линий, загруженным в базу и показывающий их определения. В случае вложенных форм создаются формы в Пространстве Модели.
Код - C++: [Выделить]
- static void MyGroupListPatterns()
- {
- Acad::ErrorStatus es;
- double previewOffset = 5.0;
- AcGePoint3d pos = AcGePoint3d::kOrigin;
- AcApDocument *pActiveDoc = acDocManager->mdiActiveDocument();
- AcDbDatabase *pDB = pActiveDoc->database();
- AcDbLinetypeTable* pLineTypeTable = NULL;
- if (pDB->getLinetypeTable(pLineTypeTable, AcDb::kForRead) != Acad::eOk)
- return ;
- es = acDocManager->lockDocument(pActiveDoc);
- AcDbBlockTableRecordPointer pMS(ACDB_MODEL_SPACE, pDB, AcDb::kForWrite);
- AcDbLinetypeTableIterator* pIter = NULL;
- es = pLineTypeTable->newIterator( pIter);
- es = pLineTypeTable->close();
- for (;! pIter->done(); pIter->step())
- {
- AcDbLinetypeTableRecord* pLinetype = NULL;
- if ( pIter->getRecord( pLinetype, AcDb::kForRead) == Acad::eOk)
- {
- const ACHAR *pLinetypeName = NULL;
- es = pLinetype->getName(pLinetypeName);
- acutPrintf(_T("\nТип линии : %s" ), pLinetypeName);
- for ( int dash = 0; dash < pLinetype->numDashes(); ++dash)
- {
- int shapeNumber = pLinetype->shapeNumberAt(dash);
- double dashLen = pLinetype->dashLengthAt(dash);
- AcDbObjectId objIdShape(pLinetype->shapeStyleAt( dash));
- if (objIdShape == AcDbObjectId::kNull)
- {
- const ACHAR *pText = NULL;
- es = pLinetype->textAt(dash, pText);
- if (pText == NULL)
- acutPrintf(_T("\nШтрих : %d Длина штриха : %lf" ), dash, dashLen);
- else
- acutPrintf(_T("\nШтрих : %d Текст : %s" ), dash, pText);
- continue ;
- }
- // Есть форма - посмотрим на неё...
- AcDbObject* pObject = NULL;
- es = acdbOpenAcDbObject(pObject, objIdShape, AcDb::kForRead);
- AcDbTextStyleTableRecord* pTextSyleTableRec
- = AcDbTextStyleTableRecord::cast( pObject);
- Adesk::Boolean isShapeFile = pTextSyleTableRec->isShapeFile();
- if (isShapeFile)
- {
- // Создаём форму
- AcDbShape *pShape = new AcDbShape (AcGePoint3d::kOrigin, 1.0);
- if ( pShape->setShapeNumber(shapeNumber) != Acad::eOk ||
- pShape->setStyleId(objIdShape) != Acad::eOk)
- {
- delete pShape;
- pShape = NULL;
- }
- if (pShape)
- {
- es = pShape->setWidthFactor(1.0);
- AcDbObjectId id;
- es = pMS->appendAcDbEntity(id, pShape);
- es = pShape->setPosition(pos);
- pos += AcGeVector3d::kXAxis * previewOffset;
- es = pShape->setSize(1);
- es = pShape->setRotation(0);
- es=pShape->close();
- const ACHAR *pShapeFileName = NULL;
- Acad::ErrorStatus es = pTextSyleTableRec->fileName(pShapeFileName);
- acutPrintf(_T("\nШтрих : %d Номер формы : %d Имя формы : %s Имя файла формы : %s"),
- dash, shapeNumber, pShape->name(), pShapeFileName);
- }
- }
- else
- {
- const ACHAR *pText = NULL;
- es = pLinetype->textAt(dash, pText);
- acutPrintf(_T("\nШтрих : %d Текст : %s" ),
- dash, pText);
- }
- pObject->close();
- }
- pLinetype->close();
- }
- }
- delete pIter;
- es = acDocManager->unlockDocument(pActiveDoc);
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=2799
Опубликовано 17.06.2015