替换AutoCAD的OPEN命令——Through the Interface

原文:Replacing AutoCAD's OPEN command using .NET

Patrick Nikoletich通过E-mail提出了一个很好的问题:

我不知道重写AutoCAD 2007中默认的“打开”对话框才是首选的方法?我能捕获事件,但不能通过给AutoCAD发送命令来取消这个请求来实现我来启动我的Win Form来替代。

这个需求相当的普遍,尤其是对于需要将文档管理系统与AutoCAD结合的人来说更是如此。

完成这个任务最简单的方式就是undefine OPEN命令,然后用你自己的实现来替换它——虽然这个技术有点古老。用Lisp来实现的的经典方法是使用(command)函数来对OPEN调用UNDEFINE命令,然后再用(defun)来实现你自己的(c:open)函数。

这种技术也可以适用于.NET。下面的C#代码在初始化时调用UNDEFINE命令,然后再实现它自己的OPEN命令。

备注:

  • 我使用的COM方式的SendCommand(),而不是SendStringToExecute(),因为SendCommand它是所谓的同步执行的,在命令定义之前就会执行。
    • 不幸的是,这会导致UNDEFINED命令会在命令行回显这样一个我们不希望的副作用。
    • 我没有在AutoCAD启动时进行测试——如果需要的话,可能需要做一些工作才能让initialization的代码运行的更加合适(例如在ActiveDocument的时候需要调用SendCommand)。
  • 我已经实现了一个简单的“OPEN”命令——只是通过标准的对话框向用户请求一个文件名,然后调用一个函数打开此文件。如果要修改这个命令使它的行为与AutoCAD的命令相匹配或者满足您的应用程序的需求可能还需要一些修改。
    • 这个命令定义为一个session命令,这样才能允许它把焦点转移到新打开的文档。它不会像AutoCAD的OPEN命令那样,如果当前文档是“default”并且没有修改的话(例如“Drawing1.dwg”)就会关闭它

以下则是代码:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Interop;
using System.Runtime.InteropServices;

namespace RedefineOpen
{
  public class CommandRedefinitions
  : Autodesk.AutoCAD.Runtime.IExtensionApplication
  {
    public void Initialize()
    {
      AcadApplication app =
        (AcadApplication)Application.AcadApplication;
      app.ActiveDocument.SendCommand("_.UNDEFINE _OPEN ");
    }

    public void Terminate(){}

    [CommandMethod("OPEN", CommandFlags.Session)]
    static public void Open()
    {
      DocumentCollection dm = Application.DocumentManager;
      Editor ed = dm.MdiActiveDocument.Editor;

      PromptOpenFileOptions opts =
        new PromptOpenFileOptions(
          "Select a drawing file (for a custom command)"
        );
      opts.Filter = "Drawing (*.dwg)";
      PromptFileNameResult pr = ed.GetFileNameForOpen(opts);

      if (pr.Status == PromptStatus.OK)
      {
        dm.Open(pr.StringResult);
      }
    }
  }
}


 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值