關於用戶交互時選擇關鍵字的簡化寫法
本帖最后由 箭头_Row 于 2024-8-7 05:51 编辑功能介紹:用戶交互時選擇關鍵字的簡化寫法
用戶交互時提示用戶選擇關鍵字:
一、獲取關鍵字字典;
二、添加關鍵字;
三、比對關鍵字輸入;
測試代碼部份:
namespace ArrowTools;
public class Enum_Test
{
private enum Keywords
{
板厚 = 1,
字典 = 2,
图层 = 4,
填充 = 8
}
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.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.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);
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的指教!!!!
页:
[1]