cad对图层的一些操作

在一些书上看见的方法,自己编译尝试了一下,全部有效,希望对大家有所帮助:
    public class CadLayerBasicOp
    {

        /// <summary>
        /// 取得图层下的所有对象id
        /// </summary>
        /// <param name="name">图层名称</param>
        /// <returns>id集合</returns>
        public static ObjectIdCollection GetObjectIdsAtLayer(string name)
        {
            ObjectIdCollection ids = new ObjectIdCollection();

            PromptSelectionResult ProSset = null;
            TypedValue[] filList = new TypedValue[1] { new TypedValue((int)DxfCode.LayerName, name) };
            SelectionFilter sfilter = new SelectionFilter(filList);

            Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
            ProSset = ed.SelectAll(sfilter);
            if (ProSset.Status == PromptStatus.OK)
            {

                SelectionSet sst = ProSset.Value;

                ObjectId[] oids = sst.GetObjectIds();

                for (int i = 0; i < oids.Length; i++)
                {
                    ids.Add(oids[i]);
                }
            }

            return ids;
        }

        /// <summary>
        /// 获取图层
        /// </summary>
        /// <param name="name"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public LayerTableRecord GetLayer(string name,Database db)
        {
            LayerTableRecord layer = new LayerTableRecord();
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                LayerTableRecord layer0 = new LayerTableRecord();
                LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
                if (lt.Has(name))
                {
                    layer0 = trans.GetObject(lt[name], OpenMode.ForRead) as LayerTableRecord;

                    if (!layer0.IsErased)
                    {
                        layer = layer0;
                    }
                }
                trans.Commit();
            }
                return null;
        }

        /// <summary>
        /// 获取当前图层
        /// </summary>
        /// <param name="db"></param>
        /// <returns></returns>
        public LayerTableRecord GetCurLayer(Database db)
        {
            LayerTableRecord layer = new LayerTableRecord();
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                layer = tr.GetObject(db.Clayer, OpenMode.ForRead) as LayerTableRecord;
            }
            return layer;
        }


        /// <summary>
        /// 增加图层并设置,当前图层
        /// </summary>
        /// <param name="strLayerName"></param>
        /// <param name="nColIndex"></param>
        public void AddLayer(string strLayerName,short nColIndex)
        {
            short colIndex = (short)(nColIndex % 256);
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            using (Transaction tr = acDoc.TransactionManager.StartTransaction())
            {
                //指定点图层
                LayerTable lt = (LayerTable)tr.GetObject(acDoc.Database.LayerTableId, OpenMode.ForRead);
                if (!lt.Has(strLayerName))//判断是否存在
                {
                    var LayerID = ObjectId.Null;
                    LayerTableRecord ltr = new LayerTableRecord();
                    ltr.Name = strLayerName;
                    ltr.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(
                        Autodesk.AutoCAD.Colors.ColorMethod.ByColor, colIndex);
                    lt.UpgradeOpen();
                    LayerID = lt.Add(ltr);
                    tr.AddNewlyCreatedDBObject(ltr, true);

                    acDoc.Database.Clayer = ltr.ObjectId;
                }
                else
                {
                    WriteLine("\n此图层已经曾在");
                }
                tr.Commit();
            }
        }
        /// <summary>
        /// 删除图层
        /// </summary>
        /// <param name="strName"></param>
        /// <param name="db"></param>
        public void RemoveLayer(string strName,Database db)
        {
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
                LayerTableRecord curLayer = (LayerTableRecord)trans.GetObject(db.Clayer,OpenMode.ForRead);

                if(curLayer.Name.ToLower() == strName.ToLower())
                {
                    WriteLine("\n不能删除当前图层");
                }
                else
                {
                    LayerTableRecord ltr = new LayerTableRecord();
                    if(lt.Has(strName))
                    {
                        ltr = trans.GetObject(lt[strName], OpenMode.ForWrite) as LayerTableRecord;
                        if(ltr.IsErased)
                        {
                            WriteLine("\n此图层已经被删除");
                        }
                        else
                        {
                            ObjectIdCollection idCol = new ObjectIdCollection();
                            idCol.Add(ltr.ObjectId);
                            db.Purge(idCol);
                            if(idCol.Count==0)
                            {
                                WriteLine("\n不能删除有对象的图层");
                            }
                            else
                            {
                                ltr.Erase();
                            }
                        }
                    }
                    else
                    {
                        WriteLine("\n没有此图层");
                    }
                }

                trans.Commit();
            }
        }

        /// <summary>
        /// 删除图层的所有实体
        /// </summary>
        /// <param name="layer"></param>
        /// <param name="db"></param>
        public void RemoveAllEntOfLayer(LayerTableRecord layer,Database db)
        {
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
                foreach(ObjectId btrid in bt)
                {
                    BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrid, OpenMode.ForWrite);
                    foreach(ObjectId eid in btr)
                    {
                        Entity ent = trans.GetObject(eid, OpenMode.ForWrite) as Entity;
                        if(ent != null)
                        {
                            if (ent.LayerId == layer.ObjectId)
                            {
                                ent.Erase();
                            }
                        }
                    }
                }
                trans.Commit();
            }
        }


        public static void LayerOff(string strLayerName)
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            using (Transaction trs = db.TransactionManager.StartTransaction())
            {
                LayerTable lt = trs.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                var layer = trs.GetObject(lt[strLayerName], OpenMode.ForWrite) as LayerTableRecord;
                layer.IsOff = true;
                trs.Commit();
            }
        }

        public static void LayerOn(string strLayerName)
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            using (Transaction trs = db.TransactionManager.StartTransaction())
            {
                LayerTable lt = trs.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                var layer = trs.GetObject(lt[strLayerName], OpenMode.ForWrite) as LayerTableRecord;
                layer.IsOff = false;
                trs.Commit();
            }
        }

        public void LayerEnable(string strLayerName)
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            using (Transaction trs = db.TransactionManager.StartTransaction())
            {
                LayerTable lt = trs.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                var layer = trs.GetObject(lt[strLayerName], OpenMode.ForWrite) as LayerTableRecord;
                layer.IsOff = layer.IsOff ? false : true;
                trs.Commit();
            }
        }
        
        private void WriteLine(string strCon)
        {
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(strCon);//输出字符串 
        }


    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值