公告
Autodesk Community will be read-only between April 26 and April 27 as we complete essential maintenance. We will remove this banner once completed. Thanks for your understanding
Announcements
We are currently migrating data within this board to improve the community. During this process, posting, replying, editing and other features are temporarily disabled. We sincerely apologize for any inconvenience caused and appreciate your understanding. Thank you for your patience and support.

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 评论