日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

用C#来开发CAD插件,含源代

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用C#来开发CAD插件,含源代 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CAD插件看起來很神秘,其實一個合格碼農經過幾天就能快速掌握。沒什么秘密,開發CAD插件和winform一樣簡單,多學幾個類庫用法就是,在CAD里展現界面和winform略有不同。學習CAD插件開發的動機是為了薪水,由于公司是做顯示屏和觸摸屏的,養了一堆CAD的設計工程師拿著8K以上的薪水,當時我做為信息系統開發人員才拿4K,4個人要開發維護整個公司(2萬人,幾十個部門)的系統,感覺嚴重不平衡,便挑戰一下設計工程師,借此提高自身價值。適用案例,公司做手機屏要放UV膠來貼合,用CAD畫一個邊框加一些線條。看著設計工程師們畫畫CAD也有那么多薪水,心里不平衡就搞出一個按照參數自動出圖的東西。當然實際的項目比我放出的復雜得多,這里只是講講CAD插件技術,不涉及實際項目。總之無論多復雜,凡是根據參數生成固定圖形的,CAD插件程序都可以勝任。可惜的是,后來公司讓我給設計工程師搞了一個C#入門培訓,再重點輔導幾個“高工”來開發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 Test14 {15     public class Class1 : Autodesk.AutoCAD.Runtime.IExtensionApplication16     {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         #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();//注意這里是加載自己寫的用戶控件
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。
CAD插件技術真心不難,無非是畫點線條,CAD內部能實現的,C#調用acdbmgd.dll和acmgd.dll也能實現。花幾天時間讓自己掌握多一件技術也是件開心的事,也可以拿去鎮鎮設計工程師,讓他們知道碼農的強大。

?

轉載于:https://www.cnblogs.com/ruishuang208/archive/2013/05/26/3100143.html

總結

以上是生活随笔為你收集整理的用C#来开发CAD插件,含源代的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。