fangmin723 发表于 2024-6-19 16:39:20

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;
}

你有种再说一遍 发表于 2024-6-19 17:20:06

为什么你的代码上面有个明经通道

fangmin723 发表于 2024-6-19 17:41:06

本帖最后由 fangmin723 于 2024-6-19 17:47 编辑

你有种再说一遍 发表于 2024-6-19 17:20
为什么你的代码上面有个明经通道
贴C#代码时,论坛自动生成的,编辑界面没有这个网址,发表后,就有了

czb203 发表于 2024-6-19 23:05:59

感谢大佬的分享

d1742647821 发表于 2024-6-20 09:37:57

A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作

fangmin723 发表于 2024-6-20 10:36:54

d1742647821 发表于 2024-6-20 09:37
A切换到添加图元R切换到删除图元,这功能直接GetSelection就有,不需要任何额外操作

箭头_Row 发表于 2024-7-16 08:55:16

本帖最后由 箭头_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 就會出現上面的提示。

你有种再说一遍 发表于 2024-7-16 16:10:49

箭头_Row 发表于 2024-7-16 08:55
封裝好複雜的感覺,實際關鍵在這一行:entOpts.KeywordInput += (sender, e) 。




自己构造索引就能替换掉ssget,例如开图就构造四叉树,然后用四叉树选择,此时你就可以不依靠acad的API了

箭头_Row 发表于 2024-7-17 23:11:24

和尚大佬給給出了提示,用這個自帶的類(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
}

你有种再说一遍 发表于 2024-7-18 00:44:16

箭头_Row 发表于 2024-7-17 23:11
和尚大佬給給出了提示,用這個自帶的類(PromptSelectionOptions)下函數就可以移除了,
public void Remo ...

低版本没有
页: [1]
查看完整版本: CAD.Net 带关键字的选择集 ed.GetSelection()