AutoCAD Ribbon 创建的一种新思路

1157827-20250124150048457-122541655.png

之前开发的功能相对简单,一个 RibbonTab 就把相关的功能展示出来了。

目前着手准备开发的功能,需要多个 RibbonTab,且不想显示 AutoCAD 或 Civil 3D 自身的 RibbonTab。

曾经想模拟 3d3s 的样子来切换 RibbonTab,但发现 3d3s 是将 AutoCAD 原生的 Cuix 和自己的 RibbonTab 结合到一起。对于纯 AutoCAD,这样做没什么问题,但对于 Civil 3D、Map 3D 或者 Architecture,这样做就有问题了,加载 3d3s 后显示的是 AutoCAD 与 3d3s 的 RibbonTab。

后来发现软件原生的 RibbonTab 与自己定制 RibbonTab 的切换,完全可以通过切换工作空间来实现。

 

1157827-20250124145917867-1135013910.png

加载到 AutoCAD 的情况

 

1157827-20250124150048457-122541655.png

加载到 Civil 3D 的情况

 

对于数量不多的 RibbonButton,使用代码直接创建, 代码量不多, 编写和修改问题都不大。

但当 RibbonButton 数量很多时, 编写和修改代码就很困难了,于是想借助 Cuix 文件来实现。

如果直接加载 Cuix 文件,这些自定义的 RibbonTab 将会出现在所有的工作空间中,所以不能采用简单的方式直接加载 Cuix 文件,于是就有了这篇文章的新思路:

 

—— 读取 Cuix 文件“动态”创建 RibbonTab。

读取 Cuix 文件使用的 API 是 Autodesk.AutoCAD.Customization 命名空间下的;“动态”创建使用的 API 则是 Autodesk.Windows 和 Autodesk.AutoCAD.Ribbon 下的。

—— 中心思想就是将 Autodesk.AutoCAD.Customization 下的对象转换为 Autodesk.Windows 下的对象。

 

下面是代码片段:

 

 

using cuix = Autodesk.AutoCAD.Customization;
using Autodesk.Windows;

 CustomizationSection cs = new CustomizationSection(
     Path.GetDirectoryName(
         Uri.UnescapeDataString(
             new UriBuilder(
                 Assembly.GetExecutingAssembly().CodeBase).Path))
     + "\\工业总图三维设计.cuix", true);
 Autodesk.Windows.RibbonControl ribbonCtrol = ComponentManager.Ribbon;
 if (ribbonCtrol != null)
 {
     foreach (cuix.RibbonTabSource rts in cs.MenuGroup.RibbonRoot.RibbonTabSources)
     {
         RibbonTab rtab = ribbonCtrol.FindTab(rts.ElementID);
         if (rtab == null)
         {
             rtab = new RibbonTab();
             rtab.Title = rts.Name;
             rtab.Id = rts.ElementID;
             ribbonCtrol.Tabs.Add(rtab);
             CreatePanels(rtab, rts);
         }

 

 

这样做的好处是:当重启 AutoCAD 后,自己的 RibbonTab 不再出现,不会残留在主 Cuix 文件中。

当然, 工作空间也是在代码中动态创建的,在 AutoCAD 正常退出的过程中,也会将其删除。

 

 

如果您觉得这篇博客对您有所帮助或启发,请点赞👍

如果您有任何疑问或想法,请在评论区留言👇

 

1 评论