明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 698|回复: 10

[选集] CAD.Net 带关键字的选择集 ed.GetSelection()

  [复制链接]
发表于 2024-6-19 16:39:20 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2024-6-19 16:42 编辑


封装的水平有限,大佬请略过哈


按关键字【A】可以切换到添加图元


按关键字【R】可以切换到删除图元


  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Acap = Autodesk.AutoCAD.ApplicationServices.Application;

  6. /// <summary>
  7. /// 将关键字处理添加到AutoCAD.NET的GetSelection()<br/>
  8. /// <see href="https://www.keanw.com/2010/05/adding-keyword-handling-to-autocad-nets-getselection.html"/>
  9. /// </summary>
  10. [CmdDescription("", "将关键字处理添加到AutoCAD.NET的GetSelection()", "Adding keyword handling to AutoCAD .NET’s GetSelection()")]
  11. [CommandMethod(nameof(SELKW), CommandFlags.Session | CommandFlags.UsePickSet)]
  12. public void SELKW()
  13. {
  14.     var doc = Acap.DocumentManager.MdiActiveDocument;
  15.     var ed = doc.Editor;
  16.     var psr = ed.GetSelectionEx("\n将对象添加到所选内容",
  17.          pso =>
  18.          {
  19.              pso.MessageForRemoval = $"\n从选择中删除对象{pso.Keywords.GetDisplayString(true)}";
  20.          },
  21.          keyWords: [new KeyWord("FIrst"), new KeyWord("Second")],
  22.          keyWordAction: e =>
  23.          {
  24.              ed.WriteMessage("\n输入的关键字:{0}", e.Input);
  25.          });
  26.     if (psr.Status == PromptStatus.OK)
  27.     {
  28.         ed.WriteMessage($"\n选中 {psr.Value.Count} 个对象。");
  29.     }
  30. }

  31. /// <summary>
  32. /// 获取选择集
  33. /// </summary>
  34. /// <param name="editor">用户交互对象</param>
  35. /// <param name="message">文本提示</param>
  36. /// <param name="filter">过滤条件</param>
  37. /// <param name="optionsAction">选择集选项设置委托</param>
  38. /// <param name="keyWords">关键字信息集合</param>
  39. /// <param name="keyWordAction">关键字回调委托</param>
  40. /// <returns>获取结果:PromptSelectionResult</returns>
  41. public static PromptSelectionResult GetSelectionEx
  42.     (this Editor editor, string message, Action<romptSelectionOptions> optionsAction = null,
  43.     SelectionFilter filter = null, IEnumerable<KeyWord> keyWords = null,
  44.     Action<SelectionTextInputEventArgs> keyWordAction = null)
  45. {
  46.     void Pso_KeywordInput(object sender, SelectionTextInputEventArgs e)
  47.     {
  48.         keyWordAction?.Invoke(e);
  49.     }
  50.     var pso = new PromptSelectionOptions();
  51.     if (keyWords is not null && keyWords?.Count() > 0)
  52.     {
  53.         keyWords?.ForEach(kw =>
  54.         {
  55.             pso.Keywords.Add(kw.GlobalName, kw.LocalName, kw.DisplayName, kw.Visible, kw.Enabled);
  56.         });
  57.         pso.MessageForAdding = $"{message}{pso.Keywords.GetDisplayString(true)}";
  58.         pso.KeywordInput += Pso_KeywordInput;
  59.     }
  60.     else
  61.     {
  62.         pso.MessageForAdding = message;
  63.     }
  64.     optionsAction?.Invoke(pso);
  65.     return filter switch
  66.     {
  67.         not null => editor.GetSelection(pso, filter),
  68.         _ => editor.GetSelection(pso)
  69.     };
  70. }

  71. /// <summary>
  72. /// 关键字信息对象
  73. /// </summary>
  74. /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
  75. /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
  76. /// <param name="displayName">输入关键字的显示名称;这显示在命令行上,通常与本地名称相同。</param>
  77. /// <param name="visible">输入指示是否应向用户显示关键字。</param>
  78. /// <param name="enabled">输入表示关键字当前是否启用;默认true,为false时将不接受用户输入。</param>
  79. public class KeyWord(string globalName, string localName, string displayName, bool visible, bool enabled)
  80. {
  81.     /// <summary>
  82.     /// 关键字信息对象一参构造
  83.     /// </summary>
  84.     /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
  85.     public KeyWord(string globalName)
  86.         : this(globalName, globalName, globalName, true, true) { }

  87.     /// <summary>
  88.     /// 关键字信息对象二参构造
  89.     /// </summary>
  90.     /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
  91.     /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
  92.     public KeyWord(string globalName, string localName)
  93.         : this(globalName, localName, localName, true, true) { }

  94.     /// <summary>
  95.     /// 关键字信息对象三参构造
  96.     /// </summary>
  97.     /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
  98.     /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
  99.     /// <param name="displayName">输入关键字的显示名称;这显示在命令行上,通常与本地名称相同。</param>
  100.     public KeyWord(string globalName, string localName, string displayName)
  101.         : this(globalName, localName, displayName, true, true) { }

  102.     /// <summary>
  103.     /// 关键字信息对象四参构造
  104.     /// </summary>
  105.     /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
  106.     /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
  107.     /// <param name="displayName">输入关键字的显示名称;这显示在命令行上,通常与本地名称相同。</param>
  108.     /// <param name="visible">输入指示是否应向用户显示关键字。</param>
  109.     public KeyWord(string globalName, string localName, string displayName, bool visible)
  110.         : this(globalName, localName, displayName, visible, true) { }

  111.     /// <summary>
  112.     /// 关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。
  113.     /// </summary>
  114.     public string GlobalName { get; set; } = globalName;

  115.     /// <summary>
  116.     /// 关键字的本地名称;用户输入本地名称以指定关键字。
  117.     /// </summary>
  118.     public string LocalName { get; set; } = localName;

  119.     /// <summary>
  120.     /// 关键字的显示名称;这显示在命令行上,通常与本地名称相同。
  121.     /// </summary>
  122.     public string DisplayName { get; set; } = displayName;

  123.     /// <summary>
  124.     /// 否应向用户显示关键字。
  125.     /// </summary>
  126.     public bool Visible { get; set; } = visible;

  127.     /// <summary>
  128.     /// 当前是否启用;默认true,为false时将不接受用户输入。
  129.     /// </summary>
  130.     public bool Enabled { get; set; } = enabled;
  131. }

