Extracting pattern, text and shapes used in linetypes

<?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 :

LineType


Comments

2 responses to “Extracting pattern, text and shapes used in linetypes”

  1. 2005anjob Avatar
    2005anjob

    what to do if I want to get all shapes in the AcDbTextStyleTable?
    how to get the shapes name and create the shape unless i create the shape?
    please give me a demo if you can,thank you

  2. If I don’t build the shape, how can I get the name of the shape and make the shape?

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading