本帖最后由 箭头_Row 于 2026-2-23 16:23 编辑
PaletteSet類
PaletteSet自動保存


具體代碼詳見:gileCAD
PaletteSet自動保存
Profile.aws格式化 及 修改

网友答:
本帖最后由 箭头_Row 于 2026-2-27 14:05 编辑
父子級按鈕是什麽意思,是UI容器層級關係(最常見)?
類似下面這樣的?

可以參考和尚同志寫的這個添加child的寫法,將按鈕裝在Expander父項容器里,也可以自己手搓Grid、stackPanel容器。
最少代码的侧边栏菜单 - AutoCAD.net/VB.net/C# 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz!
還是你說的不同的分欄?如果說的是不同的分欄,類似自帶的ctrl+3的默認選項板的建築、機械、電力等分欄,那麼是在這個語句下瘋狂加contorl。
類似下面語句:

网友答: 本帖最后由 箭头_Row 于 2026-3-1 17:46 编辑
關於拼接配置下路徑的方法(com模式):


上面代碼中間自己手動補全哦,詳見驚佬的博客:Com方式修改颜色cad.net 颜色对话框+背景色 - 惊惊 - 博客园
AutoCAD 通过COM调用Preference设置背景颜色-阿里云开发者社区
下面是具體如何獲取當前配置路徑下的關於UI記錄的數據的方法:
PaletteSet類
PaletteSet自動保存
- 通過繼承類:PaletteSet,注册软件开启后执行的命令 & 註冊记录数据用的Guid,使其自動保存打開數據方便下次打開直接調用。

- internal class SideMenusPaletteSet : PaletteSet
- {
- // AppName :標題欄顯示名稱、關聯命令、唯一ID(保存信息用)
- public SideMenusPaletteSet()
- : base(AppName, nameof(SideMenus.ArS_PaletteSet), new Guid("{42425FEE-B3FD-4770-8090-DB857E9F7A7E}"))
- }
- 註冊ID必須唯一!
- 關於註冊Guid后經測試又需要修改其名稱,可通過修改當前用戶配置下Profile.aws文件來重置,故測試時最好不繼承註冊Guid.

- public ArFolderPaletteSet()
- : base(PaletteName) // 測試時使用
- /*public ArFolderPaletteSet()
- : base(
- PaletteName,
- nameof(FolderTreePaletteCmd.CMD_FolderTreePalette),
- new Guid("{42425FEE-B3FD-4776-8090-DB857E9F7A7E}")
- )*/
具體代碼詳見: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格式化

- public class XmlFormatter
- {
- private static string Desktop => Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
- [CommandMethod(nameof(Test_FormatXml), CommandFlags.Modal)]
- public void Test_FormatXml()
- {
- // 暫且寫成絕對路徑,可以通過com接口獲取此路徑,相對複雜,內容過於長後續另起一篇
- const string inputPath =
- @"C:\Users\Administrator\AppData\Roaming\Autodesk\AutoCAD 2022\R24.1\chs\Support\Profiles\未命名配置\Profile.aws";
- string inputXml = File.ReadAllText(inputPath);
- string formattedXml = FormatXml(inputXml);
- string outputPath = Path.Combine(Desktop, "Test01.xml");
- File.WriteAllText(outputPath, formattedXml);
- Process.Start(new ProcessStartInfo(outputPath) { UseShellExecute = true });
- }
- private static string FormatXml(string inputXml)
- {
- try
- {
- var doc = XDocument.Parse(inputXml);
- return doc.ToString();
- }
- catch (Exception ex)
- {
- return "error: " + ex.Message;
- }
- }
- }
- 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容器層級關係(最常見)?
類似下面這樣的?

