替换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”)就会关闭它
以下则是代码:
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); } } } }
相关文章推荐
- 获取AutoCAD中.Net程序定义的命令——Through the Interface
- 在AutoCAD中使用Python——Through the Interface
- Through the Interface——.NET 和 AutoCAD
- 支持多个版本的AutoCAD——C#中的条件编译——Through the Interface
- 优化AutoCAD .NET 程序的加载——Through the Interface
- 在.Net程序中调用ObjectARX函数——Through the Interface
- win10 Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host
- mm mmm命令不能用,出现cannot open the display.
- virtualbox启动虚拟机报错Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host
- Centos下_MysqL5.7在使用mysqldump命令备份数据库报错:mysqldump: [Warning] Using a password on the command line interface can be insecure.
- What is the "internal" interface and port for on Openvswitch?
- interface builder could not open the document ... does not exist
- Through the Interface——AutoDesk API使用入门
- Accessing DWG files not open in the AutoCAD editor using .NET
- How To Import Standard PO Using the Purchase Document Open Interface[转]
- OpenAirInterface USRP安装时You do not have write permissions at the install location问题解决方案
- the diff of implement when ram interface is direct address mapping or is access through register
- The Open Web Interface for .NET (OWIN) 源码阅读
- Xcode编译报错:Interface Builder could not open the document
- Interface Builder could not open the document "xxx.xib" because it does not exist.