2022年2022年开发CAD .pdf

上传人:C****o 文档编号:39702268 上传时间:2022-09-07 格式:PDF 页数:9 大小:81.45KB
返回 下载 相关 举报
2022年2022年开发CAD .pdf_第1页
第1页 / 共9页
2022年2022年开发CAD .pdf_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《2022年2022年开发CAD .pdf》由会员分享,可在线阅读,更多相关《2022年2022年开发CAD .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、利用 C#进行 AutoCAD 的二次开发(一)众所周知,对 AutoCAD 进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp。但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC+,而这门语言非常的难学;VBA 和 VLisp 虽然简单易上手,但它们对于开发大型的程序好象无能为力。那究竟有没有一种语言能结合它们的优点而尽量避免它们的缺点呢?回答是肯定的,那就是微软新推出的21 世纪编程语言C#。关于 C#的详细介绍,大家可以参考有关的文章。C#是通过AutoCAD ActiveX 这座桥梁来和AutoCAD之间进行通讯的。Au

2、toCAD ActiveX 使用户能够从AutoCAD 的内部或外部以编程方式来操作AutoCAD。它是通过将AutoCAD 对象显示到“外部世界”来做到这一点的。一旦这些对象被显示,许多不同的编程语言和环境就可以访问它们。关于AutoCAD ActiveX 的情况,大家可以参考AutoCAD自带的帮助。呵呵,说了这么多无聊的,还是让我们通过一个具体的例子来说明怎样利用C#进行AutoCAD 的二次开发吧。在介绍例子之前先讲一下有关的配置:(1)Visual S(2003 和 2002 都可以,我用的是2002)(2)AutoCAD2000 以上版本(我用的是2004)这个例子非常简单,就是通

3、过 C#建立的窗体来启动AutoCAD 并画一条直线。下面是编程的具体步骤:(1)通过 Visual S 建立一 C#的 windows 应用程序。(2)在“解决方案资源管理器”中右击“引用”标签,在弹出的菜单中选择“添加引用”,在“添加引用”对话框中选择“com 选项卡下的下拉列表框中的“AutoCAD 2004 Type Library 项(注意:不同版本的CAD 的数字不同),单击右边的“选择”按钮,最后单击下面的“确定”按钮。(3)在C#窗体中加入两个文本框和一个按钮,分别用于输入直线起点、终点的坐标和在CAD 中画直线。下面主要解释一下添加的代码。(a)在程序的开头加入:using

4、AutoCAD;/导入 AutoCAD 引用空间(b)在窗体的变量声明部分加入:private AcadApplication a;/声明 AutoCAD 对象(c)在窗体的构造函数部分加入:a=new AcadApplicationClass();/创建 AutoCAD 对象a.Visible=true;/使 AutoCAD 可见(d)在按钮的消息处理函数中加入:double startPoint=new double3;/声明直线起点坐标double endPoint=new double3;/声明直线终点坐标string str=textBox1.Text.Split(,);/取出直线起

5、点坐标输入文本框的值,文本框的输入模式为 x,y,zfor(int i=0;i3;i+)startPoint=Convert.ToDouble(str);/将str数组转为double型str=textBox2.Text.Split(,);/取出直线终点坐标输入文本框的值for(int i=0;i3;i+)endPoint=Convert.ToDouble(str);a.ActiveDocument.ModelSpace.AddLine(startPoint,endPoint);/在 AutoCAD 中画直线a.Application.Update();/更新显示好了,简单吧,你可以试着编译一

6、下。关于上面一些语句的用法,我会在下一讲中作详细介绍。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 9 页 -利用 C#进行 AutoCAD 的二次开发(二)大家好,今天我继续给各位介绍利用C#进行 AutoCAD 的二次开发。在这一讲中,主要介绍上一讲例子中存在的问题。在上一次的例子中我是通过引用AutoCAD 2004 Type Library来进行 C#与 AutoCAD 之间的通信,但这种方法存在两个致命的缺点。第一个缺点是每次调试程序的时候C#都要重新启动 AutoCAD,如果调试的次数非常多(比如跟踪错误然后调试),那么编程的效率就很低,因为启动一次CAD 还是需要

