明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: transteel

[界面] 【已解决】如何实现一个跟随鼠标的菜单?

[复制链接]
 楼主| 发表于 2025-8-5 23:18:16 | 显示全部楼层
你有种再说一遍 发表于 2025-8-5 23:10
它这个应该只是关键字...你看看getstring参数上面的配置里面是不是有

问了下chatgpt大概实现了(虽然还有bug):


  1. Dim promptString As New PromptKeywordOptions(vbCrLf & $"选择管线类型(根据提示输入数字)[SC×1(1)/SC×2(2)/SC×4(3)/SC×6(4)/PE×1(5)/PE×2(6)/PE×4(7)/PE×6(8)/]<{typeindex}>")
  2. promptString.Keywords.Add("SC×1", "1")
  3. promptString.Keywords.Add("SC×2", "2")
  4. promptString.Keywords.Add("SC×4", "3")
  5. promptString.Keywords.Add("SC×6", "4")
  6. promptString.Keywords.Add("PE×1", "5")
  7. promptString.Keywords.Add("PE×2", "6")
  8. promptString.Keywords.Add("PE×4", "7")
  9. promptString.Keywords.Add("PE×6", "8")

  10. ' 获取用户选择的选项
  11. Dim result As PromptResult = ed.GetKeywords(promptString)

  12. If result.Status = PromptStatus.OK Then
  13.     ' 通过选项设置 typeindex
  14.     typeindex = CInt(result.StringResult)
  15. End If


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

发表于 2025-8-5 23:19:45 | 显示全部楼层
看他这个意思,应该就不需要做任何处理,把动态菜单打开就是了。
回复 支持 反对

使用道具 举报

发表于 2025-8-5 23:21:03 | 显示全部楼层
你有种再说一遍 发表于 2025-8-5 23:10
它这个应该只是关键字...你看看getstring参数上面的配置里面是不是有

大佬的精力好旺盛,怎么调养的。告诉我你的秘方。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-5 23:21:17 | 显示全部楼层
bskidtf 发表于 2025-8-5 23:19
看他这个意思,应该就不需要做任何处理,把动态菜单打开就是了。

CAD二开上,我是新手。问题已经基本解决了(见重新编辑的1楼),感谢指导!
回复 支持 反对

使用道具 举报

发表于 2025-8-5 23:21:22 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-8-13 13:32 编辑
transteel 发表于 2025-8-5 23:18
问了下chatgpt大概实现了(虽然还有bug):

提示字符串不要写关键字.
关键字会自动出现在提示字符串上面的,如果没有的话,就是有个开关..
而且 promptString.Keywords.Add("8", "8", "8")
这里应该是三个参数,都要写上
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-5 23:24:34 | 显示全部楼层
你有种再说一遍 发表于 2025-8-5 23:21
提示字符串不要写关键字.
关键字会自动出现在提示字符串上面的,如果没有的话,就是有个开关..
而且 prom ...

从操作简便的角度看,选择比输入更方便,也不用想输入哪个数字。刚才的代码基本实现的我的诉求,后面的修修补补慢慢来吧。

看男篮比赛了!

惊惊晚安。多谢指导!
回复 支持 反对

使用道具 举报

发表于 2025-8-6 10:11:30 | 显示全部楼层
应该是这样的keywords.Add("A","A","选项(A)");并且不需要写到message里
回复 支持 反对

使用道具 举报

发表于 2025-8-13 12:18:31 | 显示全部楼层
本帖最后由 箭头_Row 于 2025-8-13 12:29 编辑

看動圖大致是下面步驟操作:

第一步獲取座標點,判斷操作:
option:點取點則進行接下來插入操作
option:點右鍵則進行右鍵菜單(關鍵字菜單)選取關鍵字操作
        {
              根據關鍵寫對應的更改參數的邏輯;
        }

注意:獲取點時一定要打開可空輸入!

