找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1057|回复: 1

[求助] 遍历autocad模型空间有意思的问题

[复制链接]
发表于 2018-3-27 19:53:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
向高人求教了!
叙述一下问题:


我是用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二次开发高手指教,谢谢了!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-3-27 20:00:47 | 显示全部楼层
你意思是通过你的控件,已经插入到模型空间了,而且也正常显示了?
你用MOVE命令移动下你插入的所有块,正常不?

如果MOVE正常,你再用你的函数读下块引用,看能读出不?


另外,把你用符号库插入的块保存的DWG,传到论坛来看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 20:47 , Processed in 0.393892 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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