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類分別演示了命令行、右鍵菜單、工具條的實現。注釋得非常清楚了,就不做多解釋。 

 

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也能實現。

 

 

 


免責聲明!

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



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