本帖最后由 fangmin723 于 2024-6-19 16:42 编辑
封装的水平有限,大佬请略过哈
按关键字【A】可以切换到添加图元
按关键字【R】可以切换到删除图元

网友答: 和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void RemoveKeywordsFromFullList(SubtractedKeywords kwds);
网友答:
本帖最后由 箭头_Row 于 2024-7-16 09:00 编辑
封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。


寫的時候關鍵字避開下面提示中關鍵字就好了,目前我不知道如何把默認的覆蓋掉,得大佬補充了。
需要点或 窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)
上述命令行提示是在提示選擇對象時,按Q 就會出現上面的提示。
网友答: 为什么你的代码上面有个明经通道网友答: 本帖最后由 fangmin723 于 2024-6-19 17:47 编辑
贴C#代码时,论坛自动生成的,编辑界面没有这个网址,发表后,就有了网友答: 感谢大佬的分享网友答: A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作
网友答:


网友答:
自己构造索引就能替换掉ssget,例如开图就构造四叉树,然后用四叉树选择,此时你就可以不依靠acad的API了网友答:
低版本没有
封装的水平有限,大佬请略过哈

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

- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.Geometry;
- using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
- /// <summary>
- /// 将关键字处理添加到AutoCAD.NET的GetSelection()<br/>
- /// <see href="https://www.keanw.com/2010/05/adding-keyword-handling-to-autocad-nets-getselection.html"/>
- /// </summary>
- [CmdDescription("", "将关键字处理添加到AutoCAD.NET的GetSelection()", "Adding keyword handling to AutoCAD .NET’s GetSelection()")]
- [CommandMethod(nameof(SELKW), CommandFlags.Session | CommandFlags.UsePickSet)]
- public void SELKW()
- {
- var doc = Acap.DocumentManager.MdiActiveDocument;
- var ed = doc.Editor;
- var psr = ed.GetSelectionEx("\n将对象添加到所选内容",
- pso =>
- {
- pso.MessageForRemoval = $"\n从选择中删除对象{pso.Keywords.GetDisplayString(true)}";
- },
- keyWords: [new KeyWord("FIrst"), new KeyWord("Second")],
- keyWordAction: e =>
- {
- ed.WriteMessage("\n输入的关键字:{0}", e.Input);
- });
- if (psr.Status == PromptStatus.OK)
- {
- ed.WriteMessage($"\n选中 {psr.Value.Count} 个对象。");
- }
- }
- /// <summary>
- /// 获取选择集
- /// </summary>
- /// <param name="editor">用户交互对象</param>
- /// <param name="message">文本提示</param>
- /// <param name="filter">过滤条件</param>
- /// <param name="optionsAction">选择集选项设置委托</param>
- /// <param name="keyWords">关键字信息集合</param>
- /// <param name="keyWordAction">关键字回调委托</param>
- /// <returns>获取结果:PromptSelectionResult</returns>
- public static PromptSelectionResult GetSelectionEx
- (this Editor editor, string message, Action<
romptSelectionOptions> optionsAction = null, - SelectionFilter filter = null, IEnumerable<KeyWord> keyWords = null,
- Action<SelectionTextInputEventArgs> keyWordAction = null)
- {
- void Pso_KeywordInput(object sender, SelectionTextInputEventArgs e)
- {
- keyWordAction?.Invoke(e);
- }
- var pso = new PromptSelectionOptions();
- if (keyWords is not null && keyWords?.Count() > 0)
- {
- keyWords?.ForEach(kw =>
- {
- pso.Keywords.Add(kw.GlobalName, kw.LocalName, kw.DisplayName, kw.Visible, kw.Enabled);
- });
- pso.MessageForAdding = $"{message}{pso.Keywords.GetDisplayString(true)}";
- pso.KeywordInput += Pso_KeywordInput;
- }
- else
- {
- pso.MessageForAdding = message;
- }
- optionsAction?.Invoke(pso);
- return filter switch
- {
- not null => editor.GetSelection(pso, filter),
- _ => editor.GetSelection(pso)
- };
- }
- /// <summary>
- /// 关键字信息对象
- /// </summary>
- /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
- /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
- /// <param name="displayName">输入关键字的显示名称;这显示在命令行上,通常与本地名称相同。</param>
- /// <param name="visible">输入指示是否应向用户显示关键字。</param>
- /// <param name="enabled">输入表示关键字当前是否启用;默认true,为false时将不接受用户输入。</param>
- public class KeyWord(string globalName, string localName, string displayName, bool visible, bool enabled)
- {
- /// <summary>
- /// 关键字信息对象一参构造
- /// </summary>
- /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
- public KeyWord(string globalName)
- : this(globalName, globalName, globalName, true, true) { }
- /// <summary>
- /// 关键字信息对象二参构造
- /// </summary>
- /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
- /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
- public KeyWord(string globalName, string localName)
- : this(globalName, localName, localName, true, true) { }
- /// <summary>
- /// 关键字信息对象三参构造
- /// </summary>
- /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
- /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
- /// <param name="displayName">输入关键字的显示名称;这显示在命令行上,通常与本地名称相同。</param>
- public KeyWord(string globalName, string localName, string displayName)
- : this(globalName, localName, displayName, true, true) { }
- /// <summary>
- /// 关键字信息对象四参构造
- /// </summary>
- /// <param name="globalName">输入关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。</param>
- /// <param name="localName">输入关键字的本地名称;用户输入本地名称以指定关键字。</param>
- /// <param name="displayName">输入关键字的显示名称;这显示在命令行上,通常与本地名称相同。</param>
- /// <param name="visible">输入指示是否应向用户显示关键字。</param>
- public KeyWord(string globalName, string localName, string displayName, bool visible)
- : this(globalName, localName, displayName, visible, true) { }
- /// <summary>
- /// 关键字的全局名称;这永远不会显示,但当本地翻译未知时,程序可以使用它来访问关键字。
- /// </summary>
- public string GlobalName { get; set; } = globalName;
- /// <summary>
- /// 关键字的本地名称;用户输入本地名称以指定关键字。
- /// </summary>
- public string LocalName { get; set; } = localName;
- /// <summary>
- /// 关键字的显示名称;这显示在命令行上,通常与本地名称相同。
- /// </summary>
- public string DisplayName { get; set; } = displayName;
- /// <summary>
- /// 否应向用户显示关键字。
- /// </summary>
- public bool Visible { get; set; } = visible;
- /// <summary>
- /// 当前是否启用;默认true,为false时将不接受用户输入。
- /// </summary>
- public bool Enabled { get; set; } = enabled;
- }
网友答: 和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void RemoveKeywordsFromFullList(SubtractedKeywords kwds);

