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

本文介绍如何在Revit中自定义UI按钮,并通过AdWindows.dll实现按钮悬停时显示视频提示的效果。主要通过Autodesk.Windows.RibbonItem设置ToolTip属性,支持视频及图片展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    测试环境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.youkuaiyun.com/download/mye918/9970716

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值