- 积分
- 750
- 明经币
- 个
- 注册时间
- 2005-12-28
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
向高人求教了!
叙述一下问题:
我是用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二次开发高手指教,谢谢了!!!!!!
|
|