当前位置: 首页 > news >正文

cad c#二次开发 图层封装 获取当前层

    public static class 图层助手{/// <summary>/// 将模型空间所有实体的图层修改为当前文档的当前图层/// </summary>/// <param name="doc">当前文档对象</param>/// <param name="editor">CAD编辑器对象(用于输出提示信息)</param>/// <returns>成功修改的实体数量</returns>public static int 改所有实体到当前图层(Document doc, Editor editor)
{int modifiedCount = 0;string currentLayer = ""; // 当前图层名称// 1. 获取当前图层名称(关键:从文档获取当前活动图层)try{//object clayerValue = doc.Database.Clayer;object clayerValue = Application.GetSystemVariable("CLAYER");currentLayer = clayerValue.ToString();if (string.IsNullOrEmpty(currentLayer)){currentLayer = "0"; // 默认图层名称}}catch (Exception ex){}if (string.IsNullOrEmpty(currentLayer)){currentLayer = "0"; // 默认图层名称}using (Transaction trans = doc.TransactionManager.StartTransaction()){try{// 2. 打开模型空间块表记录(写模式,因为需要修改实体)BlockTable blockTable = trans.GetObject(doc.Database.BlockTableId, OpenMode.ForRead) as BlockTable;BlockTableRecord modelSpace = trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;// 3. 遍历模型空间所有实体IDforeach (ObjectId entityId in modelSpace){Entity entity = trans.GetObject(entityId, OpenMode.ForWrite) as Entity;if (entity == null || entity.IsErased) continue; // 跳过无效实体// 4. 执行图层修改(仅当当前图层不同时操作)if (entity.Layer != currentLayer){entity.Layer = currentLayer; // 直接赋值图层名称modifiedCount++;}entity.Dispose(); // 显式释放实体(虽然事务结束会自动释放,但显式调用更安全)}trans.Commit(); // 提交事务// editor.WriteMessage($"\n成功修改 {modifiedCount} 个实体的图层到【{currentLayer}】");}catch (System.Exception ex){trans.Abort(); // 异常时回滚事务//editor.WriteMessage($"\n批量改图层失败:{ex.Message}");}}return modifiedCount;
}public static string 获取当前层(this Database db) {Document doc = Application.DocumentManager.MdiActiveDocument;string currentLayer = ""; // 当前图层名称// 1. 获取当前图层名称(关键:从文档获取当前活动图层)try{//object clayerValue = doc.Database.Clayer;object clayerValue = Application.GetSystemVariable("CLAYER");currentLayer = clayerValue.ToString();if (string.IsNullOrEmpty(currentLayer)){currentLayer = "0"; // 默认图层名称}}catch (Exception ex){}if (string.IsNullOrEmpty(currentLayer)){currentLayer = "0"; // 默认图层名称}return currentLayer;#region//using (Transaction trans = doc.TransactionManager.StartTransaction())//{//    try//    {//        // 2. 打开模型空间块表记录(写模式,因为需要修改实体)//        BlockTable blockTable = trans.GetObject(//            doc.Database.BlockTableId, OpenMode.ForRead//        ) as BlockTable;//        BlockTableRecord modelSpace = trans.GetObject(//            blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite//        ) as BlockTableRecord;//        // 3. 遍历list实体ID//        ents.ForEach(ent =>//        {//            ent.Layer = currentLayer;//        }); // 直接赋值图层名称 //        trans.Commit(); // 提交事务//                        // editor.WriteMessage($"\n成功修改 {modifiedCount} 个实体的图层到【{currentLayer}】");//    }//    catch (System.Exception ex)//    {//        trans.Abort(); // 异常时回滚事务//                       //editor.WriteMessage($"\n批量改图层失败:{ex.Message}");//    }//}#endregion}/// <summary>/// 获取指定图层的颜色索引/// </summary>/// <param name="layerName">目标图层名称</param>/// <returns>图层的颜色索引(若不存在返回-1)</returns>public static int 获取图层颜色(this string layerName ){// 获取当前文档和数据库Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;// 使用事务保证数据库操作安全using (Transaction tr = db.TransactionManager.StartTransaction()){try{// 打开图层表(只读模式)LayerTable layerTable = tr.GetObject(db.LayerTableId,OpenMode.ForRead) as LayerTable;// 检查图层是否存在if (!layerTable.Has(layerName)){return 0; // 返回表示图层不存在}// 获取图层记录(只读模式)ObjectId layerId = layerTable[layerName];LayerTableRecord layer = tr.GetObject(layerId,OpenMode.ForRead) as LayerTableRecord;// 返回颜色索引return layer.Color.ColorIndex;}finally{tr.Commit(); // 提交事务(只读操作仍需要提交)}}}}
 public static  class 图层助手1{public static void SetCurrentLayer(this Database db, Entity ent){if (db == null||ent is null||ent.IsErased) return;try{using (Transaction tr = db.TransactionManager.StartTransaction()){var getent = tr.GetObject(ent.ObjectId, OpenMode.ForWrite) as Entity;//LayerTable layerTable = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;//var ltr = tr.GetObject(db.Clayer, OpenMode.ForRead) as LayerTableRecord;//ent.Layer = ltr.Name;getent.LayerId = db.Clayer;tr.Commit();}}catch (Exception ex){Z.WriteEX(ex);}}/// <summary>/// 将指定的图层设置为当前层/// </summary>/// <param name="db">数据库对象</param>/// <param name="layerName">图层名</param>/// <returns>如果设置成功,则返回ture</returns>public static bool SetCurrentLayer(this Database db, string layerName){#region 前置校验(避免非法输入)if (string.IsNullOrEmpty(layerName))return false; // 图层名不能为空// 检查图层名是否包含AutoCAD禁止的特殊字符(如<、>、:等)if (layerName.IndexOfAny(new[] { '<', '>', ':', '"', '/', '\\', '|', '?', '*' }) != -1)return false;#endregion// 获取当前文档(确保在AutoCAD界面中运行)Document doc = Application.DocumentManager.MdiActiveDocument;if (doc == null) return false;// 启动事务(关键!保证数据库操作的原子性)using (Transaction tr = db.TransactionManager.StartTransaction()){try{#region 步骤1:获取图层表(LayerTable)// 以读模式打开图层表(所有图层的容器)LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;if (lt == null) return false; // 图层表获取失败#endregion#region 步骤2:检查图层是否存在if (!lt.Has(layerName))return false; // 图层不存在#endregion#region 步骤3:获取目标图层IDObjectId targetLayerId = lt[layerName];#endregion#region 步骤4:判断是否已为当前图层(避免重复设置)// 使用 LayerManager 获取当前图层ID(新版本推荐方式)if (db.Clayer == targetLayerId)return false; // 已是当前图层#endregion#region 步骤5:设置当前图层(新版本推荐方式)db.Clayer = targetLayerId;#endregiontr.Commit(); // 提交事务(所有操作生效)return true;}catch (Exception ex){tr.Abort(); // 异常时回滚事务doc.Editor.WriteMessage($"\n设置当前图层失败:{ex.Message}");return false;}}}public static string SetLayer(this Database db, Entity ent, string layname){if (ent.Layer == layname) return layname;// Database db = HostApplicationServices.WorkingDatabase;Document mdiActiveDocument = Application.DocumentManager.MdiActiveDocument;using (Transaction transaction = db.TransactionManager.StartTransaction()){LayerTable layerTable = transaction.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;if (!layerTable.Has(layname)){LayerTableRecord layerTableRecord = new LayerTableRecord();layerTableRecord.Color = Color.FromColorIndex(ColorMethod.ByAci, 0);layerTableRecord.Name = layname;layerTable.UpgradeOpen();layerTable.Add(layerTableRecord);transaction.AddNewlyCreatedDBObject(layerTableRecord, add: true);}//// 以只读方式打开块表   Open the Block table for read//BlockTable acBlkTbl = transaction.GetObject(db.BlockTableId,//                             OpenMode.ForRead) as BlockTable;//// 以写方式打开模型空间块表记录   Open the Block table record Model space for write//BlockTableRecord acBlkTblRec = transaction.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],//                                OpenMode.ForWrite) as BlockTableRecord;//// 设置图层Entity entInTrans = transaction.GetObject(ent.ObjectId, OpenMode.ForWrite) as Entity;entInTrans.Layer = layname;////acBlkTblRec.AppendEntity(ent);//transaction.AddNewlyCreatedDBObject(ent, true);// Save the changes and dispose of the transactiontransaction.Commit();}return layname;}/// <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;}public enum AddLayerStatuts{AddLayerOK,IllegalLayerName,LayerNameExist}//添加图层的返回值public struct AddLayerResult{public AddLayerStatuts statuts;public string layerName;}//修改图层属性的返回状态public enum ChangeLayerPropertyStatus{ChangeOK,LayerIsNotExist}}

CAD 二次开发、插件定制↓↓↓

http://www.dtcms.com/a/318341.html

相关文章:

  • 《第十一篇》深入解析 `embedding.py`:基于 SiliconFlow API 的文本向量化服务
  • 《算法导论》笔记——归并排序及循环不变式证明
  • [AI 生成] 大数据数仓面试题
  • 无人机共轴双桨动力测试-如何确认桨叶最优间距(效率/噪音/重量/尺寸)
  • 无人机航拍数据集|第3期 无人机军事目标目标检测YOLO数据集3556张yolov11/yolov8/yolov5可训练
  • 2025年高防IP隐身术:四层架构拆解源站IP“消失之谜”
  • 笔试——Day30
  • 吴声 2025 年度演讲:“场景革命十年”的多面审视,理念重复之嫌!
  • 笔记html模板
  • OpenHarmony源码解析之init进程
  • 题解:CF1453D Checkpoints
  • 看不见的伪造痕迹:AI时代的鉴伪攻防战
  • 微信小程序多媒体功能实现
  • n8n循环处理完全指南
  • 工业自动化中Modbus RTU转Profibus DP网关的应用与温度监控实现
  • 昇思+昇腾开发板:DeepSeek-R1-Distill-Qwen-1.5B 模型推理部署与 JIT 优化实践
  • spring i18n 词条英文下格式化占位符不生效 问题排查处理
  • Kafka 重平衡(Rebalance)机制
  • UniStorm 5.3.0 + Unity2022 + URP配置说明
  • 机器学习概述
  • 微调训练时,ignore_empty_think是怎么保护模型的思考能力?
  • 自然语言处理的相关概念与问题
  • Redis面试精讲 Day 12:Redis Sentinel哨兵机制详解
  • 非机动车识别mAP↑28%!陌讯多模态融合算法在智慧交通的实战解析
  • PyTorch生成式人工智能——Hugging Face环境配置与应用详解
  • leetcode 3479. 水果成篮 III 中等
  • 74.5%登顶SWE-bench:Claude Opus 4.1如何重塑AI编程格局
  • AdGuard 安卓修改版:全方位广告拦截与隐私保护专家
  • 将英文PDF文件完整地翻译成中文的4类方式
  • 【机器学习篇】02day.python机器学习篇Scikit-learn基础操作