之前开发的功能相对简单,一个 RibbonTab 就把相关的功能展示出来了。
目前着手准备开发的功能,需要多个 RibbonTab,且不想显示 AutoCAD 或 Civil 3D 自身的 RibbonTab。
曾经想模拟 3d3s 的样子来切换 RibbonTab,但发现 3d3s 是将 AutoCAD 原生的 Cuix 和自己的 RibbonTab 结合到一起。对于纯 AutoCAD,这样做没什么问题,但对于 Civil 3D、Map 3D 或者 Architecture,这样做就有问题了,加载 3d3s 后显示的是 AutoCAD 与 3d3s 的 RibbonTab。
后来发现软件原生的 RibbonTab 与自己定制 RibbonTab 的切换,完全可以通过切换工作空间来实现。
加载到 AutoCAD 的情况
加载到 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 正常退出的过程中,也会将其删除。
如果您觉得这篇博客对您有所帮助或启发,请点赞👍
如果您有任何疑问或想法,请在评论区留言👇