7、较长的时间。相对于第一个缺点,第二个缺点则更要命。由于.NET 本身的问题,Interop.AutoCAD.dll文件(就是通过它才实现了C#与 AutoCAD之间的通信)存在着一些bug,因此虽然有时你的代码是完全正确的,但C#编译器还是抛出莫名其妙的错误。那不是完蛋了吗?我曾经有一阶段就因为这两个要命的东东差一点放弃了C#而想改学ObjectArx 了,呵呵,不过还是运气好,我偶尔一次在网上看了一篇外国人写的文章,他专门介绍了这两个问题的解决办法。下面就来解决这两个问题。首先来看第二个难题,按以下步骤来进行:1.随便用 Visual Studio.NET 建立一个C#应用程序,然后按照上一

8、篇文章中的设置加入AutoCAD 2004 Type Library,然后不加入任何代码,编译你的程序。2.在 Visual Studio.NET 命令行工具下用ildasm.exe(这个工具可以在Visual Studio.NET安装光盘中找到)把 Interop.AutoCAD.dll文件(这个文件在步骤1 中生成的项目的BinRelease文件夹中)编译成中间语言Interop.AutoCAD.il。注意:在步骤1 中建立的项目的编译设置为 Release模式。ildasm.exe/source Interop.AutoCAD.dll/output=Interop.AutoCAD.il

9、又要注意了:把ildasm.exe,Interop.AutoCAD.dll放在同一目录下。3在记事本中打开Interop.AutoCAD.il文件,然后查找结尾是“SinkHelper”而开头为.class private auto ansi sealed _DAcad“的语句,把语句中的private 改为 public,然后保存Interop.AutoCAD.il文件。4 使用 ilasm.exe把 Interop.AutoCAD.il文件编译为 Interop.AutoCAD.dll文件,同样是在 Visual Studio.NET 命令行工具下进行。ilasm.exe /resourc

10、e=Interop.AutoCAD.res/dll Interop.AutoCAD.il/output=Interop.AutoCAD.dll Interop.AutoCAD.res文件是在步骤1 中生成的。5显然你不愿意每次编写应用程序时都通过上一篇文章中介绍的方法来加入Interop.AutoCAD.dll,那太麻烦了。你可以用下面的方法来让程序自动加入该文件:找到 C:Program FilesMicrosoft.NET Primary Interop Assemblies 文件夹,然后把上面生成的Interop.AutoCAD.dll文件拷贝进去。好了,第二个问题解决了,接下来看第一个

11、。在 VBA 中,编程者可以使用GetObject 函数来获得当前活动的AutoCAD对象,但在C#中却没有,为了这个函数我几乎把MSDN 给翻遍了,然后去各种C#论坛问各位高手,结果都没得到解决,呵呵,可能国内使用C#的人比较少吧。还是在老外的论坛上看到了一篇就是讲这个问题的文章才把这个难题给解决了。使用下面的语句就可以获得当前活动的AutoCAD 对象了:(AcadApplication)Marshal.GetActiveObject(AutoCAD.Application.16)(对于 CAD2000 和 CAD2002,则把 16 改为 15)当然以上语句必须在AutoCAD打开的情况

12、下才能使用,否则会发生错误,对于AutoCAD没打开的情况,可以使用上一篇文章的方法来处理。完整的连接AutoCAD 与 C#的源程序如名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 9 页 -下所示:using System;using AutoCAD;using System.Runtime.InteropServices;namespace AcadExample public class AutoCADConnector:IDisposable private AcadApplication _application;private bool _initialized;p

13、rivate bool _disposed;public AutoCADConnector()try /Upon creation,attempt to retrieve running instance _application=(AcadApplication)Marshal.GetActiveObject(AutoCAD.Application.16);catch try /Create an instance and set flag to indicate this _application=new AcadApplicationClass();_initialized=true;c

14、atch throw;/If the user doesnt call Dispose,the/garbage collector will upon destruction AutoCADConnector()Dispose(false);public AcadApplication Application get /Return our internal instance of AutoCAD 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 9 页 -return _application;/This is the user-callable version of Dispo

15、se./It calls our internal version and removes the/object from the garbage collectors queue.public void Dispose()Dispose(true);GC.SuppressFinalize(this);/This version of Dispose gets called by our/destructor.protected virtual void Dispose(bool disposing)/If we created our AutoCAD instance,call its/Qu

16、it method to avoid leaking memory.if(!this._disposed&_initialized)_application.Quit();_disposed=true;利用 Visual S 把上面的程序编译成一个类库,你就可以在以后的程序中使用它了,下面的这个例子说明了它的用法。(首先把AcadExample 类库包含在项目中)using System;using AcadExample;using AutoCAD;namespace ConsoleApplication6 class Class1 STAThread static void Main(st

17、ring args)using(AutoCADConnector connector=new AutoCADConnector()Console.WriteLine(connector.Application.ActiveDocument.Name);Console.ReadLine();名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 9 页 -这个例子是在C#窗口中显示AutoCAD 中当前文档的标题。利用 C#进行 AutoCAD 的二次开发(三)这一讲的主要内容是介绍AutoCAD 对象模型,如果你对VBA 开发 AutoCAD 了解的话,这部分内容应该是超简单的。对象 是

18、AutoCAD ActiveX 接口的主要构造块,每一个显示的对象均精确代表一个AutoCAD 组件。AutoCAD ActiveX 接口的主要对象有:?直线、圆弧、文字和标注等图形对象。?线型与标注样式等样式设置对象?图层、编组和块等组织结构对象?视图与视口等图形显示对象。?图形、AutoCAD 应用程序本身也是对象所有对象的根对象是AutoCAD 应用程序本身,它用AcadApplication类来表示。获得当前运行的 AcadApplication对象可以使用上一讲中介绍的方法来得到。AcadApplication对象下有四个子对象构成,分别是:AcadPreferences 对象,通过

19、此对象可以访问和设置“选项”对话框中的相关选项AcadDocuments 对象,它表示AutoCAD 图形AcadMenuBar对象,它表示AutoCAD主菜单栏(注意不是AcadMenuBars,因为应用程序只有一个主菜单栏)AcadMenuGroups 对象,它表示AutoCAD 菜单和工具栏上面介绍了AutoCAD ActiveX 接口对象模型的大致组成,下面重点介绍AcadDocuments 对象,因为大部分的编程都与它有关。首先大家看到它是复数的形式,因此它是当前打开的AutoCAD 所有图形的集合,这种对象称为集合对象(呵呵,好像在讲废话)。集合对象有一些比较重要的方法和特性。其中

20、最主要的是:Count 特性用于获取集合中的对象个数(从零开始);Item 方法用于获取集合中的任何对象。关于它们的用法我会在下面的例子中介绍。而 AcadDocuments 的单数形式AcadDocument表示当前打开的一个AutoCAD图形。AcadDocument 对象由以下几个主要对象组成:AcadModelSpace 集合和 AcadPaperSpace集合,提供对图形对象(直线、圆、等)的访问AcadLayers、AcadLinetypes 和 AcadTextStyles,则提供对非图形对象(图层、线型、文本样式等)的访问AcadPlot对象提供对“打印”对话框中设置的访问,并

21、为应用过程提供了打印图形的各种方法AcadUtility对象提供用户输入和转换函数图形对象的创建使用Add 方法,比如要创建一个圆,就是用AddCircle 方法,而非图形对象的创建使用Add 方法。下面通过一个简单的例子来说明上面介绍的内容。这个例子是在AutoCAD 中建立一个新的层,然后在该层中画一个红色的圆和一条绿色的直线。这是程序的源代码:(请先把上一讲中生成的 interop.AutoCAD.dll 和 AutoCADExample.dll文件包含在工程中)using System;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 9 页 -using AcadExam

22、ple;using AutoCAD;namespace CircleLine /Class1 的摘要说明。/class Class1 /应用程序的主入口点。/STAThread static void Main(string args)/TODO:在此处添加代码以启动应用程序/using(AutoCADConnector connector=new AutoCADConnector()/连接 AutoCAD AcadDocument aDocument=connector.Application.ActiveDocument;/取得当前AutoCAD 活动图形对象double center=n

23、ew Double320,20,0;/设置圆心double radius=20;/设置圆的半径double startPoint=new Double30,0,0;/设置直线的起点double endPoint=new Double340,40,0;/设置直线的终点AcadLayer newLayer=aDocument.Layers.Add(CircleLine);/创建一个名为CircleLine 的新层aDocument.ActiveLayer=newLayer;/把 CircleLine 层设置为当前层AcadCircle circle=aDocument.ModelSpace.Add

24、Circle(center,radius);/加入圆AcadLine line=aDocument.ModelSpace.AddLine(startPoint,endPoint);/加入直线circle.color=ACAD_COLOR.acRed;/把圆变为红色line.color=ACAD_COLOR.acGreen;/把直线变为绿色connector.Application.Update();/更新显示for(int i=0;iADOCUMENT.MODELSPACE.COUNT;I+)Console.WriteLine(这是第 0 个对象:1,i+1,aDocument.ModelSp

25、ace.Item(i);/遍历当前图形 Console.ReadLine();名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 9 页 -好了,今天就到这里。利用 C#进行 AutoCAD 的二次开发(四)使用通用对话框看了本站出的“AutoCAD VBA 开发精彩实例教程”以后,深有启发。但书中用到通用对话框时,总是调用windows api 函数,我一看就头大了。想到C#可以调用通用对话框,因此试验了一下,没想到在C#中可以非常容易地解决这个问题,下面就把我的做法给写出来。本文的例子是调用颜色对话框,对于其他通用对话框做法是一样的。但由于要使用到AutoCAD2004新增加的T

26、rueColor 属性,因此,本文所举的例子只能用于AutoCAD2004,对于其他通用对话框(如文件对话框),则可以使用其他版本的AutoCAD。要求:会用 C#编程读过我写的“利用 C#进行 AutoCAD 的二次开发“(在明经通道中有)开始:在 visual 中新建一 C#控制台程序,在引用选项卡中添加下列类库:interop.AutoCAD.dll AcadExample.dll using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Wind

27、ows.Forms;using System.Data;using AutoCAD;using AcadExample;namespace WindowsApplication3 /Form1 的摘要说明。/public class Form1:System.Windows.Forms.Form private System.Windows.Forms.Button button1;/必需的设计器变量。/private System.ComponentModel.Container components=null;public Form1()/Windows 窗体设计器支持所必需的 /名师资料

28、总结-精品资料欢迎下载-名师精心整理-第 7 页,共 9 页 -InitializeComponent();/TODO:在 InitializeComponent 调用后添加任何构造函数代码 /清理所有正在使用的资源。/protected override void Dispose(bool disposing)if(disposing)if(components!=null)components.Dispose();base.Dispose(disposing);#region Windows 窗体设计器生成的代码 /设计器支持所需的方法-不要使用代码编辑器修改 /此方法的内容。/priva

29、te void InitializeComponent()this.button1=new System.Windows.Forms.Button();this.SuspendLayout();/button1 /this.button1.Location=new System.Drawing.Point(96,112);this.button1.Name=button1;this.button1.Size=new System.Drawing.Size(64,32);this.button1.TabIndex=0;this.button1.Text=确定;this.button1.Click

30、+=new System.EventHandler(this.button1_Click);/Form1 /this.AutoScaleBaseSize=new System.Drawing.Size(6,14);this.ClientSize=new System.Drawing.Size(280,213);this.Controls.Add(this.button1);this.Name=Form1;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 9 页 -this.Text=Form1;this.ResumeLayout(false);#endregion /应用程序的主入

31、口点。/STAThread static void Main()Application.Run(new Form1();private void button1_Click(object sender,System.EventArgs e)AutoCADConnector connector=new AutoCADConnector();AcadDocument document=connector.Application.ActiveDocument;AcadAcCmColor color=(AcadAcCmColor)document.Application.GetInterfaceObj

32、ect(AutoCAD.AcCmColor.16);/新建一 AcadAcCmColor对象,该对象用来给直线的颜色属性赋值 AcadLine line=document.ModelSpace.AddLine(new double0,0,0,new double200,200,0);/加入直线 ColorDialog dlg=new ColorDialog();/生成一颜色对话框 if(dlg.ShowDialog()=DialogResult.OK)/显示颜色对话框,并按确定按钮后 color.SetRGB(dlg.Color.R,dlg.Color.G,dlg.Color.B);/设置颜色

33、为颜色对话框中选择的颜色 line.TrueColor=color;/设置直线的颜色 line.Update();/更新显示 给 AutoCAD 的对象设置颜色,注意不是使用Color 属性,而是使用 TrueColor 属性。TrueColor属性是一个AcadAcCmColor对象,它必须使用GetInterfaceObject方法而不能用new AcadAcCmColor()方法声明。给 AcadAcCmColor对象设置颜色时,由于要使用.net 颜色对话框中选择的值,因此可使用SetRGB 的方法,它的三个参数分别是RGB 颜色的红,绿,蓝的值。名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 9 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