Posts: 13
Registered: ‎10-07-2011
Message 1 of 3 (573 Views)
Accepted Solution

How to get AcadBlock and AcadEntity in transaction?

573 Views, 2 Replies
10-24-2011 04:56 AM



I have a little problem - how to get AcadBlock or AcadEntities by using transaction.


In a current open document I can do something like this:


Dim document As Document = Application.DocumentManager.MdiActiveDocument
        Dim AcadDrawing As AcadDocument = DirectCast(document.AcadDocument, AcadDocument)
        For Each block As AcadBlock In AcadDrawing.Blocks
            For Each ent As AcadEntity In block
                'here I can access all of the entities in block

It's working fine, but when I tried open a document in backgroud I can't get the AcadBlock or AcadEntities, only a BlockTableRecord.


Dim path As String = "c:\path to dwg file"
        Dim db As Database = New Database(TrueTrue)
        db.ReadDwgFile(path, FileOpenMode.OpenForReadAndAllShare, TrueNothing)
        Dim tr As Transaction = db.TransactionManager.StartTransaction()
        Dim blockTable As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
        For Each blockRecordId As ObjectId In blockTable
            Dim blockRecord As BlockTableRecord = DirectCast(tr.GetObject(blockRecordId, OpenMode.ForRead), BlockTableRecord)'I can't get AcadEntity or AcadBlock here :/

Is there any posibility to get AcadBlocks or AcadEntities by using TransactionManager?

what's the difference between AcadBlock and BlockTableRecord?


I will be very grateful if anyone would like to help me with this problem :smileyhappy:


*Expert Elite*
Posts: 8,963
Registered: ‎06-29-2007
Message 2 of 3 (571 Views)

Re: How to get AcadBlock and AcadEntity in transaction?

10-24-2011 05:18 AM in reply to: lukasz.taraszka



am I right that you try to scan through all Blocks?

Look at this code. ... does it help?


Dim blockTable As BlockTable = ctype(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
For Each blockRecordId As ObjectId In blockTable
  if (blockRecordID.isValid) andalso (not blockRecordID.isErased) Then
    'now we can get the BlockTableRecord for this ID
    Dim blockRecord As BlockTableRecord = cType(tr.GetObject(blockRecordId, OpenMode.ForRead), BlockTableRecord)
    'now scan through the entities in the BlockTableRecord
    for each EntID as ObjectID in blockRecord
      if (EntID.isValid) andalso (not EntID.isErased) Then
        dim tEnt as Entity = cType(tr.GetObject(EntID,OpenMode.ForRead),Entity)
        'whatever you want to do with this Entity now ...
      end if
  end if

 HTH, - alfred -

Ingenieur Studio HOLLAUS ... www.hollaus.at
Posts: 13
Registered: ‎10-07-2011
Message 3 of 3 (565 Views)

Re: How to get AcadBlock and AcadEntity in transaction?

10-24-2011 05:25 AM in reply to: Alfred.NESWADBA

That's correct - Your code is doing exactly what I meant.

Thanks for Your help and support.

Best regards

Are you familiar with the Autodesk Expert Elites? The Expert Elite program is made up of customers that help other customers by sharing knowledge and exemplifying an engaging style of collaboration. To learn more, please visit our Expert Elite website.
Need installation help?

Start with some of our most frequented solutions or visit the Installation and Licensing Forum to get help installing your software.