I use addhandlers to change color/layer and change it back.
AddHandler AcadAPP.BeginCommand, AddressOf callback_BeginCommand
AddHandler AcadAPP.EndCommand, AddressOf callback_EndCommand
Last time i wanted to add an handler to change back color/layer when a command gets cancelled.
I used an AddHandler doc.commandCancelled but somehow it messed op my other handlers (maybe because its doc. instead of AcadAPP.).
EndCommand doesnt work anymore even when i delete the CommandCancelled Handler and command.
I have deleted all commandcancelled and sometimes, when i try to debug in autocad it doesnt load autocad (freezes at "FILETAB" on startup)
This happens only if i place the red dot (don't know how its called) at AddHandler AcadAPP.EndCommand and AddHandler AcadAPP.BeginCommand.
Did someone also have this problem?
Maybe it's because of a mixture of using .NET and COM?
I never use COM, so I don't know of BeginCommand and EndCommand. Maybe you could try to use the .NET equivalents as well:
doc.CommandWillStart
doc.CommandEnded
doc.CommandCancelled
doc.CommandFailed
I'm using Commandname as string and that's not part of doc.commandended and doc.commandwillstart.
Sub callback_BeginCommand(ByVal CommandName As String)
I need Commandname to change the layer/color when using hatch, text or dim only.
I'm trying to get an old version without doc.commandcancelled but i modified so much in the meantime 😞
So if someone has the awnser for me it would be much apreciated because i dont have to copy/paste all in an old code.
Here's an example of how you can trap the start of the PLOT command in C#:
private void callback_CommandWillStart(object sender, CommandEventArgs e)
{
string sCommand = e.GlobalCommandName.ToUpper();
switch (sCommand)
{
case "PLOT":
// Do your thing...
break;
default:
break;
}
}
Or in VB.NET:
Private Sub callback_CommandWillStart(sender As Object, e As CommandEventArgs)
Dim sCommandName As String = e.GlobalCommandName.ToUpper()
End Sub
Thanks Henk,
That is what i was looking for:) I still have a little problem nevertheless 😞
Like i said, i use commandwillstart to change the color/layer and commandended to change to the previous color/layer (like the code below).
When i try to declare the current layer/color before i change it, it gives the already changed color/layer as value (db.Clayer is not the current layer but it is already the layer that i'm going to chage it in later in the code).
Private Sub callback_CommandWillStart2(sender As Object, e As CommandEventArgs)
Dim currentlayer = db.Clayer
Dim currentcolor = db.Cecolor
previouslayer = currentlayer
previouscolor = currentcolor
change color/layer
End Sub
Can i add the current color/layer the same way as the commandname? Something like this:
Private Sub callback_CommandWillStart(sender As Object, e As CommandEventArgs, d As Database)
Dim CommandName As String = e.GlobalCommandName.ToUpper()
Dim currentcolor as string = d.cecolor.ToString.ToUpper
Dim currentlayer as string = d.Clayer.ToString.ToUpper
I've atteched the error message
You cannot manipulate the structure of an eventhandler.
Declare your variables outside the eventhandlers, store the current values and set it back like this:
Dim m_sCurrentLayer As String Private Sub callback_CommandWillStart(sender As Object, e As CommandEventArgs) Dim sCommandName As String = e.GlobalCommandName.ToUpper() If sCommandName = "LINE" Then ...... m_sCurrentLayer = db.Clayer ...... End If End Sub Private Sub callback_CommandEnded(sender As Object, e As CommandEventArgs) Dim sCommandName As String = e.GlobalCommandName.ToUpper() If sCommandName = "LINE" Then ...... db.Clayer = m_sCurrentLayer ...... End If End Sub
Yes i did that before but for some strange reason the db.Clayer (made it Bold in your example) is alrready the color that i'm going to change it in.
So for example, if i'm in layer "concrete" and i use a text command it has to change to layer "text" and turn back to concrete after the command.
Now, db.Clayer has already the value "text" so in Commandended it will change it to "text", what it already is.
Dim m_sCurrentLayer As String Private Sub callback_CommandWillStart(sender As Object, e As CommandEventArgs) Dim sCommandName As String = e.GlobalCommandName.ToUpper() If sCommandName = "LINE" Then ...... m_sCurrentLayer = db.Clayer ...... End If End Sub Private Sub callback_CommandEnded(sender As Object, e As CommandEventArgs) Dim sCommandName As String = e.GlobalCommandName.ToUpper() If sCommandName = "LINE" Then ...... db.Clayer = m_sCurrentLayer ...... End If End Sub
I don't think AutoCAD already knows the layer you're intending to use
So check your code: maybe you already have set the layer current yourself, or for some reason you are changing the value of m_sCurrentLayer before you give it back to db.Clayer? Debug your code with breakpoints in the handlers to see what is happening.
Hi,
You need to pass layer objectId not the strings, for example you can following method in your handler, and accordingly restore layer in command end event.
Public Shared Sub SetLayerCurrent(slayerName As String) ' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database ' Start a transaction Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() ' Open the Layer table for read Dim acLyrTbl As LayerTable acLyrTbl = TryCast(acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead), LayerTable) If acLyrTbl.Has(sLayerName) = True Then ' Set the layer Center current acCurDb.Clayer = acLyrTbl(sLayerName) ' Save the changes acTrans.Commit() ' Dispose of the transaction End If End Using End Sub
Henk, aperently AutoCAD does know it.
Somehow using COM handlers like doc.CommandCancelled messed up my other handlers.
I deleted all COM handlers and i only use AcadAPP.BeginCommand and AcadAPP.EndCommand now.
The handlers are working fine for all commands except text,hatch and dim commands.
Also if i debug it in autoCAD i get this message when opening a drawing:
Application does not support just-in-time (JIT)
debugging. See the end of this message for details.
************** Exception Text **************
System.InvalidCastException: Unable to cast object of type 'Autodesk.AutoCAD.LivePreview.PreviewRuleProvider' to type 'Autodesk.AutoCAD.Internal.IPreviewContextProvider'.
at Autodesk.AutoCAD.LivePreview.PreviewContextService.LoadContext()
at Autodesk.AutoCAD.LivePreview.PreviewContextService.get_ContextProvider()
at Autodesk.AutoCAD.LivePreview.PreviewContextManager.OnIdleInitialize(Object sender, EventArgs e)
at System.EventHandler.Invoke(Object sender, EventArgs e)
at Autodesk.AutoCAD.ApplicationServices.Core.Application.OnIdle()
************** Loaded Assemblies **************
etc....
These two lines are interesting:
at Autodesk.AutoCAD.LivePreview.PreviewContextManager.OnIdleInitialize(Object sender, EventArgs e)
at System.EventHandler.Invoke(Object sender, EventArgs e)
This because i used EventArgs e for COM handlers but i already deleted them:
Private Sub callback_CommandWillStart(sender As Object, e As CommandEventArgs)
Dim sCommandName As String = e.GlobalCommandName.ToUpper()
So somehow my vbproject still has information in it from old COM handlers i already deleted.
Do i have to reset or something?
I already tried to delete all references and add them again but it didn't work 😞
I solved it by reinstalling AutoCAD.
We will never know what it was but i'm releaved that it's solved.
it was beginning to frustrate me.
Thanks for all your help 🙂
Can't find what you're looking for? Ask the community or share your knowledge.