青华模具培训学校

 找回密码
 注册

QQ登录

只需一步,快速开始

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

NET平台的AutoCAD二次开发

[复制链接]
发表于 2011-2-24 16:23 | 显示全部楼层 |阅读模式
当前AutoCAD的二次开发工具主要有:VisualLisp、VBA和ObjectARX等。其中,VisualLisp与VBA较为简单,特别是VBA,使用方便且开发速度较快,但其功能相比ObjectARX有所不足,尤其是对面向对象的功能支持不好。而ObjectARX基于VC平台,在C++的支持下,其功能非常强大,可以很好地运用各种面向对象技术,但其缺点是发开速度比较慢,同时对开发人员的能力要求较高。
1 c- K7 ~9 k! m    .NET是微软新推出的开发平台,具有众多优点。基于.NET平台对AutoCAD进行二次开发,可充分利用.NET的各种优势,在保证功能强大的前提下大大提高开发速度。
0 G+ ?5 X& d  |6 T% G, ?- Q一、基于.NET的开发
4 S, {, Z  W7 B2 q    1..NET API简介5 I. R' y9 n0 B- g, M: N+ c
    在新推出的AutoCAD 2006中,Autodesk为其开发增加了.NET API。.NET API提供了一系列托管的外包类(Managed Wrapper Class),使开发人员可在.NET框架下,使用任何支持.NET的语言,如VB.NET、C# 和Managed C++等对AutoCAD进行二次开发。其优点是完全面向对象,在拥有与C++相匹配的强大功能的同时,具有方便易用的特点,是较理想的AutoCAD二次开发工具。4 ?4 p4 L' M" q7 Z2 s
    2..NET API与传统ObjectARX的主要区别, k: {1 ~' z' Z
    .NET API与传统ObjectARX的区别主要源于在.NET环境下开发应用程序与在VC环境下开发应用程序的区别。首先,在VC环境下,程序员需要自己管理内存的申请和释放,而.NET采用了垃圾回收机制,由.NET框架自行判断内存回收的时机并实行回收,从而解决了令C++程序员头痛的内存泄漏问题。也正是由于这个特点,在.NET环境下不能象在C++环境下那样利用析构函数释放其他的资源,需要程序员在程序中显式地释放。在.NET API中,主要通过Dispose来函数进行资源的释放。1 f6 B/ {, u) P4 [9 `+ C3 ?, X
    其次,ObjectARX中的各种反应器(Reactor)在.NET API中由外包类映射为各种事件(Event),可通过定义这些事件的响应函数来响应AutoCAD的各种操作。同时对于错误信息的处理也从函数返回值改变为通常异常来处理,使其更好地兼容.NET。由于VB.NET、C#等语言都是完全面向对象的,没有全局函数的概念,所以.NET API将ObjectARX下的全局函数封装为.NET API下的某些对象或对象的属性,如ObjectARX下与用户交互的系列全局函数被封装为CommandLinePrompt类。
/ C, |7 q0 h) p3 o# `    3.使用.NET API+ f/ k" h1 U3 T: ~3 d. s
    下面以C#为例,在Microsoft Visual C# 2005 Express Edition Beta平台上,先新建一个Class Library项目,再将AutoCAD2005安装目录下的acdbmgb.dll与acmgb.dll作为引用添加进项目中。这两个文件包含了.NET API中所有的外包类。
8 D7 ]  i0 I. y. X4 W7 H    然后在要使用.NET API的类中添加以下语句以引用.NET API的命名空间。需要添加的语句如下:5 @7 v7 G5 X: K1 Z5 h
    using Autodesk.AutoCAD.ApplicationServices;
1 P* ~- q2 }0 }  e) M    using Autodesk.AutoCAD.DatabaseServices;
) Z# v0 H8 _7 l5 k    using Autodesk.AutoCAD.Runtime;
+ F3 Z: V3 S1 U, @1 ^! u    using Autodesk.AutoCAD.Geometry;
! w/ l6 x' [* i2 F' c    这样就可以利用.NET API进行开发了。以下代码可在AutoCAD注册为一个命令“AddLine”,该命令可在当前工作空间中添加一条起点为(0,0,0),终点(200,200,0)的直线。代码如下:9 q7 b. x& j/ G8 C
    [CommandMethod ("AddLine")]# m8 O4 \7 |, O' }8 C7 T
    public static void AddLineCmd(): G! q; ?- _9 F, ~! D- w& ~- t
    {# n, }! e+ u7 {5 V* x2 ~$ Z
    Database db = HostApplicationServices.WorkingDatabase;//获得当前工作空间的数据库
. g6 v4 I9 s- l" W& z- ]8 w    BlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead); //获得块表
6 h! _( d7 j3 S' _3 v    BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite); //获得模型空间的块表记录- f8 u% S4 k; u- x
    Line line = new Line(new Point3d(0, 0, 0), new Point3d(200, 200, 0));//创建一条直线
8 G% U9 H" M+ O  u! q    try {2 _7 b1 i6 l+ `7 F. H
    btr.AppendEntity(line);//将直线添加到模型空间中
% R4 ?* X* T3 I6 S- k9 z    line.Close();//关闭该直线1 H' L: v1 _+ W$ ]
    }  B% _+ f3 h. g" E& p
    finally {8 U1 X# a+ v- F3 `: o" [; [0 M1 N( @
    btr.Close();//关闭块表记录$ |% X- B1 K3 b) Q7 k; z/ T7 u
    bt.Close();//关闭块表5 V' R+ G' y. x9 u2 |; X
    }
. u; e$ l2 [9 W& v) E4 d    }
( U7 P4 o, L% |+ Y4 z+ X, d9 J$ d    由此可见,上述语句与在VC下的开发非常类似,其过程都是先得到数据库,然后依次打开块表、块表记录,接着添加实体,最后关闭块表、块表记录。值得注意的是finally语句,无论try块中的语句是否发生异常,finally块中的语句都会被执行,从而确保关闭块表和块表记录的操作会被执行。9 j5 h1 _/ r% V1 x  e( p
    写完代码后进行编译,编译完成将得到一个dll文件。在AutoCAD 2006中通过“netload”命令即可选择该dll文件进行加载,加载成功后即可以通过“AddLine”命令执行上述代码。遗憾的是目前的.NET API版本还不支持卸载,若要卸载只能关闭AutoCAD。
- C$ W1 n' C/ q0 Q# G" C    4..NET API的初始化与清除# g- h" o6 P' ^7 f
    在ObjectARX中,“acrxEntryPoint”函数是ARX程序的载入点,程序的初始化和清除均可在该函数中进行。而在.NET API中则首先需要将初始化代码封装在一个类中,同时该类需要压迫实现# n3 n  K& o0 V0 y8 W
    IExtensionApplication接口。该接口包含Initialize与Terminate两个函数。其中Initialize负责加载程序时的初始化操作,Terminate则负责进行卸载程序时的清除操作。代码如下:( O" K6 i1 T1 i$ ^1 S% W, |
namespace ARXExample {8 G, t/ S- |2 I9 [
public class MyARX : IExtensionApplication {1 T2 d6 C& M+ S  i
……3 r8 O$ k! R' }6 l# Y6 H
public void Initialize() {: o1 e3 d1 s) P. [5 ^7 u
//初始化操作1 V  V$ H( r5 y" M5 `
}
# j- d3 Z1 E5 b9 w+ \public void Terminate() {; e: X- b! b) r" x0 Q' P9 i
      //清除操作
! G  p  A9 T9 M3 b: `}  C$ S- l$ f6 U0 j: b
……3 I+ c: U3 V- F, N$ h: v

9 q2 L2 j* ^( o, z" v% O# Q: K}' }0 z7 _8 o' q/ ?* z8 t! X- v, G
同时,为加快加载速度,可在MyARX.cs的文件头加入以下语句:! c" @5 ?& P- ?$ X3 e( U
[assembly: ExtensionApplication (typeof (ARXExample.MyARX) ) ]
8 R5 n& J3 e/ P% s+ [) R0 |[assembly: CommandClass (typeof (ARXExample.MyARX) ) ]* ?: k! b# z/ `
    这样在加载程序时AutoCAD将直接通过MyARX中的Initialize语句进行初始化,同时注册MyARX中的命令。否则,AutoCAD将搜索dll中所有的类以找到实现IExtensionApplication接口的类进行初始化,如找不到则不进行初始化。同样,通过CommandClass属性,AutoCAD也会直接到MyARX类中搜索要注册的命令。当程序中包含的类数目较多时,通过ExtensionApplication和CommandClass这两个属性可显著地加快程序的加载速度。
) j$ ~. N8 U$ x/ v    5..NET API与COM交互操作
' u; r9 ?4 s: ]) w  j* G) o/ l    在目前的.NET API中,其功能与传统的ObjectARX相比有所不及,有相当的ObjectARX函数目前还没有封装到.NET API中,如GetPoint等。但可以通过COM方式使用ActiveX来弥补.NET API的不足。
; _' b& B. G2 T3 p- i" M& I4 Q" C增加了COM引用后,程序就可以使用许多VBA中的功能了。以AutoCAD ActiveX中的事件为例,以下代码可以为当前工作空间中所有的图元添加Modified事件:
1 P7 c6 b& N: z  x7 jDatabase db = HostApplicationServices.WorkingDatabase;
7 X  W4 w  j- j/ M& J* {) JBlockTable bt = (BlockTable)db.BlockTableId.Open(OpenMode.ForRead);2 N7 w2 a- j. s% H* g
BlockTableRecord btr = (BlockTableRecord)bt[BlockTableRecord.ModelSpace].Open(OpenMode.ForWrite);  S9 K7 f; ^+ E4 K$ y" P4 X
try {6 v" g8 b. M* M6 M( c$ l
AcadObject obj;
) i% s! t; U* W& p, |" ]8 W//遍历块表记录) X4 O/ q  A8 X% P* T* j! H6 _1 x
foreach (ObjectId objId in btr) {
; d4 M' U/ {- k- z    //由ObjectId得到ActiveX中的AcadObject对象
5 v: s7 E9 ]( d6 R: l        obj = (AcadObject)((AcadDatabase)db.AcadDatabase).ObjectIdToObject(objId.OldId);
0 @  |0 F* E5 z% Q, z& {    //为obj添加响应Modified事件- U) y6 q9 R  p) H
        obj.Modified += new IAcadObjectEvents_ModifiedEventHandler(obj_Modified);
- {, j; F0 o7 S) v% R# r$ s    }9 n$ S5 O9 ?' Z: J
}9 L+ W' J4 @8 _* }* u# [
finally {
. G7 X+ p$ c8 R6 ^2 t+ `: I    btr.Close();
; U$ X! J5 [& W$ y    bt.Close();
* e" c3 F, f- A5 A# d8 j}. y0 j4 ]2 r1 ?: u. U- D
其中事件响应函数obj_Modified的表示如下所示:
, O" l  c4 P, v4 w; I; hpublic static void obj_Modified(AcadObject obj) {- y" E; h, R' B0 C# d* _3 A. Z+ @
CommandLinePrompts.Message("object modified!" + obj.ObjectID + "\n");) o1 a' S5 Z/ I" K8 P( l; z7 O
}
" j6 Y5 U+ C4 m1 |; w1 ^二、结论6 x% u4 s: i* W( F5 y4 U0 I
    本文以C#为例,对基于.NET API的AutoCAD二次开发作了较详细的介绍。.NET API在具有ObjectARX强大功能的同时具有VBA使用方便易用的优点,同时具有C++的强大功能,是较为理想的开发工具。但目前.NET API在某些方面还有些不足,但随着其版本的更新、完善,定会成为众多开发人员的首选工具。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 05:03 , Processed in 0.050694 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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