凡是根據參數生成固定圖形的,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類分別演示了命令行、右鍵菜單、工具條的實現。注釋得非常清楚了,就不做多解釋。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
namespace Test
{
public class Class1 : Autodesk.AutoCAD.Runtime.IExtensionApplication
{
ContextMenuExtension m_ContextMenu;//定義右鍵菜單
PaletteSet palSet;//定義工具欄按鈕
//初始化方法,這里加了一個面板工具欄和右鍵菜單。如果不要右鍵菜單,注釋即可
public void Initialize()
{
AddContextMenu();//添加面板工具欄
AddPalette();//添加右鍵菜單
}
//卸載方法
public void Terminate()
{
RemoveContextMenu();
}
//有CommandMethod標注,是提供給CAD使用的命令
[CommandMethod("HelloWorld")]
public void HelloWorld()
{
//這段代碼的作用是彈出一個提示
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
ed.WriteMessage("深淵碼奴編寫:第一個外部門程序CAD!");
}
#region 添加一個右鍵菜單,並實現畫一個圓的功能
/// <summary>點擊響應事件,創建一個圓
///
/// </summary>
/// <param name="o"></param>
/// <param name="e"></param>
private void MyMenuItem_OnClick(object o, EventArgs e)
{
using (DocumentLock doclock = Application.DocumentManager.MdiActiveDocument.LockDocument())
{
//創建一個紅色的圓
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
Circle cir = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 100);
cir.ColorIndex = 1;
btr.AppendEntity(cir);
trans.AddNewlyCreatedDBObject(cir, true);
trans.Commit();
}
}
}
/// <summary>添加右鍵菜單項
///
/// </summary>
private void AddContextMenu()
{
m_ContextMenu = new ContextMenuExtension();
m_ContextMenu.Title = "深淵碼奴的自定義菜單";
Autodesk.AutoCAD.Windows.MenuItem mi;
mi = new Autodesk.AutoCAD.Windows.MenuItem("創建圓");
//關聯菜單項的處理函數
mi.Click += MyMenuItem_OnClick;
m_ContextMenu.MenuItems.Add(mi);
Application.AddDefaultContextMenuExtension(m_ContextMenu);
}
/// <summary>移除菜單項
///
/// </summary>
private void RemoveContextMenu()
{
if (m_ContextMenu != null)
{
Application.RemoveDefaultContextMenuExtension(m_ContextMenu);
m_ContextMenu = null;
}
}
#endregion
[CommandMethod("ShowModalForm")]
public void ShowModalForm()
{
Form1 modalForm = new Form1();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm);
}
[CommandMethod("AddPalette")]
public void AddPalette()
{
Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
try
{
if (palSet == null)
{
palSet = new Autodesk.AutoCAD.Windows.PaletteSet("我的面板集");
palSet.Style = PaletteSetStyles.ShowTabForSingle;
palSet.Style = PaletteSetStyles.NameEditable;
palSet.Style = PaletteSetStyles.ShowPropertiesMenu;
palSet.Style = PaletteSetStyles.ShowAutoHideButton;
palSet.Style = PaletteSetStyles.ShowCloseButton;
palSet.Opacity = 90;
palSet.MinimumSize = new System.Drawing.Size(300, 300);
System.Windows.Forms.UserControl myPageCtrl = new ModelessForm();//注意這里是加載自己寫的用戶控件
//myPageCtrl.Dock = System.Windows.Forms.DockStyle.Fill;
palSet.Add("我的頁面", myPageCtrl);
palSet.Visible = true;
}
}
catch
{
ed.WriteMessage("創建面板集錯誤");
}
}
}
}
2,CAD展現工具條,添加一個用戶控件,取名為ModelessForm。兩行代碼顯示Form1窗體而已。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Test
{
public partial class ModelessForm : UserControl
{
public ModelessForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1 modalForm = new Form1();
Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm);
}
}
}
3,Form1窗體的功能,是根據長寬畫一個矩形,矩形的四個角分別畫一個圓。因為在CAD里運行,所以使用的類庫和正常C#的不同。這里是實現的重點,根據需要寫自己的代碼。class1類是一個框架,基本不用改。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
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;
namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
float C;//長
float K;//寬
/// <summary> 畫CAD圖,根據計算出的坐標
///
/// </summary>
void drawCAD()
{
Point3d p0 = new Point3d(0,0,0);
Point3d p1 = new Point3d(C,0,0);
Point3d p2 = new Point3d(C, K, 0);
Point3d p3 = new Point3d(0, K, 0);
using (DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
{
//
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction())
{
BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
//畫4條直線的矩形
List<Line> lins = new List<Line>();
lins.Add(new Line(p0, p1));
lins.Add(new Line(p1, p2));
lins.Add(new Line(p2, p3));
lins.Add(new Line(p3, p0));
foreach (Line line in lins)
{
btr.AppendEntity(line);
trans.AddNewlyCreatedDBObject(line, true);
}
//畫圓,這里直接用矩形的四個點來畫
List<Point3d> points = new List<Point3d>();
points.Add(p0);
points.Add(p1);
points.Add(p2);
points.Add(p3);
List<Circle> cirs = new List<Circle>();
foreach (Point3d p3d in points)
{
int R = 20;
cirs.Add(new Circle(p3d, Vector3d.ZAxis, R));
}
foreach (Circle cir in cirs)
{
cir.ColorIndex = 1;
btr.AppendEntity(cir);
trans.AddNewlyCreatedDBObject(cir, true);
}
trans.Commit();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
this.C = Convert.ToInt32(this.textBox1.Text);//int轉成float一定可以,所以可以把int的值直接賦給float
this.K = Convert.ToInt32(this.textBox2.Text);
this.drawCAD();
this.Close();
}
}
}
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也能實現。
