青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

NET平台的AutoCAD二次开发

[复制链接]
发表于 2011-2-24 16:23 | 显示全部楼层 |阅读模式
当前AutoCAD的二次开发工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp与VBA较为简单,特别是VBA,使用方便且开发速度较快,但其功能相比ObjectARX有所不足,尤其是对面向对象的功能支持不好。而ObjectARX基于VC平台,在C++的支持下,其功能非常强大,可以很好地运用各种面向对象技术,但其缺点是发开速度比较慢,同时对开发人员的能力要求较高。
' t  M3 s" a' {+ C, X    .NET是微软新推出的开发平台,具有众多优点。基于.NET平台对AutoCAD进行二次开发,可充分利用.NET的各种优势,在保证功能强大的前提下大大提高开发速度。
% [7 q6 Q) t5 f( ?一、基于.NET的开发
, X0 s$ R+ p  I$ l    1..NET API简介
$ m' C2 q8 D2 U( i; I9 X1 \    在新推出的AutoCAD 2006中,Autodesk为其开发增加了.NET API。.NET API提供了一系列托管的外包类(Managed Wrapper Class),使开发人员可在.NET框架下,使用任何支持.NET的语言,如VB.NET、C# 和Managed C++等对AutoCAD进行二次开发。其优点是完全面向对象,在拥有与C++相匹配的强大功能的同时,具有方便易用的特点,是较理想的AutoCAD二次开发工具。0 p& C2 \" l0 c) e2 h# Y
    2..NET API与传统ObjectARX的主要区别
2 p8 K9 l! @' ^# |) X" f0 Z  i    .NET API与传统ObjectARX的区别主要源于在.NET环境下开发应用程序与在VC环境下开发应用程序的区别。首先,在VC环境下,程序员需要自己管理内存的申请和释放,而.NET采用了垃圾回收机制,由.NET框架自行判断内存回收的时机并实行回收,从而解决了令C++程序员头痛的内存泄漏问题。也正是由于这个特点,在.NET环境下不能象在C++环境下那样利用析构函数释放其他的资源,需要程序员在程序中显式地释放。在.NET API中,主要通过Dispose来函数进行资源的释放。
3 V; j8 F  J( i/ e  Q/ h- }    其次,ObjectARX中的各种反应器(Reactor)在.NET API中由外包类映射为各种事件(Event),可通过定义这些事件的响应函数来响应AutoCAD的各种操作。同时对于错误信息的处理也从函数返回值改变为通常异常来处理,使其更好地兼容.NET。由于VB.NET、C#等语言都是完全面向对象的,没有全局函数的概念,所以.NET API将ObjectARX下的全局函数封装为.NET API下的某些对象或对象的属性,如ObjectARX下与用户交互的系列全局函数被封装为CommandLinePrompt类。
" M- N, w; U! H5 g, w    3.使用.NET API
* {9 [& ~* z2 _& t! l" ~    下面以C#为例,在Microsoft Visual C# 2005 Express Edition Beta平台上,先新建一个Class Library项目,再将AutoCAD2005安装目录下的acdbmgb.dll与acmgb.dll作为引用添加进项目中。这两个文件包含了.NET API中所有的外包类。% h9 _- e+ ^+ u& r. l
    然后在要使用.NET API的类中添加以下语句以引用.NET API的命名空间。需要添加的语句如下:
) k' t+ @6 H4 E, q  V" b+ I    using Autodesk.AutoCAD.ApplicationServices;$ z$ p! j4 x8 |( w; w: c# P" \1 z- d
    using Autodesk.AutoCAD.DatabaseServices;  }& }7 b4 z5 k6 H3 g+ Q) f2 ~1 ?
    using Autodesk.AutoCAD.Runtime;
