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

Block Reference question.

12 REPLIES 12
Reply
Message 1 of 13
wowens63
610 Views, 12 Replies

Block Reference question.

1. first I have a drawing called "test1"

2. and a drawing call "Dwg1" Inside this drawing is a block called "Block1"

3. now after I insert Drawing "Dwg1" into drawing "test1" I explode it then I save and close the drawing test1.

4. now I run this code on drawing Test1 and it gives me a block count of 2 for block "Block1"
   but there is only one block Reference in the drawing called "Block1"
   yes I know when I inserted the Drawing "dwg1" is comes in as a block called "dwg1" and inside that Block is a   block called "block1"

   now my code count the block1 that is inside the drawing/block called "dwg1 Even though i exploded the drawing/block "dwg1"

 

   my question is Even though i exploded the Drawing/block "dwg1" why does "block1" that was inside Drawing/block "dwg1" show up as a Block Reference?
   and how do i work around this so i only get the Block Reference that is really in the drawing.

 

Public Sub DwgTest(ByVal pathtodwg As String, ByVal blockname As String)

        Dim db As Database = New Database(False, False)

        If IO.File.Exists(pathtodwg) = True Then
            db.ReadDwgFile(pathtodwg, System.IO.FileShare.Read, False, Nothing)

            Using Trans As Transaction = db.TransactionManager.StartTransaction
                Dim bktbl As BlockTable = db.BlockTableId.GetObject(OpenMode.ForRead)

                Dim revblk As BlockTableRecord = bktbl(blockname).GetObject(OpenMode.ForRead)
                Dim refs As ObjectIdCollection = revblk.GetBlockReferenceIds(False, False)
                MsgBox(refs.Count.ToString)
            End Using

            db.Dispose()
        End If

    End Sub

 

12 REPLIES 12
Message 2 of 13
Alfred.NESWADBA
in reply to: wowens63

Hi,

 

>> now after I insert Drawing "Dwg1" into drawing "test1" I explode it then I save and close the drawing test1.

If you insert DWG1 in TEST1 and you explode it then ==> you have exploded the block called DWG1, but as the block BLOCK1 was a subobject it is not exploded with it's parent one, so after your step 3 there is one blockreference called BLOCK1 in modelspace.

If you redo the same, you will have 2 blockreferences then.

 

You can simulate this by hand, insert DWG1 into a new drawing, explode it, you'll see that BLOCK1 is now available in modelspace.

 

Does that clear up you situation?

 

- alfred -

------------------------------------------------------------------------------------
Alfred NESWADBA
Ingenieur Studio HOLLAUS ... www.hollaus.at ... blog.hollaus.at ... CDay 2024
------------------------------------------------------------------------------------
(not an Autodesk consultant)
Message 3 of 13
wowens63
in reply to: Alfred.NESWADBA

I understand the when I explode Dwg1 it leaves Block1 in model space but the code shows that there are 2

Block References for block Block1 thats the part i do not understand. when i check the 

Block Reference (bref.BlockName one will = Block1 and the other will = *Model_Space) so why does is show a

bref.BlockName to Block1 after block1 was exploded.

Message 4 of 13
wowens63
in reply to: wowens63

mistyped try this again.

I understand the when I explode Dwg1 it leaves Block1 in model space but the code shows that there are 2

Block References for block Block1 thats the part i do not understand. when i check the 

Block Reference (bref.BlockName one will = dwg1 and the other will = *Model_Space) so why does is show a

bref.BlockName to Block1 after block1 was exploded.

Message 5 of 13
Alfred.NESWADBA
in reply to: wowens63

Hi,

 

>> but the code shows that there are 2Block References for block Block1 thats the part i do not understand

When you open the drawing and select the content of the modelspace with QSELECT, how many BlockReferences do you see then? Because I don't see a problem with your code and counting.

 

>> so why does is show a bref.BlockName to Block1 after block1 was exploded.

I didn't see in your description (points 1 to 4) and position where you explode the BlockReference called "BLOCK1" in the modelspace of the new drawing?

You just exploded to parent DWG1.

 

 

- alfred -

------------------------------------------------------------------------------------
Alfred NESWADBA
Ingenieur Studio HOLLAUS ... www.hollaus.at ... blog.hollaus.at ... CDay 2024
------------------------------------------------------------------------------------
(not an Autodesk consultant)
Message 6 of 13
norman.yuan
in reply to: wowens63

What you might want to look into is BlockReference.Name, not BlockReference.BlockName.

 

The former is the name of a BlockTableRecord (block definition) the BlockReference is based on, while the later is the name of the BlockReference' owner (usually, it is the ModelSpace block or PaperSpace block).

Message 7 of 13
wowens63
in reply to: wowens63

Hi alfred

if i open the drawing and do qselect there is only one item in model_space if i try erase all there is only one item found in model_space but my code shows 2 Block References for Block1..if i purge the drawing then my code shows only one Block References for Block1

Message 8 of 13
wowens63
in reply to: norman.yuan

Hi Norman.

yes i know that,  i was using BlockReference.BlockName only to see what was going on

Message 9 of 13
wowens63
in reply to: Alfred.NESWADBA

HI alfred

I never explode Block1 I only explode block Dwg1

Message 10 of 13
wowens63
in reply to: wowens63

here is the code and the drawing mybe you can tell me why my code gives me a count of 2 for block DBDSTXT

 

Call DwgTest("C:\test.dwg", "DBDSTXT")

    Public Sub DwgTest(ByVal pathtodwg As String, ByVal blockname As String)

        Dim db As Database = New Database(False, False)

        If IO.File.Exists(pathtodwg) = True Then
            db.ReadDwgFile(pathtodwg, System.IO.FileShare.Read, False, Nothing)

            Using Trans As Transaction = db.TransactionManager.StartTransaction
                Dim bktbl As BlockTable = db.BlockTableId.GetObject(OpenMode.ForRead)

                Dim revblk As BlockTableRecord = bktbl(blockname).GetObject(OpenMode.ForRead)
                Dim refs As ObjectIdCollection = revblk.GetBlockReferenceIds(False, False)
                MsgBox(refs.Count.ToString)
            End Using

            db.Dispose()
        End If

    End Sub

 

 

Message 11 of 13
Alfred.NESWADBA
in reply to: wowens63

Hi,

 

so last guess before I try to simulate your situation

You exploded the DWG1, so you have in this drawing

  • a) a BlockTableRecord "ModelSpace" containing one BlockReference "BLOCK1"
  • b) a BlockTableRecord "BLOCK1" ... whatever defines this block
  • c) a BlockTableRecord "DWG1" containing one BlockReference "BLOCK1"

 

Now you check "how often is my BlockTableRecord named "BLOCK1 referenced within that database".

Look to the colored words ==> 2

 

- alfred -

------------------------------------------------------------------------------------
Alfred NESWADBA
Ingenieur Studio HOLLAUS ... www.hollaus.at ... blog.hollaus.at ... CDay 2024
------------------------------------------------------------------------------------
(not an Autodesk consultant)
Message 12 of 13
wowens63
in reply to: Alfred.NESWADBA

hi alfred

if i look at the BlockTable for the database i see one block called "block1"

did you see my last post with my drawing and my code?

Message 13 of 13
wowens63
in reply to: wowens63

I understand now. thanks

 

When you explode Dwg1, you're making a copy of the block reference in Dwg1,

so you end up with two block references:

one in the Dwg1 block table record, and one in the *Model_Space block table record.

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