How to get AcadBlock and AcadEntity in transaction?

How to get AcadBlock and AcadEntity in transaction?

Anonymous
Not applicable
1,267 Views
2 Replies
Message 1 of 3

How to get AcadBlock and AcadEntity in transaction?

Anonymous
Not applicable

Welcome 

 

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
            Next
        Next

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 :/
        Next

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 🙂

 

0 Likes
Accepted solutions (1)
1,268 Views
2 Replies
Replies (2)
Message 2 of 3

Alfred.NESWADBA
Consultant
Consultant
Accepted solution

Hi,

 

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
    Next
  end if
Next

 HTH, - alfred -

------------------------------------------------------------------------------------
Alfred NESWADBA
ISH-Solutions GmbH / Ingenieur Studio HOLLAUS
www.ish-solutions.at ... blog.ish-solutions.at ... LinkedIn ... CDay 2026
------------------------------------------------------------------------------------

(not an Autodesk consultant)
Message 3 of 3

Anonymous
Not applicable

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

Thanks for Your help and support.

Best regards

0 Likes