给Revit中的Button添加动画和图片

来源:互联网 发布:美洲文明覆灭 知乎 编辑:程序博客网 时间:2024/06/08 19:49

    测试环境Revit2016;

    引用Revit的DLL有RevitAPI.dll,RevitAPIUI.dll,AdWindows.dll,UIFramework.dll.

    如何实现像Revit自带的命令一样,当鼠标长停在button上,出现动画或者图片(如图1)。

    查看RevitAPIUI.dll中的  Autodesk.Revit.UI.PushButtonData,发现revit提供了ToolTipImage属性,但是它只能添加图片,无法添加动画,所以我们要使用AdWindows.dll提供的Autodesk.Windows.RibbonItem,来给ToolTip属性赋值。

    这个方法的关键是找到Autodesk.Windows命名空间下的RibbonItem,本文将提供两种方式,一种是遍历Autodesk.Windows.RibbonControl,第二种是通过Autodesk.Revit.UI.RibbonItem反射查找Autodesk.Windows.RibbonItem

    使用C:/Program Files/Autodesk/Revit 2016/videos/目录下的视频文件(根据Revit安装目录查找文件),最后实现效果如图2。

   

                                    图1                                                                           图2

using Autodesk.Revit.UI;using Autodesk.Windows;using System;using System.Collections.Generic;using System.Drawing;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;using System.Windows.Media.Imaging;using UIFramework;using RibbonItem = Autodesk.Revit.UI.RibbonItem;namespace ButtonVideo{    public class App : IExternalApplication    {        private const string tabName = "VButton";        private const string panelName = "Video tooltip";        public Result OnShutdown(UIControlledApplication application)        {            return Result.Succeeded;        }        public Result OnStartup(UIControlledApplication application)        {            RibbonControl ribbonControl = RevitRibbonControl.RibbonControl;            var ribbonTab = ribbonControl.FindTab(tabName);            if (ribbonTab == null)            {                application.CreateRibbonTab(tabName);            }            var ribbonPanel = application.CreateRibbonPanel(tabName, panelName);            var button1Data = new PushButtonData("Button1",                                                 "Button1",                                                 typeof(App).Assembly.Location,                                                   "ButtonVideo.Button");            //图片地址            string path = System.Reflection.Assembly.GetExecutingAssembly().Location;            path = Path.Combine(Path.GetDirectoryName(path), "weather_sun.png");            button1Data.LargeImage = GetBitmapImage(path);            var button1 = ribbonPanel.AddItem(button1Data);                RibbonToolTip toolTip1 = new RibbonToolTip()            {                Title = "这是Button1",                Content = "这是命令简要内容",                ExpandedContent = "这是命令的扩展内容!",                //字符串不要换行,否则读不出来                //ExpandedVideo = new Uri(@"C:\Program Files\Autodesk\Revit 2016\videos\GUID-4D816758-AF71-455E-9FAE-A1D5ED237EC6-low.swf"),                ExpandedVideo = new Uri("C:/Program Files/Autodesk/Revit 2016/videos/GUID-4D816758-AF71-455E-9FAE-A1D5ED237EC6-low.swf"),                ExpandedImage = GetBitmapImage(path),                //IsHelpEnabled = true,                //IsProgressive = true            };                        SetRibbonItemToolTip(button1, toolTip1);            return Result.Succeeded;        }        public BitmapImage GetBitmapImage(string imagePath)        {            if (File.Exists(imagePath))                return new BitmapImage(new Uri(imagePath));            else                return null;        }         void SetRibbonItemToolTip(RibbonItem item, RibbonToolTip toolTip)        {                      //var ribbonItem = GetRibbonItem1(item);            var ribbonItem = GetRibbonItem2(item);            if (ribbonItem == null)                return;            ribbonItem.ToolTip = toolTip;        }        private Autodesk.Windows.RibbonItem GetRibbonItem1( RibbonItem item)        {            Type itemType = item.GetType();            var mi = itemType.GetMethod("getRibbonItem",              BindingFlags.NonPublic | BindingFlags.Instance);            var windowRibbonItem = mi.Invoke(item, null);            return windowRibbonItem              as Autodesk.Windows.RibbonItem;        }        private Autodesk.Windows.RibbonItem GetRibbonItem2(      RibbonItem item)        {            RibbonControl ribbonControl              = RevitRibbonControl.RibbonControl;            //第二种方式获得RibbonControl            //RibbonControl ribbonControl = Autodesk.Windows.ComponentManager.Ribbon;            foreach (var tab in ribbonControl.Tabs)            {                if (tab.Id == App.tabName)                {                    foreach (var panel in tab.Panels)                    {                        //panel.Source.Id------CustomCtrl_%VButton%Video tooltip                        if (panel.Source.AutomationName == App.panelName)                        {                            foreach (var ribbonItem                              in panel.Source.Items)                            {                                //ribbonItem.Id------------CustomCtrl_%CustomCtrl_%VButton%Video tooltip%Button1                                                        if (ribbonItem.AutomationName                                  == item.Name)                                {                                    return ribbonItem as                                      Autodesk.Windows.RibbonItem;                                }                            }                        }                    }                }            }            return null;        }    }}

更详细的代码见:http://download.csdn.net/download/mye918/9970716