123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- /* ==============================================================================
- * 功能描述: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
- {
- /// <summary>
- /// RevitRibbonOperate
- /// </summary>
- class RevitRibbonOperate
- {
- /// <summary>
- /// 创建菜单
- /// </summary>
- /// <param name="app"></param>
- /// <param name="configTabs"></param>
- /// <returns></returns>
- 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<RibbonPanel> listRibPanel;
- try
- {//获取自定义Tab下的Panel,如果Tab不存在,抛出异常
- listRibPanel = app.GetRibbonPanels(tabData.TabName);
- }
- catch (Exception e)
- {
- app.CreateRibbonTab(tabData.TabName);
- listRibPanel = new List<RibbonPanel>();
- }
- #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<RibbonItem> listPanelItem = new List<RibbonItem>();
- 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<RibbonItem, bool> setRibbonItemVisibleAction = (t, b) =>
- {
- t.Visible = b;
- if (b)
- separatorBeforeVisibleItem = t;
- };
- PulldownButton pulldownButton = null;
- List<Tuple<ButtonData, bool>> stackButtonDatas = new List<Tuple<ButtonData, bool>>();
- IList<RibbonItem> 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<ButtonData, bool>(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;
- }
- /// <summary>
- /// Tab前后加【】
- /// </summary>
- /// <param name="configTabs"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 设置StackButton的可见性
- /// </summary>
- /// <param name="ribbonItems"></param>
- /// <param name="stackButtonDatas"></param>
- private static void SetStackItemsVisible(IList<RibbonItem> ribbonItems, List<Tuple<ButtonData, bool>> stackButtonDatas)
- {
- int i = 0;
- foreach (RibbonItem ribbonItem in ribbonItems)
- {
- var tuple = stackButtonDatas[i];
- ribbonItem.Visible = tuple.Item2;
- i++;
- }
- }
- }
- }
|