青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

NET平台的AutoCAD二次开发

[复制链接]
发表于 2011-2-24 16:23 | 显示全部楼层 |阅读模式
当前AutoCAD的二次开发工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp与VBA较为简单,特别是VBA,使用方便且开发速度较快,但其功能相比ObjectARX有所不足,尤其是对面向对象的功能支持不好。而ObjectARX基于VC平台,在C++的支持下,其功能非常强大,可以很好地运用各种面向对象技术,但其缺点是发开速度比较慢,同时对开发人员的能力要求较高。
3 q) b; i. ?) p% j9 F& z( `    .NET是微软新推出的开发平台,具有众多优点。基于.NET平台对AutoCAD进行二次开发,可充分利用.NET的各种优势,在保证功能强大的前提下大大提高开发速度。
4 n) q, V% k, [! G: v7 |) M8 v一、基于.NET的开发
5 w  ^3 D3 J! k    1..NET API简介
4 S  y* j9 Y) g3 v  w6 q# ^$ ~! N& i" z    在新推出的AutoCAD 2006中,Autodesk为其开发增加了.NET API。.NET API提供了一系列托管的外包类(Managed Wrapper Class),使开发人员可在.NET框架下,使用任何支持.NET的语言,如VB.NET、C# 和Managed C++等对AutoCAD进行二次开发。其优点是完全面向对象,在拥有与C++相匹配的强大功能的同时,具有方便易用的特点,是较理想的AutoCAD二次开发工具。  |5 ]3 e: i0 ?1 B
    2..NET API与传统ObjectARX的主要区别
9 q4 g4 R7 H2 n6 e0 C    .NET API与传统ObjectARX的区别主要源于在.NET环境下开发应用程序与在VC环境下开发应用程序的区别。首先,在VC环境下,程序员需要自己管理内存的申请和释放,而.NET采用了垃圾回收机制,由.NET框架自行判断内存回收的时机并实行回收,从而解决了令C++程序员头痛的内存泄漏问题。也正是由于这个特点,在.NET环境下不能象在C++环境下那样利用析构函数释放其他的资源,需要程序员在程序中显式地释放。在.NET API中,主要通过Dispose来函数进行资源的释放。
, n% P+ D: g: Z) v' {1 G    其次,ObjectARX中的各种反应器(Reactor)在.NET API中由外包类映射为各种事件(Event),可通过定义这些事件的响应函数来响应AutoCAD的各种操作。同时对于错误信息的处理也从函数返回值改变为通常异常来处理,使其更好地兼容.NET。由于VB.NET、C#等语言都是完全面向对象的,没有全局函数的概念,所以.NET API将ObjectARX下的全局函数封装为.NET API下的某些对象或对象的属性,如ObjectARX下与用户交互的系列全局函数被封装为CommandLinePrompt类。
; u* W5 \* M! \2 a* d) ?% P    3.使用.NET API
4 ~" ?. n6 O4 Y* ]4 C4 [    下面以C#为例,在Microsoft Visual C# 2005 Express Edition Beta平台上,先新建一个Class Library项目,再将AutoCAD2005安装目录下的acdbmgb.dll与acmgb.dll作为引用添加进项目中。这两个文件包含了.NET API中所有的外包类。
* W  M9 s; m8 ^: D0 C: M- l    然后在要使用.NET API的类中添加以下语句以引用.NET API的命名空间。需要添加的语句如下:4 W8 T1 P5 w$ I3 c
    using Autodesk.AutoCAD.ApplicationServices;
+ `  G, \) j3 E6 x/ V3 Z3 b    using Autodesk.AutoCAD.DatabaseServices;
' F7 C! }. F, {6 D  i    using Autodesk.AutoCAD.Runtime;
9 ?  F- ]$ v! \. {5 J: F$ W    using Autodesk.AutoCAD.Geometry;
3 j: C3 [3 A/ g: {5 [& M* K, g    这样就可以利用.NET API进行开发了。以下代码可在AutoCAD注册为一个命令“AddLine”,该命令可在当前工作空间中添加一条起点为(0,0,0),终点(200,200,0)的直线。代码如下:
# j1 P  M$ u6 P% ^  D    [CommandMethod ("AddLine")]( h# f3 l5 b& E+ L1 T5 l' N, ]- `
    public static void AddLineCmd()5 m% R! P. A3 c$ k4 d& @7 T$ s
    {6 x  W  o: @1 g" h1 L
    Database db = HostApplicationServices.WorkingDatabase;//获得当前工作空间的数据库* c1 ?( m5 k/ M' A# [7 J
    BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead); //获得块表
5 ^; o: ]) H' a) ]9 `4 I    BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite); //获得模型空间的块表记录
0 s& J0 ^. \7 C; T    Line line = new Line(new Point3d(0, 0, 0), new Point3d(200, 200, 0));//创建一条直线; t0 C3 A! s5 o: [% q! V
    try {( i% I- Y6 o7 I0 |* n* p
    btr.AppendEntity(line);//将直线添加到模型空间中
8 w1 S4 a' U; p- n) J) ?6 y    line.Close();//关闭该直线
  _5 K: a" U$ O) |7 z7 B0 ?2 ~    }
& f; U, ^$ K4 [    finally {, l$ ~) N4 L! A6 U9 s
    btr.Close();//关闭块表记录
/ [8 f% s( E( l    bt.Close();//关闭块表
8 t! J5 A3 V8 m3 f; S1 X3 t) x    }
, G' r4 k$ ?2 K3 t    }
  Y! R: z5 X! c$ w! {" U6 ~    由此可见,上述语句与在VC下的开发非常类似,其过程都是先得到数据库,然后依次打开块表、块表记录,接着添加实体,最后关闭块表、块表记录。值得注意的是finally语句,无论try块中的语句是否发生异常,finally块中的语句都会被执行,从而确保关闭块表和块表记录的操作会被执行。/ n: j  t0 ^: _0 o; G
    写完代码后进行编译,编译完成将得到一个dll文件。在AutoCAD 2006中通过“netload”命令即可选择该dll文件进行加载,加载成功后即可以通过“AddLine”命令执行上述代码。遗憾的是目前的.NET API版本还不支持卸载,若要卸载只能关闭AutoCAD。0 {* w- O* ^" k
    4..NET API的初始化与清除: X  c" b0 @' [. j2 d' Q; ?
    在ObjectARX中,“acrxEntryPoint”函数是ARX程序的载入点,程序的初始化和清除均可在该函数中进行。而在.NET API中则首先需要将初始化代码封装在一个类中,同时该类需要压迫实现- r9 o  |3 e  r& G
    IExtensionApplication接口。该接口包含Initialize与Terminate两个函数。其中Initialize负责加载程序时的初始化操作,Terminate则负责进行卸载程序时的清除操作。代码如下:
6 @8 W: D, g! Z; W% v( Qnamespace ARXExample {) M' F% R4 r, f3 i! ^
public class MyARX : IExtensionApplication {
# T5 \8 m% K0 s) n6 F/ E( {# J……  g0 C* T7 ~1 E* j
public void Initialize() {
8 ?# D" @3 r2 u//初始化操作7 Q0 m' C7 U7 n* u3 i- y
}
. H3 `( _0 D; {. G$ V- `public void Terminate() {
4 R$ a. N0 z" V  k      //清除操作
* ]9 j4 m# `1 F  m* H, H7 W8 M$ \) B}
7 `: [- v+ ^+ B$ A……# y# o0 u# w  A

! U3 _- \; {4 R}; }+ L) Q9 p  I& Y" P
同时,为加快加载速度,可在MyARX.cs的文件头加入以下语句:2 V6 Y' K/ K& }1 g. l2 b7 M7 x
[assembly: ExtensionApplication (typeof (ARXExample.MyARX) ) ]5 g7 E* U, Q  ]" l6 J0 ~1 `7 Z
[assembly: CommandClass (typeof (ARXExample.MyARX) ) ]
2 C, |+ Z' s3 D, q; b) B    这样在加载程序时AutoCAD将直接通过MyARX中的Initialize语句进行初始化,同时注册MyARX中的命令。否则,AutoCAD将搜索dll中所有的类以找到实现IExtensionApplication接口的类进行初始化,如找不到则不进行初始化。同样,通过CommandClass属性,AutoCAD也会直接到MyARX类中搜索要注册的命令。当程序中包含的类数目较多时,通过ExtensionApplication和CommandClass这两个属性可显著地加快程序的加载速度。  q" H0 O3 o" V# Q# q
    5..NET API与COM交互操作
, B+ s* G2 O6 ^) q; ?, \. }  W    在目前的.NET API中,其功能与传统的ObjectARX相比有所不及,有相当的ObjectARX函数目前还没有封装到.NET API中,如GetPoint等。但可以通过COM方式使用ActiveX来弥补.NET API的不足。
& r5 e  E+ u0 ?; y( J2 M0 A增加了COM引用后,程序就可以使用许多VBA中的功能了。以AutoCAD ActiveX中的事件为例,以下代码可以为当前工作空间中所有的图元添加Modified事件:) g- D5 L- F& d) {9 a0 A; D
Database db = HostApplicationServices.WorkingDatabase;
( n% J! \- A3 z7 ~4 |( MBlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead);
" \7 G# @7 p5 P  K+ `BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite);
, @8 E! k* r1 {3 }( F% otry {
( B) t8 l4 U5 A4 WAcadObject obj;
% A# u: J. o$ b$ f2 B( {8 K//遍历块表记录; d; O/ M3 K% x; F' L9 h5 {( w, `; p
foreach (ObjectId objId in btr) {/ X/ m9 W; y" t5 h. f! ]! m
    //由ObjectId得到ActiveX中的AcadObject对象2 s3 u. I# ?1 a4 h
        obj = (AcadObject)((AcadDatabase)db.AcadDatabase).ObjectIdToObject(objId.OldId);
6 d# H( N2 x, J    //为obj添加响应Modified事件( t; U1 ?' q1 p8 T
        obj.Modified += new IAcadObjectEvents_ModifiedEventHandler(obj_Modified);
5 B4 j1 c2 k% M    }0 k& p- S( P& m( U6 s+ @3 u
}
& ]3 k# a2 M" R( R# L1 vfinally {
8 C8 W1 Q: t; u  }3 _3 {    btr.Close();6 w2 V) q' U" c8 f! @# X
    bt.Close();1 p. A* \. P7 Q* H: |
}
8 @3 E2 i9 J9 s- H4 j. W其中事件响应函数obj_Modified的表示如下所示:
5 m4 `2 m! c: Z, x- @public static void obj_Modified(AcadObject obj) {
& _" p  B" M" n0 w$ J5 \CommandLinePrompts.Message("object modified!" + obj.ObjectID + "\n");% M% l" C- ~7 y8 k* R; \- V
}
6 l9 H4 i. J# {1 o$ G, z二、结论
# `( R& V/ p- Z" Z0 n    本文以C#为例,对基于.NET API的AutoCAD二次开发作了较详细的介绍。.NET API在具有ObjectARX强大功能的同时具有VBA使用方便易用的优点,同时具有C++的强大功能,是较为理想的开发工具。但目前.NET API在某些方面还有些不足,但随着其版本的更新、完善,定会成为众多开发人员的首选工具。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-11 21:32 , Processed in 0.050500 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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