您的位置:首页 > 运维架构

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

2013-10-30 23:05 274 查看
原文: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);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