大致代碼如下:
  1. public static class CsTest
  2. {
  3.     private enum Keywords
  4.     {
  5.         [Description("A")]
  6.         轴类,

  7.         [Description("S")]
  8.         设置,
  9.     }

  10.     [CommandMethod(nameof(Dg))]
  11.     public static void Dg()
  12.     {
  13.         using var doc = Acaop.DocumentManager.MdiActiveDocument;
  14.         var ed = doc.Editor;

  15.         // 以下測試代碼,循環可自行擴展
  16.         PromptPointOptions ppo = new("\n指定第一个点");
  17.         ppo.AllowNone = true; // 打开可空才會右鍵彈關鍵字菜單

  18.         PromptPointResult ppr = Env.Editor.GetPoint(ppo);
  19.         if (ppr.Status == PromptStatus.None)
  20.         {
  21.             PromptKeywordOptions options = new(string.Empty);
  22.             var keywordsMap = ArEnumEx.GetKeywordsMap<Keywords>();
  23.             options.AddKeywords([.. keywordsMap.Keys]);
  24.             options.AppendKeywordsToMessage = false; //不将关键字列表添加到提示信息中
  25.             options.Message = "\n右鍵彈出菜單示例" + keywordsMap.ToMessage();

  26.             PromptResult pr = ed.GetKeywords(options);
  27.             if (pr.Status.CancelPrint())
  28.                 return;

  29.             // 進行更改參數的操作
  30.         }
  31.         else if (ppr.Status != PromptStatus.OK)
  32.             return;

  33.         Point3d ptStart = ppr.Value;
  34.     }
  35. }


  1. /// <summary>
  2. /// 獲取關鍵字字典
  3. /// </summary>
  4. /// <typeparam name="T">關鍵字枚舉</typeparam>
  5. /// <returns> Dictionary 快捷鍵,(描述字_中文,Enum值)</returns>
  6. public static Dictionary<string, (string Key_CN, T enumValue)> GetKeywordsMap<T>()
  7.      where T : Enum
  8. {
  9.      Dictionary<string, (string, T)> keywordsDic = [];
  10.      var type = typeof(T);
  11.      var typeDesc = typeof(DescriptionAttribute);
  12.      foreach (var e in Enum.GetValues(type))
  13.      {
  14.          var name = e.ToString();
  15.          object objArr = type.GetField(name).GetCustomAttributes(typeDesc, true)[0];
  16.          keywordsDic.Add(((DescriptionAttribute)objArr).Description, (name, (T)e));
  17.      }

  18.      return keywordsDic;
  19. }


感謝驚驚提示的源碼及思路:獲取關鍵字字典。

  1. /// <summary>
  2. /// 获取关键字提示信息行。
  3. /// </summary>
  4. /// <param name="keywordsDic">keywords關鍵字字典</typeparam>
  5. /// <param name="defaultKeyword">可选的默认关键字,非空时添加到结果中</param>
  6. /// <returns> 返回格式示例:[字典(D)/板厚(T)/层高(H)/完成面(F)/图层(C)]</returns>
  7. public static StringBuilder ToMessage<T>(
  8.      this Dictionary<string, (string Key_CN, T enumValue)> keywordsDic,
  9.      string defaultKeyword = ""
  10. )
  11.      where T : Enum
  12. {
  13.      int number = 0;
  14.      StringBuilder keywordNotice = new("[");
  15.      foreach (var item in keywordsDic)
  16.      {
  17.          keywordNotice.Append(item.Value.Key_CN);
  18.          keywordNotice.Append('(');
  19.          keywordNotice.Append(item.Key);
  20.          keywordNotice.Append(')');
  21.          if (number < keywordsDic.Count - 1)
  22.              keywordNotice.Append('/');
  23.          number++;
  24.      }

  25.      keywordNotice.Append(']');

  26.      if (defaultKeyword != string.Empty)
  27.          if (keywordsDic.ContainsKey(defaultKeyword))
  28.              keywordNotice.Append($"<{defaultKeyword}>");
  29.          else // 無默認值時報錯提示
  30.              throw new ArgumentException("错误的默认值!");

  31.      return keywordNotice;
  32. }


  1. /// <summary>
  2. /// 檢查提示狀態是否為取消狀態,如果是則打印指定消息並返回 true。
  3. /// </summary>
  4. /// <param name="status">提示狀態。</param>
  5. /// <param name="message">要打印的消息,默認為 "*取消*"。</param>
  6. /// <returns>如果提示狀態不是 OK,則返回 true,否則返回 false。</returns>
  7. public static bool CancelPrint(this PromptStatus status, string message = "*取消*")
  8. {
  9.     if (status == PromptStatus.OK)
  10.         return false;

  11.     message.Print();
  12.     return true;
  13. }




回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-8-27 18:14 , Processed in 0.189634 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表