之前开发的功能相对简单,
一个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正常退出的过程中,
也会将其删除。
目前完成的代码中只涉及到了简单的RibbonCommandButton、RibbonSplitButton相对简单的按钮,
没有涉及到RibbonTextBox等复杂的按钮。