.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

BlockReference from AttributeReference

3 REPLIES 3
SOLVED
Reply
Message 1 of 4
HJohn1
1014 Views, 3 Replies

BlockReference from AttributeReference

I am using GetNestedEntity to select an AttributeReference and update the TextString.  However, I would like to modify the routine to include other AttributeReferences on other BlockReferences.  I would like to be able to access the BlockReference from the AttributeReference so I could implement different validations based on the Name of the BlockRefence.  I have been trying to find a way to get this to work but I have been unable to do it.  Can someone please indicate how to go about it.

3 REPLIES 3
Message 2 of 4
norman.yuan
in reply to: HJohn1

I assume that you use PromptNestedEntityResult object to obtain user picked AttributeReference' ObjectId.

 

According to the document and ObjectBrowser, there is a method: PromptNestedEntityResult.GetContainers(). It looks like the one we could use to find out which blockreference object owns the picked attribute. However, I tried this method with a simple block ( a circle with a couple of attributes) without sucess: the PromptNestedEntityResult.GetContainers() returns no container at all, although the picked nested entity is correctly an attribute.

 

But there is still a way to get what you want: AttributeReference.OwnerId will identify the BlockReference that owns the attributereference:

 

The code will look like:

 

            Document dwg = Application.DocumentManager.MdiActiveDocument;
            Editor ed = dwg.Editor;
            Database db = dwg.Database;

            //Pick nested object - Attribute in a block
            PromptNestedEntityOptions opt = new 
                    PromptNestedEntityOptions("\nPick an attribute:"); 
                opt.AllowNone = false; 
  
            PromptNestedEntityResult res = ed.GetNestedEntity(opt);
            if (res.Status == PromptStatus.OK)
            {
                using (Transaction tran = db.TransactionManager.StartTransaction())
                {
                    AttributeReference att = tran.GetObject(res.ObjectId, OpenMode.ForRead) as AttributeReference;

                    ed.WriteMessage("\nOwner ({0}): {1}", att.OwnerId.ToString(), att.OwnerId.ObjectClass.DxfName);

                    BlockReference blk = tran.GetObject(att.OwnerId, OpenMode.ForRead) as BlockReference;
                    ed.WriteMessage("\nPicked attribute is owned by block \"{0}\"", blk.Name);

                    tran.Commit();
                }
            }

 

Norman Yuan

Drive CAD With Code

EESignature

Message 3 of 4
khoa.ho
in reply to: HJohn1

An appendix to norman.yuan post:

 

AttributeReference.OwnerId gets the BlockReference that owns this AttributeReference.

 

var containers = PromptNestedEntityResult.GetContainers() gets the container(s) of the selected nested entity. If this entity is nested inside a block (innerBlock), and this block is nested inside another block (outerBlock), the result will be containers[0] = innerBlock.ObjectId, containers[1] = outerBlock.ObjectId. The first index is for the inner most nested block, the last index is for the outside overall block.

 

PromptNestedEntityResult.GetContainers() does NOT return anything if you pick on an AttributeReference (it may be a bug), but returns an array if you pick on any other entity (Line, Circle, DBText…). So GetContainers() will not use for attribute, instead we use AttributeReference.OwnerId to get the block reference of this attribute.

 

-Khoa

 

Message 4 of 4
HJohn1
in reply to: norman.yuan

Thank you very much Norman.  AttributeReference.OwnerId is exactly what I was looking for.  I just needed to go back up one level to the BlockRefence.

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost