明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1201|回复: 1

[图形系统] 遍历autocad模型空间有意思的问题

[复制链接]
发表于 2018-3-27 15:13:54 | 显示全部楼层 |阅读模式
向高人求教了!
叙述一下问题:


我是用vb.net+AutoCAD .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二次开发高手指教,谢谢了!!!!!!
发表于 2018-5-30 00:45:48 | 显示全部楼层
当我通过命令将符号库自定义控件加载到autocad并显示后,在模型空间内插入若干个符号块后??

通过你的自定义控件在模型空间插入若干个块===这一步执行正确了吗?  通过  rename命令看一下,你的块有没有被加载。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 06:54 , Processed in 0.168165 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表