- 积分
- 1386
- 明经币
- 个
- 注册时间
- 2023-2-2
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 箭头_Row 于 2024-8-7 05:51 编辑
功能介紹:用戶交互時選擇關鍵字的簡化寫法
用戶交互時提示用戶選擇關鍵字:
一、獲取關鍵字字典;
二、添加關鍵字;
三、比對關鍵字輸入;
測試代碼部份:
- namespace ArrowTools;
- public class Enum_Test
- {
- private enum Keywords
- {
- [Description("T")]
- 板厚 = 1,
- [Description("D")]
- 字典 = 2,
- [Description("C")]
- 图层 = 4,
- [Description("H")]
- 填充 = 8
- }
- [CommandMethod("EN`")]
- public static void EnumKeywordsTest()
- {
- PromptKeywordOptions options = new(string.Empty);
- var keywordsMap = GetKeywordsMap<Keywords>();
- options.AddKeywords([.. keywordsMap.Keys]);
- options.AppendKeywordsToMessage = false; //不将关键字列表添加到提示信息中
- options.Message = $"图层状态:" + keywordsMap.ToMessage();
- PromptResult pr = Env.Editor.GetKeywords(options);
- if (pr.Status != PromptStatus.OK)
- {
- Env.Printl("命令取消!");
- return;
- }
- switch (keywordsMap[pr.StringResult.ToUpper()].enumValue)
- {
- case Keywords.板厚:
- Env.Printl("触发了关键字:板厚......");
- break;
- case Keywords.字典:
- Env.Printl("触发了关键字:字典......");
- break;
- case Keywords.图层:
- Env.Printl("触发了关键字:图层......");
- break;
- case Keywords.填充:
- Env.Printl("触发了关键字:填充......");
- break;
- }
- // switch .NET8.0 的最新寫法
- var str = keywordsMap[pr.StringResult.ToUpper()].enumValue switch
- {
- Keywords.板厚 => Keywords.板厚.ToString(),
- Keywords.字典 => Keywords.字典.ToString(),
- Keywords.图层 => Keywords.图层.ToString(),
- Keywords.填充 => Keywords.填充.ToString(),
- _ => throw new NotImplementedException(),
- };
- Env.Printl("第二次打印 触发了关键字:" + str);
- }
- }
GetKeywordsMap( );
- /// <summary>
- /// 獲取關鍵字字典
- /// </summary>
- /// <typeparam name="T">關鍵字枚舉</typeparam>
- /// <returns> Dictionary 快捷鍵,(描述字_中文,Enum值)</returns>
- public static Dictionary<string, (string Key_CN, T enumValue)> GetKeywordsMap<T>() where T : Enum
- {
- Dictionary<string, (string, T)> keywordsDic = [];
- var type = typeof(T);
- var typeDesc = typeof(DescriptionAttribute);
- foreach (var e in Enum.GetValues(type))
- {
- var name = e.ToString();
- object objArr = type.GetField(name).GetCustomAttributes(typeDesc, true)[0];
- keywordsDic.Add(((DescriptionAttribute)objArr).Description, (name, (T)e));
- }
- return keywordsDic;
- }
AddKeywords( );
- /// <summary>
- /// 添加关键字至设置中
- /// </summary>
- /// <param name="options">jig设置</param>
- /// <param name="keywords">关键字</param>
- public static void AddKeywords(this PromptKeywordOptions? options, IEnumerable<string> keywords)
- {
- foreach (var key in keywords)
- {
- if (!options!.Keywords.Contains(key))
- options.Keywords.Add(key);
- }
- }
備註:其它類型的PromptKeywordOptions 可參照此函數封裝!!!!
ToMessage( );
- /// <summary>
- /// 获取关键字提示信息行。
- /// </summary>
- /// <param name="keywordsDic">keywords關鍵字字典</typeparam>
- /// <param name="defaultKeyword">可选的默认关键字,非空时添加到结果中</param>
- /// <returns> 返回格式示例:[字典(D)/板厚(T)/层高(H)/完成面(F)/图层(C)]</returns>
- public static StringBuilder ToMessage<T>(this Dictionary<string, (string Key_CN, T enumValue)> keywordsDic, string defaultKeyword = "") where T : Enum
- {
- int number = 0;
- StringBuilder keywordNotice = new("[");
- foreach (var item in keywordsDic)
- {
- keywordNotice.Append(item.Value.Key_CN);
- keywordNotice.Append('(');
- keywordNotice.Append(item.Key);
- keywordNotice.Append(')');
- if (number < keywordsDic.Count - 1)
- keywordNotice.Append('/');
- number++;
- }
- keywordNotice.Append(']');
- if (defaultKeyword != string.Empty)
- if (keywordsDic.ContainsKey(defaultKeyword))
- keywordNotice.Append($"<{defaultKeyword}>");
- else // 無默認值時報錯提示
- throw new ArgumentException("错误的默认值!");
- return keywordNotice;
- }
備註: 感謝驚驚大佬的關於如何使用map的指教!!!!
|
|