You need to enable JavaScript to run this app. 如何在.NET C#中异步调用Lisp函数并避免AutoCAD命令拒绝错误
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET C#中异步调用Lisp函数并避免AutoCAD命令拒绝错误

解决方法

  • 核心原因是Application.Invoke调用时,AutoCAD检测到当前处于命令执行上下文,拦截了Lisp内部的命令调用。你可以先清空命令进行中标记再执行调用:
    var doc = Application.DocumentManager.MdiActiveDocument;
    // 清空命令执行标记,绕过上下文校验
    doc.Editor.DocumentContext.CommandInProgress = "";
    
  • 不要在同步命令执行栈中直接调用Application.Invoke,将调用逻辑投递到AutoCAD空闲队列执行,避免上下文冲突,完整示例:
    var doc = Application.DocumentManager.MdiActiveDocument;
    doc.Editor.DocumentContext.CommandInProgress = "";
    
    // 注册单次空闲事件执行Lisp调用
    Application.Idle += InvokeCustomLisp;
    
    void InvokeCustomLisp(object sender, EventArgs e)
    {
        Application.Idle -= InvokeCustomLisp;
        // 构造结果缓冲区,第一个参数为你的Lisp函数名,后续为传入参数
        using var rb = new ResultBuffer(
            new TypedValue((int)LispDataType.Text, "C:MY_CUSTOM_LISP_FUNC"),
            new TypedValue((int)LispDataType.Double, 100.5)
        );
        Application.Invoke(rb);
    }
    
  • 如果Lisp内部调用的是需要用户交互的命令,可额外设置doc.Editor.DocumentContext.Interactive = true,调用完成后自动恢复即可。
  • 若仍有报错,可修改Lisp代码,将内部的(command)调用替换为(command-s),该函数是AutoCAD专门提供给二次开发场景的无上下文约束命令执行接口,不会触发命令拦截。

注意事项

  • 不需要手动恢复CommandInProgress属性值,AutoCAD会在Lisp函数执行完成后自动更新。
  • 所有调用逻辑必须在AutoCAD主线程执行,上述空闲事件触发时本身就在主线程,无需额外处理线程同步。

内容的提问来源于stack exchange,提问作者OGP99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:48:05