青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

青华模具培训学院
查看: 1319|回复: 0

NET平台的AutoCAD二次开发

[复制链接]
发表于 2011-2-24 16:23 | 显示全部楼层 |阅读模式
当前AutoCAD的二次开发工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp与VBA较为简单,特别是VBA,使用方便且开发速度较快,但其功能相比ObjectARX有所不足,尤其是对面向对象的功能支持不好。而ObjectARX基于VC平台,在C++的支持下,其功能非常强大,可以很好地运用各种面向对象技术,但其缺点是发开速度比较慢,同时对开发人员的能力要求较高。 3 Y. \8 x+ T/ L/ J) ?4 S
    .NET是微软新推出的开发平台,具有众多优点。基于.NET平台对AutoCAD进行二次开发,可充分利用.NET的各种优势,在保证功能强大的前提下大大提高开发速度。" e! @9 I9 H3 O& x1 U
一、基于.NET的开发
8 \0 |/ |6 \, @  I, i" H; ?/ D  w    1..NET API简介
. K+ ^( l. _( _$ }5 `    在新推出的AutoCAD 2006中,Autodesk为其开发增加了.NET API。.NET API提供了一系列托管的外包类(Managed Wrapper Class),使开发人员可在.NET框架下,使用任何支持.NET的语言,如VB.NET、C# 和Managed C++等对AutoCAD进行二次开发。其优点是完全面向对象,在拥有与C++相匹配的强大功能的同时,具有方便易用的特点,是较理想的AutoCAD二次开发工具。
* T7 s- N5 Y: U! U    2..NET API与传统ObjectARX的主要区别1 y/ n. {2 v# X, @
    .NET API与传统ObjectARX的区别主要源于在.NET环境下开发应用程序与在VC环境下开发应用程序的区别。首先,在VC环境下,程序员需要自己管理内存的申请和释放,而.NET采用了垃圾回收机制,由.NET框架自行判断内存回收的时机并实行回收,从而解决了令C++程序员头痛的内存泄漏问题。也正是由于这个特点,在.NET环境下不能象在C++环境下那样利用析构函数释放其他的资源,需要程序员在程序中显式地释放。在.NET API中,主要通过Dispose来函数进行资源的释放。2 `, l( m3 Q+ s7 [
    其次,ObjectARX中的各种反应器(Reactor)在.NET API中由外包类映射为各种事件(Event),可通过定义这些事件的响应函数来响应AutoCAD的各种操作。同时对于错误信息的处理也从函数返回值改变为通常异常来处理,使其更好地兼容.NET。由于VB.NET、C#等语言都是完全面向对象的,没有全局函数的概念,所以.NET API将ObjectARX下的全局函数封装为.NET API下的某些对象或对象的属性,如ObjectARX下与用户交互的系列全局函数被封装为CommandLinePrompt类。! D2 {* Z) K# L1 T3 _3 S, I
    3.使用.NET API( u5 H! l% z, z
    下面以C#为例,在Microsoft Visual C# 2005 Express Edition Beta平台上,先新建一个Class Library项目,再将AutoCAD2005安装目录下的acdbmgb.dll与acmgb.dll作为引用添加进项目中。这两个文件包含了.NET API中所有的外包类。
+ u2 \8 v$ ~5 y$ r7 h8 G    然后在要使用.NET API的类中添加以下语句以引用.NET API的命名空间。需要添加的语句如下:: N$ ]( ~) D. {" _* ~2 H8 w
    using Autodesk.AutoCAD.ApplicationServices;* g1 c7 G2 _" Q( n9 v: F& b1 h) A
    using Autodesk.AutoCAD.DatabaseServices;
2 Q- p! O& O7 L    using Autodesk.AutoCAD.Runtime;
5 G& r$ d- D( p" q) w    using Autodesk.AutoCAD.Geometry;
! D. j. A1 I6 d1 {4 Q    这样就可以利用.NET API进行开发了。以下代码可在AutoCAD注册为一个命令“AddLine”,该命令可在当前工作空间中添加一条起点为(0,0,0),终点(200,200,0)的直线。代码如下:
, ^0 G4 M2 R0 F$ z2 g4 W    [CommandMethod ("AddLine")]6 @, J/ R! ~! ?5 _
    public static void AddLineCmd()% H6 i$ g9 Z: B0 H% p( K
    {0 _* z  d# ]6 A# m# T5 Q7 j5 p
    Database db = HostApplicationServices.WorkingDatabase;//获得当前工作空间的数据库
( O5 F* ?, V! z! Z    BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead); //获得块表8 o3 L- ~. M. n5 P- M9 H7 X
    BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite); //获得模型空间的块表记录
$ z5 H" N, N( d( F- q0 i' m) @1 O9 U    Line line = new Line(new Point3d(0, 0, 0), new Point3d(200, 200, 0));//创建一条直线
# ~& m& |! B/ Q  k' _& m% j" ^1 V' l5 ?    try {
+ e+ y& N- Z- R4 D4 |    btr.AppendEntity(line);//将直线添加到模型空间中. g2 S4 ?) e. F2 X9 p+ R
    line.Close();//关闭该直线8 ]' \" R" |3 _( `
    }! a0 M8 [" w8 p/ y* Y; X
    finally {# k, H) B& F7 @/ a& U
    btr.Close();//关闭块表记录
$ y9 H$ d( p" ~/ P0 i# X4 b" B/ M    bt.Close();//关闭块表
1 p; P5 \! c; I$ ~% U/ n    }
+ I' y: N; G% R; _+ U. k    }
# P( `; F- j0 p/ u+ f+ A0 G+ ~    由此可见,上述语句与在VC下的开发非常类似,其过程都是先得到数据库,然后依次打开块表、块表记录,接着添加实体,最后关闭块表、块表记录。值得注意的是finally语句,无论try块中的语句是否发生异常,finally块中的语句都会被执行,从而确保关闭块表和块表记录的操作会被执行。! @" g8 p2 g$ g7 k. B" a( N7 J
    写完代码后进行编译,编译完成将得到一个dll文件。在AutoCAD 2006中通过“netload”命令即可选择该dll文件进行加载,加载成功后即可以通过“AddLine”命令执行上述代码。遗憾的是目前的.NET API版本还不支持卸载,若要卸载只能关闭AutoCAD。# t1 ^; }+ Z/ V& E$ a
    4..NET API的初始化与清除% k: ^* ~) s4 E! I
    在ObjectARX中,“acrxEntryPoint”函数是ARX程序的载入点,程序的初始化和清除均可在该函数中进行。而在.NET API中则首先需要将初始化代码封装在一个类中,同时该类需要压迫实现
! u9 a, Q+ A/ C; m    IExtensionApplication接口。该接口包含Initialize与Terminate两个函数。其中Initialize负责加载程序时的初始化操作,Terminate则负责进行卸载程序时的清除操作。代码如下:* F, O) |" D0 ?5 O3 y$ c! n& y
namespace ARXExample {
/ E$ {' R! G8 n/ w1 s1 u  Gpublic class MyARX : IExtensionApplication {
8 m! _3 Q% `5 ~: ~1 E……
: ]/ ]* T  `, `. ~, D# y. o( hpublic void Initialize() {
, }' {4 \- K) f- X! @  k5 K1 d) v2 U* ?//初始化操作- o! A7 Y5 u% ?  P2 z. l
}6 D+ H3 Z+ Q) R7 @6 w
public void Terminate() {& }! M8 B2 w) z* ^
      //清除操作+ [5 P' f+ k5 _& u
}
: [- k3 _7 R9 y5 m6 y, @! h& J……4 a* q8 Y2 z0 w/ s5 |  B9 C
  O$ j. V! `4 J4 [% c2 F
}* ~9 w: @, f( ]3 P$ u( [: {! X
同时,为加快加载速度,可在MyARX.cs的文件头加入以下语句:
4 X( y# R  G' j. `0 z[assembly: ExtensionApplication (typeof (ARXExample.MyARX) ) ]
# x4 C+ S7 ]: m- S5 `! t[assembly: CommandClass (typeof (ARXExample.MyARX) ) ]
6 e+ U) M1 Y# p# f# m# {    这样在加载程序时AutoCAD将直接通过MyARX中的Initialize语句进行初始化,同时注册MyARX中的命令。否则,AutoCAD将搜索dll中所有的类以找到实现IExtensionApplication接口的类进行初始化,如找不到则不进行初始化。同样,通过CommandClass属性,AutoCAD也会直接到MyARX类中搜索要注册的命令。当程序中包含的类数目较多时,通过ExtensionApplication和CommandClass这两个属性可显著地加快程序的加载速度。
6 n3 ^! u" W! x# Z2 Q2 }    5..NET API与COM交互操作$ k& d; y, ~4 c3 X+ H
    在目前的.NET API中,其功能与传统的ObjectARX相比有所不及,有相当的ObjectARX函数目前还没有封装到.NET API中,如GetPoint等。但可以通过COM方式使用ActiveX来弥补.NET API的不足。  w8 j" Y4 i7 \  X% M
增加了COM引用后,程序就可以使用许多VBA中的功能了。以AutoCAD ActiveX中的事件为例,以下代码可以为当前工作空间中所有的图元添加Modified事件:# G8 I9 d- J+ C, U& U* E
Database db = HostApplicationServices.WorkingDatabase;
7 x' k4 e4 c5 z7 eBlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead);
( T1 [5 w6 n2 O2 j: {; ~/ @BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite);6 E9 c! V' R! w1 e
try {6 l% c% Y) X5 p: y
AcadObject obj;; r1 r; y. w  t$ s6 U
//遍历块表记录
/ l& q# Q# B* g" R8 nforeach (ObjectId objId in btr) {; n' h1 X! o) }& R5 R/ G0 r5 k
    //由ObjectId得到ActiveX中的AcadObject对象
1 o+ C- g. r! ^/ ]        obj = (AcadObject)((AcadDatabase)db.AcadDatabase).ObjectIdToObject(objId.OldId);
9 N" i/ f( r6 o6 S( M    //为obj添加响应Modified事件: ]* G  \  O+ X# k
        obj.Modified += new IAcadObjectEvents_ModifiedEventHandler(obj_Modified);* X6 F. ?. a$ ?9 A" E# s3 \
    }3 Q: ?! `" f3 g  K/ b0 ~
}
. ]( D% d' m* \9 U: Z/ X* H1 o& Hfinally {
& z# B* D$ f, D/ p: P! u    btr.Close();
6 t7 N0 ~: B: W$ C    bt.Close();; i" g9 ^9 z" d; H$ v4 A
}
, I, x3 U% \6 h5 C& s其中事件响应函数obj_Modified的表示如下所示:
! X. k9 y- ?! U! V; E. ?0 jpublic static void obj_Modified(AcadObject obj) {
) u+ }- h9 O1 c1 HCommandLinePrompts.Message("object modified!" + obj.ObjectID + "\n");  ?4 S* u* [5 G, @' z* A
}3 X% P2 N- N  @2 ]' a( w" D
二、结论
* L6 y: N. c2 T" M$ e5 D& I    本文以C#为例,对基于.NET API的AutoCAD二次开发作了较详细的介绍。.NET API在具有ObjectARX强大功能的同时具有VBA使用方便易用的优点,同时具有C++的强大功能,是较为理想的开发工具。但目前.NET API在某些方面还有些不足,但随着其版本的更新、完善,定会成为众多开发人员的首选工具。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|sitemap|小黑屋|Archiver|手机版|UG网-UG技术论坛-青华数控模具培训学校 ( 粤ICP备15108561号 )

GMT+8, 2025-7-6 22:31 , Processed in 0.180135 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表