Originally Posted by
krkeec763189
Thank you very much fixo!!!! I will try it when I get home.
I was playing a little with your code
Assuming Lblokova is listbox with block names
you want to delete
Here is working part, tested on 2009:
Code:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'populate list of blocks to be deleted:
Dim names As List(Of String) = New List(Of String)(New String() {"Block1", "Block2", "Block3", "BlockETC"})
'Or use like this instead
'Dim names As New List(Of String)
'names.Add("Block1")
'names.Add("Block2")
'names.Add("Block3")
Me.Lblokova.DataSource = names
Me.Lblokova.ClearSelected()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If Me.Lblokova.SelectedItems.Count = 0 Then
MessageBox.Show("Select blocks from listbox first")
Return
End If
Try
Dim myOFD As New Autodesk.AutoCAD.Windows.OpenFileDialog("Select DWG", "", "dwg", "Select DWG", _
Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.AllowMultiple)
If myOFD.ShowDialog = System.Windows.Forms.DialogResult.OK Then
For Each myFileName As String In myOFD.GetFilenames
Using myDB As New Database(False, True)
myDB.ReadDwgFile(myFileName, FileOpenMode.OpenForReadAndAllShare, True, "")
Using mytrans As Transaction = myDB.TransactionManager.StartTransaction
Using myBt As BlockTable = mytrans.GetObject(myDB.BlockTableId, OpenMode.ForRead)
For i = 0 To Me.Lblokova.SelectedItems.Count - 1
Dim myBlockName As String = Me.Lblokova.SelectedItems.Item(i).ToString
If myBt.Has(myBlockName) Then
Dim btrId As ObjectId = myBt(myBlockName)
Using myBtr As BlockTableRecord = mytrans.GetObject(btrId, OpenMode.ForRead)
' ' you probably might be want to check before if it's dynamic:
' ' if myBtr.IsDynamicBlock.... etc...
' ' and also you need to check if BlockReferece layer is not locked etc...
' ' First delete all block references
Dim blkIds As ObjectIdCollection = myBtr.GetBlockReferenceIds(True, True)
For Each blkID As ObjectId In blkIds
Using bref As BlockReference = mytrans.GetObject(blkID, OpenMode.ForWrite)
bref.Erase()
End Using
Next
' ' Now delete the block record itself
myBtr.UpgradeOpen()
myBtr.Erase()
End Using
End If
Next
End Using
mytrans.Commit()
End Using
myDB.SaveAs(myFileName, DwgVersion.Current) '<-- 2009
'myDB.SaveAs(myFileName, DwgVersion.Current, Database.SecurityParameters) '<-- 2010?
End Using
Next
End If
Catch ex As System.Exception
MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace)
Finally
MessageBox.Show("done")
Me.Close()
End Try
End Sub