【问题标题】:Autocad API , reading block attributes casting errorAutoCAD API,读取块属性转换错误
【发布时间】:2016-01-27 13:36:19
【问题描述】:

我收到以下错误

“无法转换类型的对象
autodesk.autocad.databaseservices.polyline 键入 autodesk.autocad.databaseservices.blockreferences

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

代码:

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

你能帮忙吗!!!

【问题讨论】:

    标签: vb.net autocad-plugin


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      有什么问题?

      我有一个装满各种商品/产品的购物篮。牛奶、小苏打、苹果。香蕉。有些东西是可以吃的,有些东西是剧毒的。如果我假设所有东西都是可食用的并且我尝试吃一些东西——那可能会导致一些非常严重的问题。例如我可以吃苹果,但如果我尝试吃牙刷,我的身体会崩溃并抛出错误。我必须先检查它是否可以食用,然后再放入口中......啊,好吧,让我们继续吧...... 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
      

      【讨论】:

        猜你喜欢
        • 2016-05-21
        • 2019-07-04
        • 2017-03-17
        • 2016-01-24
        • 2021-11-06
        • 2020-05-09
        • 2011-10-23
        • 1970-01-01
        • 2018-06-04
        相关资源
        最近更新 更多