How To Make MultiViewBlocks Annotative

<?xml encoding=”UTF-8″>By Madhukar Moogala

Though the post is very much related to AutoCAD Architecture or MEP, I have taken little liberty to attract AutoCAD audience too Smile

There isn’t a direct API to make annotative MVBlock, however if the internal ACAD block is annotative, same behaviour can be exposed to MVBlocks, we will get all referenced blocks and set annotation on each block which is an ACAD block.

<span>[</span>CommandMethod<span>(</span><span>"</span><span>MakeMVBlockAnnotative</span><span>"</span><span>)</span><span>]</span>
<span>public</span> <span>static</span> <span>void</span> makeMVBlockAnnotative<span>(</span><span>)</span>
<span>{</span>
<span>/*You need to include AecBaseMgd reference from OMF SDK or available with ACAMEP installations*/</span>
Document doc <span>=</span> Application<span>.</span>DocumentManager<span>.</span>MdiActiveDocument<span>;</span>
Database db <span>=</span> doc<span>.</span>Database<span>;</span>
Editor ed <span>=</span> doc<span>.</span>Editor<span>;</span>
PromptEntityOptions peo <span>=</span> <span>new</span> PromptEntityOptions<span>(</span><span>"</span><span>Select a MVBlockreference</span><span>"</span><span>)</span><span>;</span>
PromptEntityResult result <span>=</span> ed<span>.</span>GetEntity<span>(</span>peo<span>)</span><span>;</span>
<span>if</span> <span>(</span>result<span>.</span>Status <span>!</span><span>=</span> PromptStatus<span>.</span>OK<span>)</span> <span>return</span><span>;</span>
<span>try</span>
<span>{</span>
<span>using</span> <span>(</span>Transaction tr <span>=</span>
db<span>.</span>TransactionManager<span>.</span>StartTransaction<span>(</span><span>)</span><span>)</span>
<span>{</span>
MultiViewBlockReference mvBref <span>=</span>
tr<span>.</span>GetObject<span>(</span>result<span>.</span>ObjectId<span>,</span> OpenMode<span>.</span>ForWrite<span>)</span> <span>as</span> MultiViewBlockReference<span>;</span>
MultiViewBlockDefinition mbBdef <span>=</span>
tr<span>.</span>GetObject<span>(</span>mvBref<span>.</span>BlockDefId<span>,</span> OpenMode<span>.</span>ForWrite<span>)</span> <span>as</span> MultiViewBlockDefinition<span>;</span>
<span>/*Each MVBlockDefination has various internal ACAD Blocks,</span>
<span>                     *  each such block holds view dependent entities                     </span>
<span>                     * If a internal ACAD Block has annotative behavior, </span>
<span>                     * same can be exposed to mvblocks.                </span>
<span>                     </span>
<span>                     */</span>
Autodesk<span>.</span>AutoCAD<span>.</span>DatabaseServices<span>.</span>ObjectIdCollection BrefIds <span>=</span>
mbBdef<span>.</span>GetAllBlocksReferenced<span>(</span><span>)</span><span>;</span>
<span>/*Utility*/</span>
printHandlesToEditor<span>(</span>BrefIds<span>)</span><span>;</span>
<span>foreach</span><span>(</span>Autodesk<span>.</span>AutoCAD<span>.</span>DatabaseServices<span>.</span>ObjectId id <span>in</span> BrefIds<span>)</span>
<span>{</span>
BlockTableRecord btr <span>=</span> tr<span>.</span>GetObject<span>(</span>id<span>,</span> OpenMode<span>.</span>ForWrite<span>)</span> <span>as</span> BlockTableRecord<span>;</span>
btr<span>.</span>Annotative <span>=</span> AnnotativeStates<span>.</span>True<span>;</span>
<span>}</span>
BrefIds<span>.</span>Clear<span>(</span><span>)</span><span>;</span>
<span>bool</span> status <span>=</span> mvBref<span>.</span>UpdateAnnotative<span>(</span><span>)</span><span>;</span>
tr<span>.</span>Commit<span>(</span><span>)</span><span>;</span>
<span>}</span>
<span>}</span>
<span>catch</span> <span>(</span>System<span>.</span>Exception ex<span>)</span>
<span>{</span>
ed<span>.</span>WriteMessage<span>(</span>ex<span>.</span>ToString<span>(</span><span>)</span><span>)</span><span>;</span>
<span>}</span>
<span>}</span>
<span>/*Helper*/</span>
<span>private</span> <span>static</span> <span>void</span> printHandlesToEditor<span>(</span>Autodesk<span>.</span>AutoCAD<span>.</span>DatabaseServices<span>.</span>ObjectIdCollection ids<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>
Editor ed <span>=</span> doc<span>.</span>Editor<span>;</span>
<span>foreach</span> <span>(</span>Autodesk<span>.</span>AutoCAD<span>.</span>DatabaseServices<span>.</span>ObjectId id <span>in</span> ids<span>)</span>
<span>{</span>
Handle handle <span>=</span> id<span>.</span>Handle<span>;</span>
ed<span>.</span>WriteMessage<span>(</span><span>"</span><span>n</span><span>"</span> <span>+</span> handle<span>.</span>Value<span>.</span>ToString<span>(</span><span>)</span><span>)</span><span>;</span>
<span>}</span>
<span>}</span>

Comments

2 responses to “How To Make MultiViewBlocks Annotative”

  1. Cool to see new posts. AutoCAD, ACA and MEP still lives? The last post on the AEC Devblog was in 07/20/2016.

  2. Typepad HTML Email
    Pretty much!, they are not yet dead, in recent AU, our Engineering colleagues made a presentation on OMF.
     
    Thanks,
    Madhu.
     

Leave a Reply

Discover more from Autodesk Developer Blog

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

Continue reading