tbeahgl 发表于 2018-3-27 15:13:00

遍历autocad模型空间有意思的问题

向高人求教了!
叙述一下问题:
我是用vb.net+ .NET API对autocad2012进行二次开发的。
实现的功能是
1.建立符号库,先自定义一个控件,控件内包含一个树形控件,树形控件各节点对应符号库中的自定义符号(dwg文件)
2.遍历模型空间内的所有块引用实体并记录块的名称。
我是这样做的:
1.符号库部分:
首先设计一个自定义控件,自定义控件上放一个树形控件,编程增加各节点,每个节点对应符号库中一个dwg符号文件,通过拖动,增加到模型空间。
Public Function AddToPaletteSet(ByRef ps As PaletteSet, ByVal sName As String, ByRef UserCtrl As UserControl) As Palette
      Dim pale As Palette = Nothing
      If ps Is Nothing Then
            Return Nothing
      End If
      pale = ps.Add(sName, UserCtrl)
      ps.Visible = True
      Return pale
End Function
Public Sub AddToolPalleteToDatabase(ByVal sPalleteName As String, ByVal sToolName As String)
      Dim ps As PaletteSet = CreateToolPalette(sPalleteName)
      Dim UserCtrl As MyUsrCtrl = New MyUsrCtrl
      AddToPaletteSet(ps, sToolName, UserCtrl)
End Sub
调用函数AddToolPalleteToDatabase在autocad里增加。
2.遍历模型空间内的所有块引用实体并记录块的名称
    Public Function GetBlockNames() As String()
      Dim list As ArrayList = New ArrayList
      Dim db As Database = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase
      Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager = db.TransactionManager
      Dim docLock As DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument()
      Dim ta As Transaction = tm.StartTransaction()
      Try
            Dim bt As BlockTable = ta.GetObject(db.BlockTableId, OpenMode.ForRead)
            Dim btr As BlockTableRecord = ta.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForRead)
            For Each id As ObjectId In btr
                Dim obj As DBObject = ta.GetObject(id, OpenMode.ForRead)
                If TypeOf obj Is BlockReference Then
                  Dim br As BlockReference = CType(obj, BlockReference)
                  list.Add(br.Name)
                End If
            Next
            ta.Commit()
            Dim arr As String()
            If list.Count = 0 Then
                Return Nothing
            End If
            ReDim arr(list.Count - 1)
            For i As Integer = 0 To list.Count - 1 Step 1
                arr(i) = CType(list(i), String)
            Next
            Return arr
      Catch
            ta.Abort()
            Return Nothing
      Finally
            docLock.Dispose()
            ta.Dispose()
      End Try
    End Function
通过函数GetBlockNames遍历模型空间内的所有块引用并记录块名称。
3.出现的问题
当我通过命令将符号库自定义控件加载到autocad并显示后,在模型空间内插入若干个符号块后,调用函数GetBlockNames遍历模型空间内的块引用时,找不到块引用,即GetBlockNames不能返回块名称。但是如果我随意创建一个autocad文件,插入若干块,此时根本没有增加符号库条,用GetBlockNames遍历模型空间就能返回块引用的名称,这种现象我一直没有找到出现问题的原因,及解决办法,故请autocad二次开发高手指教,谢谢了!!!!!!

guohq 发表于 2018-5-30 00:45:00

当我通过命令将符号库自定义控件加载到autocad并显示后,在模型空间内插入若干个符号块后??
通过你的自定义控件在模型空间插入若干个块===这一步执行正确了吗?通过rename命令看一下,你的块有没有被加载。
页: [1]
查看完整版本: 遍历autocad模型空间有意思的问题