本帖最后由 箭头_Row 于 2026-2-23 16:23 编辑

PaletteSet類

PaletteSet自動保存
  • 通過繼承類:PaletteSet,注册软件开启后执行的命令 & 註冊记录数据用的Guid,使其自動保存打開數據方便下次打開直接調用。
  1. internal class SideMenusPaletteSet : PaletteSet
  2. {
  3.     // AppName :標題欄顯示名稱、關聯命令、唯一ID(保存信息用)
  4.     public SideMenusPaletteSet()
  5.         : base(AppName, nameof(SideMenus.ArS_PaletteSet), new Guid("{42425FEE-B3FD-4770-8090-DB857E9F7A7E}"))
  6. }

  • 註冊ID必須唯一!
  • 關於註冊Guid后經測試又需要修改其名稱,可通過修改當前用戶配置下Profile.aws文件來重置,故測試時最好不繼承註冊Guid.

  1.     public ArFolderPaletteSet()
  2.         : base(PaletteName) // 測試時使用
  3.     /*public ArFolderPaletteSet()
  4.         : base(
  5.             PaletteName,
  6.             nameof(FolderTreePaletteCmd.CMD_FolderTreePalette),
  7.             new Guid("{42425FEE-B3FD-4776-8090-DB857E9F7A7E}")
  8.         )*/

具體代碼詳見:gileCAD

PaletteSet自動保存
  • 註冊数据保存的具體位置: "C:\Users\Administrator\AppData\Roaming\Autodesk\AutoCAD 2022\R24.1\chs\Support\Profiles\未命名配置\Profile.aws"(未命名配置為當前用戶配置:OP--配置--可用配置。)
  • Profiles 文件夹:存储的是 AutoCAD 的 .aws (AutoCAD Workspace) 文件。 简单来说,它记录了你对 用户界面 (UI) 的所有个性化改动。

Profile.aws格式化 及 修改
  • xml格式化
  1. public class XmlFormatter
  2. {
  3.     private static string Desktop => Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

  4.     [CommandMethod(nameof(Test_FormatXml), CommandFlags.Modal)]
  5.     public void Test_FormatXml()
  6.     {
  7.         // 暫且寫成絕對路徑,可以通過com接口獲取此路徑,相對複雜,內容過於長後續另起一篇
  8.         const string inputPath =
  9.             @"C:\Users\Administrator\AppData\Roaming\Autodesk\AutoCAD 2022\R24.1\chs\Support\Profiles\未命名配置\Profile.aws";

  10.         string inputXml = File.ReadAllText(inputPath);
  11.         string formattedXml = FormatXml(inputXml);
  12.         string outputPath = Path.Combine(Desktop, "Test01.xml");
  13.         File.WriteAllText(outputPath, formattedXml);

  14.         Process.Start(new ProcessStartInfo(outputPath) { UseShellExecute = true });
  15.     }

  16.     private static string FormatXml(string inputXml)
  17.     {
  18.         try
  19.         {
  20.             var doc = XDocument.Parse(inputXml);
  21.             return doc.ToString();
  22.         }
  23.         catch (Exception ex)
  24.         {
  25.             return "error: " + ex.Message;
  26.         }
  27.     }
  28. }

  • xml删除
    • 注册的软件启动执行的命令信息:<StartupInfo>下<Tool ToolName="胡亂設計" Command="ArS_PaletteSet" />项,其中Command为类继承中设置的關聯命令。
    • 注册的Guid保存的窗口信息:<ToolsInfo>中注册的<Tool CLSID="{618C5FEF-B687-4F57-8C82-FDEB1023DE58}">项,其中618C5FEF-B687-4F57-8C82-FDEB1023DE58为命令绑定的GUID。


网友答: 能详细说明一下吗,比如工具选项板,能不能实现添加父子级按钮

网友答: 本帖最后由 箭头_Row 于 2026-2-27 14:05 编辑

父子級按鈕是什麽意思,是UI容器層級關係(最常見)?

類似下面這樣的?

  1. <!-- StackPanel 是父,兩個 Button 是子 -->
  2. <StackPanel x:Name="parentContainer">
  3.     <Button Content="子按鈕1"/>
  4.     <Button Content="子按鈕2"/>
  5. </StackPanel>


可以參考和尚同志寫的這個添加child的寫法,將按鈕裝在Expander父項容器里,也可以自己手搓Grid、stackPanel容器。
最少代码的侧边栏菜单 - AutoCAD.net/VB.net/C# 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz!

