cad二次开发的一些简单入门实例

时间:2025-04-17 15:21:42

记录一下CAD二次开发的一些简单实例

1、helloworld
2、画一个圆
3、画一条直线
4、取得图层下的所有对象id
5、得到当前图层的所有object的id
6、取得当前所有图层名称
7、添加图层

using System;
using ;
using ;
using ;
using ;

using ;
using ;
using ;
using ;
using ;
using ;
using ;

using ;
using AcadApp = ;
using ;

namespace cad开发
{

    public class Class1
    {
        /// <summary>
        /// Hello World!!!
        /// </summary>
        [CommandMethod("HelloWorld")]
        public void HelloWorld()
        {
            Editor ed = ;
            ("Hello World222");
        }
        /// <summary>
        /// 画一个圆
        /// </summary>
        [CommandMethod("test")]
        public void createCircle()
        { //首先声明我们要使用的对象
            Circle circle; //这个是我们要加入到模型空间的圆
            BlockTableRecord btr;//要加入圆,我们必须打开模型空间
            BlockTable bt; //要打开模型空间,我们必须通过块表(BlockTable)来访问它

            //我们使用一个名为‘Transaction’的对象,把函数中有关数据库的操作封装起来
            Transaction trans;
            //使用 TransactionManager 的 StartTransaction()成员来开始事务处理
            trans = ();
            //现在创建圆……请仔细看这些参数——注意创建 Point3d 对象的‘New’和 Vector3d 的静态成员 ZAxis
            circle = new Circle(new Point3d(10, 10, 0), , 2);
            bt = (BlockTable)(, );
            //使用当前的空间 Id 来获取块表记录——注意我们是打开它用来写入
            btr = (BlockTableRecord)(, );
            //现在使用 btr 对象来加入圆
            (circle);
            (circle, true); //并确定事务处理知道要加入圆!
                                                         //一旦完成以上操作,我们就提交事务处理,这样以上所做的改变就被保存了……
            ();
            //…然后销毁事务处理,因为我们已经完成了相关的操作(事务处理不是数据库驻留对象,可以销毁)
            ();
        }
        /// <summary>
        /// 选择一个点,并显示坐标;选择两个点,并显示距离
        /// </summary>
        [CommandMethod("selectPoint")]
        public void SelectPoint()
        {
            PromptPointOptions prPointOptions = new PromptPointOptions("Select a point");
            PromptPointResult prPointRes;
            Editor ed = ;
            prPointRes = (prPointOptions);
            if ( != )
            {
                ("Error");
            }
            else
                ("You selected point: " + ());
            PromptDistanceOptions prDistOptions = new PromptDistanceOptions("Find distance, select first point:");
            PromptDoubleResult prDistRes;
            prDistRes = (prDistOptions);
            if ( != )
            {
                ("Error");
            }
            else
            {
                ("The distance is: " + ());
            }
        }

        [CommandMethod("CreateDivision")]
        public void CreateDivision()
        {
            Database db = ;
            Transaction trans = ();

            try
            {
                //首先,获取 NOD……
                DBDictionary NOD = (DBDictionary)(, );
                //定义一个公司级别的字典
                DBDictionary acmeDict;
                try
                {
                    //如果 ACME_DIVISION 不存在,则转到 catch 块,这里什么也不做
                    acmeDict = (DBDictionary)(("ACME_DIVISION"), );
                }
                catch
                {
                    //如果 ACME_DIVISION 不存在,则创建它并把它加入到 NOD 中……
                    acmeDict = new DBDictionary();
                    ("ACME_DIVISION", acmeDict);
                    (acmeDict, true);
                }
                ();
            }
            finally
            {
                ();
            }
        }
        /// <summary>
        /// 画一条直线
        /// </summary>
        [CommandMethod("FirstLine")]
        public static void FirstLine()
        {
            //获取当前活动图形数据库 ;
            Database db = ;
            //定义一个指向当前数据库的事务处理,以添加直线
            using (Transaction trans = ())
            {
                BlockTable acBlkTbl;
                acBlkTbl = (, ) as BlockTable; //以读方式打开块表.
                //以写方式打开模型空间块表记录.
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = (acBlkTbl[], ) as BlockTableRecord;
                Point3d startPoint = new Point3d(0, 100, 0);  //直线起点
                Point3d endPoint = new Point3d(100, 100, 0); //直线终点
                Line line = new Line(startPoint, endPoint); //新建一直线对象
                //将图形对象的信息添加到块表记录中,并返回ObjectId对象.
                (line);
                (line, true); //把对象添加到事务处理中.
                (); //提交事务处理
            }
        }

