【问题标题】:Using Editor class in AutoCAD to execute commands在 AutoCAD 中使用 Editor 类执行命令
【发布时间】:2015-04-07 16:57:19
【问题描述】:

我正在尝试创建一个按钮,当按下该按钮时,它会标记绘图的位置。现在方法看起来像这样。

[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\nickg\Documents\All Code\autocad-adapter\IOAutoCADHandler\myCommands.cs:line 186 中的 AutoCAD_Adapter.MyCommands.MarkPosition() 在 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()

【问题讨论】:

  • 看我的 cmets 到 'Augusto Goncalves'。他有正确的答案,但要澄清的是,您的 eInvalidInput 异常是您的 CommandMethod 运行的上下文的结果。

标签: c# command autocad autocad-plugin


【解决方案1】:

使用 CommandFlags.Session

时不能使用 ed.command()

【讨论】:

    【解决方案2】:

    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"});
    }
    

    【讨论】:

    • 实际上,SendStringToExecute() 在 2015 API 中仍然可用。我用过它,你可以在 AcCoreMgd.dll 中找到它。但是“Nick G”的问题是他通过将 CommandFlags.Session 枚举添加到他的 CommandMethod 属性来在应用程序上下文中运行它。 Editor.Command() 仅适用于 DocumentContext。真的,修复它所需要做的就是删除 Session 枚举,它会起作用。
    • 没错,但Editor.Command和CommandAsync更好,因为我们有控制(同步或异步),这就是我建议更换的原因。
    【解决方案3】:

    使用这个:

    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute
    

    【讨论】:

    • 将此代码放在上下文中会改善答案
    • 方法是同步的。它一直等到 C# 方法结束时才发送我需要执行命令时之后的字符串
    • @Nick G:你可能不是这个意思,但 SendStringToExecute() 是异步的。来自 AutoCAD .NET 开发人员指南:“使用 SendStringToExecute 执行的命令是异步的,并且在 .NET 命令结束之前不会被调用”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2017-05-30
    • 2017-08-04
    • 2013-06-25
    • 1970-01-01
    相关资源
    最近更新 更多