<?xml encoding=”UTF-8″>By Balaji Ramamoorthy
As you may already know, linetype definition in AutoCAD consists of series of values representing the pattern and can include text and shapes. Here is a sample code to iterate the linetypes loaded in the database and display the definition. In case of embedded shapes, a preview of the shape is created by adding an AcDbShape to the modelspace.
Acad::ErrorStatus es;
<span>double</span><span> previewOffset = 5.0;</span>
AcGePoint3d pos = AcGePoint3d::kOrigin;
AcApDocument *pActiveDoc
= acDocManager->mdiActiveDocument();
AcDbDatabase *pDB = pActiveDoc->database();
AcDbLinetypeTable* pLineTypeTable = NULL;
<span>if</span><span> ( pDB->getLinetypeTable(</span>
pLineTypeTable, AcDb::kForRead) != Acad::eOk)
<span>return</span><span> ;</span>
es = acDocManager->lockDocument(pActiveDoc);
AcDbBlockTableRecordPointer
pMS(ACDB_MODEL_SPACE, pDB, AcDb::kForWrite);
AcDbLinetypeTableIterator* pIter = NULL;
es = pLineTypeTable->newIterator( pIter);
es = pLineTypeTable->close();
<span>for</span><span> (;! pIter->done(); pIter->step()) </span>
<span>{</span>
AcDbLinetypeTableRecord* pLinetype = NULL;
<span>if</span><span> ( pIter->getRecord( pLinetype, </span>
AcDb::kForRead) == Acad::eOk)
<span>{</span>
<span>const</span><span> ACHAR *pLinetypeName = NULL; </span>
es = pLinetype->getName(pLinetypeName);
acutPrintf(_T(<span>"\nLinetype : %s"</span><span> ), </span>
pLinetypeName);
<span>for</span><span> ( <span>int</span><span> dash = 0; dash < </span></span>
pLinetype->numDashes(); ++dash)
<span>{</span>
<span>int</span><span> shapeNumber </span>
= pLinetype->shapeNumberAt(dash);
<span>double</span><span> dashLen </span>
= pLinetype->dashLengthAt(dash);
AcDbObjectId objIdShape
(pLinetype->shapeStyleAt( dash));
<span>if</span><span> ( objIdShape == AcDbObjectId::kNull) </span>
<span>{</span>
<span>const</span><span> ACHAR *pText = NULL; </span>
es = pLinetype->textAt(dash, pText);
<span>if</span><span> (pText == NULL)</span>
acutPrintf(_T(<span>"\nDash : %d DashLen : %lf"</span><span> ),</span>
dash, dashLen);
<span>else</span>
acutPrintf(_T(<span>"\nDash : %d Text : %s"</span><span> ), </span>
dash, pText);
<span>continue</span><span> ;</span>
<span>}</span>
<span>// Shape involved, lets preview it...</span>
AcDbObject* pObject = NULL;
es = acdbOpenAcDbObject(
pObject, objIdShape, AcDb::kForRead);
AcDbTextStyleTableRecord* pTextSyleTableRec
= AcDbTextStyleTableRecord::cast( pObject);
Adesk::Boolean isShapeFile
= pTextSyleTableRec->isShapeFile();
<span>if</span><span> (isShapeFile)</span>
<span>{</span>
<span>// Create a preview of the shape</span>
AcDbShape *pShape = <span>new</span><span> AcDbShape</span>
(AcGePoint3d::kOrigin, 1.0);
<span>if</span><span> ( pShape->setShapeNumber(shapeNumber) </span>
!= Acad::eOk ||
pShape->setStyleId(objIdShape)
!= Acad::eOk)
<span>{</span>
<span>delete</span><span> pShape;</span>
pShape = NULL;
<span>}</span>
<span>if</span><span> (pShape)</span>
<span>{</span>
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();
<span>const</span><span> ACHAR *pShapeFileName = NULL; </span>
Acad::ErrorStatus es
= pTextSyleTableRec->fileName
(pShapeFileName);
acutPrintf(_T(<span>"\nDash : %d </span>
ShapeNumber : %d
ShapeName : %s
ShapeFile : %s<span>"), </span>
dash, shapeNumber,
pShape->name(), pShapeFileName);
<span>}</span>
<span>}</span>
<span>else</span>
<span>{</span>
<span>const</span><span> ACHAR *pText = NULL; </span>
es = pLinetype->textAt(dash, pText);
acutPrintf(_T(<span>"\nDash : %d Text : %s"</span><span> ), </span>
dash, pText);
<span>}</span>
pObject->close();
<span>}</span>
pLinetype->close();
<span>}</span>
<span>}</span>
<span>delete</span><span> pIter;</span>
es = acDocManager->unlockDocument(pActiveDoc);
The output generated by this code snippet is as seen in this screenshot :


Leave a Reply