c# cad 二次开发 类库 netload 图层操作、创建图层、删除图层、设置当前图层等

该代码段展示了使用C#进行CAD二次开发,实现对图层的管理,包括添加、删除、修改颜色、锁定/解锁、设置当前图层以及删除未使用图层等功能。通过图形数据库操作,确保图层操作的正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c# cad 二次开发 类库 netload 图层操作、创建图层、删除图层、设置当前图层等
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _10图层操作
{
//添加图层的返回状态
public enum AddLayerStatuts
{
AddLayerOK,
IllegalLayerName,
LayerNameExist
}
//添加图层的返回值
public struct AddLayerResult
{
public AddLayerStatuts statuts;
public string layerName;
}
//修改图层属性的返回状态
public enum ChangeLayerPropertyStatus
{
ChangeOK,
LayerIsNotExist

}
public static partial class LayerTool
{
    /// <summary>
    /// 添加图层
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="layerName">图层名</param>
    /// <returns>AddLayerResult</returns>
    public static AddLayerResult AddLayer(this Database db, string layerName)
    {
        //声明AddLayerResult类型的数据,用户返回
        AddLayerResult res = new AddLayerResult() ;
        try
        {
            SymbolUtilityServices.ValidateSymbolName(layerName, false);
        }
        catch (Exception)
        {
            res.statuts = AddLayerStatuts.IllegalLayerName;
            return res;
        }
        
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            //新建层表记录
            if (!lt.Has(layerName))
            {
                
                LayerTableRecord ltr = new LayerTableRecord();
                //判断要创建的图层名是否已经存在,不存在则创建
                ltr.Name = layerName;
                //升级层表打开权限
                lt.UpgradeOpen();
                lt.Add(ltr);
                //降低层表打开权限
                lt.DowngradeOpen();
                trans.AddNewlyCreatedDBObject(ltr, true);
                trans.Commit();
                res.statuts = AddLayerStatuts.AddLayerOK;
                res.layerName = layerName;
            }
            else
            {
                res.statuts = AddLayerStatuts.LayerNameExist;
            } 
        }
        return res;
    }
    /// <summary>
    /// 修改图层颜色
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="LayerName">图层名</param>
    /// <param name="colorIndex">图层颜色</param>
    /// <returns>ChangeLayerPropertyStatus</returns>
    public static ChangeLayerPropertyStatus ChangeLayerColor(this Database db, string LayerName, short colorIndex)
    {
        ChangeLayerPropertyStatus status;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            //判断指定的图形名是否存在
            if (lt.Has(LayerName))
            {

                LayerTableRecord ltr = (LayerTableRecord)lt[LayerName].GetObject(OpenMode.ForWrite);
                ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndex);
                trans.Commit();
                status = ChangeLayerPropertyStatus.ChangeOK;
            }
            else
            {
                status = ChangeLayerPropertyStatus.LayerIsNotExist;
            }
        }
        return status;
    }
    /// <summary>
    /// 锁定图层
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="LayerName">图层名</param>
    /// <returns>bool</returns>
    public static bool LockLayer(this Database db, string LayerName)
    {
        bool isOk = true;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            //判断指定的图形名是否存在
            if (lt.Has(LayerName))
            {

                LayerTableRecord ltr = (LayerTableRecord)lt[LayerName].GetObject(OpenMode.ForWrite);
                ltr.IsLocked = true;
                trans.Commit();
            }
            else
            {
                isOk = false;
            }
        }
        return isOk;
    }
    /// <summary>
    /// 解除锁定图层
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="LayerName">图层名</param>
    /// <returns>bool</returns>
    public static bool UnLockLayer(this Database db, string LayerName)
    {
        bool isOk = true;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            //判断指定的图形名是否存在
            if (lt.Has(LayerName))
            {

                LayerTableRecord ltr = (LayerTableRecord)lt[LayerName].GetObject(OpenMode.ForWrite);
                ltr.IsLocked = false;
                trans.Commit();
            }
            else
            {
                isOk = false;
            }
        }
        return isOk;
    }
    /// <summary>
    /// 修改图层的线宽
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="LayerName">图层名</param>
    /// <param name="lineWeight">线宽</param>
    /// <returns>bool</returns>
    public static bool ChangleLineWeight(this Database db, string LayerName, LineWeight lineWeight)
    {
        bool isOk = true;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            //判断指定的图形名是否存在
            if (lt.Has(LayerName))
            {

                LayerTableRecord ltr = (LayerTableRecord)lt[LayerName].GetObject(OpenMode.ForWrite);
                ltr.LineWeight = lineWeight;
                trans.Commit();
            }
            else
            {
                isOk = false;
            }
        }
        return isOk;
    }
    /// <summary>
    /// 设置当前图层
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="LayerName">图层名</param>
    /// <returns>bool</returns>
    public static bool SetCurrentLayer(this Database db, string LayerName)
    {
        bool isSetOk = false;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            //判断要设置的图层名是否存在
            if (lt.Has(LayerName))
            {
                //获取指定图层名的ObjectId
                ObjectId layerId = lt[LayerName];
                //判断要设置的图形是否已是当前图层
                if (db.Clayer != layerId)
                {
                    db.Clayer = layerId; 
                }
                isSetOk = true;
            }
            trans.Commit();
        }
        return isSetOk;
    }
    /// <summary>
    /// 返回所有层表记录
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <returns>List<LayerTableRecord></returns>
    public static List<LayerTableRecord> GetAllLayers(this Database db)
    {
        List<LayerTableRecord> layerList = new List<LayerTableRecord>();
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            lt.GenerateUsageData();
            foreach (ObjectId item in lt)
            {
                LayerTableRecord ltr = (LayerTableRecord)item.GetObject(OpenMode.ForRead);
                layerList.Add(ltr);
            }
        }
        return layerList;
    }
    /// <summary>
    /// 获取所有图层名
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <returns>List<string></returns>
    public static List<string> GetAllLayersName(this Database db)
    {
        List<string> layerNamesList = new List<string>();
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            //打开层表
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            foreach (ObjectId item in lt)
            {
                LayerTableRecord ltr = (LayerTableRecord)item.GetObject(OpenMode.ForRead);
                layerNamesList.Add(ltr.Name);
            }
        }
        return layerNamesList;
    }
    /// <summary>
    /// 删除图形
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="layerName">图层名</param>
    /// <returns>bool</returns>
    public static bool DeleteLayer(this Database db, string layerName)
    {

        if (layerName == "0" || layerName == "Defpoints") return false;
        bool isDeleteOK = false;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            lt.GenerateUsageData(); 
            if (lt.Has(layerName))
            {
                LayerTableRecord ltr = (LayerTableRecord)lt[layerName].GetObject(OpenMode.ForWrite);
                if (!ltr.IsUsed && db.Clayer != lt[layerName])
                {
                    ltr.Erase();
                    isDeleteOK = true;
                }
            }
            else
            {
                isDeleteOK = true;
            }
            trans.Commit();
        }
        return isDeleteOK;
    }
    /// <summary>
    /// 删除所有未使用的图形
    /// </summary>
    /// <param name="db"></param>
    public static void DeleteNotUsedLayer(this Database db)
    {
        
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            lt.GenerateUsageData();
            foreach (ObjectId item in lt)
            {
                LayerTableRecord ltr = (LayerTableRecord)item.GetObject(OpenMode.ForWrite);
                if (!ltr.IsUsed)
                {
                    ltr.Erase();
                }
            }
            trans.Commit();
        }
    }

    /// <summary>
    /// 强行删除图形及图形上的所有实体对象
    /// </summary>
    /// <param name="db">图形数据库</param>
    /// <param name="layerName">图层名</param>
    /// <param name="delete"></param>
    /// <returns></returns>
    public static bool DeleteLayer(this Database db, string layerName,bool delete)
    {

        if (layerName == "0" || layerName == "Defpoints") return false;
        bool isDeleteOK = false;
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
            lt.GenerateUsageData();
            if (lt.Has(layerName))
            {
                LayerTableRecord ltr = (LayerTableRecord)lt[layerName].GetObject(OpenMode.ForWrite);
                if (delete)
                {
                    if (ltr.IsUsed)
                    {
                        ltr.deleteAllEntityInLayer();  
                    }
                    if (db.Clayer == ltr.ObjectId)
                    {
                        db.Clayer = lt["0"];
                    }
                    ltr.Erase();
                    isDeleteOK = true;
                }
                else
                {
                    if (!ltr.IsUsed && db.Clayer != lt[layerName])
                    {
                        ltr.Erase();
                        isDeleteOK = true;
                    }
                }   
            }
            else
            {
                isDeleteOK = true;
            }
            trans.Commit();
        }
        return isDeleteOK;
    }
    /// <summary>
    /// 删除指定图形上的所有实体对象
    /// </summary>
    /// <param name="ltr"></param>
    public static void deleteAllEntityInLayer(this LayerTableRecord ltr)
    {
        Database db = HostApplicationServices.WorkingDatabase;
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
        TypedValue[] value = new TypedValue[]
        {
            new TypedValue((int)DxfCode.LayerName,ltr.Name)
        };
        SelectionFilter filter = new SelectionFilter(value);
        PromptSelectionResult psr = ed.SelectAll();
        if (psr.Status == PromptStatus.OK)
        {
            ObjectId[] ids = psr.Value.GetObjectIds();
            using(Transaction trans = db.TransactionManager.StartTransaction())
            {
                for (int i = 0; i < ids.Length; i++)
                {
                    Entity ent = (Entity)ids[i].GetObject(OpenMode.ForWrite);
                    ent.Erase();
                }
                trans.Commit();
            }
        }
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DK业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值