您的位置:首页 > 其它

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

2017-09-08 21:19 387 查看
    测试环境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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: