明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 437|回复: 0

[基础] 關於用戶交互時選擇關鍵字的簡化寫法

[复制链接]
发表于 2024-8-6 16:01:36 | 显示全部楼层 |阅读模式
本帖最后由 箭头_Row 于 2024-8-7 05:51 编辑

功能介紹:用戶交互時選擇關鍵字的簡化寫法

用戶交互時提示用戶選擇關鍵字:
一、獲取關鍵字字典;
二、添加關鍵字;
三、比對關鍵字輸入;

測試代碼部份:

  1. namespace ArrowTools;
  2. public class Enum_Test
  3. {
  4.     private enum Keywords
  5.     {
  6.         [Description("T")]
  7.         板厚 = 1,
  8.         [Description("D")]
  9.         字典 = 2,
  10.         [Description("C")]
  11.         图层 = 4,
  12.         [Description("H")]
  13.         填充 = 8
  14.     }
  15.     [CommandMethod("EN`")]
  16.     public static void EnumKeywordsTest()
  17.     {
  18.         PromptKeywordOptions options = new(string.Empty);
  19.         var keywordsMap = GetKeywordsMap<Keywords>();
  20.         options.AddKeywords([.. keywordsMap.Keys]);
  21.         options.AppendKeywordsToMessage = false;  //不将关键字列表添加到提示信息中
  22.         options.Message = $"图层状态:" + keywordsMap.ToMessage();

  23.         PromptResult pr = Env.Editor.GetKeywords(options);
  24.         if (pr.Status != PromptStatus.OK)
  25.         {
  26.             Env.Printl("命令取消!");
  27.             return;
  28.         }

  29.         switch (keywordsMap[pr.StringResult.ToUpper()].enumValue)
  30.         {
  31.             case Keywords.板厚:
  32.                 Env.Printl("触发了关键字:板厚......");
  33.                 break;
  34.             case Keywords.字典:
  35.                 Env.Printl("触发了关键字:字典......");
  36.                 break;
  37.             case Keywords.图层:
  38.                 Env.Printl("触发了关键字:图层......");
  39.                 break;
  40.             case Keywords.填充:
  41.                 Env.Printl("触发了关键字:填充......");
  42.                 break;
  43.         }

  44.         // switch .NET8.0 的最新寫法
  45.         var str = keywordsMap[pr.StringResult.ToUpper()].enumValue switch
  46.         {
  47.             Keywords.板厚 => Keywords.板厚.ToString(),
  48.             Keywords.字典 => Keywords.字典.ToString(),
  49.             Keywords.图层 => Keywords.图层.ToString(),
  50.             Keywords.填充 => Keywords.填充.ToString(),
  51.             _ => throw new NotImplementedException(),
  52.         };
  53.         Env.Printl("第二次打印  触发了关键字:" + str);

  54.     }
  55. }


GetKeywordsMap( );
  1. /// <summary>
  2. /// 獲取關鍵字字典
  3. /// </summary>
  4. /// <typeparam name="T">關鍵字枚舉</typeparam>
  5. /// <returns> Dictionary 快捷鍵,(描述字_中文,Enum值)</returns>
  6. public static Dictionary<string, (string Key_CN, T enumValue)> GetKeywordsMap<T>() where T : Enum
  7. {
  8.      Dictionary<string, (string, T)> keywordsDic = [];
  9.      var type = typeof(T);
  10.      var typeDesc = typeof(DescriptionAttribute);
  11.      foreach (var e in Enum.GetValues(type))
  12.      {
  13.          var name = e.ToString();
  14.          object objArr = type.GetField(name).GetCustomAttributes(typeDesc, true)[0];
  15.          keywordsDic.Add(((DescriptionAttribute)objArr).Description, (name, (T)e));
  16.      }
  17.      return keywordsDic;
  18. }


AddKeywords( );
  1. /// <summary>
  2. /// 添加关键字至设置中
  3. /// </summary>
  4. /// <param name="options">jig设置</param>
  5. /// <param name="keywords">关键字</param>
  6. public static void AddKeywords(this PromptKeywordOptions? 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. }

備註:其它類型的PromptKeywordOptions 可參照此函數封裝!!!!

ToMessage( );
  1. /// <summary>
  2. /// 获取关键字提示信息行。
  3. /// </summary>
  4. /// <param name="keywordsDic">keywords關鍵字字典</typeparam>
  5. /// <param name="defaultKeyword">可选的默认关键字,非空时添加到结果中</param>
  6. /// <returns> 返回格式示例:[字典(D)/板厚(T)/层高(H)/完成面(F)/图层(C)]</returns>
  7. public static StringBuilder ToMessage<T>(this Dictionary<string, (string Key_CN, T enumValue)> keywordsDic, string defaultKeyword = "") where T : Enum
  8. {
  9.      int number = 0;
  10.      StringBuilder keywordNotice = new("[");
  11.      foreach (var item in keywordsDic)
  12.      {
  13.          keywordNotice.Append(item.Value.Key_CN);
  14.          keywordNotice.Append('(');
  15.          keywordNotice.Append(item.Key);
  16.          keywordNotice.Append(')');
  17.          if (number < keywordsDic.Count - 1)
  18.              keywordNotice.Append('/');
  19.          number++;
  20.      }
  21.      keywordNotice.Append(']');

  22.      if (defaultKeyword != string.Empty)
  23.          if (keywordsDic.ContainsKey(defaultKeyword))
  24.              keywordNotice.Append($"<{defaultKeyword}>");
  25.          else    // 無默認值時報錯提示
  26.              throw new ArgumentException("错误的默认值!");

  27.      return keywordNotice;
  28. }


備註: 感謝驚驚大佬的關於如何使用map的指教!!!!


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

本版积分规则

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

GMT+8, 2024-11-25 04:06 , Processed in 0.140556 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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