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 RemoveContextMenu(); 31 } 32 33 34 //有CommandMethod標注,是提供給CAD使用的命令 35 [CommandMethod("HelloWorld")] 36 public void HelloWorld() 37 { 38 //這段代碼的作用是彈出一個提示 39 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; 40 ed.WriteMessage("深淵碼奴編寫:第一個外部門程序CAD!"); 41 } 42 43 44 45 #region 添加一個右鍵菜單,並實現畫一個圓的功能 46 /// <summary>點擊響應事件,創建一個圓 47 /// 48 /// </summary> 49 /// <param name="o"></param> 50 /// <param name="e"></param> 51 private void MyMenuItem_OnClick(object o, EventArgs e) 52 { 53 using (DocumentLock doclock = Application.DocumentManager.MdiActiveDocument.LockDocument()) 54 { 55 //創建一個紅色的圓 56 Database db = HostApplicationServices.WorkingDatabase; 57 using (Transaction trans = db.TransactionManager.StartTransaction()) 58 { 59 BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; 60 BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; 61 Circle cir = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 100); 62 cir.ColorIndex = 1; 63 btr.AppendEntity(cir); 64 trans.AddNewlyCreatedDBObject(cir, true); 65 trans.Commit(); 66 } 67 } 68 } 69 70 /// <summary>添加右鍵菜單項 71 /// 72 /// </summary> 73 private void AddContextMenu() 74 { 75 m_ContextMenu = new ContextMenuExtension(); 76 m_ContextMenu.Title = "深淵碼奴的自定義菜單"; 77 Autodesk.AutoCAD.Windows.MenuItem mi; 78 mi = new Autodesk.AutoCAD.Windows.MenuItem("創建圓"); 79 //關聯菜單項的處理函數 80 mi.Click += MyMenuItem_OnClick; 81 m_ContextMenu.MenuItems.Add(mi); 82 83 Application.AddDefaultContextMenuExtension(m_ContextMenu); 84 } 85 /// <summary>移除菜單項 86 /// 87 /// </summary> 88 private void RemoveContextMenu() 89 { 90 if (m_ContextMenu != null) 91 { 92 93 Application.RemoveDefaultContextMenuExtension(m_ContextMenu); 94 m_ContextMenu = null; 95 } 96 } 97 #endregion 98 99 100 [CommandMethod("ShowModalForm")] 101 public void ShowModalForm() 102 { 103 Form1 modalForm = new Form1(); 104 Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm); 105 } 106 107 [CommandMethod("AddPalette")] 108 public void AddPalette() 109 { 110 Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; 111 try 112 { 113 if (palSet == null) 114 { 115 palSet = new Autodesk.AutoCAD.Windows.PaletteSet("我的面板集"); 116 117 palSet.Style = PaletteSetStyles.ShowTabForSingle; 118 palSet.Style = PaletteSetStyles.NameEditable; 119 palSet.Style = PaletteSetStyles.ShowPropertiesMenu; 120 palSet.Style = PaletteSetStyles.ShowAutoHideButton; 121 palSet.Style = PaletteSetStyles.ShowCloseButton; 122 palSet.Opacity = 90; 123 palSet.MinimumSize = new System.Drawing.Size(300, 300); 124 System.Windows.Forms.UserControl myPageCtrl = new ModelessForm();//注意這里是加載自己寫的用戶控件 125 //myPageCtrl.Dock = System.Windows.Forms.DockStyle.Fill; 126 palSet.Add("我的頁面", myPageCtrl); 127 palSet.Visible = true; 128 } 129 } 130 131 catch 132 { 133 ed.WriteMessage("創建面板集錯誤"); 134 } 135 136 137 } 138 139 140 141 } 142 } 143 144
2,CAD展現工具條,添加一個用戶控件,取名為ModelessForm。兩行代碼顯示Form1窗體而已。

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Drawing; 5 using System.Data; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9
10 namespace Test 11 { 12 public partial class ModelessForm : UserControl 13 { 14 public ModelessForm() 15 { 16 InitializeComponent(); 17 } 18
19 private void button1_Click(object sender, EventArgs e) 20 { 21 Form1 modalForm = new Form1(); 22 Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm); 23 } 24 } 25 }
3,Form1窗體的功能,是根據長寬畫一個矩形,矩形的四個角分別畫一個圓。因為在CAD里運行,所以使用的類庫和正常C#的不同。這里是實現的重點,根據需要寫自己的代碼。class1類是一個框架,基本不用改。

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using Autodesk.AutoCAD.EditorInput; 10 using Autodesk.AutoCAD.ApplicationServices; 11 using Autodesk.AutoCAD.Runtime; 12 using Autodesk.AutoCAD.DatabaseServices; 13 using Autodesk.AutoCAD.Geometry; 14 using Autodesk.AutoCAD.Windows.ToolPalette; 15 using Autodesk.AutoCAD.Windows; 16 namespace Test 17 { 18 public partial class Form1 : Form 19 { 20 public Form1() 21 { 22 InitializeComponent(); 23 } 24 float C;//長
25 float K;//寬
26 /// <summary> 畫CAD圖,根據計算出的坐標 27 ///
28 /// </summary>
29 void drawCAD() 30 { 31 Point3d p0 = new Point3d(0,0,0); 32 Point3d p1 = new Point3d(C,0,0); 33 Point3d p2 = new Point3d(C, K, 0); 34 Point3d p3 = new Point3d(0, K, 0); 35
36 using (DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument()) 37 { 38 // 39 Database db = HostApplicationServices.WorkingDatabase; 40 using (Transaction trans = db.TransactionManager.StartTransaction()) 41 { 42 BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; 43 BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; 44
45
46 //畫4條直線的矩形
47 List<Line> lins = new List<Line>(); 48 lins.Add(new Line(p0, p1)); 49 lins.Add(new Line(p1, p2)); 50 lins.Add(new Line(p2, p3)); 51 lins.Add(new Line(p3, p0)); 52 foreach (Line line in lins) 53 { 54 btr.AppendEntity(line); 55 trans.AddNewlyCreatedDBObject(line, true); 56 } 57
58
59 //畫圓,這里直接用矩形的四個點來畫
60 List<Point3d> points = new List<Point3d>(); 61 points.Add(p0); 62 points.Add(p1); 63 points.Add(p2); 64 points.Add(p3); 65 List<Circle> cirs = new List<Circle>(); 66 foreach (Point3d p3d in points) 67 { 68 int R = 20; 69 cirs.Add(new Circle(p3d, Vector3d.ZAxis, R)); 70 } 71 foreach (Circle cir in cirs) 72 { 73 cir.ColorIndex = 1; 74 btr.AppendEntity(cir); 75 trans.AddNewlyCreatedDBObject(cir, true); 76 } 77
78 trans.Commit(); 79 } 80 } 81 } 82 private void button1_Click(object sender, EventArgs e) 83 { 84 this.C = Convert.ToInt32(this.textBox1.Text);//int轉成float一定可以,所以可以把int的值直接賦給float
85 this.K = Convert.ToInt32(this.textBox2.Text); 86 this.drawCAD(); 87 this.Close(); 88 } 89 } 90 }
整個工程打包上來,有興趣的朋友跑起來玩玩。很少寫博客,不知道哪里能上傳,放個360網盤分享吧,http://yunpan.cn/Q5t2pTptiUm4b。
http://files.cnblogs.com/files/zkp2010/CAD%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E2%80%94%E2%80%94%E4%BB%A5CAD2006%E4%B8%BA%E4%BE%8B.rarCAD插件技術真心不難,無非是畫點線條,CAD內部能實現的,C#調用acdbmgd.dll和acmgd.dll也能實現。
花幾天時間讓自己掌握多一件技術也是件開心的事,也可以拿去鎮鎮設計工程師,讓他們知道碼農的強大。