• Industries
  • Products
  • Buy
  • Services & Support
  • Communities
  • Discussion Groups

    AutoCAD Civil 3D Customization

    Reply
    Valued Contributor
    Posts: 75
    Registered: ‎09-14-2009

    read anonymous blocks

    101 Views, 3 Replies
    10-23-2012 03:54 AM

    I have the follwoing error in C3D R2013.

     

    Unable to cast object of type 'Autodesk.AutoCAD.DatabaseServices.BlockTableRecord' to type 'Autodesk.AutoCAD.DatabaseServices.BlockReference'.

    When casting from a number, the value must be a number less than infinity

    Make sure the source type is convertible to the destination type

     

    My code is:

    Imports System
    Imports Autodesk.AutoCAD.Runtime
    Imports Autodesk.AutoCAD.ApplicationServices
    Imports Autodesk.AutoCAD.DatabaseServices
    Imports Autodesk.AutoCAD.Geometry
    Imports Autodesk.AutoCAD.EditorInput
    Imports Autodesk.AutoCAD
    Imports Autodesk.AutoCAD.ApplicationServices.Application
    Imports Autodesk.AutoCAD.LayerManager
    Imports Autodesk.AutoCAD.Windows
    Imports Autodesk.AutoCAD.PlottingServices
    Imports Autodesk.AutoCAD.Colors
    Imports Autodesk.Civil.DatabaseServices
    Imports Autodesk.Civil.ApplicationServices
    Imports Autodesk.Civil.DatabaseServices.LabelGroup
    Imports Autodesk.Civil.DatabaseServices.Styles.LabelSetStylesRoot
    Imports Autodesk.Civil.Runtime
    Imports Excel = Microsoft.Office.Interop.Excel
    Imports Microsoft.VisualBasic.FileIO.FileSystem
    Imports System.IO
    Imports System.Convert
    Imports Microsoft.VisualBasic.Strings
    Imports System.Runtime.InteropServices
    Imports System.Collections.Specialized
    
    ...
    
    Using tr As Transaction = db.TransactionManager.StartTransaction()
                Dim btable As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                If btable.Has("vbredakdettek") Then
                    Dim btr As BlockTableRecord = DirectCast(tr.GetObject(btable("vbredakdettek"), OpenMode.ForRead), BlockTableRecord)
                    For Each refId As ObjectId In btr.GetAnonymousBlockIds()
                        myBlock = DirectCast(tr.GetObject(refId, OpenMode.ForRead), BlockReference)
    
    ...

     

    Please use plain text.
    *Expert Elite*
    Posts: 6,409
    Registered: ‎06-29-2007

    Re: read anonymous blocks

    10-23-2012 04:01 AM in reply to: fallright

    Hi,

     

    >> Unable to cast object of type 'Autodesk.AutoCAD.DatabaseServices.BlockTableRecord'

    >> to type 'Autodesk.AutoCAD.DatabaseServices.BlockReference'.

    I have not tried it, but I guess that the function .GetAnonymousBlockIds returns ObjectIDs of BlockTableRecords.

     

    So change your last shown code line to:

          Dim myBlockBTR as BlockTableRecord = DirectCast(tr.GetObject(refId, OpenMode.ForRead), BlockTableRecord)

    ...does that work?

     

    - alfred -

    -------------------------------------------------------------------------
    Alfred NESWADBA
    Ingenieur Studio HOLLAUS ... www.hollaus.at
    -------------------------------------------------------------------------
    Please use plain text.
    Valued Contributor
    Posts: 75
    Registered: ‎09-14-2009

    Re: read anonymous blocks

    10-23-2012 05:53 AM in reply to: alfred.neswadba

    that works, but my code continues with:

     

                Using tr As Transaction = db.TransactionManager.StartTransaction()
                    Dim btable As BlockTable = DirectCast(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
                    If btable.Has("vbredakdettek") Then
                        Dim btr As BlockTableRecord = DirectCast(tr.GetObject(btable("vbredakdettek"), OpenMode.ForRead), BlockTableRecord)
                    For Each refId As ObjectId In btr.GetAnonymousBlockIds()
                        Dim myBlockBTR As BlockTableRecord = DirectCast(tr.GetObject(refId, OpenMode.ForRead), BlockTableRecord)
                        'myBlock = DirectCast(tr.GetObject(refId, OpenMode.ForRead), BlockReference)
    
    
                        Dim owner As BlockTableRecord = DirectCast(tr.GetObject(myBlock.OwnerId, OpenMode.ForRead), BlockTableRecord)
                        If owner.IsLayout Then
                            If myBlock.Name.ToUpper = "VBREDAKDETTEK" Then

     How can I then get "myblock" ?

    Please use plain text.
    *Expert Elite*
    Posts: 6,409
    Registered: ‎06-29-2007

    Re: read anonymous blocks

    10-23-2012 08:42 AM in reply to: fallright

    Hi,

     

    use the function myBlockBTR.GetBlockReferenceIDs to get the ObjectIDs pointing to the blockreferences then.

     

    - alfred -

    -------------------------------------------------------------------------
    Alfred NESWADBA
    Ingenieur Studio HOLLAUS ... www.hollaus.at
    -------------------------------------------------------------------------
    Please use plain text.