wyb36870 发表于 2018-4-4 16:22:17

从AutoCAD .NET程序使用pickfirst选择集

许多工作在实体集之上的AutoCAD命令有两种类型的工作方式:动作-名字或名字-动作。这意味着若用户已经预告选择了一个集合的实体(“名字”),然后发起命令(“动作”),命令就不会需要请求用户选择他们了。
这就会使用一些东西来调用pickfirst或暗指AutoCAD中的选择集。要在命令中利用这个特性的优势,首先需要使用一个特别的命令标志“UsePickSet”:这告诉AutoCAD编辑器在调用命令时不要清除这个pickfirst集。然后命令的实现会使用编辑器对象的SelectImplied()方法来得到pickfirst集,这就可以用了。在这个阶段也可以使用SetImpliedSelection()来清除pickfirst集。
下面的C#代码展示了一些额外的,例如,在没有pickfirst集时,怎么退回去请求用户去选择对象。如,我们用被选择的实体来做什么…在此例中,每个实体都被打开来读并调用其list()方法来dump出它的内容到命令行中。当然,你也可以做一些更有意思的事情了。本文出自:https://www.cnblogs.com/happy123/archive/2012/11/19/2778023.html   仅作备忘之用using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
namespace SelectionTest
{
    public class PickfirstTestCmds
    {
      //必须指定UsePickSet标志 游天居士到此一游
      
      static public void PickFirstTest()
      {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            try
            {
                //得到pickfirst集
                PromptSelectionResult selectionRes = ed.SelectImplied();
                //如果没有pickfirst集
                if (selectionRes.Status == PromptStatus.Error)
                {
                  //请求用户选择实体
                  PromptSelectionOptions selectionOpts = new PromptSelectionOptions();
                  selectionOpts.MessageForAdding = "\nSelect objects to list: ";
                  selectionRes = ed.GetSelection(selectionOpts);
                }
                else//如果有pickfirst集,清除它
                {
                  ed.SetImpliedSelection(new ObjectId);
                }
                //如果用户在此时还没有取消操作
                if (selectionRes.Status == PromptStatus.OK)
                {
                  //一个一个地利用被选择的对象
                  Transaction tr = doc.TransactionManager.StartTransaction();
                  try
                  {
                        ObjectId[] objIds = selectionRes.Value.GetObjectIds();
                        foreach (ObjectId objId in objIds)
                        {
                            Entity ent = (Entity)tr.GetObject(objId, OpenMode.ForRead);
                            //此例中,只是dump它的的属性到命令行中
                            ent.List();
                            ent.Dispose();
                        }
                        //尽管没有对实体作改变,但使用Commit(),因为这样比回滚操//作要快些
                        tr.Commit();
                  }
                  catch (Autodesk.AutoCAD.Runtime.Exception ex)
                  {
                        ed.WriteMessage(ex.Message);
                        tr.Abort();
                  }
                }
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                ed.WriteMessage(ex.Message);
            }
      }

    }
}
页: [1]
查看完整版本: 从AutoCAD .NET程序使用pickfirst选择集