明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9845|回复: 17

图层管理[实现图层的关闭打开、冻结解冻、锁定解锁、删除与图层相关联的实体对象]

    [复制链接]
发表于 2012-6-27 15:46:16 | 显示全部楼层 |阅读模式
/* 图层管理命令:LayerManagement[TT]
     *     |-关闭或打开图层命令:LayerClose[TC]
     *     |     |-[S]图选
     *     |     |-[F]反选
     *     |     |-[R]手输
     *     |     |-[T]打开
     *     |     |-[A]打开全部()
     *     |     
     *     |-冻结或解冻图层命令:LayerFrozen[TF]
     *     |     |-[S]图选
     *     |     |-[F]反选
     *     |     |-[R]手输
     *     |     |-[T]打开
     *     |     |-[A]解冻全部()
     *     |     
     *     |-锁定或解锁图层命令:LayerLock[TS]
     *     |     |-[S]图选
     *     |     |-[F]反选
     *     |     |-[R]手输
     *     |     |-[T]打开
     *     |     |-[A]解锁全部()
     *     |     
     *     |-打开/解冻/解锁所有图层命令:LayerOpenAll[TA]
     *     |     |-[A]打开解冻解锁所有图层
     *     |     |-[C]打开
     *     |     |-[F]解冻
     *     |     |-[S]解锁
     *     |
     *     |-删除与图层关联的对象命令:LayerDelete[TD]  
     *     |     |-[S]图选
     *     |     |-[F]反选
     *     |     |-[R]手输
     */




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +3 金钱 +30 收起 理由
雪山飞狐_lzh + 3 + 30 赞一个!

查看全部评分

 楼主| 发表于 2012-6-28 08:44:16 | 显示全部楼层
