工作上要用到CAD画图,但是机械性的操作太多,感觉效率很低,既然是伪程序猿何不用代码提高下设计效率呢,我就有了CAD二次开发的想法,参考了网上很多大佬的教程,这里把我自己总结的方法记录下来,使用的均为目前最新版本的软件,踩了一些坑,希望和大家分享一下。
1.环境搭建
CAD版本一般要比VS版本晚两年以上,比如我现在使用VS2017,则CAD要用2019版,至于CAD2018能不能用没试验过,有兴趣的小伙伴可以试试。
搭建环境很简单,只需两步:
1.安装ObjectARX类库
双击Autodesk_ObjectARX_2019_Win_64_and_32_Bit.sfx选个非中文路径解压,记住路径备用。
2.安装dotnet_wizards
双击安装autoCADnetwizards2019,向导可以帮我们配置好环境,当然也可以自己配置,但是还是直接用人家提供的向导方便。这里我安装的时候碰到一个坑,打开wizard后提示需要framework4.7,而我明明安装了framework4.7.2,折腾了半天最后把4.7.2卸了装回4.7才把wizard装上,好吧,人家只认framework4.7,高了不行。
以上两项都能在Autodesk网站下载:ObjectARX_2019、autoCADnetwizards。
我也放在网盘了:网盘 密码:y2fz。
2.Hello World
完成上述步骤打开VS2017,新建项目,可以发现C#下面出现了Autodesk选项,framework固定为4.7,点击确定。
接下来选择:ObjectARX SDK(上面第一步的路径) 和 CAD 软件安装目录。
点击Ok后创建完成。
此时在解决方案栏里有了两个cs:myCommand.cs和myPlugin.cs,选择myCommand.cs找到如下代码:
[CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)]
public void MyCommand() // This method can have any name
{
// Put your command code here
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed;
if (doc != null)
{
ed = doc.Editor;
ed.WriteMessage("Hello, this is your first command.");
}
}
这是其自动生成的示例,在CAD里输入"MyCommand"命令可以输出"Hello, this is your first command."的信息,我们可以改成熟悉的"Hello World"。
ed.WriteMessage("Hello World");
F5启动,系统会自动打开CAD,在CAD中输入命令"netload",打开“选择.NET程序集”框,找到我们刚生成的dll。
注:启动前选Debug的话,生成的dll在:工程文件夹\bin\Debug里,比如我的在:
F:\IGNB \AutoCAD CSharp plug-in2\bin\Debug里。
选择后会询问安全性,选加载。
这样我们的dll就加载进来了,命令栏输入mycommand,回车会显示“Hello World”,则运行成功。
在VS里设置断点,再回CAD输一遍mycommand命令,可以看见断点也能正常运作。
3.补充:手动配置环境
近日装了win10系统,结果感觉好坑,安装autoCADnetwizards的时候一直提示需要framework4.7……
好吧老毛病,win10是预装4.7的,尤其是现在都会帮你更新到4.7.2,所以向导不认。我寻思着把4.7.2卸了,再装4.7就行,结果使出浑身解数都找不到在哪卸(有会的同学望告知),所以只能手动配置。
3.1导入引用
首先创建一个类库或者根据个人需要其他什么的应用,创建的时候要注意,要选framework4.7。然后将accoremgd.dll,AcCui.dll,acdbmgd.dll,acmgd.dll这几个dll导入到引用,这几个文件可以在cad的安装目录里找到,如:X:\XX\CAD2019\AutoCAD 2019。
3.2配置启动CAD
我希望点击“启动”按钮能打开CAD,这里需要在项目的属性>调试>启动外部程序里选择:
3.3添加using
最后把之前的using拷进来就行了,代码和第二章的一样。
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;