向块添加属性:Autocad API VB.net

Add attribute to block: Autocad API VB.net

我正在使用下面的代码将属性添加到某个块,

但它不起作用,我没有弄清楚到底出了什么问题,也没有错误。

Public Class addattribute
    Public Function addnewattribute()


        Dim attdef As New AttributeReference
        Dim templatepath As String = "C:\Users\sesa388372\Documents\Visual Studio 2015\Projects\SchneiderMacros\Wtemplate.DWG"
        Dim db As Database = New Database
        db.ReadDwgFile(templatepath, System.IO.FileShare.ReadWrite, False, "")
        Using tr As Transaction = db.TransactionManager.StartTransaction
            attdef.SetDatabaseDefaults(db)
            attdef.Tag = "Cell location"
            attdef.TextString = "AAA"


            Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite)
            Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite)
            For Each objid As ObjectId In btr
                If objid.ObjectClass.Name = "AcDbBlockReference" Then
                    Dim blkref As BlockReference = tr.GetObject(objid, OpenMode.ForWrite)
                    If blkref.Name = "TB-D-ATTR" Then

                        blkref.AttributeCollection.AppendAttribute(attdef)

                    End If
                End If
            Next

            tr.AddNewlyCreatedDBObject(attdef, True)
            tr.Commit()

        End Using

        Return Nothing
    End Function
End Class

我认为主要问题是 BlockReference 位置以及您没有保存文件。我对代码做了一些调整,但无法完全测试它,请查看下面的评论。

Public Sub addnewattribute() ' don't you mean define as Sub?
  Dim templatepath As String = "C:\Users\sesa388372\Documents\Visual Studio 2015\Projects\SchneiderMacros\Wtemplate.DWG"
  ' you must dispose this side database, the 'using' will take care of it
  Using db As Database = New Database(False, True) ' specify the parameters
    db.ReadDwgFile(templatepath, System.IO.FileShare.ReadWrite, False, "")
    db.CloseInput() ' this should help the Save() method
    Using tr As Transaction = db.TransactionManager.StartTransaction
      Dim bt As BlockTable = tr.GetObject(db.BlockTableId, OpenMode.ForWrite)
      Dim btr As BlockTableRecord = tr.GetObject(bt(BlockTableRecord.PaperSpace), OpenMode.ForWrite)
      For Each objid As ObjectId In btr
        If objid.ObjectClass.Name = "AcDbBlockReference" Then
          Dim blkref As BlockReference = tr.GetObject(objid, OpenMode.ForWrite)
          If blkref.Name = "TB-D-ATTR" Then
            ' define this variable inside the loop, you cannot reuse it
            Dim attdef As New AttributeReference
            attdef.SetDatabaseDefaults(db)
            attdef.Tag = "Cell location"
            attdef.TextString = "AAA"
            attdef.SetAttributeFromBlock(blkref.BlockTransform) ' adjust the location
            blkref.AttributeCollection.AppendAttribute(attdef)
            tr.AddNewlyCreatedDBObject(attdef, True)
          End If
        End If
      Next
      tr.Commit()
    End Using
    'Return Nothing ' in this case, a Sub (instead function) should be better
    db.Save() ' did you miss to save changes?
  End Using
End Sub

我注意到您正在尝试将 AttributeDefinition 添加到块引用。

您需要将 AttributeDefinition 添加到 BlockTableRecord,然后更新 BlockReference 中的 AttributeReference。

查看此处了解更多信息:http://adndevblog.typepad.com/autocad/2012/07/changing-block-definition-of-an-block-reference.html

此外,您是否在 运行 之后执行 ATTSYNC 命令以确保您的块引用正确显示?