Message 1 of 7
speed up code
Not applicable
03-18-2011
03:53 PM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
I've made some code to find all blocks "vbredak" in a Drawing.
Version 1 "zbl" is the slowest version.
Version 2 "zbl2" is much faster. But in this version I can't find blocks in another drawing (f.i. an xref)
When I change in version 1
Dim mydb As Database = myDWG.Database Dim mydb As DatabaseServices.Database"c:\test.dwg", IO.FileShare.Read, True, "")
by
mydb.ReadDwgFile(
I can search in other drawings.
How can I adapt the code in version 2 so I can find blocks in ohter DWG's ?
Or
How can I speed up version 1 ?
Here is my code
<CommandMethod("zbl")> _
Public Sub zbl()
Dim starttime As Double
Dim endtime As Double
starttime = DateAndTime.Timer
Dim myTransMan As DatabaseServices.TransactionManager
Dim myTrans As DatabaseServices.Transaction
Dim myBT As DatabaseServices.BlockTable
Dim myBTR As DatabaseServices.BlockTableRecord
Dim myBlockDef As DatabaseServices.BlockTableRecord
Dim mySTE As DatabaseServices.SymbolTableEnumerator
Dim myBTE As DatabaseServices.BlockTableRecordEnumerator
Dim myDWG As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument
Dim mydb As Database = myDWG.Database
Dim myEd As EditorInput.Editor = myDWG.Editor
myTransMan = mydb.TransactionManager
myTrans = myTransMan.StartTransaction
myBT = myDB.BlockTableId.GetObject(DatabaseServices.OpenMode.ForRead)
mySTE = myBT.GetEnumerator
While mySTE.MoveNext
myBTR = mySTE.Current.GetObject(DatabaseServices.OpenMode.ForRead)
If myBTR.IsLayout = True Then
myBTE = myBTR.GetEnumerator
Dim myEnt As DatabaseServices.Entity
While myBTE.MoveNext
myEnt = myBTE.Current.GetObject(DatabaseServices.OpenMode.ForRead)
If TypeOf myEnt Is DatabaseServices.BlockReference Then
Dim MyBlockRef As DatabaseServices.BlockReference
MyBlockRef = myEnt
If MyBlockRef.BlockName = "vbredak" Then myEd.WriteMessage("vbredak found")
If MyBlockRef.IsDynamicBlock = True Then
myBlockDef = MyBlockRef.DynamicBlockTableRecord.GetObject(DatabaseServices.OpenMode.ForRead)
Else
myBlockDef = MyBlockRef.BlockTableRecord.GetObject(DatabaseServices.OpenMode.ForRead)
If myBlockDef.Name = "vbredak" Then myEd.WriteMessage("vbredak found")
End If
End If
End While
End If
End While
myTrans.Dispose()
myTransMan.Dispose()
myDB.Dispose()
endtime = DateAndTime.Timer
MsgBox(endtime - starttime & "seconds")
End Sub
<CommandMethod("zbl2")> _
Public Sub zbl2()
Dim starttime As Double
Dim endtime As Double
starttime = DateAndTime.Timer
Dim myDWG As ApplicationServices.Document
Dim myEd As EditorInput.Editor
Dim myPSR As EditorInput.PromptSelectionResult
Dim mySS As EditorInput.SelectionSet
Dim myTransMan As DatabaseServices.TransactionManager
Dim myTrans As DatabaseServices.Transaction
Dim myObjIds As DatabaseServices.ObjectIdCollection
Dim myObjId As DatabaseServices.ObjectId
Dim myBlock As DatabaseServices.BlockReference
Dim myfilter(0) As DatabaseServices.TypedValue
Dim mySF As New EditorInput.SelectionFilter(myfilter)
myDWG = ApplicationServices.Application.DocumentManager.MdiActiveDocument
myfilter(0) = New DatabaseServices.TypedValue(DatabaseServices.DxfCode.BlockName, "vbredak")
myEd = myDWG.Editor
myPSR = myEd.SelectAll(mySF)
mySS = myPSR.Value
If Not (mySS Is Nothing) Then
myTransMan = myDWG.TransactionManager
myTrans = myTransMan.StartTransaction
myObjIds = New DatabaseServices.ObjectIdCollection(mySS.GetObjectIds)
For Each myObjId In myObjIds
myBlock = myObjId.GetObject(DatabaseServices.OpenMode.ForRead)
If myBlock.Name = "vbredak" Then myEd.WriteMessage("vbredak found")
Next
myTrans.Dispose()
myTransMan.Dispose()
End If
endtime = DateAndTime.Timer
MsgBox(endtime - starttime & "seconds")
End Sub