欢迎来到天天文库
浏览记录
ID:38682645
大小:135.23 KB
页数:12页
时间:2019-06-17
《外部.NET程序与AutoCAD交互》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、外部.NET程序与AutoCAD交互外部.NET程序与AutoCAD交互(AutoCAD)开发者一般要么将功能集成到AutoCAD(通过其扩展体系来添加命令、用户界面元素、对象等),要么通过程序来驱动AutoCAD,使通用的任务自动化。这两种方式的界线有时候不是那么明显,我今天要关注的是后者。为了后面的解释方便,我先介绍一下两种应用程序的交互。一、线程外此种情况下,我们需要在两个独立的可执行程序之间进行通信。就好比如我需要一个.EXE的执行程序来驱动AutoCAD,我们就需要找到某种方式来启动AutoCAD并且与之通信-最典型的就是使用COM技术或更早的DDE技术。这种通信方式,确切地说,是
2、通过进程间通信IPC(Inter-ProcessCommunication)来完成,这种方式在传输大量数据时是非常低效的。这就是早期的ADS和外部VB应用程序运行很慢的原因。二、线程内当程序代码被编译成DLL,不管是VB建立的ActivexDll,ObjectARX模块,还是.NET的程序集,程序与AutoCAD主线程之间的通信都要高效得多-数据结构可以通过指针来传递或直接引用,而不是通过低效的IPC编组来发送数据信息。目前AutoCAD大部分的APIs都是被设计用于"线程内"的-包括LISP,ObjectARX,和.NETAPI。因为.NETRemoting的实用性,很多人常希望或期盼着A
3、utoCAD能通过.NET从线程外部驱动,不过.NET的托管API并不是这么设计的-它其实就是对ObjectARX的一个封装,其运行是以通过指针对内部对象的直接访问为基础的,完全不可能超越线程的界线。COM自动化技术的最大特点之一就是它就是被设计成既可以用于线程外(通过外部EXE)也可以用于线程内(通过VBA或通过GetInterfaceObject()来调用VB6的ActiveXDLL)。目前这仍然是从外部可执行程序驱动AutoCAD的最好方式。通常我不建议在进程间传递太多的信息。如果你需要从外部程序驱动AutoCAD,最好只是通过它运行AutoCAD(或是在可能的情况下连接到一个已运行的
4、实例),接下来加载一个线程内的模块,让它在AutoCAD的进程内完成主要的任务。12外部.NET程序与AutoCAD交互下面的代码就将展示如何用C#来完成这一过程。它会尝试连接到一个已运行的AutoCAD实例(这是随意的-你也可以把代码修改成直接运行一个AutoCAD),如果失败则运行。一旦有了正在运行的对象实例,使之可见且运行一个自定义命令。建议将程序设置成自动加载-要么在AutoCAD启动时加载,要么在命令被触发时加载,然后运行一个模块中定义的命令。你需要添加对“AutoCADTypeLibrary”的引用,还有导入以下命名空间。usingSystem;usingSystem.Runti
5、me.InteropServices;usingAutodesk.AutoCAD.Interop;下面的代码你可以添加到比如某个按钮的Click事件中或其他有效的函数中去。[代码如下]//"AutoCAD.Application.17"uses2007or2008,// whicheverwasmostrecentlyrun//"AutoCAD.Application.17.1"uses2008,specificallyconststringprogID="AutoCAD.Application.17.1";AcadApplicationacApp=null;try{ acApp=
6、 (AcadApplication)Marshal.GetActiveObject(progID);}catch{ try { TypeacType= Type.GetTypeFromProgID(progID); acApp= (AcadApplication)Activator.CreateInstance( acType, true ); } catch { MessageBox.Show( "Cannotcreateobjectoftype""+ progID+"""
7、); }}12外部.NET程序与AutoCAD交互if(acApp!=null){ //BythetimethisisreachedAutoCADisfully //functionalandcanbeinteractedwiththroughcode acApp.Visible=true; acApp.ActiveDocument.SendCommand("_MYCOMMAND");}前面讨论了如
此文档下载收益归作者所有