<?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 :
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>);
}
}
}
}
}
}
}


Leave a Reply