autocad.net 用acedCmd发送命令如何等待用户输入

//用acedCmd发送命令如何等待用户输入
//参考:https://adndevblog.typepad.com/autocad/2012/04/synchronously-send-and-wait-for-commands-in-autocad-using-c-net.html
//qq群:720924083
//2020-11-17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Windows;
namespace AcadDemo
{
    public class SendSyncCommand
    {
    // call the insert command and wait until the user has finished, by Fenton Webb, DevTech
    
        [DllImport("acad.exe", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedCmd")]
        private static extern int acedCmd(System.IntPtr vlist);
     
        [CommandMethod("Test7")]
        public void Test7()
        {
            ResultBuffer rb = new ResultBuffer();
            // RTSTR = 5005
            rb.Add(new TypedValue(5005, "_.INSERT"));
            // start the insert command

            acedCmd(rb.UnmanagedObject);
            bool quit = false;
            // loop round while the insert command is active
            while (!quit)
            {
            // see what commands are active

                string cmdNames = (string)Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CMDNAMES");

                // if the INSERT command is active

                if (cmdNames.ToUpper().IndexOf("INSERT") >= 0)
                {
                    // then send a PAUSE to the command line
                    rb = new ResultBuffer();
                    // RTSTR = 5005 - send a user pause to the command line

                    rb.Add(new TypedValue(5005, "\\"));

                    acedCmd(rb.UnmanagedObject);
                }
                else
                    // otherwise quit
                    quit = true;

                }

        }
   
    }
}

### 使用 `SendStringToExecute` 实现 CAD 二次开发中的参照功能 在 AutoCAD 的 C# 二次开发中,`Application.DocumentManager.MdiActiveDocument.SendStringToExecute` 方法是一种常用的方式,用于向当前活动文档发送字符串命令并执行。这种方法适用于模拟用户输入操作,从而完成特定的功能需求。 以下是通过 `SendStringToExecute` 实现参照功能的一个典型示例: #### 示例代码 ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; public void ExecuteReferenceCommand() { Document doc = Application.DocumentManager.MdiActiveDocument; // 获取当前活动文档 Database db = doc.Database; // 获取数据库实例 string referencePath = @"C:\path\to\your\drawing.dwg"; // 设置要参照的 DWG 文件路径 string command = $"_.REFMANAGER \"_IMPORT\" \"{referencePath}\" "; // 构建命令字符串 // 发送命令AutoCAD 执行环境 doc.SendStringToExecute(command, true, false, false); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // 如果需要进一步处理模型空间对象,则在此处编写逻辑 tr.Commit(); } } ``` #### 关键点解析 1. **构建命令字符串** 命令字符串的设计需严格遵循 AutoCAD命令语法。上述例子中使用了 `_REFMANAGER` 和其子选项 `_IMPORT` 来导入外部参照文件[^1]。注意,命令前缀加下划线表示支持多语言环境下的命令调用。 2. **参数说明** - 参数一:完整的命令字符串。 - 参数二:是否附加回车符 (`true`)。 - 参数三:是否立即刷新屏幕显示 (`false`)。 - 参数四:是否等待命令结束后再继续运行后续代码 (`false`)。 3. **事务管理** 虽然 `SendStringToExecute` 是一种简单快捷的方法来执行命令,但在某些情况下可能仍需要借助事务机制访问和修改数据库对象。 4. **兼容性考虑** 需要注意的是,在不同版本的 AutoCAD 中,部分 API 或者 DLL 库的位置可能发生改变(例如从 acad.exe 移动至 accore.dll)。因此建议开发者始终测试目标环境中所使用的具体方法及其依赖库是否存在差异。 #### 注意事项 - 当利用 P/Invoke 方式尝试直接调用底层函数如 acedCmd 或 acedCommand 时,若这些接口被放置于非默认模块内(比如 ACCORE.DLL),则可能导致失败或行为异常的情况发生。此时推荐改用更高层次封装好的 .NET 接口替代低级 WinAPI 调用。 - 对于复杂场景下的批量插入或其他高级定制化需求而言,单独依靠 SendStringToExecute 并不足以满足全部要求;这时应当深入研究 ObjectARX 提供的相关类结构以及更精细的操作流程设计思路。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸟哥01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值