CAD.Net 带关键字的选择集 ed.GetSelection()
本帖最后由 fangmin723 于 2024-6-19 16:42 编辑封装的水平有限,大佬请略过哈
按关键字【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>
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: ,
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<PromptSelectionOptions> 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;
}
为什么你的代码上面有个明经通道 本帖最后由 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 09:00 编辑
封裝好複雜的感覺,實際關鍵在這一行: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 就會出現上面的提示。
箭头_Row 发表于 2024-7-16 08:55
封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。
自己构造索引就能替换掉ssget,例如开图就构造四叉树,然后用四叉树选择,此时你就可以不依靠acad的API了 和尚大佬給給出了提示,用這個自帶的類(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
} 箭头_Row 发表于 2024-7-17 23:11
和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void Remo ...
低版本没有
页:
[1]