- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
The below code is one part of code which am using now and i got this solutions here only. Now comming to problem: i am trying my best for select all from screen without opening AutoCAD but they are not successful.
Can any one alter this piece of code so that it will select all without opening CAD
Regards
Amit
Public Shared Sub ReadTexts()
Dim acadver As String = "18" '//AutoCAD Version
' Set your file name to read data here
'Dim fname As String = "C:\Test\tags.dwg"
' Define csv file name variable
Dim csvname As String = String.Empty
Dim listData As New List(Of Object)
' Get current culture
Dim oldCult As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
' Create new culture
Dim thisCult As System.Globalization.CultureInfo = New System.Globalization.CultureInfo("en-US")
' Set current culture to newly created
System.Threading.Thread.CurrentThread.CurrentCulture = thisCult
MsgBox("Wait...")
Dim appProgID As String = "Autocad.Application" + "." + acadver
' Get reference on interface IDispatch
Dim AcadType As Type = Type.GetTypeFromProgID(appProgID)
' Run AutoCAD
Dim AcadApp As Object = Activator.CreateInstance(AcadType)
Dim visargs() As Object = New Object(0) {}
' Set visibility mode to true
visargs(0) = False
' Make application visible
AcadApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, Nothing, AcadApp, visargs, Nothing)
' Maximize window
AcadApp.GetType().InvokeMember("WindowState", BindingFlags.SetProperty, Nothing, AcadApp, New Object() {1}, Nothing)
Dim AcadDocs As Object = AcadApp.GetType().InvokeMember("Documents", BindingFlags.GetProperty, Nothing, AcadApp, Nothing)
' Define arguments to open file
Dim args() As Object = New Object(1) {}
args(0) = fname
' Set read only mode to true
args(1) = False
' Try open document
Dim AcDoc As Object = AcadDocs.GetType.InvokeMember("Open", BindingFlags.InvokeMethod, Nothing, AcadDocs, args, Nothing)
Dim AcUtil As Object = New Object
Try
' get reference on active document
AcDoc = AcadApp.GetType.InvokeMember("ActiveDocument", BindingFlags.GetProperty, Nothing, AcadApp, Nothing, Nothing)
' Get reference on ModelSpace
Dim AcSpace As Object = AcDoc.GetType.InvokeMember("ModelSpace", BindingFlags.GetProperty, Nothing, AcDoc, Nothing)
' get reference on Utility
AcUtil = AcDoc.GetType.InvokeMember("Utility", BindingFlags.GetProperty, Nothing, AcDoc, Nothing, Nothing)
' get reference on SelectionSets
Dim AcSsets As Object = AcDoc.GetType.InvokeMember("SelectionSets", BindingFlags.GetProperty, Nothing, AcDoc, Nothing, Nothing)
' Perform zooming
AcadApp.GetType.InvokeMember("ZoomExtents", BindingFlags.InvokeMethod, Nothing, AcadApp, Nothing, Nothing)
' Perform zooming
AcadApp.GetType.InvokeMember("ZoomScaled", BindingFlags.InvokeMethod, Nothing, AcadApp, New Object() {0.8, 1})
' Add prompt to the command line
'AcUtil.GetType.InvokeMember("Prompt", BindingFlags.InvokeMethod, Nothing, AcUtil, New Object() {vbLf & " >> SELECT TEXTS ON SCREEN >> "})
' Add SelectionSet, named "$SelectionTest$"
AcSsets.GetType.InvokeMember("Add", BindingFlags.InvokeMethod, Nothing, AcSsets, New Object() {"$SelectionTest$"})
' Get reference on newly created Selection Set
Dim AcSset As Object = AcSsets.GetType.InvokeMember("Item", BindingFlags.InvokeMethod Or BindingFlags.GetProperty, Nothing, AcSsets, New Object() {"$SelectionTest$"})
' Create filter to use attributed blocks
Dim selargs As Object() = New Object(1) {}
Dim ftype As Short() = New Short() {0}
Dim fdata As Object() = New Object() {"*TEXT"}
selargs(0) = DirectCast(ftype, Object)
selargs(1) = DirectCast(fdata, Object)
' Perform selection on screen
'AcSset.GetType.InvokeMember("SelectOnScreen", BindingFlags.InvokeMethod, Nothing, AcSset, selargs)
' Get number of selected items
Dim cnt As Integer = CInt(AcSset.GetType.InvokeMember("Count", BindingFlags.GetProperty, Nothing, AcSset, Nothing))
' Add prompt to the command line
AcUtil.GetType.InvokeMember("Prompt", BindingFlags.InvokeMethod, Nothing, AcUtil, New Object() {vbLf & "--> Selected Mtexts -->" & vbTab & cnt.ToString()})
' Loop through selected objects
For n As Integer = 0 To cnt - 1
' Get single item from selection
Dim AcSelItem As Object = AcSset.GetType.InvokeMember("Item", BindingFlags.InvokeMethod, Nothing, AcSset, New Object() {n})
' Get Object name
Dim objName As String = AcSelItem.GetType.InvokeMember("ObjectName", BindingFlags.GetProperty, Nothing, AcSelItem, Nothing).ToString()
Dim textStr As String = String.Empty
If objName = "AcDbText" Then
textStr = AcSelItem.GetType.InvokeMember("TextString", BindingFlags.GetProperty, Nothing, AcSelItem, Nothing).ToString()
ElseIf objName = "AcDbMText" Then
textStr = AcSelItem.GetType.InvokeMember("TextString", BindingFlags.GetProperty, Nothing, AcSelItem, Nothing).ToString()
End If
listData.Add(textStr)
Next
Dim initDir As String = AcDoc.GetType.InvokeMember("Path", BindingFlags.GetProperty, Nothing, AcDoc, Nothing, Nothing).ToString()
Dim saveFileDialog As New System.Windows.Forms.SaveFileDialog
saveFileDialog.Title = "Enter a file name to write data: "
saveFileDialog.InitialDirectory = initDir
saveFileDialog.RestoreDirectory = True
saveFileDialog.Filter = "CSV files | *.csv"
saveFileDialog.FileName = "File name without extension"
Dim result As System.Windows.Forms.DialogResult = saveFileDialog.ShowDialog()
If result <> DialogResult.OK Then
csvname = "Not saved"
Return
End If
csvname = saveFileDialog.FileName
' Write data
Using sw As New StreamWriter(csvname, True, Encoding.ASCII)
For Each strline As String In listData
sw.WriteLine(strline)
Next
sw.Flush()
sw.Close()
End Using
'Save document
Dim closeargs() As Object = New Object(1) {}
closeargs(0) = True
' with the same name
closeargs(1) = fname
' Try close document
' Simplified syntax
AcDoc.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, Nothing, AcDoc, closeargs)
' Try quit application
AcadApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, Nothing, AcadApp, Nothing)
Catch ex As System.Exception
MsgBox("Error: " & ex.Message & vbLf & "Trace: " & ex.StackTrace)
Finally
' clean up the memory
'--------------------'
' release Utility.
releaseObject(AcUtil)
' release Document.
releaseObject(AcDoc)
' release Documents.
releaseObject(AcadDocs)
' release Application.
releaseObject(AcadApp)
' call garbage cleaner immediatelly
GC.WaitForPendingFinalizers()
GC.GetTotalMemory(True)
GC.WaitForPendingFinalizers()
GC.GetTotalMemory(True)
' restore current culture
System.Threading.Thread.CurrentThread.CurrentUICulture = oldCult
'Display result
MsgBox("Csv file saved as : " + csvname)
End Try
End Sub
Solved! Go to Solution.