青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

NET平台的AutoCAD二次开发

[复制链接]
发表于 2011-2-24 16:23 | 显示全部楼层 |阅读模式
当前AutoCAD的二次开发工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp与VBA较为简单,特别是VBA,使用方便且开发速度较快,但其功能相比ObjectARX有所不足,尤其是对面向对象的功能支持不好。而ObjectARX基于VC平台,在C++的支持下,其功能非常强大,可以很好地运用各种面向对象技术,但其缺点是发开速度比较慢,同时对开发人员的能力要求较高。
4 b& y8 S4 r7 k    .NET是微软新推出的开发平台,具有众多优点。基于.NET平台对AutoCAD进行二次开发,可充分利用.NET的各种优势,在保证功能强大的前提下大大提高开发速度。
/ E4 m. P. `5 l: t/ B一、基于.NET的开发
& u; V: A6 |4 X* R) I    1..NET API简介
9 k5 ]/ D; {% ~1 ~/ @1 B) C6 V    在新推出的AutoCAD 2006中,Autodesk为其开发增加了.NET API。.NET API提供了一系列托管的外包类(Managed Wrapper Class),使开发人员可在.NET框架下,使用任何支持.NET的语言,如VB.NET、C# 和Managed C++等对AutoCAD进行二次开发。其优点是完全面向对象,在拥有与C++相匹配的强大功能的同时,具有方便易用的特点,是较理想的AutoCAD二次开发工具。
+ l- z: x! |) P6 T+ V- G    2..NET API与传统ObjectARX的主要区别
7 F3 J& i) @- x  k    .NET API与传统ObjectARX的区别主要源于在.NET环境下开发应用程序与在VC环境下开发应用程序的区别。首先,在VC环境下,程序员需要自己管理内存的申请和释放,而.NET采用了垃圾回收机制,由.NET框架自行判断内存回收的时机并实行回收,从而解决了令C++程序员头痛的内存泄漏问题。也正是由于这个特点,在.NET环境下不能象在C++环境下那样利用析构函数释放其他的资源,需要程序员在程序中显式地释放。在.NET API中,主要通过Dispose来函数进行资源的释放。, E, n. V( X5 E) G/ C
    其次,ObjectARX中的各种反应器(Reactor)在.NET API中由外包类映射为各种事件(Event),可通过定义这些事件的响应函数来响应AutoCAD的各种操作。同时对于错误信息的处理也从函数返回值改变为通常异常来处理,使其更好地兼容.NET。由于VB.NET、C#等语言都是完全面向对象的,没有全局函数的概念,所以.NET API将ObjectARX下的全局函数封装为.NET API下的某些对象或对象的属性,如ObjectARX下与用户交互的系列全局函数被封装为CommandLinePrompt类。
& S8 o: n6 a! n% V8 l; f& m    3.使用.NET API! U/ f; b1 P1 Y- G  g2 z% x
    下面以C#为例,在Microsoft Visual C# 2005 Express Edition Beta平台上,先新建一个Class Library项目,再将AutoCAD2005安装目录下的acdbmgb.dll与acmgb.dll作为引用添加进项目中。这两个文件包含了.NET API中所有的外包类。$ P/ j* K# o0 g, ?5 u7 [
    然后在要使用.NET API的类中添加以下语句以引用.NET API的命名空间。需要添加的语句如下:
4 y5 ?! \1 k% m) D4 P7 n, D% V    using Autodesk.AutoCAD.ApplicationServices;5 ~) ~! N1 Y; X
    using Autodesk.AutoCAD.DatabaseServices;1 ?/ p' {& x! r
    using Autodesk.AutoCAD.Runtime;1 R( b: e( z, i6 o8 _2 h
    using Autodesk.AutoCAD.Geometry;
% x# g1 Q' B) S" B- Y% }$ ?# ?    这样就可以利用.NET API进行开发了。以下代码可在AutoCAD注册为一个命令“AddLine”,该命令可在当前工作空间中添加一条起点为(0,0,0),终点(200,200,0)的直线。代码如下:
% C8 A4 c" ?. t9 ~% u% q    [CommandMethod ("AddLine")]+ G! d$ p) g/ S
    public static void AddLineCmd()1 W) q' }) ]) S* O
    {
. Z8 ]( V  O9 r# l    Database db = HostApplicationServices.WorkingDatabase;//获得当前工作空间的数据库9 m. g0 C" ^3 ~- \' X: e* f
    BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead); //获得块表
3 e( Y5 S/ P; k; c$ p' f    BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite); //获得模型空间的块表记录! B! u# K& p3 `+ p# I  y; t6 j; y
    Line line = new Line(new Point3d(0, 0, 0), new Point3d(200, 200, 0));//创建一条直线
. |" N- X+ Y" O    try {
" W7 }! w1 `6 J7 K* m    btr.AppendEntity(line);//将直线添加到模型空间中4 }  A' G* w! R* I* `
    line.Close();//关闭该直线2 E& d4 N2 y8 \- @% X8 q
    }
* }" o% Y# U2 A& C$ V, l    finally {$ W; i& G( [0 K9 c3 z9 ~
    btr.Close();//关闭块表记录
- ~% ]4 B- N2 S& U7 g+ C0 D, p    bt.Close();//关闭块表
1 K2 i9 w8 D; b1 a' x: B& r    }2 O9 M; g2 U7 C  f  O6 [6 h
    }% s% F# \1 N2 D6 I! A! W' j) l9 K
    由此可见,上述语句与在VC下的开发非常类似,其过程都是先得到数据库,然后依次打开块表、块表记录,接着添加实体,最后关闭块表、块表记录。值得注意的是finally语句,无论try块中的语句是否发生异常,finally块中的语句都会被执行,从而确保关闭块表和块表记录的操作会被执行。