1 s5 C6 N% x% c" x4 n    using Autodesk.AutoCAD.Geometry;$ Z! C1 c3 i6 D; P3 ^6 n
    这样就可以利用.NET API进行开发了。以下代码可在AutoCAD注册为一个命令“AddLine”,该命令可在当前工作空间中添加一条起点为(0,0,0),终点(200,200,0)的直线。代码如下:
" _2 G& P+ ?0 u% V& U    [CommandMethod ("AddLine")]
# h9 h1 ~0 D1 X8 q$ C0 q  D; `3 `$ f    public static void AddLineCmd(), I7 g( h% U. w* q$ _
    {
* {9 g2 e3 |* q5 n/ }( [    Database db = HostApplicationServices.WorkingDatabase;//获得当前工作空间的数据库
! Z( o( ?, G) A6 j/ k" {    BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead); //获得块表' N  \$ f: |! R: ]+ r& c# F, `, s: b5 q
    BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite); //获得模型空间的块表记录
; u" g5 ~% z. _  N' T+ Z: H" J) ^' d% }    Line line = new Line(new Point3d(0, 0, 0), new Point3d(200, 200, 0));//创建一条直线- W% d8 U+ H% C( l0 W
    try {
: |5 q9 S6 N" C" u# d* m    btr.AppendEntity(line);//将直线添加到模型空间中
  U2 X- @- F+ R4 f1 _    line.Close();//关闭该直线% ?; S7 T, ^4 ?3 N# D
    }7 M0 @7 p  G4 k8 |
    finally {+ a* x0 l! O7 Q" `) E( g6 Z8 x
    btr.Close();//关闭块表记录
2 P: Y/ p% n4 F! B0 l7 c6 j    bt.Close();//关闭块表: |8 m; }7 ]. R, O: n2 P
    }4 @* N4 Z# K) d" e( o, ]: _
    }
* v) l$ K, I; L# S& W    由此可见,上述语句与在VC下的开发非常类似,其过程都是先得到数据库,然后依次打开块表、块表记录,接着添加实体,最后关闭块表、块表记录。值得注意的是finally语句,无论try块中的语句是否发生异常,finally块中的语句都会被执行,从而确保关闭块表和块表记录的操作会被执行。9 G& o! w, t: f7 i8 y5 M
    写完代码后进行编译,编译完成将得到一个dll文件。在AutoCAD 2006中通过“netload”命令即可选择该dll文件进行加载,加载成功后即可以通过“AddLine”命令执行上述代码。遗憾的是目前的.NET API版本还不支持卸载,若要卸载只能关闭AutoCAD。* u2 i) ]1 A5 E
    4..NET API的初始化与清除
4 Q2 U6 X3 r5 s4 Q& g+ q    在ObjectARX中,“acrxEntryPoint”函数是ARX程序的载入点,程序的初始化和清除均可在该函数中进行。而在.NET API中则首先需要将初始化代码封装在一个类中,同时该类需要压迫实现# p3 y" ~3 ^5 n* o1 p, o
    IExtensionApplication接口。该接口包含Initialize与Terminate两个函数。其中Initialize负责加载程序时的初始化操作,Terminate则负责进行卸载程序时的清除操作。代码如下:
