明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 900|回复: 0

[基础] 从AutoCAD .NET程序使用pickfirst选择集

[复制链接]
发表于 2018-4-4 16:22 | 显示全部楼层 |阅读模式
许多工作在实体集之上的AutoCAD命令有两种类型的工作方式:动作-名字或名字-动作。这意味着若用户已经预告选择了一个集合的实体(“名字”),然后发起命令(“动作”),命令就不会需要请求用户选择他们了。
这就会使用一些东西来调用pickfirst或暗指AutoCAD中的选择集。要在命令中利用这个特性的优势,首先需要使用一个特别的命令标志“UsePickSet”:这告诉AutoCAD编辑器在调用命令时不要清除这个pickfirst集。然后命令的实现会使用编辑器对象的SelectImplied()方法来得到pickfirst集,这就可以用了。在这个阶段也可以使用SetImpliedSelection()来清除pickfirst集。
下面的C#代码展示了一些额外的,例如,在没有pickfirst集时,怎么退回去请求用户去选择对象。如,我们用被选择的实体来做什么…在此例中,每个实体都被打开来读并调用其list()方法来dump出它的内容到命令行中。当然,你也可以做一些更有意思的事情了。
  1. using Autodesk.AutoCAD;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. namespace SelectionTest
  7. {
  8.     public class PickfirstTestCmds
  9.     {
  10.         //必须指定UsePickSet标志 游天居士到此一游
  11.         [CommandMethod("PFT", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]
  12.         static public void PickFirstTest()
  13.         {
  14.             Document doc = Application.DocumentManager.MdiActiveDocument;
  15.             Editor ed = doc.Editor;
  16.             try
  17.             {
  18.                 //得到pickfirst集
  19.                 PromptSelectionResult selectionRes = ed.SelectImplied();
  20.                 //如果没有pickfirst集
  21.                 if (selectionRes.Status == PromptStatus.Error)
  22.                 {
  23.                     //请求用户选择实体
  24.                     PromptSelectionOptions selectionOpts = new PromptSelectionOptions();
  25.                     selectionOpts.MessageForAdding = "\nSelect objects to list: ";
  26.                     selectionRes = ed.GetSelection(selectionOpts);
  27.                 }
  28.                 else//如果有pickfirst集,清除它
  29.                 {
  30.                     ed.SetImpliedSelection(new ObjectId[0]);
  31.                 }
  32.                 //如果用户在此时还没有取消操作
  33.                 if (selectionRes.Status == PromptStatus.OK)
  34.                 {
  35.                     //一个一个地利用被选择的对象
  36.                     Transaction tr = doc.TransactionManager.StartTransaction();
  37.                     try
  38.                     {
  39.                         ObjectId[] objIds = selectionRes.Value.GetObjectIds();
  40.                         foreach (ObjectId objId in objIds)
  41.                         {
  42.                             Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
  43.                             //此例中,只是dump它的的属性到命令行中
  44.                             ent.List();
  45.                             ent.Dispose();
  46.                         }
  47.                         //尽管没有对实体作改变,但使用Commit(),因为这样比回滚操//作要快些
  48.                         tr.Commit();
  49.                     }
  50.                     catch (Autodesk.AutoCAD.Runtime.Exception ex)
  51.                     {
  52.                         ed.WriteMessage(ex.Message);
  53.                         tr.Abort();
  54.                     }
  55.                 }
  56.             }
  57.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  58.             {
  59.                 ed.WriteMessage(ex.Message);
  60.             }
  61.         }

  62.     }
  63. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 16:15 , Processed in 0.253218 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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