1. [CommandMethod("mysel", CommandFlags.Session)]
    2. public void mysel()
    3. {
    4. var acDoc = ZwSoft.ZwCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
    5. var acEditor = acDoc.Editor;
    6. void pso_KeywordInput(object sender, SelectionTextInputEventArgs e)
    7. {
    8. //user has pressed keyword, so throw Exception
    9. acEditor.WriteMessage("\n使用了关键字");
    10. if (e.Input == "s")
    11. {
    12. acEditor.WriteMessage("\ns设置");
    13. }
    14. else
    15. throw new ZwSoft.ZwCAD.Runtime.Exception(ErrorStatus.OK, e.Input);
    16. }
    17. PromptSelectionOptions pso = new PromptSelectionOptions();
    18. pso.MessageForAdding = "请选择对象或[设置(S)]: ";
    19. pso.KeywordInput += new SelectionTextInputEventHandler(pso_KeywordInput);
    20. pso.SetKeywords("[设置(S)]", "s");
    21. var psr = acEditor.GetSelection(pso);
    22. if (psr.Status == PromptStatus.OK)
    23. {
    24. var ids = psr.Value.GetObjectIds();
    25. acEditor.WriteMessage("\n选择到对象");
    26. }
    27. }
    28. // ids = ed.myGetSelection("请选择需要对齐的对象或[选择集(S)]:", "[选择集(S)]", "S");
    29. ////public static ObjectId[] myGetSelection(this Editor ed, string str, string keywords, string globalkeywords)
    30. ////{
    31. //// void pro_KeywordInput(object sender, SelectionTextInputEventArgs e)
    32. //// {
    33. //// ed.WriteMessage("\n使用了关键字!");
    34. //// if (e.Input.Equals("S"))
    35. //// {
    36. //// ed.WriteMessage("\nS=>设置");
    37. //// }
    38. //// }
    39. //// PromptSelectionOptions pso = new PromptSelectionOptions();
    40. //// pso.AllowDuplicates = false; //重复选择
    41. //// pso.MessageForAdding = str;
    42. //// pso.KeywordInput += new SelectionTextInputEventHandler(pro_KeywordInput);
    43. //// pso.SetKeywords(keywords, globalkeywords);
    44. //// //从选择集命令中显示关键字
    45. //// pso.MessageForAdding = pso.Keywords.GetDisplayString(true);
    46. //// PromptSelectionResult psr = ed.GetSelection(pso);
    47. //// if (psr.Status == PromptStatus.OK)
    48. //// {
    49. //// return psr.Value.GetObjectIds();
    50. //// }
    51. //// return new ObjectId[0];
    52. ////}
    53. /// <summary>
    54. /// 添加选择集关键字和回调
    55. /// </summary>
    56. /// <param name="keyExplain">关键字,关键字说明,关键字回调的操作</param>
    57. /// <returns></returns>
    58. ////public static void SsgetAddKeys(this PromptSelectionOptions pso, Dictionary<string, Action> dicActions)
    59. ////{
    60. //// // 处理后缀名的|号切割
    61. //// foreach (var key in dicActions.Keys.ToArray())//克隆副本
    62. //// {
    63. //// var keySplitS = key.Split('|');
    64. //// if (keySplitS.Length > 1)
    65. //// {
    66. //// foreach (var keySplit in keySplitS)
    67. //// {
    68. //// // 防止多个后缀通过|符越过词典约束同名
    69. //// // 后缀(key)含有,而且Action(value)不同,就把Action(value)累加到后面.
    70. //// if (dicActions.Keys.Contains(keySplit))
    71. //// {
    72. //// if (dicActions[keySplit] != dicActions[key])
    73. //// {
    74. //// dicActions[keySplit] += dicActions[key];
    75. //// }
    76. //// }
    77. //// else
    78. //// {
    79. //// dicActions.Add(keySplit, dicActions[key]);
    80. //// }
    81. //// }
    82. //// dicActions.Remove(key);
    83. //// }
    84. //// }
    85. //// //去除关键字重复的,把重复的执行动作移动到前面
    86. //// var keys = dicActions.Keys.ToList();
    87. //// for (int i = 0; i < keys.Count; i++)
    88. //// {
    89. //// var key1 = keys[i];
    90. //// for (int n = i + 1; n < keys.Count; n++)
    91. //// {
    92. //// var key2 = keys[n];
    93. //// if (key1.Split(',')[0] == key2.Split(',')[0] && dicActions[key1] != dicActions[key2])
    94. //// {
    95. //// dicActions[key1] += dicActions[key2];
    96. //// dicActions.Remove(key2);
    97. //// keys.Remove(key2);
    98. //// }
    99. //// }
    100. //// }
    101. //// foreach (var item in dicActions)
    102. //// {
    103. //// var keySplitS = item.Key.Split(new string[] { ",", "|" }, StringSplitOptions.RemoveEmptyEntries);
    104. //// for (int i = 0; i < keySplitS.Length; i += 2)
    105. //// {
    106. //// pso.Keywords.Add(keySplitS[i], keySplitS[i], keySplitS[i + 1] + "(" + keySplitS[i] + ")");
    107. //// }
    108. //// }
    109. //// KeywordCollection keyWords = pso.Keywords;
    110. //// //从选择集命令中显示关键字
    111. //// pso.MessageForAdding = keyWords.GetDisplayString(true);
    112. //// //在输入关键字时实现回调的事件 ssget关键字
    113. //// pso.KeywordInput += (sender, e) =>
    114. //// {
    115. //// foreach (var item in dicActions)
    116. //// {
    117. //// if (item.Key.Split(',')[0] == e.Input)
    118. //// {
    119. //// item.Value.Invoke();
    120. //// }
    121. //// }
    122. //// };
    123. ////}
    124. 调用
    125. //定义选择集选项
    126. var pso = new PromptSelectionOptions
    127. {
    128. AllowDuplicates = false, //重复选择
    129. };
    130. //getai遍历全图选择块有用到
    131. var di = new Dictionary<string, Action>() {
    132. { "Z,全部同名", ()=> {
    133. getai = BlockTool.EnumAttIdentical.AllBlockName;
    134. SendEsc.Esc();
    135. }},
    136. { "X,动态块显示", ()=> {
    137. getai = BlockTool.EnumAttIdentical.Display;
    138. }},
    139. { "V,属性值-默认", ()=> {
    140. getai = BlockTool.EnumAttIdentical.DisplayAndTagText;
    141. }},
    142. //允许以下操作,相同的会覆盖前面的
    143. { "V,属性值-默认|X,啊啊啊啊", ()=> {
    144. }},
    145. };
    146. pso.SsgetAddKeys(di);
    147. //创建选择集过滤器,只选择块对象
    148. var filList = new TypedValue[] { new TypedValue((int)DxfCode.Start, "INSERT") };
    149. var filter = new SelectionFilter(filList);
    150. //手选
    151. ssPsr = ed.GetSelection(pso, filter);
    152. if (ssPsr.Status != PromptStatus.OK)
    153. {
    154. return re;
    155. }
    156. 封装
    157. /// <summary>
    158. /// 添加选择集关键字和回调
    159. /// </summary>
    160. /// <param name="keyExplain">关键字,关键字说明,关键字回调的操作</param>
    161. /// <returns></returns>
    162. public static void SsgetAddKeys(this PromptSelectionOptions pso,
    163. Dictionary<string, Action> dicActions)
    164. {
    165. // 处理后缀名的|号切割
    166. foreach (var key in dicActions.Keys.ToArray())//克隆副本
    167. {
    168. var keySplitS = key.Split('|');
    169. if (keySplitS.Length > 1)
    170. {
    171. foreach (var keySplit in keySplitS)
    172. {
    173. // 防止多个后缀通过|符越过词典约束同名
    174. // 后缀(key)含有,而且Action(value)不同,就把Action(value)累加到后面.
    175. if (dicActions.Keys.Contains(keySplit))
    176. {
    177. if (dicActions[keySplit] != dicActions[key])
    178. {
    179. dicActions[keySplit] += dicActions[key];
    180. }
    181. }
    182. else
    183. {
    184. dicActions.Add(keySplit, dicActions[key]);
    185. }
    186. }
    187. dicActions.Remove(key);
    188. }
    189. }
    190. //去除关键字重复的,把重复的执行动作移动到前面
    191. var keys = dicActions.Keys.ToList();
    192. for (int i = 0; i < keys.Count; i++)
    193. {
    194. var key1 = keys[i];
    195. for (int n = i + 1; n < keys.Count; n++)
    196. {
    197. var key2 = keys[n];
    198. if (key1.Split(',')[0] == key2.Split(',')[0] && dicActions[key1] != dicActions[key2])
    199. {
    200. dicActions[key1] += dicActions[key2];
    201. dicActions.Remove(key2);
    202. keys.Remove(key2);
    203. }
    204. }
    205. }
    206. foreach (var item in dicActions)
    207. {
    208. var keySplitS = item.Key.Split(new string[] { ",", "|" }, StringSplitOptions.RemoveEmptyEntries);
    209. for (int i = 0; i < keySplitS.Length; i += 2)
    210. {
    211. pso.Keywords.Add(keySplitS[i], keySplitS[i], keySplitS[i + 1] + "(" + keySplitS[i] + ")");
    212. }
    213. }
    214. KeywordCollection keyWords = pso.Keywords;
    215. //从选择集命令中显示关键字
    216. pso.MessageForAdding = keyWords.GetDisplayString(true);
    217. //在输入关键字时实现回调的事件 ssget关键字
    218. pso.KeywordInput += (sender, e) => {
    219. foreach (var item in dicActions)
    220. {
    221. if (item.Key.Split(',')[0] == e.Input)
    222. {
    223. item.Value.Invoke();
    224. }
    225. }
    226. };
    227. }