李志超,余杉钰,章 波,张彩云
LI Zhi-chao,YU Shan-yu,ZHANG Bo,ZHANG Cai-yun
(哈尔滨理工大学 自动化学院,哈尔滨 150080)
AutoCAD作为一款成功的计算机辅助软件在工程绘图中具有广泛的应用,它可以帮助设计人员进行绘图设计。CAD已经成为现代工程设计最常用的工具,在机械、建筑、电子等领域得到了广泛的应用。但由于CAD软件的通用性,可能造成在某些专业领域内的功能不足或缺失[1]。因此,有必要对CAD进行二次开发,设计出符合特定领域的专业模块。这样可以扩展CAD的应用范围,同样可以提高设计人员的工作效率还可以减少设计时出现的错误,具有很强的实用价值。
以实际工程中法兰的绘制为例,不同法兰的直径,材质,螺孔数,厚度等参数均不同。因此,如果对每一个法兰盘都进行绘制将浪费工程师大量的时间,而且不便于管理。利用CAD二次开发技术,不但可以快速准确的绘制所要求的法兰盘,而且通过数据库技术可以将CAD与企业的ERP管理系统链接起来,更方便企业的综合管理,提高企业的管理效率,节约成本。
目前AutoCAD二次开发的工具比较多,如Visual Lisp、VBA和ObjectARX等。它们各存在着不同的优缺点,Visual Lisp采用Lisp语言开发,简单但不直观。VBA采用Visual Basic语言开发,开发简单方便但功能不足。而ObjectARX是基于Visual C++开发语言的,功能强但难以掌握[2]。
AutoCAD .NET API使用户可通过编程的方法利用程序集和开放库操作AutoCAD和图形文件。通过开放的对象,它们可被许多不同的编程语言和环境访问。在AutoCAD中实现.NET API具有以下优点:
1)有更多的编程环境可以访问AutoCAD图形。而之前的开发工具仅限于使用相应的语言。如VBA只能使用Visual Basic语言。
2)NET 框架可以为32位及64位操作系统进行设计,而VBA只能为32位操作系统设计。
3)与那些传统编程语言相比,如C++,.NET具有更低的学习要求来访问高级接口。
4)C#相比VC++采用了垃圾回收机制,自行判断内存回收的时机并实行回收,通过Dispose函数进行资源自动释放,从而解决了内存泄漏问题。同时VC# NET的二次编译技术也使得其开发的程序编译成功之后可以实现编译后的程序与硬件无关,从而使得程序员只是专注于程序本身,因而成为了程序员开发工具的首选。因此,在.NET框架下利用C#语言对AutoCAD进行二次开发,具有完全面向对象、方便易用的特点,是最合适的AutoCAD二次开发工具[3]。
在AutoCAD二次开发中,一般有两种实现方式。一种是通过外部应用程序启动AutoCAD,并在CAD中作图;另一种是在CAD中加载插件,利用插件来弹出我们所需的面板,在面板上输入参数,并可在CAD中画出图形。这两种方法的实现方法和原理大致相同,只是实现的方式有所不同,在这里我们以更具普遍性和代表性的插件开发为例来进行说明[4]。
在AutoCAD二次开发中,为了使用.NET API托管封装的类,我们需要先引入上述的这些DLL文件。先启动Visual studio 2008,新建一个类库项目,然后将鼠标放在项目名称上,鼠标右键单击“引用”,然后选择“添加引用”。在“添加引用”对话框中选择“浏览”,然后找到上述的AcDbMgd.dll、AcMgd.dll、AcCui.dll文件,点击确定将这些组建添加到项目中。此时,我们已经将C#与.NET API连接起来了,接下来我们就可以专心进行CAD的开发了[5]。
首先我们在AutoCAD的菜单项中,添加我们的插件菜单,这里将该菜单项命名为“法兰”,其含有下拉子菜单。在项目添加一个类文件,添加如下代码:
[CommandMethod(“AddMenu”)]
Public void AddMenu()
{AcadApplication acadApp=Application.AcadApplication;
AcadPopupMenuItem pm=acadApp.MenuGroups.Item(0).Menus.Add(“法兰”);
AcadPopupMenuItem pmi1,pmi2,pmi3,pmi4,pmi5;
pm1=pm.AddMenuItem(pm.count+1,“板式平焊法兰”,“Thickness”+convert.Tochar(13));//子菜单}
通过以上代码我们可以实现在C A D中添加插件菜单和去其子菜单,[CommandMethod(“AddMenu”)],可以在CAD中添加命令,如在命令行中输入,AddMenu相当于单击“堵板”菜单。根据我们的要求可以任意添加菜单和子菜单,最终可生成如下图所示的形式。
图1 插件菜单图
添加好所要求的插件菜单和其子菜单后,就可以对各个子菜单添加命令以实现各自不同的功能。现在假设当点击子菜单后弹出的是面板形式,那么我们首先需要在项目中添加一个Windows Form窗体,并将该窗体的命令与子菜单的命令相对应,则可实现单击子菜单弹出相应的窗体。
而面板的设计则相对的比较容易,我们可以根据Visual studio 2008集成环境中提供的各种控件如文本框、标签、按钮等,设计自己想要的面板。我们以法兰为例设计一种面板,如图2所示。
图2 法兰盘面板图
该面板比较简洁,左上方为DataGridView控件,主要与数据库中的数据进行交互绑定,通过查询等一些命令来显示数据库中的相关信息。左下方为TextBox控件,主要用来输入数据下达命令。右上方为PictureBox控件,主要用来显示预览图片,右下方为按钮控件。这些按钮控件具体实现什么功能,主要取决于内部包含相应的代码。双击控件我们就可以进入该控件的编程界面,根据所实现的功能编写相应的程序。
对AutoCAD进行二次开发,主要是用来绘图的,下面我们就来介绍一下通过面板怎样实现在CAD中作图。由上述内容我们知道,直线、园、注释、图层等均为AutoCAD的对象,因此我们可以利用这些类来绘制图形,下面以法兰为例进行说明。设置好面板上的相关数据后,单击作图按钮,则相应图形将显示在CAD的绘图界面中。法兰图形如图3所示。
在工程应用中,设计人员可能经常需要将设计好的图形保存下来,如果图形太多则不方便管理,查找起来也比较困难,也不利于公司内部进行资源交流。因此,在进行二次开发的时候将AutoCAD与数据库联系起来是很有必要的。同时,数据库也是CAD与企业的ERP管理系统链接起来的纽带,这样方便企业的整体管理,可以提高管理效率。
图3 法兰图
数据库主要分为本地数据库和远程数据库两种。本地数据库安装在所使用电脑上,一般比较小,用于个人电脑上的信息存储;远程数据库一般在公司的服务器上,一般来说比较大,远程数据库与本地数据库通过局域网或因特网进行连接,实现本地与服务器之间的传递与下载。本文中我们以MySQL为本地数据库,以SQL Server为远程数据库。由于它们之间操作方法类似,我们主要以MySQL数据库为例进行说明。
要想实现AutoCAD与MySQL的连接,必须在工程项目中引入MySQL的一个组件,即mySql.data.dll[6]。
先在数据库中建一个表,该表有四列型号、直径、螺孔数、厚度。在查询中,我们可以根据已知的某些信息查找出所有符合条件的零件。实现代码如下:
从上述代码可以看出,其过程是先与数据库取得连接,然后通过查询语句返回我们所需要的信息。图2左上角中显示了库存中厚度为80mm的法兰信息。
当设计好需要的插件时,便可以对程序进行编译,最终生成一个dll文件,可以在CAD中输入Netload命令进行加载,但显然这种方法太繁琐,我们更希望每次在CAD启动时能自动加载。此时可在CAD安装文件support中的acad2007.lsp的末尾处添加命令(COMMAND "NetLoad" "D:/Program Files/AutoCAD 2007/Support/MyMenu.dll")即可[5]。
本文主要介绍C#与.NET API技术相结合的一种AutoCAD二次开发方法,并对其原理及实现各种功能的流程进行了简要的阐明。从文中的介绍中,我们可以看到利用该方法可轻松实现AutoCAD的二次开发,并且比较容易掌握,只需具备一定的C#基础和CAD的一些基本常识便可以进行CAD的二次开发,具有很好的实用价值。
[1] 方毅.基于C#与AutoCAD的断面图绘制程序设计与应用[J].地理空间信息.2012,10.10(5).
[2] 余甚洋,谢元礼.AutoCAD平台下坐标文件图形化模块C#实现[J].西北大学学报.2008,9.6(5).
[3] 蒋元星.基于C#的AutoCAD二次开发技术研究及应用[J].中国制造业信息化.2007,9.36(17).
[4] 尧燕.基于VC#.NET对AutCAD二次开发方法的研究[J].科学技术与工程.2008,12.8(23).
[5] 曾洪飞. AutoCAD VBA&VB.NET开发基础与实例教程[M].中国电力出版社.2009.
[6] Matthew Stucky著,金旭军译. MySQL:创建用户接口[M].北京:人民邮电出版社.2002.