glowz 发表于 2010-11-16 21:47:00

vb.net 外部参照 unload 导致cad崩溃

<p><font face="Verdana">&nbsp;Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim doc As Document = Application.DocumentManager.MdiActiveDocument<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim db As Database = doc.Database<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' Dim bt as<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '获取当前的选择集对象<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim ss As SelectionSet = ed.SelectImplied().Value<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Using trans As Transaction = db.TransactionManager.StartTransaction()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '循环遍历选择集中的对象</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each id As ObjectId In ss.GetObjectIds()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim obj As DBObject = trans.GetObject(id, OpenMode.ForRead)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If TypeOf (obj) Is BlockReference Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim br As BlockReference = trans.GetObject(id, OpenMode.ForRead) 'CType(obj, BlockReference)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim btr As BlockTableRecord = trans.GetObject(br.BlockTableRecord, OpenMode.ForRead)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (btr.IsFromExternalReference) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim xrefId As ObjectId = br.BlockTableRecord<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (Not xrefId = ObjectId.Null) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acObjIdColl.Add(xrefId)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'db.DetachXref(xrefId)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'db.UnloadXrefs()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ed.WriteMessage(vbCrLf &amp; "Xref:" &amp; btr.Name &amp; " Unload!")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.UnloadXrefs(acObjIdColl)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trans.Commit()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font face="Verdana">&nbsp; End If<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Using</font></p>

glowz 发表于 2010-11-16 21:53:00

vb.net 外部参照 unload 导致cad崩溃

运行到db.UnloadXrefs(acObjIdColl) 就崩溃了

雪山飞狐_lzh 发表于 2010-11-16 21:58:00

<p>其他的没仔细看,但这里应该在For循环外吧</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db.UnloadXrefs(acObjIdColl)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trans.Commit()<br/></p>

glowz 发表于 2010-11-16 22:53:00

vb.net 外部参照 unload 导致cad崩溃

我是想做个右键的快捷菜单 ,一般的选择后执行 我试了试没有问题 ,用在右键的快捷菜单就崩溃了


<CommandMethod("AddBlockRefMenu")> _
Public Sub AddBlockRefMenu()
'定义一个ContextMenuExtension对象,用于表示快捷菜单
Dim contextMenu As New ContextMenuExtension()
'对于对象级别的快捷菜单,不必设置菜单名
Dim miBlockUnload As New MenuItem("卸载")
AddHandler miBlockUnload.Click, AddressOf miBlockUnload_Click

contextMenu.MenuItems.Add(miBlockUnload)
Application.AddObjectContextMenuExtension(RXClass.GetClass(GetType(BlockReference)), contextMenu)
End Sub
Sub miBlockUnload_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim doc As Document = Application.DocumentManager.MdiActiveDocument
Dim db As Database = doc.Database
' Dim bt as
'获取当前的选择集对象
Dim acObjIdColl As ObjectIdCollection = New ObjectIdCollection()
Dim ss As SelectionSet = ed.SelectImplied().Value
Using trans As Transaction = db.TransactionManager.StartTransaction()
'循环遍历选择集中的对象

For Each id As ObjectId In ss.GetObjectIds()
Dim obj As DBObject = trans.GetObject(id, OpenMode.ForRead)
'如果所选择的对象是
If TypeOf (obj) Is BlockReference Then
'获取所选择的对象
Dim br As BlockReference = trans.GetObject(id, OpenMode.ForRead) 'CType(obj, BlockReference)
Dim btr As BlockTableRecord = trans.GetObject(br.BlockTableRecord, OpenMode.ForRead)
If (btr.IsFromExternalReference) Then
Dim xrefId As ObjectId = br.BlockTableRecord
If (Not xrefId = ObjectId.Null) Then
acObjIdColl.Add(xrefId)
'db.DetachXref(xrefId)
'db.UnloadXrefs()
' ed.WriteMessage(vbCrLf & "Xref:" & btr.Name & " Unload!")
End If

End If
End If
Next
db.UnloadXrefs(acObjIdColl)
trans.Commit()
End Using
End Sub
End Class

glowz 发表于 2010-11-16 22:57:00

vb.net 外部参照 unload 导致cad崩溃

顺便再问问 Dim acTypValAr(0) As TypedValue
acTypValAr.SetValue(New TypedValue(DxfCode.Start, "BlockReference"), 0)好像不能过滤到块参照,过滤块参照应该在.net怎么用呢

雪山飞狐_lzh 发表于 2010-11-16 23:00:00

<p>"Insert"</p>
<p>&nbsp;</p>
<p>右键菜单的话,文档应该加锁的吧</p>

glowz 发表于 2010-11-17 08:19:00

谢谢 飞狐版主 能详细说下文档应该怎么加锁吗

雪山飞狐_lzh 发表于 2010-11-17 21:08:00

<p>Using doc.LockDocument()</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>End Using</p>

glowz 发表于 2010-11-17 21:59:00

vb.net 外部参照 unload 导致cad崩溃

<p>谢谢 飞狐版主&nbsp; 可以做出来 哈哈</p>

glowz 发表于 2010-11-17 22:01:00

vb.net 外部参照 unload 导致cad崩溃

完整的代码
页: [1] 2
查看完整版本: vb.net 外部参照 unload 导致cad崩溃