Check needed to determine if a text is present in a Linetype using .NET

<?xml encoding=”UTF-8″>By Deepak Nadig

Recently, an ADN partner requested for a method to check if a text is contained in a Linetype before extracting the text.

To extract a text, LinetypeTableRecord.TextAt is used and it returns eNotApplicable error when text is not present at index in the record. To avoid this, null id check using LinetypeTableRecord.ShapeStyleAt can be used. This method returns null, if text is not present at an index in the LinetypeTableRecord.

Here is a quick sample to check if text is present prior to extraction of the text :  

<span>[</span>CommandMethod<span>(</span><span>"</span><span>lineTypeText</span><span>"</span><span>)</span><span>]</span>
<span>public</span> <span>void</span> lineTypeText<span>(</span><span>)</span> <span>{</span>
Document doc <span>=</span> Application<span>.</span>DocumentManager<span>.</span>MdiActiveDocument<span>;</span>
Database db <span>=</span> doc<span>.</span>Database<span>;</span>
Transaction tr <span>=</span> db<span>.</span>TransactionManager<span>.</span>StartTransaction<span>(</span><span>)</span><span>;</span>
Editor ed <span>=</span> doc<span>.</span>Editor<span>;</span>
<span>using</span> <span>(</span>tr<span>)</span> <span>{</span>
DBObject tmpObj <span>=</span> tr<span>.</span>GetObject<span>(</span>db<span>.</span>LinetypeTableId<span>,</span> OpenMode<span>.</span>ForRead<span>)</span><span>;</span>
LinetypeTable pLineTable <span>=</span> <span>(</span>LinetypeTable<span>)</span>tmpObj<span>;</span>
<span>if</span> <span>(</span><span>(</span>pLineTable <span>!</span><span>=</span> <span>null</span><span>)</span><span>)</span> <span>{</span>
<span>foreach</span> <span>(</span>ObjectId tblRecId <span>in</span> pLineTable<span>)</span> <span>{</span>
LinetypeTableRecord pLineType <span>=</span> <span>(</span>LinetypeTableRecord<span>)</span>tr<span>.</span>GetObject<span>(</span>tblRecId<span>,</span> OpenMode<span>.</span>ForRead<span>)</span><span>;</span>
<span>if</span> <span>(</span><span>(</span>pLineType <span>!</span><span>=</span> <span>null</span><span>)</span><span>)</span> <span>{</span>
<span>for</span> <span>(</span><span>int</span> dash <span>=</span> <span>0</span><span>;</span> dash <span><</span> pLineType<span>.</span>NumDashes<span>;</span> dash<span>+</span><span>+</span><span>)</span> <span>{</span>
<span>/* LinetypeTableRecord.ShapeStyleAt returns the ObjectId of the TextStyleTableRecord of the shape </span>
<span>                (or textStyle if it's a text string instead of a shape) at position index in the LinetypeTableRecord.</span>
<span>                If there is no shape or text at index, then Null is returned.*/</span>
ObjectId objIdShape <span>=</span> pLineType<span>.</span>ShapeStyleAt<span>(</span>dash<span>)</span><span>;</span>
<span>if</span> <span>(</span>objIdShape <span>!</span><span>=</span> ObjectId<span>.</span>Null<span>)</span> <span>{</span>
<span>string</span> pText <span>=</span> <span>"</span><span>"</span><span>;</span>
pText <span>=</span> pLineType<span>.</span>TextAt<span>(</span>dash<span>)</span><span>;</span>
<span>if</span> <span>(</span>pText <span>=</span><span>=</span> <span>"</span><span>"</span><span>)</span> <span>{</span>
ed<span>.</span>WriteMessage<span>(</span><span>"</span><span>no dash text </span><span>"</span><span>)</span><span>;</span>
<span>}</span> <span>else</span> <span>{</span>
ed<span>.</span>WriteMessage<span>(</span><span>"</span><span>dash :</span><span>"</span> <span>+</span> dash<span>.</span>ToString<span>(</span><span>)</span><span>)</span><span>;</span>
ed<span>.</span>WriteMessage<span>(</span><span>"</span><span>ndash text :</span><span>"</span> <span>+</span> pText<span>)</span><span>;</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>}</span>
<span>}</span>

The output generated by this code snippet is as seen in this screenshot :

  LineTypeText

 

 

 

 

 

 

 

 

 

 

Update:  The above code is not equipped to handle shapesymbol in linetype. You can use the LinetypeTableRecord.ShapeNumberAt API to determine if shape exists. It returns 0 if shape does not exist. Below is the modified code that Can be used for testing : 

<span>[CommandMethod("lineTypeText")]</span>
<span>public</span> <span>void</span> <span>lineTypeText</span>()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Transaction tr = db.TransactionManager.StartTransaction();
Editor ed = doc.Editor;
<span>using</span> (tr)
{
DBObject tmpObj = tr.GetObject(db.LinetypeTableId, OpenMode.ForRead);
LinetypeTable pLineTable = (LinetypeTable)tmpObj;
<span>if</span> ((pLineTable != <span>null</span>))
{
<span>foreach</span> (ObjectId tblRecId <span>in</span> pLineTable)
{
LinetypeTableRecord pLineType = (LinetypeTableRecord)tr.GetObject(tblRecId, OpenMode.ForRead);
<span>if</span> ((pLineType != <span>null</span>))
{
<span>for</span> (<span>int</span> dash = <span>0</span>; dash < pLineType.NumDashes; dash++)
{
ObjectId objIdShape = pLineType.ShapeStyleAt(dash); <span>//If there is no shape or text at index, then Null is returned.</span>
<span>int</span> shpNum = pLineType.ShapeNumberAt(dash);
<span>if</span> (objIdShape != ObjectId.Null)
{
ed.WriteMessage(<span>"text or shape exist;"</span>);
<span>string</span> pText = <span>""</span>;
<span>//returns 0 if there is no shapesymbol at the index, which means text exist in this context</span>
<span>if</span> (shpNum == <span>0</span>)
{
pText = pLineType.TextAt(dash);
ed.WriteMessage(<span>" dash text :"</span> + pText );
}
ed.WriteMessage(<span>"n"</span>);
}
}
}
}
}
}
}

Comments

Leave a Reply

Discover more from Autodesk Developer Blog

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

Continue reading