sunny~晴 2024-03-24 23:06 采纳率: 80%
浏览 7
已结题

C# CAD二次开发 如何杀死命令进程

C# CAD二次开发
用C#写了一个命令,其中需要获取对象ID,将获取ID过程封装在方法中;
获取ID的方法需要返回一个 ObjectId 类型的对象 ,该对象部门为 null
那么如果我在CAD中调用了该命令,该命令就会要求用户选取一个对象,用于get其图元ID
如果用户选择了一个正确类型的对象,那么命令可以正常执行,
但如果在执行命令后按了Esc键(通常在CAD中表示取消命令),CAD会直接崩溃,甚至不会弹出进程错误的窗口
那么为了CAD在该种情况下依然能够运行,我计划在该方法检测到“用户按下‘Esc’键”时,直接杀死主命令进程
或者还有其他更好的办法解决?
主命令代码如下

public class ClassPT
{
    internal static Document doc = Application.DocumentManager.MdiActiveDocument;
    internal static Database db = doc.Database;

    static int b波胶 = 20;
    static int f分段基数 = 1000;
    static int w屏风宽度 = 80;

    [CommandMethod("PT")]
    public void AdskGreeting()
    {
        //选取道轨
        ObjectId ID道轨 = db.I获取对象ID("选择导轨",typeof(Line));
    }
}

方法代码如下

internal static ObjectId I获取对象ID(this Database db, string 提示信息, Type 选择类型)
{
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    PromptEntityOptions 用户输入 = new PromptEntityOptions(提示信息);
    PromptEntityResult result = ed.GetEntity(用户输入);

    if (result.Status == PromptStatus.Cancel) { 
        
        //kill(true);  这里希望杀死调用该方法的进程,如何编写代码?

    }

    if (用户输入 != null)
    {
        用户输入.SetRejectMessage("选择的图元类型错误,请重新选择" + 选择类型.ToString());
        用户输入.AddAllowedClass(选择类型, true);
    }

    PromptEntityResult res = ClassPT.doc.Editor.GetEntity(用户输入);
    return res.ObjectId;
}
  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-24 23:06
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    在方法中直接杀死主命令进程可能会造成其他问题,因为调用该方法的命令进程可能对CAD有其他的依赖关系。建议在用户按下“Esc”键时,直接抛出一个自定义的异常,让主命令代码捕获该异常并处理。以下是修改后的代码示例: 主命令代码:
    public class ClassPT{
        internal static Document doc = Application.DocumentManager.MdiActiveDocument;
        internal static Database db = doc.Database;
        static int b波胶 = 20;
        static int f分段基数 = 1000;
        static int w屏风宽度 = 80;
        [CommandMethod("PT")]
        public void AdskGreeting()
        {
            //选取道轨
            ObjectId ID道轨 = I获取对象ID("选择导轨", typeof(Line));
            if (ID道轨.IsNull) {
                return; //用户取消选择,命令退出
            }
            //执行其他操作
        }
    }
    方法代码:
    internal static ObjectId I获取对象ID(this Database db, string 提示信息, Type 选择类型)
    {
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        PromptEntityOptions 用户输入 = new PromptEntityOptions(提示信息);
        PromptEntityResult result = ed.GetEntity(用户输入);
        if (result.Status == PromptStatus.Cancel) {
            throw new UserBreakException(); //用户按下Esc键,抛出一个自定义异常
        }
        if (用户输入 != null) {
            用户输入.SetRejectMessage("选择的图元类型错误,请重新选择" + 选择类型.ToString());
            用户输入.AddAllowedClass(选择类型, true);
        }
        PromptEntityResult res = ClassPT.doc.Editor.GetEntity(用户输入);
        return res.ObjectId;
    }
    //定义一个自定义异常类
    public class UserBreakException : Exception
    {
        public UserBreakException() {}
        public UserBreakException(string message) : base(message) {}
        public UserBreakException(string message, Exception innerException) : base(message, innerException) {}
    }
    在命令中调用 I获取对象ID 方法时,如果用户按下“Esc”键,则会抛出 UserBreakException 异常,主命令代码就可以捕获该异常并做特殊处理,例如退出命令或者显示一个提示窗口。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 为什么我安装了Homebrew之后,无法像官网的那样通过执行命令安装Watchman
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表