- <!-- StackPanel 是父,兩個 Button 是子 -->
- <StackPanel x:Name="parentContainer">
- <Button Content="子按鈕1"/>
- <Button Content="子按鈕2"/>
- </StackPanel>
可以參考和尚同志寫的這個添加child的寫法,將按鈕裝在Expander父項容器里,也可以自己手搓Grid、stackPanel容器。
最少代码的侧边栏菜单 - AutoCAD.net/VB.net/C# 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz!
還是你說的不同的分欄?如果說的是不同的分欄,類似自帶的ctrl+3的默認選項板的建築、機械、電力等分欄,那麼是在這個語句下瘋狂加contorl。
類似下面語句:

- ElementHost host = new()
- {
- AutoSize = true,
- Dock = DockStyle.Fill,
- Child = Dfrm,
- };
- PSet.Add(AppName, host); // 加了一個分欄
- ......
- // 再實例化一個contorn,就是另一個分欄
- PSet.Add(另一個名稱, host02);/ / 加了另一個分欄
- PSet.Visible = true;
网友答: 本帖最后由 箭头_Row 于 2026-3-1 17:46 编辑
關於拼接配置下路徑的方法(com模式):

- using Autodesk.AutoCAD.Interop;
- public class Ac01File : AcadPreferencesFiles
- {
- private readonly AcadPreferencesFiles _acadFiles;
- public Ac01File()
- {
- //访问首选项对象
- var acPrefComObj = (AcadPreferences)Acap.Preferences;
- _acadFiles = acPrefComObj.Files;
- }
- #if acad2025
- public AcadApplication? Application => null;
- #else
- public IAcadApplication? Application => null;
- #endif
- ......
- public string CustomDictionary
- {
- get => _acadFiles.CustomDictionary;
- set => _acadFiles.CustomDictionary = value;
- }
- }

- using Autodesk.AutoCAD.Interop;
- public class Ac09Profiles : AcadPreferencesProfiles
- {
- private readonly AcadPreferencesProfiles _acadProfiles;
- public Ac09Profiles()
- {
- //访问首选项对象
- var acPrefComObj = (AcadPreferences)Acap.Preferences;
- _acadProfiles = acPrefComObj.Profiles;
- }
- #if acad2025
- public AcadApplication? Application => null;
- #else
- public IAcadApplication? Application => null;
- #endif
- ......
- public string ActiveProfile
- {
- get => _acadProfiles.ActiveProfile;
- set => _acadProfiles.ActiveProfile = value;
- }
- }
上面代碼中間自己手動補全哦,詳見驚佬的博客:Com方式修改颜色cad.net 颜色对话框+背景色 - 惊惊 - 博客园
AutoCAD 通过COM调用Preference设置背景颜色-阿里云开发者社区
下面是具體如何獲取當前配置路徑下的關於UI記錄的數據的方法:

- [CommandMethod(nameof(PathCad_Format_Profile))]
- public static void PathCad_Format_Profile()
- {
- var ac01File = new Ac01File();
- var profilesPath = Path.GetDirectoryName(ac01File.CustomDictionary)!;
- $"profilesPath:{profilesPath}".Print();
- var ac09Profiles = new Ac09Profiles();
- var activeProfile = ac09Profiles.ActiveProfile.Replace("<", "").Replace(">", "");
- $"activeProfile:{activeProfile}".Print();
- var inputPath = Path.Combine(profilesPath, "Profiles", activeProfile, "Profile.aws");
- inputPath.Print();
- //inputPath = @"C:\Users\Administrator\AppData\Roaming\Autodesk\AutoCAD 2022\R24.1\chs\Support\Profiles\未命名配置\Profile.aws"
- string inputXml = File.ReadAllText(inputPath);
- string formattedXml = FormatXml(inputXml);
- string outputPath = Path.Combine(Desktop, "Profile.xml");
- File.WriteAllText(outputPath, formattedXml);
- Process.Start(new ProcessStartInfo(outputPath) { UseShellExecute = true });
- }
- private static string FormatXml(string inputXml)
- {
- try
- {
- var doc = XDocument.Parse(inputXml);
- return doc.ToString();
- }
- catch (Exception ex)
- {
- return "error: " + ex.Message;
- }
- }