我正在尝试创建一个按钮,按下该按钮即可标记绘图的位置。现在的方法看起来像这样。
[CommandMethod("MARKPOS", CommandFlags.Session)]
public void MarkPosition()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
ed.Command("UNDO", "M");
}
但是,当我尝试执行该方法时,出现下图所示的错误,并且无法确定原因。
**************** 异常文本 ************** Autodesk.AutoCAD.Runtime.Exception:eInvalidInput 在 Autodesk.AutoCAD.EditorInput.Editor.Command(对象[]参数) 在 c:\Users 中的 AutoCAD_Adapter.MyCommands.MarkPosition() 处 ickg\Documents\所有代码 utocad-adapter\IOAutoCADHandler\myCommands.cs:第 186 行 在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi、对象 commandObject、布尔 bLispFunction) 在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi,对象 commandObject,布尔 bLispFunction) 在 Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi,布尔 bLispFunction) 在 Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
SendStringToExecute 将一直有效到 AutoCAD 2014。在 AutoCAD 2015(及更高版本)上,它被替换为 Editor.Command 或 Editor.CommandAsync。
关于原代码,请尝试使用
[CommandMethod("MARKPOS")]
public static void MarkPosition()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
ed.Command(new object[]{"UNDO", "M"});
}
使用 CommandFlags.Session
时不能使用 ed.command()使用这个:
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute
您可以尝试的另一个想法是
static void Invoke(Action action)
{
var docmgr = Application.DocumentManager;
if(docmgr.IsApplicationContext)
{
docmgr.ExecuteInCommandContextAsync(unused =>
{
action();
return Task.CompletedTask;
}, null);
}
else
{
action();
}
}
这就是您的称呼:
Invoke(() => YourMethod());
按照这里。