用C#来开发CAD插件,含源代
生活随笔
收集整理的這篇文章主要介紹了
用C#来开发CAD插件,含源代
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
CAD插件看起來(lái)很神秘,其實(shí)一個(gè)合格碼農(nóng)經(jīng)過(guò)幾天就能快速掌握。沒(méi)什么秘密,開(kāi)發(fā)CAD插件和winform一樣簡(jiǎn)單,多學(xué)幾個(gè)類(lèi)庫(kù)用法就是,在CAD里展現(xiàn)界面和winform略有不同。學(xué)習(xí)CAD插件開(kāi)發(fā)的動(dòng)機(jī)是為了薪水,由于公司是做顯示屏和觸摸屏的,養(yǎng)了一堆CAD的設(shè)計(jì)工程師拿著8K以上的薪水,當(dāng)時(shí)我做為信息系統(tǒng)開(kāi)發(fā)人員才拿4K,4個(gè)人要開(kāi)發(fā)維護(hù)整個(gè)公司(2萬(wàn)人,幾十個(gè)部門(mén))的系統(tǒng),感覺(jué)嚴(yán)重不平衡,便挑戰(zhàn)一下設(shè)計(jì)工程師,借此提高自身價(jià)值。適用案例,公司做手機(jī)屏要放UV膠來(lái)貼合,用CAD畫(huà)一個(gè)邊框加一些線(xiàn)條。看著設(shè)計(jì)工程師們畫(huà)畫(huà)CAD也有那么多薪水,心里不平衡就搞出一個(gè)按照參數(shù)自動(dòng)出圖的東西。當(dāng)然實(shí)際的項(xiàng)目比我放出的復(fù)雜得多,這里只是講講CAD插件技術(shù),不涉及實(shí)際項(xiàng)目。總之無(wú)論多復(fù)雜,凡是根據(jù)參數(shù)生成固定圖形的,CAD插件程序都可以勝任。可惜的是,后來(lái)公司讓我給設(shè)計(jì)工程師搞了一個(gè)C#入門(mén)培訓(xùn),再重點(diǎn)輔導(dǎo)幾個(gè)“高工”來(lái)開(kāi)發(fā)CAD插件。然后,然后就沒(méi)我的事了。效果展示:1,命令行:2,右鍵菜單:3,工具條,CAD內(nèi)嵌界面,和winform一樣簡(jiǎn)單閑話(huà)少說(shuō),直接上原理和代碼:0, 項(xiàng)目效果查看: a:在CAD2006的命令行輸入netload,加載Test.dll b1:在命令行輸入helloworld可以看到命令功能 b2:右鍵可以看到右鍵菜單,畫(huà)一個(gè)紅色的圓 b3:左邊工具面板多了一個(gè)工具條,有個(gè)界面可以輸入各種參數(shù)來(lái)畫(huà)一個(gè)組合圖形1,建一個(gè)xindows窗體程序項(xiàng)目,設(shè)置輸出為類(lèi)庫(kù) 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上規(guī)劃界面和后臺(tái)代碼。重點(diǎn)看代碼如何實(shí)現(xiàn)5,計(jì)劃是CAD上增加一個(gè)面板按鈕,點(diǎn)擊按鈕就打開(kāi)Form1來(lái)自動(dòng)畫(huà)圖。這里我們加一個(gè)用戶(hù)控件,拖一個(gè)按鈕,按鈕方法寫(xiě): Form1 modalForm = new Form1(); Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm); 注意這里僅僅是打開(kāi)的窗體的方式選擇了AutoCAD的方式。 想建立一整套工具欄,就多拉幾個(gè)按鈕。按4的方法寫(xiě)好每個(gè)按鈕執(zhí)行的代碼(可以要個(gè)Form1這樣的界面,也可以不要,自由選擇)6,把這個(gè)項(xiàng)目導(dǎo)出還需要一個(gè)類(lèi)來(lái)輔助 先看初始化Initialize()和Terminate()方法。這里給CAD加了一個(gè)面板工具欄和右鍵菜單,以及一些命令行1,這個(gè)class1類(lèi)分別演示了命令行、右鍵菜單、工具條的實(shí)現(xiàn)。注釋得非常清楚了,就不做多解釋。 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 Test14 {15 public class Class1 : Autodesk.AutoCAD.Runtime.IExtensionApplication16 {17 ContextMenuExtension m_ContextMenu;//定義右鍵菜單 18 PaletteSet palSet;//定義工具欄按鈕19 20 //初始化方法,這里加了一個(gè)面板工具欄和右鍵菜單。如果不要右鍵菜單,注釋即可21 public void Initialize()22 {23 AddContextMenu();//添加面板工具欄24 AddPalette();//添加右鍵菜單25 }26 27 //卸載方法28 public void Terminate()29 {30 RemoveContextMenu();31 }32 33 34 //有CommandMethod標(biāo)注,是提供給CAD使用的命令35 [CommandMethod("HelloWorld")]36 public void HelloWorld()37 {38 //這段代碼的作用是彈出一個(gè)提示39 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;40 ed.WriteMessage("周孔平編寫(xiě):第一個(gè)外部門(mén)程序CAD!");41 }42 43 44 45 #region 添加一個(gè)右鍵菜單,并實(shí)現(xiàn)畫(huà)一個(gè)圓的功能46 /// <summary>點(diǎn)擊響應(yīng)事件,創(chuàng)建一個(gè)圓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 //創(chuàng)建一個(gè)紅色的圓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>添加右鍵菜單項(xiàng)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("創(chuàng)建圓");79 //關(guān)聯(lián)菜單項(xiàng)的處理函數(shù)80 mi.Click += MyMenuItem_OnClick;81 m_ContextMenu.MenuItems.Add(mi);82 83 Application.AddDefaultContextMenuExtension(m_ContextMenu);84 }85 /// <summary>移除菜單項(xiàng)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 #endregion98 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();//注意這里是加載自己寫(xiě)的用戶(hù)控件 125 //myPageCtrl.Dock = System.Windows.Forms.DockStyle.Fill; 126 palSet.Add("我的頁(yè)面", myPageCtrl); 127 palSet.Visible = true; 128 } 129 } 130 131 catch 132 { 133 ed.WriteMessage("創(chuàng)建面板集錯(cuò)誤"); 134 } 135 136 137 } 138 139 140 141 } 142 } 143 144 2,CAD展現(xiàn)工具條,添加一個(gè)用戶(hù)控件,取名為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窗體的功能,是根據(jù)長(zhǎng)寬畫(huà)一個(gè)矩形,矩形的四個(gè)角分別畫(huà)一個(gè)圓。因?yàn)樵贑AD里運(yùn)行,所以使用的類(lèi)庫(kù)和正常C#的不同。這里是實(shí)現(xiàn)的重點(diǎn),根據(jù)需要寫(xiě)自己的代碼。class1類(lèi)是一個(gè)框架,基本不用改。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;//長(zhǎng) 25 float K;//寬 26 /// <summary> 畫(huà)CAD圖,根據(jù)計(jì)算出的坐標(biāo) 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 //畫(huà)4條直線(xiàn)的矩形 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 //畫(huà)圓,這里直接用矩形的四個(gè)點(diǎn)來(lái)畫(huà) 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轉(zhuǎn)成float一定可以,所以可以把int的值直接賦給float 85 this.K = Convert.ToInt32(this.textBox2.Text); 86 this.drawCAD(); 87 this.Close(); 88 } 89 } 90 }整個(gè)工程打包上來(lái),有興趣的朋友跑起來(lái)玩玩。很少寫(xiě)博客,不知道哪里能上傳,放個(gè)360網(wǎng)盤(pán)分享吧,http://yunpan.cn/Q5t2pTptiUm4b。 CAD插件技術(shù)真心不難,無(wú)非是畫(huà)點(diǎn)線(xiàn)條,CAD內(nèi)部能實(shí)現(xiàn)的,C#調(diào)用acdbmgd.dll和acmgd.dll也能實(shí)現(xiàn)。花幾天時(shí)間讓自己掌握多一件技術(shù)也是件開(kāi)心的事,也可以拿去鎮(zhèn)鎮(zhèn)設(shè)計(jì)工程師,讓他們知道碼農(nóng)的強(qiáng)大。
?
轉(zhuǎn)載于:https://www.cnblogs.com/ruishuang208/archive/2013/05/26/3100143.html
總結(jié)
以上是生活随笔為你收集整理的用C#来开发CAD插件,含源代的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 亚龙湾躺椅收费吗
- 下一篇: 大年我要失业了。。。哪位大神帮我看看我这