        #region "取得图层下的所有对象id"
        /// <summary>
        /// 取得图层下的所有对象id
        /// </summary>
        /// <param name="name">图层名称</param>
        /// <returns>id集合</returns>
        public ObjectIdCollection GetObjectIdsAtLayer(string name)
        {
            ObjectIdCollection ids = new ObjectIdCollection();
            PromptSelectionResult ProSset = null;
            TypedValue[] filList = new TypedValue[1] { new TypedValue((int), name) };
            SelectionFilter sfilter = new SelectionFilter(filList);
            Editor ed = ;
            ProSset = (sfilter);
            if ( == )
            {

                SelectionSet sst = ;
                ObjectId[] oids = ();

                for (int i = 0; i < ; i++)
                {

                    (oids[i]);
                }
            }
            return ids;
        }
        #endregion
        /// <summary>
        /// 得到当前图层的所有几何的id
        /// </summary>
        [CommandMethod("GetAllId")]
        public void GetAllId()
        {
            Editor ed = ;
            
            ObjectIdCollection ids = GetObjectIdsAtLayer("0");
            string str = "";
            Database db = ;
            //定义一个指向当前数据库的事务处理,以添加直线
            using (Transaction trans = ())
            {
                BlockTable acBlkTbl;
                acBlkTbl = (, ) as BlockTable; //以读方式打开块表.
                //以写方式打开模型空间块表记录.
                BlockTableRecord acBlkTblRec;
                acBlkTblRec = (acBlkTbl[], ) as BlockTableRecord;
                foreach (ObjectId item in ids)
                {
                    Entity entity = (Entity)(, false, false);
                    switch (().Name)
                    {
                        case "AcDbText":
                            DBText dbtext = entity as DBText;

                            string strtext = ;
                            str += strtext + '\n';
                            break;
                    }
                }
                (str);
                (); //提交事务处理
            } 
        }
        #region "取得当前所有图层名称"
        /// <summary>
        /// 取得当前所有图层名称
        /// </summary>
        /// <returns>图层名称集合</returns>
        [CommandMethod("GetAllLayer")]
        public ArrayList GetLayerName()
        {
            ArrayList layers = new ArrayList();
            using (Database db = )
            {
                using (Transaction trans = ())
                {
                    using (LayerTable lt = (LayerTable)(, ))
                    {
                        foreach (ObjectId id in lt)
                        {
                            LayerTableRecord ltr = (LayerTableRecord)(id, );
                            ();
                        }
                    }
                    ();
                }
            }
            return layers;
        }
        #endregion

        #region 添加图层
        /// <summary>
        /// 添加图层
        /// </summary>
        /// <param name="layName"></param>
        /// <param name="layColor"></param>
        private ObjectId AddLayer(string layName, short layColor)
        {
            ObjectId oidReturn = new ObjectId(); ;
            using (())
            {
                Database database = ;
                Editor editor = ;
                using (Transaction transaction = ())
                {
                    try
                    {
                        ObjectId id;
                        LayerTable table = (, ) as LayerTable;
                        LayerTableRecord record = new LayerTableRecord();
                        if ((layName))
                        {
                            id = ;
                            record = (id, ) as LayerTableRecord;
                             = false;
                             = false;
                            if (id != )
                            {
                                 = false;
                            }
                        }
                        else
                        {
                             = layName;
                            id = (record);
                            (record, true);
                        }
                         = (, layColor);
                         = id;
                        oidReturn = id;
                        ();
                    }
                    catch ( exception)
                    {
                        ("Error in addLayer2(): " + );
                    }
                }
                return oidReturn;
            }
        }
        #endregion
		/// <summary>
        /// 删除元素
        /// </summary>
        /// <param name="objectIdCollection"></param>
        private void DeleteAllEntity(ObjectIdCollection objectIdCollection)
        {
            Document doc = ;
            SetFocus();
            Database acCurDb = ;
            Editor ed = ;
            //启动事务
            using (Transaction acTrans = ())
            {
                foreach (ObjectId id in objectIdCollection)
                {
                    Entity hatchobj = (id, ) as Entity;
                    ();//删除
                }
                ();
            }
        }
    }
}

一些需要注意的问题:

1、非模态窗口需要锁定文档

        Document doc = ;
        using (())

2、非模态窗口需要点击一下cad软件,才能够出结果的解决办法

    //切换窗口焦点
    [DllImport("", EntryPoint = "SetFocus")]
    public static extern int SetFocus(IntPtr hWnd);
    //然后引用该方法
    SetFocus();

3、成组

Group group = new Group(“description”, true);
(objectIdCollection);
(group);
(group, true);

4、显示Message

(“Message”);