代码之家  ›  专栏  ›  技术社区  ›  Pankaj Potdar

Autocad API,读取块属性强制转换错误

  •  1
  • Pankaj Potdar  · 技术社区  · 10 年前

    我收到以下错误

    “无法强制转换类型为的对象
    autodesk.autocad.databaseservices。要键入的多段线 autodesk.autocad.databaseservices.blockreference

    同时读取带有大量绘图内容的块属性。

    代码:

    Dim db As Database = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database
    
    Using tr As Transaction = db.TransactionManager.StartTransaction
    
    Dim ed As Editor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor
    Dim blockids As ObjectIdCollection = New ObjectIdCollection
    Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForRead)
    Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForRead)
    
    For Each objid As ObjectId In btr
    
        If btr.IsAnonymous = False Or btr.IsLayout = False Then
    
            Dim blkref As BlockReference = tr.GetObject(objid, OpenMode.ForRead)
    
            Dim attcol As AttributeCollection = blkref.AttributeCollection
    
            For Each attid As ObjectId In attcol
    
                Dim attref As AttributeReference = tr.GetObject(attid, OpenMode.ForRead)
    
                ed.WriteMessage(attref.Tag.ToString & vbNewLine)
    
                ed.WriteMessage(attref.TextString.ToString & vbNewLine)
    
            Next
    
        End If
    
    Next
    
    tr.Commit()
    
    End Using
    

    你能帮忙吗!!!

    2 回复  |  直到 10 年前
        1
  •  1
  •   Miiir    10 年前

    您的代码在btr(ModelSpace)中循环,但它假设它只处理块。

    在确认检查的实体类型之前,您需要再次检查。最好在你检查它是否匿名之前。

        2
  •  0
  •   BenKoshy Mayinx    10 年前

    问题是什么?

    我有一个装满各种商品/产品的购物篮。牛奶,小苏打,苹果。香蕉有些东西是可食用的,有些是有毒的。如果我假设所有的东西都是可以吃的,我试着吃一些东西——这可能会导致一些非常严重的问题。e、 我可以吃苹果,但如果我试着吃牙刷,我的身体就会崩溃并出错。我必须先检查它是否可以食用,然后再把它放进嘴里…………啊,好吧,让我们继续……Autocad也一样。

    解决方法很简单:首先检查您正在处理的对象是否是blockReference。如果是这样,请继续。我还没有检查下面的代码,因为我不是VB.NET专家,但类似这样的代码可以让您在继续之前检查是否正在处理blockReference:

    For Each objid As ObjectId In btr
    
    If btr.IsAnonymous = False Or btr.IsLayout = False Then
    
      Dim ent as Entity = tr.GetObject(objid, OpenMode.ForRead)  // ADD THIS LINE
    
      If TypeOf ent Is [BlockReference] Then            // ADD THIS IF STATEMENT
    
    
                 // ADD IN THE REST OF YOUR CODE HERE 
                 // e.g.  Dim blkref As BlockReference = tr.GetObject(objid, 
                 //  OpenMode.ForRead) etc.
    
    
    
      End If