点评

按关键字A可以切换到添加图元 按关键字R可以切换到删除图元  发表于 2024-6-19 16:40

评分

参与人数 1金钱 +5 收起 理由
inch + 5

查看全部评分

发表于 2024-6-19 17:20:06 | 显示全部楼层
为什么你的代码上面有个明经通道
 楼主| 发表于 2024-6-19 17:41:06 | 显示全部楼层
本帖最后由 fangmin723 于 2024-6-19 17:47 编辑
你有种再说一遍 发表于 2024-6-19 17:20
为什么你的代码上面有个明经通道

贴C#代码时,论坛自动生成的,编辑界面没有这个网址,发表后,就有了
发表于 2024-6-19 23:05:59 | 显示全部楼层
感谢大佬的分享
发表于 2024-6-20 09:37:57 | 显示全部楼层
A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作
 楼主| 发表于 2024-6-20 10:36:54 | 显示全部楼层
d1742647821 发表于 2024-6-20 09:37
A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作

发表于 2024-7-16 08:55:16 | 显示全部楼层
本帖最后由 箭头_Row 于 2024-7-16 09:00 编辑

封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。

  1. PromptSelectionOptions entOpts = new()
  2. {
  3.      MessageForAdding = GetPointOptionsMessage()
  4. };
  5. entOpts.AddKeywords(CzEnumEx.GetDescriptionList(typeof(Keywords)));

  6. // 设置关键字回调
  7. entOpts.KeywordInput += (sender, e) => {
  8.      switch (e.Input.ToUpper().GetEnumByDescription<Keywords>())
  9.      {
  10.          case Keywords.首尾删空:
  11.              deleteNullStartOrEndwith = !deleteNullStartOrEndwith;
  12.              break;
  13.      }
  14.      //序列化*类转字符串
  15.      JsonSaveAs();
  16.      PrintKeywordsSettings();
  17. };


  1.   /// <summary>
  2.   /// 添加关键字至设置中
  3.   /// </summary>
  4.   /// <param name="options">jig设置</param>
  5.   /// <param name="keywords">关键字</param>
  6.   public static void AddKeywords(this PromptSelectionOptions? options, IEnumerable<string> keywords)
  7.   {
  8.       foreach (var key in keywords)
  9.       {
  10.           if (!options!.Keywords.Contains(key))
  11.               options.Keywords.Add(key);
  12.       }
  13.   }


寫的時候關鍵字避開下面提示中關鍵字就好了,目前我不知道如何把默認的覆蓋掉,得大佬補充了。

需要点或 窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)

上述命令行提示是在提示選擇對象時,按Q 就會出現上面的提示。

发表于 2024-7-16 16:10:49 | 显示全部楼层
箭头_Row 发表于 2024-7-16 08:55
封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。

自己构造索引就能替换掉ssget,例如开图就构造四叉树,然后用四叉树选择,此时你就可以不依靠acad的API了
发表于 2024-7-17 23:11:24 | 显示全部楼层
和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void RemoveKeywordsFromFullList(SubtractedKeywords kwds);

  1. public enum SubtractedKeywords
  2. {
  3.     LastAllGroupPrevious = 1,
  4.     PickImplied = 2,
  5.     All = 4,
  6.     BoxAuto = 8,
  7.     Multiple = 0x10,
  8.     CrossingCPolygon = 0x20,
  9.     Fence = 0x40,
  10.     Last = 0x80,
  11.     Previous = 0x100,
  12.     WindowWPolygon = 0x200,
  13.     Group = 0x400,
  14.     AddRemove = 0x800
  15. }
发表于 2024-7-18 00:44:16 | 显示全部楼层
箭头_Row 发表于 2024-7-17 23:11
和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void Remo ...

低版本没有
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-8 07:21 , Processed in 0.210243 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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