【转】外部.NET程序与AutoCAD交互[…

       翻译了几篇从Kean的Blog转来的文章,几篇文章是连贯的,都是对同一个问题的关注-如何从一个外部的.NET程序驱动AutoCAD,并且与AutoCAD交互。指出了不少问题,应该说还是有一定的学习价值的。
       翻译的目的主要是为了不让脑中残存那么几个英文单词都离我远去,加上也闲来没事,一边看一边翻译了一下。起码翻出了个大概意思吧。遂贴出来,有兴趣的朋友可以看看。有什么纰漏,敬请指正。本想几篇文章全部归在一起发了,不过因为baidu空间日志字数有限制,还是得拆开来发。
       以下内容为原文翻译:

       Launching AutoCAD from a .NET application
      

        (AutoCAD)开发者一般要么将功能集成到AutoCAD(通过其扩展体系来添加命令、用户界面元素、对象等),要么通过程序来驱动AutoCAD,使通用的任务自动化。这两种方式的界线有时候不是那么明显,我今天要关注的是后者。
        为了后面的解释方便,我先介绍一下两种应用程序的交互。
        一、线程外
        此种情况下,我们需要在两个独立的可执行程序之间进行通信。就好比如我需要一个.EXE的执行程序来驱动AutoCAD,我们就需要找到某种方式来启动AutoCAD并且与之通信-最典型的就是使用COM技术或更早的DDE技术。这种通信方式,确切地说,是通过进程间通信IPC(Inter-Process Communication)来完成,这种方式在传输大量数据时是非常低效的。这就是早期的ADS和外部VB应用程序运行很慢的原因。
        二、线程内
        当程序代码被编译成DLL,不管是VB建立的Activex Dll,ObjectARX模块,还是.NET的程序集,程序与AutoCAD主线程之间的通信都要高效得多-数据结构可以通过指针来传递或直接引用,而不是通过低效的IPC编组来发送数据信息。
        目前AutoCAD大部分的APIs都是被设计用于"线程内"的-包括LISP,ObjectARX,和.NET API。因为.NET Remoting的实用性,很多人常希望或期盼着AutoCAD能通过.NET从线程外部驱动,不过.NET的托管API并不是这么设计的-它其实就是对ObjectARX的一个封装,其运行是以通过指针对内部对象的直接访问为基础的,完全不可能超越线程的界线。COM自动化技术的最大特点之一就是它就是被设计成既可以用于线程外(通过外部EXE)也可以用于线程内(通过VBA或通过GetInterfaceObject()来调用VB6的ActiveX DLL)。目前这仍然是从外部可执行程序驱动AutoCAD的最好方式。
        通常我不建议在进程间传递太多的信息。如果你需要从外部程序驱动AutoCAD,最好只是通过它运行AutoCAD(或是在可能的情况下连接到一个已运行的实例),接下来加载一个线程内的模块,让它在AutoCAD的进程内完成主要的任务。
        下面的代码就将展示如何用C#来完成这一过程。它会尝试连接到一个已运行的AutoCAD实例(这是随意的-你也可以把代码修改成直接运行一个AutoCAD),如果失败则运行。一旦有了正在运行的对象实例,使之可见且运行一个自定义命令。建议将程序设置成自动加载-要么在AutoCAD启动时加载,要么在命令被触发时加载,然后运行一个模块中定义的命令。
         你需要添加对“AutoCAD Type Library”的引用,还有导入以下命名空间。

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

         下面的代码你可以添加到比如某个按钮的Click事件中或其他有效的函数中去。

[代码如下]// "AutoCAD.Application.17" uses 2007 or 2008,
//   whichever was most recently run
// "AutoCAD.Application.17.1" uses 2008, specifically
conststring progID = "AutoCAD.Application.17.1";
AcadApplication acApp = null;
try
{
   acApp =
     (AcadApplication)Marshal.GetActiveObject(progID);
}
catch
{
  try
   {
     Type acType =
       Type.GetTypeFromProgID(progID);
     acApp =
       (AcadApplication)Activator.CreateInstance(
         acType,
        true
       );
   }
  catch
   {
     MessageBox.Show(
      "Cannot create object of type \"" +
       progID + "\""
     );
   }
}
if (acApp != null)
{
  // By the time this is reached AutoCAD is fully
  // functional and can be interacted with through code
   acApp.Visible = true;
   acApp.ActiveDocument.SendCommand("_MYCOMMAND ");
}

[下接].NET程序外部与AutoCAD交互[2]

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值