/* ============================================================================== * 功能描述:RevitRibbon生成操作 * 创 建 者:Garrett * 创建日期:2018/9/17 18:01:44 * ==============================================================================*/ using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging; using Autodesk.Revit.UI; using Autodesk.Windows; using SAGA.RevitUtils; using RibbonItem = Autodesk.Revit.UI.RibbonItem; using RibbonPanel = Autodesk.Revit.UI.RibbonPanel; namespace SAGA.RevitMenu.Configuration { /// /// RevitRibbonOperate /// class RevitRibbonOperate { /// /// 创建菜单 /// /// /// /// public static bool ApplyConfigTabs(UIControlledApplication app, TszTabData[] configTabs) { int index = 0; if (!AddSignToTab(configTabs)) return false; for (int j = 0; j < configTabs.Length; j++) { if (j == 18) { //经测试,最多为20个,为保险暂保留15个。 MessageShow.Infomation("菜单Tab页签项过多,只加载了18个Tab页签。"); break; } #region 创建RibbonTab 前后加【】 TszTabData tabData = configTabs[j]; //没有可用button不创建 if (!tabData.HasVisibleItem()) continue; List listRibPanel; try {//获取自定义Tab下的Panel,如果Tab不存在,抛出异常 listRibPanel = app.GetRibbonPanels(tabData.TabName); } catch (Exception e) { app.CreateRibbonTab(tabData.TabName); listRibPanel = new List(); } #endregion foreach (TszPanelData panelData in tabData.Panels) { #region 创建RibbonPanel bool blnExist = panelData.ValidateData(); if (!blnExist||!panelData.HasVisibleItem()) { continue; } var rvtRibbonPanel = listRibPanel.Find(p => p.Name == panelData.PanelName); List listPanelItem = new List(); if (rvtRibbonPanel == null) { rvtRibbonPanel = app.CreateRibbonPanel(tabData.TabName, panelData.PanelName); rvtRibbonPanel.Visible = panelData.Visible; } else { listPanelItem = rvtRibbonPanel.GetItems().ToList(); } #endregion //分割符数据 RibbonItem separatorBeforeVisibleItem = null;//分割符之前的可见Button bool separatorStandBy = false;//准备放置分割符 Action setRibbonItemVisibleAction = (t, b) => { t.Visible = b; if (b) separatorBeforeVisibleItem = t; }; PulldownButton pulldownButton = null; List> stackButtonDatas = new List>(); IList ribbonItems = null; for (int i = 0; i < panelData.Buttons.Count; i++) { bool isLast = false; #region 按钮 TszButtonData tszbuttonData = panelData.Buttons[i]; tszbuttonData.ButtonText = tszbuttonData.ButtonText?.Replace(" ", Environment.NewLine); //不加载名为NEWTEXTBUTTON的按钮(该按钮在Panel为空时仅为找TabName用,自行在XML中添加) wxy 2017-4-18 if (tszbuttonData.ButtonText == "NEWTEXTBUTTON") continue; //RibbonPalel中不允许同名Button if (listPanelItem.Exists(p => p.Name == tszbuttonData.ButtonName)) { continue; } PushButtonData pushbuttonData = null; PushButton pushButton = null; //加载Stack排列类型的命令 #region 添加Stack Button PlaceStackStart: if (stackButtonDatas.Count > 0 && tszbuttonData.Styles != ButtonStyles.Stacked || isLast) { if (stackButtonDatas.Count >= 3) { ribbonItems = rvtRibbonPanel.AddStackedItems(stackButtonDatas[0].Item1, stackButtonDatas[1].Item1, stackButtonDatas[2].Item1); SetStackItemsVisible(ribbonItems, stackButtonDatas); stackButtonDatas.RemoveRange(0, 3); goto PlaceStackStart; } if (stackButtonDatas.Count == 2) { ribbonItems = rvtRibbonPanel.AddStackedItems(stackButtonDatas[0].Item1, stackButtonDatas[1].Item1); SetStackItemsVisible(ribbonItems, stackButtonDatas); } else if (stackButtonDatas.Count == 1) { pushButton = rvtRibbonPanel.AddItem(stackButtonDatas[0].Item1) as PushButton; setRibbonItemVisibleAction(pushButton, stackButtonDatas[0].Item2); } stackButtonDatas.Clear(); if (isLast) continue; } #endregion //创建分割符。分割符创建条件,1,分割符之前有可见Button,2,在分割符之后的下一个可见Button之前创建分割符 if (separatorStandBy && tszbuttonData.Visible) { rvtRibbonPanel.AddSeparator(); separatorBeforeVisibleItem = null; separatorStandBy = false; } //创建pullButton if (tszbuttonData.Styles != ButtonStyles.Separator) { pushbuttonData = new PushButtonData(tszbuttonData.ButtonName, tszbuttonData.ButtonText, tszbuttonData.AssemblyName, tszbuttonData.ClassName); if (!string.IsNullOrEmpty(tszbuttonData.ImageName)) { var stringImagePath = tszbuttonData.ImageName + "16.png"; var stringLargeImagePath = tszbuttonData.ImageName + ".png"; if (File.Exists(stringImagePath)) { pushbuttonData.Image = new BitmapImage(new Uri(stringImagePath)); } if (File.Exists(stringLargeImagePath)) { pushbuttonData.LargeImage = new BitmapImage(new Uri(stringLargeImagePath)); } } pushbuttonData.ToolTip = tszbuttonData.ToolTip; pushbuttonData.LongDescription = tszbuttonData.LongDescription; pushbuttonData.AvailabilityClassName = tszbuttonData.ClassName; } //加载图标并且将Button添加到菜单 switch (tszbuttonData.Styles) { case ButtonStyles.Separator: if (separatorBeforeVisibleItem != null) separatorStandBy = true; //rvtRibbonPanel.AddSeparator(); break; case ButtonStyles.Large: pushButton = rvtRibbonPanel.AddItem(pushbuttonData) as PushButton; setRibbonItemVisibleAction(pushButton, tszbuttonData.Visible); break; case ButtonStyles.Pushdown: if (pulldownButton == null || pulldownButton.Visible == false) { SplitButtonData spliteButtonData = new SplitButtonData("push" + panelData.PanelName + i, panelData.PanelName); spliteButtonData.Text = pushbuttonData.Text; spliteButtonData.LargeImage = pushbuttonData.LargeImage; spliteButtonData.ToolTip = tszbuttonData.ToolTip; spliteButtonData.LongDescription = tszbuttonData.LongDescription; pulldownButton = rvtRibbonPanel.AddItem(spliteButtonData) as PulldownButton; pulldownButton.Visible = tszbuttonData.Visible; setRibbonItemVisibleAction(pulldownButton, tszbuttonData.Visible); } pushButton = pulldownButton?.AddPushButton(pushbuttonData); setRibbonItemVisibleAction(pushButton, tszbuttonData.Visible); break; case ButtonStyles.Stacked: case ButtonStyles.StackedBox: stackButtonDatas.Add(new Tuple(pushbuttonData, tszbuttonData.Visible)); break; } //最后一项,并且是Stacked ,跳转到添加Stacked isLast = panelData.Buttons.Count - 1 == i; if (isLast&&stackButtonDatas.Count>0) goto PlaceStackStart; #endregion } } ////调整选项卡到最前 RibbonTab tab = ComponentManager.Ribbon.Tabs.FirstOrDefault(t => t.Name == tabData.TabName); if (tab != null) { ComponentManager.Ribbon.Tabs.Remove(tab); ComponentManager.Ribbon.Tabs.Insert(index, tab); index++; } } return true; } /// /// Tab前后加【】 /// /// /// private static bool AddSignToTab(TszTabData[] configTabs) { var firstVisibleTabItem = configTabs.FirstOrDefault(t => t.HasVisibleItem()); //如果都不可见,直接返回,不创建了 if (firstVisibleTabItem == null) return false; firstVisibleTabItem.TabName = "【"+ firstVisibleTabItem.TabName; var lastVisibleTabItem = configTabs.LastOrDefault(t => t.HasVisibleItem()); if (lastVisibleTabItem == null) return false; lastVisibleTabItem.TabName += "】"; return true; } /// /// 设置StackButton的可见性 /// /// /// private static void SetStackItemsVisible(IList ribbonItems, List> stackButtonDatas) { int i = 0; foreach (RibbonItem ribbonItem in ribbonItems) { var tuple = stackButtonDatas[i]; ribbonItem.Visible = tuple.Item2; i++; } } } }