- a: p6 X; D) g- L( h; e9 hnamespace ARXExample {' H! d1 v/ G7 x) I& Q$ M( u
public class MyARX : IExtensionApplication {
9 ~8 ?7 c* [5 B. V……$ I! g6 H  X' }/ H  T. ~
public void Initialize() {6 }4 C) l1 @* [# t! o' g) T  W& c- c
//初始化操作
; u4 s4 \/ `/ Z" @5 j}- F0 v( q& ?& [* X" `; g8 G( W
public void Terminate() {; e/ ~4 l: c' @% R$ P3 D6 i; {, m
      //清除操作' v* {* e, ?- M4 u; H  s
}
$ g2 ?/ C. U5 V  i8 _% B……
; c. @2 X/ A9 D' z$ T! V6 J$ x! M; k  S
}5 w3 q) f7 ?+ c3 m" _
同时,为加快加载速度,可在MyARX.cs的文件头加入以下语句:
8 t0 @4 W) P2 C# j[assembly: ExtensionApplication (typeof (ARXExample.MyARX) ) ]8 B8 |; K0 e4 M8 H7 a) a9 @
[assembly: CommandClass (typeof (ARXExample.MyARX) ) ]3 `9 O' T4 V2 P0 k) H
    这样在加载程序时AutoCAD将直接通过MyARX中的Initialize语句进行初始化,同时注册MyARX中的命令。否则,AutoCAD将搜索dll中所有的类以找到实现IExtensionApplication接口的类进行初始化,如找不到则不进行初始化。同样,通过CommandClass属性,AutoCAD也会直接到MyARX类中搜索要注册的命令。当程序中包含的类数目较多时,通过ExtensionApplication和CommandClass这两个属性可显著地加快程序的加载速度。2 B4 i6 o4 w; A
    5..NET API与COM交互操作) r/ a$ J8 ]9 H' b8 n4 v
    在目前的.NET API中,其功能与传统的ObjectARX相比有所不及,有相当的ObjectARX函数目前还没有封装到.NET API中,如GetPoint等。但可以通过COM方式使用ActiveX来弥补.NET API的不足。
* w# Z; Z3 Y8 ~. o+ `增加了COM引用后,程序就可以使用许多VBA中的功能了。以AutoCAD ActiveX中的事件为例,以下代码可以为当前工作空间中所有的图元添加Modified事件:
' t: ^" S/ |4 k, cDatabase db = HostApplicationServices.WorkingDatabase;
4 ?3 B  P: ~. y5 VBlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead);
& p6 l$ A, H; wBlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite);
6 w) |2 P1 T, O6 z4 G4 u+ F. ttry {
" @$ R: u4 s  p3 U* yAcadObject obj;  E+ E/ e- d1 p. Z% t% \' f$ m
//遍历块表记录
1 X; P; Y# j, n# E/ {4 qforeach (ObjectId objId in btr) {
) F2 Y, M* P' u  I" H    //由ObjectId得到ActiveX中的AcadObject对象) {8 ^9 E0 G/ }* M) Y! l8 u
        obj = (AcadObject)((AcadDatabase)db.AcadDatabase).ObjectIdToObject(objId.OldId);
5 p4 e& x" u8 w# f4 ?    //为obj添加响应Modified事件& J( {4 N- J8 r4 F
        obj.Modified += new IAcadObjectEvents_ModifiedEventHandler(obj_Modified);
9 T6 v# V' E# \6 `9 G' q" ^1 o" c    }
0 R  Z- z0 H% p7 w- W5 i}0 G* T3 V+ _& Q0 J& W
finally {! D. C  j# C1 l- J! W- M. J
    btr.Close();1 A2 `8 Q2 }! l+ S: ~! G1 H1 V! x
    bt.Close();
4 J6 o) S; c% X}, E. g- @' i9 R0 S+ }2 Z9 z. E; m
其中事件响应函数obj_Modified的表示如下所示:
, @# d& x3 \( Upublic static void obj_Modified(AcadObject obj) {
/ k. e$ j# U1 u: ]& Z3 uCommandLinePrompts.Message("object modified!" + obj.ObjectID + "\n");
: F; }; \9 ~& e# R$ j* ?}. I( E2 j( O: z! T7 v! l3 u
二、结论' _! P# D/ r/ O- x
    本文以C#为例,对基于.NET API的AutoCAD二次开发作了较详细的介绍。.NET API在具有ObjectARX强大功能的同时具有VBA使用方便易用的优点,同时具有C++的强大功能,是较为理想的开发工具。但目前.NET API在某些方面还有些不足,但随着其版本的更新、完善,定会成为众多开发人员的首选工具。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-16 12:25 , Processed in 0.072867 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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