Hi,
After I run a VB.NET DLL that uses Windows Forms, my AutoCAD Text Window is disabled, including the close button. It doesn't happen for a commandline function, just those with a form. If I cancel the form before I do anything, I don't get the problem.
The only way to get the functionality of the Text Window back is to restart AutoCAD.
I suspect it's a bug, but I'll include some code below:
This doesn't disable the AutoCAD Text Window
Code:
<Autodesk.AutoCAD.Runtime.CommandMethod("BT")> Public Sub BracketText()
clsAutoCADText.txtBracketText()
End Sub
Public Shared Sub txtBracketText()
'///// Adds or remved brackets to a selection of text
'' Get the current document and database
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'' Request for objects to be selected in the drawing area
Dim acSSPrompt As PromptSelectionResult = acDoc.Editor.GetSelection()
'' If the prompt status is OK, objects were selected
If acSSPrompt.Status = PromptStatus.OK Then
Dim acSSet As SelectionSet = acSSPrompt.Value
For Each acSSObj As SelectedObject In acSSet
'' Check to make sure a valid SelectedObject object was returned
If Not IsDBNull(acSSObj) Then
'' Open the selected object for write
Dim acEnt As Entity = acTrans.GetObject(acSSObj.ObjectId, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)
If Not IsDBNull(acEnt) Then
If TypeOf (acEnt) Is DBText Then
Dim oText As DBText = DirectCast(acEnt, DBText)
Dim sText As String = oText.TextString.Trim
If sText.StartsWith("(") And sText.EndsWith(")") Then
If sText.Length <= 2 Then
MsgBox("I refuse to make a zero length string.")
Exit Sub
End If
sText = sText.Substring(1, sText.Length - 2)
Else
sText = "(" & sText & ")"
End If
oText.TextString = sText
End If
End If
End If
Next
'' Save the new object to the database
acTrans.Commit()
End If
'' Dispose of the transaction
End Using
End Sub
This does disable the Text Window...
Code:
<Autodesk.AutoCAD.Runtime.CommandMethod("QA")> Public Sub QA()
Dim f As New frmPolygonsArea
f.ShowDialog()
f = Nothing '
End Sub
Private Sub frmPolygonsArea_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
arM2.Add("m%%2012")
arM2.Add("m²")
Me.cmbm2.DataSource = arM2
arAreaUnits.Add("Auto")
arAreaUnits.Add("Metres")
arAreaUnits.Add("Hectares")
Me.cmbAreaUnits.DataSource = arAreaUnits
arDecimals.Add("Round down to nearest 10m²")
arDecimals.Add("Round down to nearest 5m²")
arDecimals.Add("0")
arDecimals.Add("0.0")
arDecimals.Add("0.00")
arDecimals.Add("0.000")
arDecimals.Add("0.0000")
arDecimals.Add("0.00000")
Me.cmbDecimals.DataSource = arDecimals
Me.cmbDecimals.SelectedIndex = 2
Me.cmbLayer.DataSource = clsConicsAcadLayerManager.GetLayerList(False)
Me.cmbLayer.Text = Application.GetSystemVariable("CLAYER")
Me.cmbTextStyle.DataSource = clsConicsAcadLayerManager.GetTextStyleList()
Me.cmbTextStyle.Text = Application.GetSystemVariable("TEXTSTYLE")
Dim n As Double = Application.GetSystemVariable("USERR4") * 4
If n <= 0 Then
n = 2
End If
Me.txtHeight.Text = n.ToString
End Sub
Private Sub cmdCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancel.Click
Me.Hide()
End Sub
Private Sub cmdLabel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLabel.Click
Dim oPLs As New ObjectIdCollection
'validate
If Not IsNumeric(Me.txtHeight.Text) Then
MsgBox("Text height not a number", vbExclamation, "Shinput")
Exit Sub
End If
Dim nHeight As Double = CDbl(Me.txtHeight.Text)
Dim sLay As String = Me.cmbLayer.Text
Dim sStyle As String = Me.cmbTextStyle.Text
Dim sText As String
'Select Polylines
Me.Hide()
'Loop throughthem
Dim acDwg As Autodesk.AutoCAD.ApplicationServices.Document
acDwg = Application.DocumentManager.MdiActiveDocument
Using tr As Transaction = acDwg.TransactionManager.StartTransaction()
oPLs = clsRPSUtilities.PickObjects
If oPLs IsNot Nothing Then
For Each OID As ObjectId In oPLs
Dim obj As DBObject = tr.GetObject(OID, Autodesk.AutoCAD.DatabaseServices.OpenMode.ForWrite)
Dim ent As Entity = DirectCast(obj, Entity)
If TypeOf ent Is Polyline Then
Dim pl As New Polyline
pl = DirectCast(obj, Polyline)
sText = FormatArea(pl.Area, Me.cmbAreaUnits.Text, Me.cmbDecimals.Text)
clsAutoCADText.CreateText(sText, clsRPSUtilities.Get2DCentroid(pl), sStyle, nHeight, 90)
ElseIf TypeOf ent Is Polyline2d Then
Dim pl As New Polyline2d
pl = DirectCast(obj, Polyline2d)
sText = FormatArea(pl.Area, Me.cmbAreaUnits.Text, Me.cmbDecimals.Text)
clsAutoCADText.CreateText(sText, clsRPSUtilities.Get2DCentroid(pl), sStyle, nHeight, 90)
ElseIf TypeOf ent Is Polyline3d Then
Dim pl As New Polyline3d
pl = DirectCast(obj, Polyline3d)
sText = FormatArea(pl.Area, Me.cmbAreaUnits.Text, Me.cmbDecimals.Text)
clsAutoCADText.CreateText(sText, clsRPSUtilities.Get2DCentroid(pl), sStyle, nHeight, 90)
End If
Next OID
End If
tr.Commit()
End Using
End Sub
I've obviously not supplied all the code for the form, let me know if you want to see more.
Has anyone else encountered this?