明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1710|回复: 1

group命令的深度定制和应用

[复制链接]
发表于 2012-12-9 17:05:49 | 显示全部楼层 |阅读模式
  1. public string GroupJudge()
  2.         {
  3.             Database db = HostApplicationServices.WorkingDatabase;
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  6.             PromptEntityResult per = doc.Editor.GetEntity("\nspecify an object in a group");
  7.             if (per.Status == PromptStatus.OK)
  8.             {
  9.                 string groupname = GroupJudge(per.ObjectId);
  10.                 if (groupname != "")
  11.                 {
  12.                     return groupname;
  13.                 }
  14.             }
  15.             ed.WriteMessage("\nno group will be edit");            
  16.             return "";//方法定义有输出结果,需指定默认返回值            
  17.         }

  18.         public string GroupJudge(ObjectId oid)
  19.         {
  20.             Database db = HostApplicationServices.WorkingDatabase;
  21.             Document doc = Application.DocumentManager.MdiActiveDocument;
  22.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  23.             using (Transaction trans = db.TransactionManager.StartTransaction())
  24.             {
  25.                 Entity ent = (Entity)trans.GetObject(oid, OpenMode.ForWrite, false);
  26.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  27.                 Group gro;
  28.                 string groname = "";
  29.                 int i = 0;
  30.                 Stack mystack = new Stack();
  31.                 foreach (DBDictionaryEntry groRec in GroDic)//DBDictionary由DBDictionaryEntry组成
  32.                 {
  33.                     gro = (Group)trans.GetObject(groRec.Value, OpenMode.ForWrite);//Group继承自DBDictionaryEntry,并且DBDictionaryEntry正好就是Group
  34.                     if (gro.Has(ent))
  35.                     {                        
  36.                         groname = gro.Name;
  37.                         mystack.Push(groname);
  38.                         i++;
  39.                     }                                       
  40.                 }
  41.                 if (i == 1)
  42.                 {                    
  43.                     gro = (Group)trans.GetObject(GroDic.GetAt((string)mystack.Pop()), OpenMode.ForWrite);
  44.                     gro.SetHighlight(true);
  45.                     ed.WriteMessage(string.Format("\n{0},{1}", groname, Convert.ToString(i)));
  46.                     trans.Commit();
  47.                     return groname;
  48.                 }
  49.                 while (mystack.Count != 0)
  50.                 {
  51.                     gro = (Group)trans.GetObject(GroDic.GetAt((string)mystack.Pop()), OpenMode.ForWrite);
  52.                     gro.SetHighlight(true);
  53.                     PromptKeywordOptions pko = new PromptKeywordOptions(string.Format("\n{0},{1}", gro.Name, Convert.ToString(i)));
  54.                     pko.Keywords.Add("This");
  55.                     pko.Keywords.Add("Next");
  56.                     pko.Keywords.Default = "This";
  57.                     PromptResult pkr = doc.Editor.GetKeywords(pko);
  58.                     switch (pkr.StringResult)
  59.                     {
  60.                         case "This":
  61.                             trans.Commit();
  62.                             return gro.Name;
  63.                         case "Next":
  64.                             gro.SetHighlight(false);
  65.                             break;
  66.                         default:
  67.                             goto case "Next";
  68.                     }                        
  69.                 }               
  70.                 trans.Commit();
  71.             }
  72.             return "";//方法定义有输出结果,需指定默认返回值
  73.         }

  74.         [CommandMethod("gx")]//把所有组炸开
  75.         public void GroupAllExplode()
  76.         {
  77.             Database db = HostApplicationServices.WorkingDatabase;
  78.             Document doc = Application.DocumentManager.MdiActiveDocument;
  79.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  80.             using (Transaction trans = db.TransactionManager.StartTransaction())
  81.             {
  82.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  83.                 foreach (DBDictionaryEntry groRec in GroDic)
  84.                 {
  85.                     Group gro = (Group)trans.GetObject(groRec.Value, OpenMode.ForWrite);
  86.                     gro.Erase();
  87.                 }
  88.                 ed.WriteMessage("\nall group was explode");
  89.                 trans.Commit();
  90.             }            
  91.         }

  92.         [CommandMethod("gs")]//所有组组选
  93.         public void GroupAllSelectable()
  94.         {
  95.             Database db = HostApplicationServices.WorkingDatabase;
  96.             Document doc = Application.DocumentManager.MdiActiveDocument;
  97.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  98.             using (Transaction trans = db.TransactionManager.StartTransaction())
  99.             {
  100.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  101.                 foreach (DBDictionaryEntry groRec in GroDic)
  102.                 {
  103.                     Group gro = (Group)trans.GetObject(groRec.Value, OpenMode.ForWrite);
  104.                     gro.Selectable = true;
  105.                     gro.SetHighlight(false);                    
  106.                 }
  107.                 object oGroupSelect = Application.GetSystemVariable("PICKSTYLE");
  108.                 if (Convert.ToInt16(oGroupSelect) != 1)
  109.                 {
  110.                     Application.SetSystemVariable("PICKSTYLE", 1);
  111.                 }
  112.                 ed.WriteMessage("\nall group is selectable");
  113.                 doc.Database.BeginSave -= saveEvent;//先取消订阅,后订阅事件,防止重复订阅
  114.                 doc.Database.BeginSave += saveEvent;//订阅beginsave事件,事件引发包含ge命令DE方法saveEvent
  115.                 trans.Commit();
  116.             }            
  117.         }
  118.         
  119.         public void saveEvent(object sender, DatabaseIOEventArgs a)
  120.         {
  121.             GroupEntitySelectable();
  122.         }

  123.         [CommandMethod("ge")]//所有组可单选,所有空组炸开
  124.         public void GroupEntitySelectable()
  125.         {
  126.             Database db = HostApplicationServices.WorkingDatabase;
  127.             Document doc = Application.DocumentManager.MdiActiveDocument;
  128.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  129.             using (Transaction trans = db.TransactionManager.StartTransaction())
  130.             {
  131.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  132.                 foreach (DBDictionaryEntry groRec in GroDic)
  133.                 {
  134.                     Group gro = (Group)trans.GetObject(groRec.Value, OpenMode.ForWrite);
  135.                     gro.Selectable = false;
  136.                     gro.SetHighlight(false);
  137.                     if (gro.NumEntities == 0)
  138.                     {
  139.                         gro.Erase();
  140.                     }
  141.                 }
  142.                 ed.WriteMessage("\nall group is not seclectable");
  143.                 doc.Database.BeginSave -= saveEvent;
  144.                 trans.Commit();
  145.             }
  146.         }

  147.         [CommandMethod("gh")]//所有组高亮
  148.         public void AllGroupHighlight()
  149.         {
  150.             Database db = HostApplicationServices.WorkingDatabase;
  151.             Document doc = Application.DocumentManager.MdiActiveDocument;
  152.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  153.             using (Transaction trans = db.TransactionManager.StartTransaction())
  154.             {
  155.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  156.                 foreach (DBDictionaryEntry groRec in GroDic)
  157.                 {
  158.                     Group gro = (Group)trans.GetObject(groRec.Value, OpenMode.ForWrite);                    
  159.                     gro.SetHighlight(true);                                       
  160.                 }
  161.                 PromptResult pr = doc.Editor.GetString("\nall group highlight");
  162.                 foreach (DBDictionaryEntry groRec in GroDic)
  163.                 {
  164.                     Group gro = (Group)trans.GetObject(groRec.Value, OpenMode.ForWrite);
  165.                     gro.SetHighlight(false );
  166.                 }
  167.                 trans.Commit();
  168.             }
  169.         }        
  170.         
  171.         [CommandMethod("g", CommandFlags.UsePickSet)]
  172.         public void groupcreat()
  173.         {
  174.             GroupCreat();//用commandmethod绑定方法到命令时,返回值必须是void
  175.         }

  176.         public string GroupCreat()//建无名组
  177.         {
  178.             Database db = HostApplicationServices.WorkingDatabase;
  179.             Document doc = Application.DocumentManager.MdiActiveDocument;
  180.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  181.             using (Transaction trans = db.TransactionManager.StartTransaction())
  182.             {
  183.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  184.                 Group gro = new Group("x", false);
  185.                 ed.WriteMessage("\nplease select entity or group to creat a new group");               
  186.                 PromptSelectionResult psr = doc.Editor.SelectImplied();
  187.                 if (psr.Status != PromptStatus.OK)
  188.                 {
  189.                     psr = doc.Editor.GetSelection();
  190.                 }               
  191.                 if (psr.Status == PromptStatus.OK)
  192.                 {
  193.                     SelectionSet sset = psr.Value;
  194.                     LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
  195.                     LayerTableRecord ltr;
  196.                     Entity ent;
  197.                     foreach (ObjectId oid in sset.GetObjectIds())
  198.                     {
  199.                         ent = (Entity)trans.GetObject(oid, OpenMode.ForRead);
  200.                         ltr = (LayerTableRecord)trans.GetObject(lt[ent.Layer], OpenMode.ForRead);
  201.                         if (!ltr.IsLocked)
  202.                         {
  203.                             gro.Append(oid);
  204.                         }
  205.                     }
  206.                 }
  207.                 else
  208.                 { return ""; }
  209.                 GroDic.SetAt("x", gro);
  210.                 trans.AddNewlyCreatedDBObject(gro, true);
  211.                 gro.SetAnonymous();
  212.                 gro.Selectable = false;
  213.                 trans.Commit();
  214.                 return gro.Name;
  215.             }            
  216.         }        

  217.         [CommandMethod("gg")]
  218.         public void GroupOperate()
  219.         {
  220.             Database db = HostApplicationServices.WorkingDatabase;
  221.             Document doc = Application.DocumentManager.MdiActiveDocument;
  222.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  223.             using (Transaction trans = db.TransactionManager.StartTransaction())
  224.             {
  225.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
  226.                 BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  227.                 DBDictionary GroDic = (DBDictionary)trans.GetObject(db.GroupDictionaryId, OpenMode.ForWrite);
  228.                 string group = GroupJudge();//判断是否为组
  229.                 Group currentGro;
  230.                 if (group!="")
  231.                 {
  232.                     currentGro = (Group)trans.GetObject(GroDic.GetAt(group), OpenMode.ForWrite);
  233.                 }
  234.                 else { return; }
  235.                 PromptKeywordOptions pko = new PromptKeywordOptions("\n");
  236.                 pko.Keywords.Add("Add");
  237.                 pko.Keywords.Add("Remove");
  238.                 pko.Keywords.Add("Select");
  239.                 pko.Keywords.Add("EDit");
  240.                 pko.Keywords.Add("eXplode");               
  241.                
  242.                 pko.Keywords.Default = "Select";
  243.                 PromptResult pkr = doc.Editor.GetKeywords(pko);
  244.                 currentGro.SetHighlight(false);//对应GroupJudge代码段里的setHighlight(ture)
  245.                 PromptSelectionResult pssr;
  246.                 SelectionSet sset;
  247.                 Entity ent;
  248.                 switch (pkr.StringResult)
  249.                 {
  250.                     case "Add":
  251.                         ed.WriteMessage("\nplease select entity which will be add in the group");
  252.                         pssr = doc.Editor.GetSelection();
  253.                         if (pssr.Status == PromptStatus.OK)
  254.                         {
  255.                             sset = pssr.Value;
  256.                             foreach (ObjectId oid in sset.GetObjectIds())
  257.                             {
  258.                                 ent = (Entity)trans.GetObject(oid, OpenMode.ForRead);
  259.                                 LayerTable lt = (LayerTable)trans.GetObject(db.LayerTableId, OpenMode.ForWrite);
  260.                                 LayerTableRecord ltr = (LayerTableRecord)trans.GetObject(lt[ent.Layer], OpenMode.ForRead);
  261.                                 if (!ltr.IsLocked)
  262.                                 {
  263.                                     if (!currentGro.Has(ent))
  264.                                     { currentGro.Append(oid); }
  265.                                 }
  266.                             }
  267.                         }
  268.                         break;
  269.                     case "Remove":
  270.                         bool select = currentGro.Selectable;
  271.                         currentGro.Selectable = false;//确保组中对象可单选,方便剔除
  272.                         ed.WriteMessage("\nplease select entity which will be remove in the group");
  273.                         pssr = doc.Editor.GetSelection();
  274.                         if (pssr.Status == PromptStatus.OK)
  275.                         {
  276.                             sset = pssr.Value;
  277.                             foreach (ObjectId oid in sset.GetObjectIds())
  278.                             {
  279.                                 ent = (Entity)trans.GetObject(oid, OpenMode.ForRead);                                
  280.                                 if (currentGro.Has(ent))
  281.                                 { currentGro.Remove(oid); }                                
  282.                             }
  283.                         }
  284.                         currentGro.Selectable = select;
  285.                         break;                  
  286.                     case "Select":
  287.                         object oGroupSelect = Application.GetSystemVariable("PICKSTYLE");
  288.                         if (Convert.ToInt16(oGroupSelect) != 1)
  289.                         {
  290.                             Application.SetSystemVariable("PICKSTYLE", 1);
  291.                         }
  292.                         currentGro.Selectable = true;
  293.                         doc.Database.BeginSave -= saveEvent;//先取消订阅,后订阅事件,防止重复订阅
  294.                         doc.Database.BeginSave += saveEvent;//订阅beginsave事件,事件引发包含ge命令DE方法saveEvent
  295.                         break;
  296.                     case "EDit":
  297.                         currentGro.Selectable = false;
  298.                         break;
  299.                     case "eXplode":
  300.                         currentGro.Erase();
  301.                         break;      
  302.                                        
  303.                     default:
  304.                         goto case "EDit";//switch配合PromptKeywordOptions,可以用switch-default表示pko为cancel下的条件语句                           
  305.                 }
  306.                 trans.Commit();
  307.             }            
  308.         }

g        创建无名组
gg        关于组的添加,删除,可选,不可选,炸组,检查三视组的操作。可选操作订阅beginsave事件,事件引发包含ge命令的方法saveEvent
gs        所有组组选,删除所有空组,同时激活保存时GE命令。订阅beginsave事件,事件引发包含ge命令的方法saveEvent
ge        所有组可单选,删除所有空组,取消订阅beginsave事件
gh        所有组高亮
gx        删除所有组定义

以上几个命令的代码见下方

 楼主| 发表于 2012-12-9 17:08:47 | 显示全部楼层
沙发自己做。我在这几个组命令的基础上又开发了几个命令,实现了三视图关联移动的功能,即 移动俯视图,主视图和左视图跟着做关联移动,不过仅限移动命令
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 08:14 , Processed in 0.177457 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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