5 M' G7 u7 n0 Z, U    写完代码后进行编译,编译完成将得到一个dll文件。在AutoCAD 2006中通过“netload”命令即可选择该dll文件进行加载,加载成功后即可以通过“AddLine”命令执行上述代码。遗憾的是目前的.NET API版本还不支持卸载,若要卸载只能关闭AutoCAD。0 s2 e2 [+ J  {# ]  e  _7 T( K$ {* ?
    4..NET API的初始化与清除& Q# m$ x2 `% p- r% s3 y$ f
    在ObjectARX中,“acrxEntryPoint”函数是ARX程序的载入点,程序的初始化和清除均可在该函数中进行。而在.NET API中则首先需要将初始化代码封装在一个类中,同时该类需要压迫实现! c: s1 E" \. J. V! n
    IExtensionApplication接口。该接口包含Initialize与Terminate两个函数。其中Initialize负责加载程序时的初始化操作,Terminate则负责进行卸载程序时的清除操作。代码如下:
0 w4 {; _3 B. bnamespace ARXExample {
' D. b" t9 c9 u" j0 spublic class MyARX : IExtensionApplication {
" i5 p* V* S  Z……
- ]: K% _* B( y% ypublic void Initialize() {
5 W# P2 ~' s2 m8 [; ?7 y//初始化操作3 w, ]) B7 u& T6 ]* O9 Q
}* _5 g! u) V& x9 G
public void Terminate() {
, {( ^& u8 f3 A0 c. D6 p; c2 C      //清除操作3 B3 \- f, h- b/ _
}. U3 J. A# K- Z; s* b: L
……% S2 G' v* G9 S3 M
% i" {7 ]2 c. E( A1 {8 L4 l
}& S( X) n- j2 b  U6 l) W8 t. k, n
同时,为加快加载速度,可在MyARX.cs的文件头加入以下语句:. G! |- P9 b/ B8 A
[assembly: ExtensionApplication (typeof (ARXExample.MyARX) ) ]
2 H* L9 E* r0 d3 Y, B1 j+ _1 C- b" L[assembly: CommandClass (typeof (ARXExample.MyARX) ) ]
/ G% M" g! `+ ]: m. }    这样在加载程序时AutoCAD将直接通过MyARX中的Initialize语句进行初始化,同时注册MyARX中的命令。否则,AutoCAD将搜索dll中所有的类以找到实现IExtensionApplication接口的类进行初始化,如找不到则不进行初始化。同样,通过CommandClass属性,AutoCAD也会直接到MyARX类中搜索要注册的命令。当程序中包含的类数目较多时,通过ExtensionApplication和CommandClass这两个属性可显著地加快程序的加载速度。
% I! S% k6 g8 C3 `4 j: G  @$ E    5..NET API与COM交互操作) k6 _# T: G! D$ z  f+ b
    在目前的.NET API中,其功能与传统的ObjectARX相比有所不及,有相当的ObjectARX函数目前还没有封装到.NET API中,如GetPoint等。但可以通过COM方式使用ActiveX来弥补.NET API的不足。6 k1 p2 ^0 O- n% A: l+ `1 N3 {
增加了COM引用后,程序就可以使用许多VBA中的功能了。以AutoCAD ActiveX中的事件为例,以下代码可以为当前工作空间中所有的图元添加Modified事件:& l* a+ _& S( u  _' `  Y
Database db = HostApplicationServices.WorkingDatabase;
+ Y8 @5 B$ k3 k; gBlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead);
- r3 }$ P$ w# q+ l' n, J* TBlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite);7 N% M6 {! R2 b! K" a: R
try {! {# }$ v1 Q& Y7 K+ l
AcadObject obj;
% @' l( f! f' |//遍历块表记录5 L5 E3 C* P! O- z! j/ j% F
foreach (ObjectId objId in btr) {- G3 x. X4 x: d2 s0 r/ M
    //由ObjectId得到ActiveX中的AcadObject对象
( H" K9 ~' x/ X* J; l4 L9 y4 j        obj = (AcadObject)((AcadDatabase)db.AcadDatabase).ObjectIdToObject(objId.OldId);
/ z" O) L# n- q3 o% E# c    //为obj添加响应Modified事件
+ Y8 a; a6 \* h: [7 O9 ]        obj.Modified += new IAcadObjectEvents_ModifiedEventHandler(obj_Modified);
+ @5 y6 G6 _* q3 M- n/ w0 ^    }
9 {2 A- V1 V% O) I5 q}
' E# k2 E8 S; N: r+ s, j- ?finally {) r( u! r8 k/ N# W6 R& G  @
    btr.Close();. p/ z2 G5 {4 K, ?* e$ h4 X4 {
    bt.Close();/ r4 A8 g* l1 E, e+ ~$ j8 {
}; r8 O- [. o+ c' v% @4 G
其中事件响应函数obj_Modified的表示如下所示:7 t) U3 V% m, i5 R. c
public static void obj_Modified(AcadObject obj) {
# ?( |- _3 O& c! lCommandLinePrompts.Message("object modified!" + obj.ObjectID + "\n");
( }8 n1 [. ~" x8 g}8 H: i% [' y2 p3 g, X8 d
二、结论! q; F3 d! O8 o6 F8 r
    本文以C#为例,对基于.NET API的AutoCAD二次开发作了较详细的介绍。.NET API在具有ObjectARX强大功能的同时具有VBA使用方便易用的优点,同时具有C++的强大功能,是较为理想的开发工具。但目前.NET API在某些方面还有些不足,但随着其版本的更新、完善,定会成为众多开发人员的首选工具。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-17 08:57 , Processed in 0.058994 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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