用C#來開發CAD插件,含源代碼


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     
View Code

 

 

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 }
View Code

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 }
View Code

 

整個工程打包上來,有興趣的朋友跑起來玩玩。很少寫博客,不知道哪里能上傳,放個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.rar

 CAD插件技術真心不難,無非是畫點線條,CAD內部能實現的,C#調用acdbmgd.dll和acmgd.dll也能實現。

花幾天時間讓自己掌握多一件技術也是件開心的事,也可以拿去鎮鎮設計工程師,讓他們知道碼農的強大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM