原文: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);
}
}
}
}