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

How to get AcadBlock and AcadEntity in transaction?

2 REPLIES 2
SOLVED
Reply
Message 1 of 3
lukasz.taraszka
1071 Views, 2 Replies

How to get AcadBlock and AcadEntity in transaction?

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 🙂

 

2 REPLIES 2
Message 2 of 3

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
Ingenieur Studio HOLLAUS ... www.hollaus.at ... blog.hollaus.at ... CDay 2024
------------------------------------------------------------------------------------
(not an Autodesk consultant)
Message 3 of 3

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

Thanks for Your help and support.

Best regards

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