CAD插件看起来很神秘,其实一个合格码农经过几天就能快速掌握。没什么秘密,开发CAD插件和winform一样简单学几个类库用法就是(只是太多人不喜欢知识分享),在CAD里展现界面和winform略有不同(整个项目工程在文章的最后有下载)。
学习CAD插件开发的动机是为了薪水,由于公司是做显示屏和触摸屏的,养了一堆CAD的设计工程师拿着8K以上的薪水,当时我做为信息系统开发人员才拿4K,4个人要开发维护整个公司(2万人,几十个部门)的系统,感觉严重不平衡,便挑战一下设计工程师,借此提高自身价值。
适用案例,公司做手机屏要放UV胶来贴合,用CAD画一个边框加一些线条。看着设计工程师们画画CAD也有那么多薪水,心里不平衡就搞出一个按照参数自动出图的东西。当然实际的项目比我放出的复杂得多,这里只是讲讲CAD插件技术,不涉及实际项目。总之无论多复杂,凡是根据参数生成固定图形的,CAD插件程序都可以胜任。
效果展示:
1,命令行:
2,右键菜单:
3,工具条,CAD内嵌界面,和winform一样简单
闲话少说,直接上原理和代码:
0,
项目效果查看:
a:在CAD2006的命令行输入netload,加载Test.dll
b1:在命令行输入helloworld可以看到命令功能
b2:右键可以看到右键菜单,画一个红色的圆
b3:左边工具面板多了一个工具条,有个界面可以输入各种参数来画一个组合图形
1,建一个xindows窗体程序项目,设置输出为类库
2,引用acdbmgd.dll和acmgd.dll
3,引用如下命名空间
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Windows.ToolPalette;
using Autodesk.AutoCAD.Windows;
4,在Form1上规划界面和后台代码。重点看代码如何实现
5,计划是CAD上增加一个面板按钮,点击按钮就打开Form1来自动画图。
这里我们加一个用户控件,拖一个按钮,按钮方法写:
Form1 modalForm = new Form1();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm);
注意这里仅仅是打开的窗体的方式选择了AutoCAD的方式。
想建立一整套工具栏,就多拉几个按钮。按4的方法写好每个按钮执行的代码(可以要个Form1这样的界面,也可以不要,自由选择)
6,把这个项目导出还需要一个类来辅助
先看初始化Initialize()和Terminate()方法。这里给CAD加了一个面板工具栏和右键菜单,以及一些命令行
1,这个class1类分别演示了命令行、右键菜单、工具条的实现。注释得非常清楚了,就不做多解释。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Autodesk.AutoCAD.EditorInput; 6 using Autodesk.AutoCAD.ApplicationServices; 7 using Autodesk.AutoCAD.Runtime; 8 using Autodesk.AutoCAD.DatabaseServices; 9 using Autodesk.AutoCAD.Geometry; 10 using Autodesk.AutoCAD.Windows.ToolPalette; 11 using Autodesk.AutoCAD.Windows; 12 13 namespace Test 14 { 15 public class Class1 : Autodesk.AutoCAD.Runtime.IExtensionApplication 16 { 17 ContextMenuExtension m_ContextMenu;//定义右键菜单 18 PaletteSet palSet;//定义工具栏按钮 19 20 //初始化方法,这里加了一个面板工具栏和右键菜单。如果不要右键菜单,注释即可 21 public void Initialize() 22 { 23 AddContextMenu();//添加面板工具栏 24 AddPalette();//添加右键菜单 25 } 26 27 //卸载方法 28 public void Terminate() 29 { 30 Remove