- public enum SubtractedKeywords
- {
- LastAllGroupPrevious = 1,
- PickImplied = 2,
- All = 4,
- BoxAuto = 8,
- Multiple = 0x10,
- CrossingCPolygon = 0x20,
- Fence = 0x40,
- Last = 0x80,
- Previous = 0x100,
- WindowWPolygon = 0x200,
- Group = 0x400,
- AddRemove = 0x800
- }
封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。

- PromptSelectionOptions entOpts = new()
- {
- MessageForAdding = GetPointOptionsMessage()
- };
- entOpts.AddKeywords(CzEnumEx.GetDescriptionList(typeof(Keywords)));
- // 设置关键字回调
- entOpts.KeywordInput += (sender, e) => {
- switch (e.Input.ToUpper().GetEnumByDescription<Keywords>())
- {
- case Keywords.首尾删空:
- deleteNullStartOrEndwith = !deleteNullStartOrEndwith;
- break;
- }
- //序列化*类转字符串
- JsonSaveAs();
- PrintKeywordsSettings();
- };

- /// <summary>
- /// 添加关键字至设置中
- /// </summary>
- /// <param name="options">jig设置</param>
- /// <param name="keywords">关键字</param>
- public static void AddKeywords(this PromptSelectionOptions? options, IEnumerable<string> keywords)
- {
- foreach (var key in keywords)
- {
- if (!options!.Keywords.Contains(key))
- options.Keywords.Add(key);
- }
- }
寫的時候關鍵字避開下面提示中關鍵字就好了,目前我不知道如何把默認的覆蓋掉,得大佬補充了。
需要点或 窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)
上述命令行提示是在提示選擇對象時,按Q 就會出現上面的提示。
网友答: 为什么你的代码上面有个明经通道网友答: 本帖最后由 fangmin723 于 2024-6-19 17:47 编辑
你有种再说一遍 发表于 2024-6-19 17:20
为什么你的代码上面有个明经通道
贴C#代码时,论坛自动生成的,编辑界面没有这个网址,发表后,就有了网友答: 感谢大佬的分享网友答: A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作
网友答:
d1742647821 发表于 2024-6-20 09:37
A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作


网友答:
箭头_Row 发表于 2024-7-16 08:55
封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。
自己构造索引就能替换掉ssget,例如开图就构造四叉树,然后用四叉树选择,此时你就可以不依靠acad的API了网友答:
箭头_Row 发表于 2024-7-17 23:11
和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void Remo ...
低版本没有