AutoCad 二次開發 .net 之層表的增加 刪除 修改圖層顏色 遍歷 設置當前層 凍結圖層


AutoCad 二次開發 .net 之層表的增加 刪除 修改圖層顏色 遍歷 設置當前層

AutoCad 二次開發 .net 之層表的增加 刪除 修改圖層顏色 遍歷 設置當前層
我理解的圖層的作用大概是把相同作用的功能聚集在一起,以便好選擇。比如,把一副圖塊中的所有標注定義為一個圖層,把編號定義為一個圖層,把相同的塊參照定義為一個圖層。圖層表的操作和塊表的操作類似。

在這里我就分享一下自己從書《AUTOCAD VBA&VB.NET開發基礎與實例教程(C#版) 第2版》學習到的關於圖層的一些操作的代碼,我覺得主要是圖層的刪除需要注意一下。

 

使用的成員變量:

Document Doc = Application.DocumentManager.MdiActiveDocument;
Editor Ed = Application.DocumentManager.MdiActiveDocument.Editor;
Database Db = Application.DocumentManager.MdiActiveDocument.Database;


一、圖層的刪除 代碼:

        /// <summary>
        /// 圖層0和圖層Defpoints不能被刪除,當前圖層不能被刪除,圖層上有塊參照,實體時不能被刪除
        /// 刪除前需刷新,使用LayerTableRecord.GenerateUsageData();
        /// </summary>
        public bool DeleteLayer(Database db, string layerName)
        {

            using (var trans = db.TransactionManager.StartTransaction())
            {

                var lyTbl = trans.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;

                if (!lyTbl.Has(layerName)) return false;

                if (layerName == "0" || layerName == "Defpoints") return false;

                ObjectId oId = lyTbl[layerName];

                if (oId == db.Clayer) return false;

                var lyTblRec = trans.GetObject(lyTbl[layerName], OpenMode.ForRead) as LayerTableRecord;

                lyTbl.GenerateUsageData();

                if (lyTblRec.IsUsed) return false;

                lyTblRec.UpgradeOpen();

                lyTblRec.Erase(true);

                trans.Commit();

                return true;
            }
        }

二、圖層的增加:

public ObjectId AddLayer(Database db, string layerName)
        {
            ObjectId oId = ObjectId.Null;

            using (var trans = db.TransactionManager.StartTransaction())
            {
                var lyerTbl = db.LayerTableId.GetObject(OpenMode.ForWrite) as LayerTable;

                if (lyerTbl.Has(layerName))
                {
                    trans.Commit();
                    return lyerTbl[layerName];
                }
                var lyerTblRec = new LayerTableRecord();
                lyerTblRec.Name = layerName;

                lyerTbl.Add(lyerTblRec);
                trans.AddNewlyCreatedDBObject(lyerTblRec, true);

                lyerTbl.DowngradeOpen();

                trans.Commit();

                return lyerTbl[layerName];
            }
        }

三、修改圖層顏色:

 public bool SetLayerColor(Database db, string layerName, short colorIndexs)
        {

            using (var trans = db.TransactionManager.StartTransaction())
            {

                var lyTbl = db.LayerTableId.GetObject(OpenMode.ForRead) as LayerTable;

                if (lyTbl.Has(layerName))
                {
                    var lyTblRec = trans.GetObject(lyTbl[layerName], OpenMode.ForWrite) as LayerTableRecord;

                    if (colorIndexs < 0 || colorIndexs > 255)
                    {
                        colorIndexs = 1;
                    }
                    lyTblRec.Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndexs);

                    lyTblRec.DowngradeOpen();

                    trans.Commit();
                    return true;

                }
                else
                {
                    return false;
                }
            }
        }

四、遍歷圖層:

public List<LayerTableRecord> GetAllLayer(Database db)
        {
            List<LayerTableRecord> listLyTblRec = new List<LayerTableRecord>();

            using (var trans = db.TransactionManager.StartTransaction())
            {

                var lyTbl = trans.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;

                foreach (ObjectId oId in lyTbl)
                {

                    var lyTblRec = trans.GetObject(oId, OpenMode.ForRead) as LayerTableRecord;

                    listLyTblRec.Add(lyTblRec);

                }

                return listLyTblRec;
            }
        }

五、設置當前圖層:

Databse.Clayer表示當前圖層
  public bool SetCurrentLayer(Database db, string layerName)
        {

            using (var trans = db.TransactionManager.StartTransaction())
            {

                var lyTbl = trans.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;

                if (!lyTbl.Has(layerName)) return false;

                //var lyTblRec = trans.GetObject(lyTbl[layerName], OpenMode.ForRead) as LayerTableRecord;

                if (db.Clayer != lyTbl[layerName])
                {
                    db.Clayer = lyTbl[layerName];
                }
                return true;
            }

        }
View Code

 六、凍結圖層:

 [CommandMethod("ECDLayerHide")]
        public  void HiddenSelectLayer()
        {
            var propSel = new PromptSelectionOptions();

            var propRes = Ed.GetSelection(propSel);

            if (propRes.Status != PromptStatus.OK)
            {

                return;

            }

            ObjectId[] oIds = propRes.Value.GetObjectIds();

            using(var trans = Db.TransactionManager.StartTransaction())
            {

                var lyTbl = trans.GetObject(Db.LayerTableId, OpenMode.ForRead) as LayerTable;

                var blkTbl = trans.GetObject(Db.BlockTableId, OpenMode.ForRead) as BlockTable;

                for (int i = 0; i < oIds.Length; i++)
                {

                    var ent = trans.GetObject(oIds[i], OpenMode.ForRead) as Entity;

                    var layerId = ent.LayerId;  

                    var lyTblRec = trans.GetObject(layerId, OpenMode.ForWrite) as LayerTableRecord;

                    if (lyTblRec.Name == "0") { return; }

                    lyTblRec.IsFrozen = true;
                    lyTblRec.IsHidden = true;

                }
                trans.Commit();

            }


        }

 


免責聲明!

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



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