還是你說的不同的分欄?如果說的是不同的分欄,類似自帶的ctrl+3的默認選項板的建築、機械、電力等分欄,那麼是在這個語句下瘋狂加contorl。
類似下面語句:

  1.             ElementHost host = new()
  2.             {
  3.                 AutoSize = true,
  4.                 Dock = DockStyle.Fill,
  5.                 Child = Dfrm,
  6.             };

  7.             PSet.Add(AppName, host); // 加了一個分欄
  8.             ......
  9.             // 再實例化一個contorn,就是另一個分欄
  10.             PSet.Add(另一個名稱, host02);/ / 加了另一個分欄
  11.             PSet.Visible = true;



网友答: 本帖最后由 箭头_Row 于 2026-3-1 17:46 编辑

關於拼接配置下路徑的方法(com模式):

  1. using Autodesk.AutoCAD.Interop;

  2. public class Ac01File : AcadPreferencesFiles
  3. {
  4.     private readonly AcadPreferencesFiles _acadFiles;

  5.     public Ac01File()
  6.     {
  7.         //访问首选项对象
  8.         var acPrefComObj = (AcadPreferences)Acap.Preferences;
  9.         _acadFiles = acPrefComObj.Files;
  10.     }

  11. #if acad2025
  12.     public AcadApplication? Application => null;
  13. #else
  14.     public IAcadApplication? Application => null;
  15. #endif

  16. ......
  17.     public string CustomDictionary
  18.     {
  19.         get => _acadFiles.CustomDictionary;
  20.         set => _acadFiles.CustomDictionary = value;
  21.     }
  22. }


  1. using Autodesk.AutoCAD.Interop;

  2. public class Ac09Profiles : AcadPreferencesProfiles
  3. {
  4.     private readonly AcadPreferencesProfiles _acadProfiles;

  5.     public Ac09Profiles()
  6.     {
  7.         //访问首选项对象
  8.         var acPrefComObj = (AcadPreferences)Acap.Preferences;
  9.         _acadProfiles = acPrefComObj.Profiles;
  10.     }

  11. #if acad2025
  12.     public AcadApplication? Application => null;
  13. #else
  14.     public IAcadApplication? Application => null;
  15. #endif
  16. ......
  17.     public string ActiveProfile
  18.     {
  19.         get => _acadProfiles.ActiveProfile;
  20.         set => _acadProfiles.ActiveProfile = value;
  21.     }
  22. }



上面代碼中間自己手動補全哦,詳見驚佬的博客:Com方式修改颜色cad.net 颜色对话框+背景色 - 惊惊 - 博客园
AutoCAD 通过COM调用Preference设置背景颜色-阿里云开发者社区
下面是具體如何獲取當前配置路徑下的關於UI記錄的數據的方法:

  1. [CommandMethod(nameof(PathCad_Format_Profile))]
  2.     public static void PathCad_Format_Profile()
  3.     {
  4.         var ac01File = new Ac01File();
  5.         var profilesPath = Path.GetDirectoryName(ac01File.CustomDictionary)!;
  6.         $"profilesPath:{profilesPath}".Print();

  7.         var ac09Profiles = new Ac09Profiles();
  8.         var activeProfile = ac09Profiles.ActiveProfile.Replace("<", "").Replace(">", "");
  9.         $"activeProfile:{activeProfile}".Print();

  10.         var inputPath = Path.Combine(profilesPath, "Profiles", activeProfile, "Profile.aws");
  11.         inputPath.Print();
  12.         //inputPath = @"C:\Users\Administrator\AppData\Roaming\Autodesk\AutoCAD 2022\R24.1\chs\Support\Profiles\未命名配置\Profile.aws"

  13.         string inputXml = File.ReadAllText(inputPath);
  14.         string formattedXml = FormatXml(inputXml);
  15.         string outputPath = Path.Combine(Desktop, "Profile.xml");
  16.         File.WriteAllText(outputPath, formattedXml);
  17.         Process.Start(new ProcessStartInfo(outputPath) { UseShellExecute = true });
  18.     }

  19.     private static string FormatXml(string inputXml)
  20.     {
  21.         try
  22.         {
  23.             var doc = XDocument.Parse(inputXml);
  24.             return doc.ToString();
  25.         }
  26.         catch (Exception ex)
  27.         {
  28.             return "error: " + ex.Message;
  29.         }
  30.     }
  • 上一篇:今天过年了,交个年前作业
  • 下一篇:没有了