狐哥,你终于出来,你的隐身真好,一年多了一点音讯都没,大伙还以为你出了什么事呢。差一点大伙一起要报警寻人了。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-29 00:36:56 | 显示全部楼层
是什么语言啊
 楼主| 发表于 2012-6-27 15:49:36 | 显示全部楼层
  1.         /// <summary>
  2.         /// 用户输入关键字数组
  3.         /// </summary>
  4.         private string[] array = new string[] { "S", "F", "R", "T", "A" };
  5.         private string strMessage = "\n请输入图层名称关键或全称";

  6.         /// <summary>
  7.         /// 关闭或打开图层
  8.         /// </summary>
  9.         [CommandMethod("LayerClose", "TC", CommandFlags.Modal)]
  10.         public void CloseLayer()
  11.         {
  12.             string message = "\n图层关闭或打开:[图选(S)/反选(F)/手输(R)/打开(T)/打开全部(A)]<默认S>";
  13.             LayerCommandCalls(message, LayerStatus.CloseOrOpenLayer);
  14.         }

  15.         /// <summary>
  16.         /// 冻结或解冻图层
  17.         /// </summary>
  18.         [CommandMethod("LayerFrozen", "TF", CommandFlags.Modal)]
  19.         public void FrozenLayer()
  20.         {
  21.             string message = "\n图层冻结或解冻:[图选(S)/反选(F)/手输(R)/解冻(T)/解冻全部(A)]<默认S>";
  22.             LayerCommandCalls(message, LayerStatus.FrozenOrUnFrozenLayer);
  23.         }

  24.         /// <summary>
  25.         /// 锁定或解锁图层
  26.         /// </summary>
  27.         [CommandMethod("LayerLock", "TS", CommandFlags.Modal)]
  28.         public void LockLayer()
  29.         {
  30.             string message = "\n图层锁定或解锁:[图选(S)/反选(F)/手输(R)/解锁(T)/解锁全部(A)]<默认S>";
  31.             LayerCommandCalls(message, LayerStatus.LockOrUnLockLayer);
  32.         }
 楼主| 发表于 2012-6-27 15:49:59 | 显示全部楼层
  1.         /// <summary>
  2.         /// 打开/解冻/解锁所有图层
  3.         /// </summary>
  4.         [CommandMethod("LayerOpenAll", "TA", CommandFlags.Modal)]
  5.         public void OpenUnFrozenUnlockLayer()
  6.         {
  7.             bool IsOpen = false;
  8.             bool IsUnFzozen = false;
  9.             bool IsUnLock = false;
  10.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  11.             try
  12.             {
  13.                 string message = "\n[打开解冻解锁所有图层(A)/打开(C)/解冻(F)/解锁(S)]<默认A>";
  14.                 string key = this.Keywords(message, new string[] { "A", "C", "F", "S" });
  15.                 if (!string.IsNullOrEmpty(key))
  16.                 {
  17.                     switch (key)
  18.                     {
  19.                         case "C"://关闭或打开图层
  20.                             IsOpen = true;
  21.                             break;
  22.                         case "F"://冻结或解冻图层
  23.                             IsUnFzozen = true;
  24.                             break;
  25.                         case "S"://锁定或解锁图层
  26.                             IsUnLock = true;
  27.                             break;
  28.                         case "A"://打开/解冻/解锁所有图层
  29.                             IsOpen = true;
  30.                             IsUnFzozen = true;
  31.                             IsUnLock = true;
  32.                             break;
  33.                         default:
  34.                             break;
  35.                     }

  36.                     foreach (string item in this.GetAllLayerName())
  37.                     {
  38.                         //关闭或打开图层
  39.                         if (IsOpen)
  40.                             this.LayerOperating(LayerStatus.CloseOrOpenLayer, item, false, false);
  41.                         //锁定或解锁图层
  42.                         if (IsUnLock)
  43.                             this.LayerOperating(LayerStatus.LockOrUnLockLayer, item, false, false);
  44.                         //冻结或解冻图层
  45.                         if (IsUnFzozen)
  46.                             this.LayerOperating(LayerStatus.FrozenOrUnFrozenLayer, item, false, false);
  47.                     }

  48.                     //解冻需要刷新视图
  49.                     if (IsUnFzozen)
  50.                     {
  51.                         Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute("REGEN\r", true, false, false);
  52.                     }
  53.                 }
  54.             }
  55.             catch (System.Exception ex)
  56.             {
  57.                 ed.WriteMessage("图层打开/解冻/解锁发生错误:" + ex.Message);
  58.             }
  59.         }

  60.         /// <summary>
  61.         /// 删除与图层关联的对象
  62.         /// </summary>
  63.         [CommandMethod("LayerDelete", "TD", CommandFlags.Modal)]
  64.         public void DeleteLayer()
  65.         {
  66.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  67.             try
  68.             {
  69.                 this.strMessage = "\n请输入图层名全称";
  70.                 string message = "\n删除图层关联的对象:[图选(S)/反选(F)/手输(R)]<默认S>";
  71.                 string key = this.Keywords(message, new string[] { "S", "F", "R" });
  72.                 string LayerName = string.Empty;
  73.                 if (!string.IsNullOrEmpty(key))
  74.                 {
  75.                     switch (key)
  76.                     {
  77.                         case "S":
  78.                         case "F":
  79.                             LayerName = this.SelectEntityGetLayerName();
  80.                             break;
  81.                         case "R":
  82.                             LayerName = this.ImportLayerName();
  83.                             break;
  84.                         default:
  85.                             break;
  86.                     }

  87.                     Database db = HostApplicationServices.WorkingDatabase;
  88.                     using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  89.                     {
  90.                         using (Transaction trans = db.TransactionManager.StartTransaction())
  91.                         {
  92.                             BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
  93.                             foreach (ObjectId btrid in bt)    //遍历块表
  94.                             {
  95.                                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrid, OpenMode.ForWrite);
  96.                                 foreach (ObjectId eid in btr) //遍历块表记录
  97.                                 {
  98.                                     Entity ent = trans.GetObject(eid, OpenMode.ForWrite) as Entity;
  99.                                     if (ent != null)
  100.                                     {
  101.                                         if (key.ToUpper() == "F")
  102.                                         {
  103.                                             if (ent.Layer.ToUpper() != LayerName.ToUpper())
  104.                                             {
  105.                                                 ent.Erase();
  106.                                             }
  107.                                         }
  108.                                         else
  109.                                         {
  110.                                             if (ent.Layer.ToUpper() == LayerName.ToUpper())
  111.                                             {
  112.                                                 ent.Erase();
  113.                                             }
  114.                                         }
  115.                                     }
  116.                                 }
  117.                             }
  118.                             trans.Commit();
  119.                         }
  120.                     }
  121.                 }
  122.             }
  123.             catch (System.Exception ex)
  124.             {
  125.                 ed.WriteMessage("图层打开/解冻/解锁发生错误:" + ex.Message);
  126.             }
  127.         }
 楼主| 发表于 2012-6-27 15:50:48 | 显示全部楼层
  1. /// <summary>
  2.         /// 图层管理
  3.         /// </summary>
  4.         [CommandMethod("LayerManagement", "TT", CommandFlags.Modal)]
  5.         public void LayerManagement()
  6.         {
  7.             string message = "\n图层管理:[关闭(C)/冻结(F)/锁定(S)/删除(D)/打开解冻解锁所有图层(A)]<默认C>";
  8.             string key = this.Keywords(message, new string[] { "C", "F", "S", "D", "A" });
  9.             if (!string.IsNullOrEmpty(key))
  10.             {
  11.                 switch (key)
  12.                 {
  13.                     case "C"://关闭或打开图层
  14.                         this.CloseLayer();
  15.                         break;
  16.                     case "F"://冻结或解冻图层
  17.                         this.FrozenLayer();
  18.                         break;
  19.                     case "S"://锁定或解锁图层
  20.                         this.LockLayer();
  21.                         break;
  22.                     case "D"://删除与图层关联的对象
  23.                         this.DeleteLayer();
  24.                         break;
  25.                     case "A"://打开/解冻/解锁所有图层
  26.                         this.OpenUnFrozenUnlockLayer();
  27.                         break;
  28.                     default:
  29.                         break;
  30.                 }
  31.             }
  32.         }

  33.         /// <summary>
  34.         /// 图层命令调用
  35.         /// </summary>
  36.         /// <param name="message">提示字符串</param>
  37.         /// <param name="layerstatus">图层状态</param>
  38.         private void LayerCommandCalls(string message, LayerStatus layerstatus)
  39.         {
  40.             string key = this.Keywords(message, this.array);
  41.             if (!string.IsNullOrEmpty(key))
  42.             {
  43.                 switch (key)
  44.                 {
  45.                     case "S":
  46.                         LayerOperating(layerstatus, this.SelectEntityGetLayerName(), false, true);
  47.                         break;
  48.                     case "F":
  49.                         LayerOperating(layerstatus, this.SelectEntityGetLayerName(), true, true);
  50.                         break;
  51.                     case "R":
  52.                         LayerOperating(layerstatus, this.ImportLayerName(), false, true);
  53.                         break;
  54.                     case "T":
  55.                         LayerOperating(layerstatus, this.ImportLayerName(), false, false);
  56.                         Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute("REGEN\r", true, false, false);
  57.                         break;
  58.                     case "A":
  59.                         foreach (string item in this.GetAllLayerName())
  60.                         {
  61.                             LayerOperating(layerstatus, item, false, false);
  62.                         }
  63.                         Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.SendStringToExecute("REGEN\r", true, false, false);
  64.                         break;
  65.                     default:
  66.                         break;
  67.                 }
  68.             }
  69.         }

  70.         /// <summary>
  71.         /// 获取所有图层的名称
  72.         /// </summary>
  73.         /// <returns></returns>
  74.         private List<string> GetAllLayerName()
  75.         {
  76.             List<string> LayerNames = new List<string>();
  77.             Database db = HostApplicationServices.WorkingDatabase;

  78.             using (Transaction trans = db.TransactionManager.StartTransaction())
  79.             {
  80.                 LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForRead);
  81.                 foreach (ObjectId layerId in lt)
  82.                 {
  83.                     LayerTableRecord ltr = (LayerTableRecord)trans.GetObject(layerId, OpenMode.ForRead);
  84.                     LayerNames.Add(ltr.Name);
  85.                 }
  86.                 trans.Commit();
  87.             }

  88.             return LayerNames;
  89.         }

  90.         /// <summary>
  91.         /// 提示用户输入关键字
  92.         /// </summary>
  93.         /// <param name="message">提示字符串</param>
  94.         /// <param name="keywords">关键字数组</param>
  95.         /// <returns>用户输入的字符</returns>
  96.         private string Keywords(string message, string[] keywords)
  97.         {
  98.             try
  99.             {
  100.                 Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  101.                 PromptKeywordOptions pko = new PromptKeywordOptions(message);
  102.                 for (int i = 0; i < keywords.Length; i++)
  103.                 {
  104.                     pko.Keywords.Add(keywords, keywords, keywords, false, true);
  105.                 }
  106.                 pko.Keywords.Default = keywords[0];
  107.                 //pko.AllowNone = true;
  108.                 PromptResult k = ed.GetKeywords(pko);
  109.                 if (k.Status == PromptStatus.OK)
  110.                 {
  111.                     return k.StringResult;
  112.                 }
  113.                 else
  114.                 {
  115.                     return string.Empty;
  116.                 }
  117.             }
  118.             catch (System.Exception ex)
  119.             {
  120.                 throw ex;
  121.             }
  122.         }

  123.         /// <summary>
  124.         /// 从图中选取实体对象,从中获得实体的图层名称
  125.         /// </summary>
  126.         /// <returns>图层名称</returns>
  127.         private string SelectEntityGetLayerName()
  128.         {
  129.             string strLayerName = string.Empty;
  130.             Database db = HostApplicationServices.WorkingDatabase;
  131.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

  132.             try
  133.             {
  134.                 using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  135.                 {
  136.                     PromptSelectionOptions pso = new PromptSelectionOptions();
  137.                     pso.MessageForAdding = "\n请选择对象";
  138.                     PromptSelectionResult psr = ed.GetSelection(pso);
  139.                     if (psr.Status == PromptStatus.OK)
  140.                     {
  141.                         SelectionSet ss = psr.Value;
  142.                         ObjectId[] objectIds = ss.GetObjectIds();

  143.                         using (Transaction trans = db.TransactionManager.StartTransaction())
  144.                         {
  145.                             // 遍历选择集.
  146.                             foreach (ObjectId objectId in objectIds)
  147.                             {
  148.                                 Entity entity = (Entity)trans.GetObject(objectId, OpenMode.ForRead);
  149.                                 strLayerName = entity.Layer;
  150.                             }
  151.                             trans.Commit();
  152.                         }
  153.                     }
  154.                 }
  155.             }
  156.             catch (System.Exception ex)
  157.             {
  158.                 throw ex;
  159.             }
  160.             return strLayerName;
  161.         }

  162.         /// <summary>
  163.         /// 获取输入图层名称关键或全称
  164.         /// </summary>
  165.         private string ImportLayerName()
  166.         {
  167.             string importLayerName = string.Empty;
  168.             Database db = HostApplicationServices.WorkingDatabase;
  169.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;

  170.             try
  171.             {
  172.                 using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  173.                 {
  174.                     PromptStringOptions pso = new PromptStringOptions(this.strMessage);
  175.                     PromptResult res = ed.GetString(pso);
  176.                     if (res.Status == PromptStatus.OK || res.Status == PromptStatus.None)
  177.                     {
  178.                         importLayerName = res.StringResult;
  179.                     }
  180.                 }
  181.             }
  182.             catch (System.Exception ex)
  183.             {
  184.                 throw ex;
  185.             }
  186.             return importLayerName;
  187.         }
 楼主| 发表于 2012-6-27 15:51:11 | 显示全部楼层
  1. /// <summary>
  2.         /// 图层操作
  3.         /// </summary>
  4.         /// <param name="layerstatus">图层状态</param>
  5.         /// <param name="LayerName">图层名称或关键字</param>
  6.         /// <param name="IsInvertSelection">是否反向选取</param>
  7.         /// <param name="IsTureOFlase">是与否</param>
  8.         private void LayerOperating(LayerStatus layerstatus, string LayerName, bool IsInvertSelection, bool IsTureOFlase)
  9.         {
  10.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  11.             try
  12.             {
  13.                 Database db = HostApplicationServices.WorkingDatabase;
  14.                 using (Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
  15.                 {
  16.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  17.                     {
  18.                         LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
  19.                         foreach (ObjectId layerId in lt)
  20.                         {
  21.                             LayerTableRecord ltr = (LayerTableRecord)trans.GetObject(layerId, OpenMode.ForWrite);
  22.                             if (!string.IsNullOrEmpty(LayerName))
  23.                             {
  24.                                 switch (layerstatus)
  25.                                 {
  26.                                     //关闭或打开图层
  27.                                     case LayerStatus.CloseOrOpenLayer:
  28.                                         CloseOrOpenLayer(LayerName, IsInvertSelection, IsTureOFlase, ltr);
  29.                                         break;

  30.                                     //锁定或解锁图层
  31.                                     case LayerStatus.LockOrUnLockLayer:
  32.                                         LockOrUnLockLayer(LayerName, IsInvertSelection, IsTureOFlase, ltr);
  33.                                         break;

  34.                                     //冻结或解冻图层
  35.                                     case LayerStatus.FrozenOrUnFrozenLayer:
  36.                                         FrozenOrUnFrozenLayer(LayerName, IsInvertSelection, IsTureOFlase, ltr,
  37.                                             (LayerTableRecord)trans.GetObject(db.Clayer, OpenMode.ForRead));
  38.                                         break;
  39.                                     default:
  40.                                         break;
  41.                                 }
  42.                             }
  43.                         }
  44.                         trans.Commit();
  45.                     }
  46.                 }
  47.             }
  48.             catch (System.Exception ex)
  49.             {
  50.                 ed.WriteMessage("图层操作发生错误:" + ex.Message);
  51.             }
  52.         }

  53.         /// <summary>
  54.         /// 关闭或打开图层
  55.         /// </summary>
  56.         /// <param name="LayerName">图层名称或关键字</param>
  57.         /// <param name="IsInvertSelection">是否反向选取</param>
  58.         /// <param name="IsClose">是否关闭</param>
  59.         /// <param name="ltr">层表记录</param>
  60.         private void CloseOrOpenLayer(string LayerName, bool IsInvertSelection, bool IsClose, LayerTableRecord ltr)
  61.         {
  62.             //是否反向选取
  63.             if (IsInvertSelection)
  64.             {
  65.                 if (!ltr.Name.ToUpper().Contains(LayerName.ToUpper()))
  66.                 {
  67.                     ltr.IsOff = IsClose;
  68.                 }
  69.             }
  70.             else
  71.             {
  72.                 if (ltr.Name.ToUpper().Contains(LayerName.ToUpper()))
  73.                 {
  74.                     ltr.IsOff = IsClose;
  75.                 }
  76.             }
  77.         }

  78.         /// <summary>
  79.         /// 冻结或解冻图层
  80.         /// </summary>
  81.         /// <param name="LayerName">图层名称或关键字</param>
  82.         /// <param name="IsInvertSelection">是否反向选取</param>
  83.         /// <param name="IsFrozen">是否冻结</param>
  84.         /// <param name="ltr">层表记录</param>
  85.         /// <param name="curLtr">当前图层</param>
  86.         private void FrozenOrUnFrozenLayer(string LayerName, bool IsInvertSelection, bool IsFrozen, LayerTableRecord ltr, LayerTableRecord curLtr)
  87.         {
  88.             //是否反向选取
  89.             if (IsInvertSelection)
  90.             {
  91.                 if (!ltr.Name.ToUpper().Contains(LayerName.ToUpper()))
  92.                 {
  93.                     //判断是否为当前图层,当前图层不能冻结
  94.                     if (IsFrozen && ltr.Name != curLtr.Name)
  95.                     {
  96.                         ltr.IsFrozen = true;
  97.                     }
  98.                     else
  99.                     {
  100.                         if (ltr.IsFrozen == true)
  101.                             ltr.IsFrozen = false;
  102.                     }
  103.                 }
  104.             }
  105.             else
  106.             {
  107.                 if (ltr.Name.ToUpper().Contains(LayerName.ToUpper()))
  108.                 {
  109.                     //判断是否为当前图层,当前图层不能冻结
  110.                     if (IsFrozen && ltr.Name != curLtr.Name)
  111.                     {
  112.                         ltr.IsFrozen = true;
  113.                     }
  114.                     else
  115.                     {
  116.                         if (ltr.IsFrozen == true)
  117.                             ltr.IsFrozen = false;
  118.                     }
  119.                 }
  120.             }
  121.         }

  122.         /// <summary>
  123.         /// 锁定或解锁图层
  124.         /// </summary>
  125.         /// <param name="LayerName">图层名称或关键字</param>
  126.         /// <param name="IsInvertSelection">是否反向选取</param>
  127.         /// <param name="IsLock">是否关闭</param>
  128.         /// <param name="ltr">层表记录</param>
  129.         private void LockOrUnLockLayer(string LayerName, bool IsInvertSelection, bool IsLock, LayerTableRecord ltr)
  130.         {
  131.             //是否反向选取
  132.             if (IsInvertSelection)
  133.             {
  134.                 if (!ltr.Name.ToUpper().Contains(LayerName.ToUpper()))
  135.                 {
  136.                     ltr.IsLocked = IsLock;
  137.                 }
  138.             }
  139.             else
  140.             {
  141.                 if (ltr.Name.ToUpper().Contains(LayerName.ToUpper()))
  142.                 {
  143.                     ltr.IsLocked = IsLock;
  144.                 }
  145.             }
  146.         }
发表于 2012-6-27 20:33:14 | 显示全部楼层
没地方加威望了 我已经Out了 呵呵
发表于 2012-6-28 07:09:01 | 显示全部楼层
本帖最后由 chpmould 于 2012-6-28 07:09 编辑

支持一个,很好的贴子...
发表于 2012-6-28 09:51:07 | 显示全部楼层
。。。
发表于 2012-7-2 18:21:05 | 显示全部楼层
新新手弱弱的问,要怎样执行程序?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 09:50 , Processed in 0.276995 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表