修复bug和新增部分功能

This commit is contained in:
GG Z
2024-10-08 16:21:39 +08:00
parent 082b781808
commit b6647218be
44 changed files with 1709 additions and 1390 deletions

View File

@@ -111,8 +111,8 @@ public static class ExtensibleStorageAssist
throw new ArgumentNullException(nameof(fieldName));
}
//if (!typeof(T).IsPrimitive)
// throw new NotSupportedException(nameof(T));
//if (!typeof(Command).IsPrimitive)
// throw new NotSupportedException(nameof(Command));
var result = schemaBuilder.AddArrayField(fieldName, typeof(T));
if (description == string.Empty)
@@ -144,8 +144,8 @@ public static class ExtensibleStorageAssist
throw new ArgumentNullException(nameof(fieldName));
}
//if (!typeof(T).IsPrimitive)
// throw new NotSupportedException(nameof(T));
//if (!typeof(Command).IsPrimitive)
// throw new NotSupportedException(nameof(Command));
var result = schemaBuilder.AddSimpleField(fieldName, typeof(T));
//result.SetUnitType(unitType);
@@ -340,7 +340,7 @@ public static class ExtensibleStorageAssist
// Entity ent = e.GetEntity(schema);
// foreach (var field in fields)
// {
// var f = ent.Get<T>(field);
// var f = ent.Get<Command>(field);
// storages.Add(f);
// }
// }

View File

@@ -1,6 +1,5 @@
using Autodesk.Revit.DB;
using JetBrains.Annotations;
namespace Sai.Toolkit.Revit.Assist;
@@ -14,7 +13,7 @@ internal static class HostObjectAssist
public static List<Sketch> GetSketch(this HostObject element)
{
var doc = element.Document;
List<Sketch> sketches = new();
List<Sketch> sketches = [];
using (SubTransaction subTransaction = new(doc))
{
subTransaction.Start();

View File

@@ -54,19 +54,17 @@ public static class ImageAssist
public static BitmapSource ToBitmapSource(this Bitmap bitmap)
{
if (bitmap == null)
{
return null;
}
return Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
}
return bitmap == null
? null
: Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
}
/// <summary>
/// Icon转BitmapSource
/// </summary>
/// <param name="icon"></param>
/// <returns></returns>
public static BitmapSource ToBitmapSource(this Icon icon)
/// <summary>
/// Icon转BitmapSource
/// </summary>
/// <param name="icon"></param>
/// <returns></returns>
public static BitmapSource ToBitmapSource(this Icon icon)
{
return Imaging.CreateBitmapSourceFromHIcon(
icon.Handle,

View File

@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Sai.Toolkit.Revit.Assist
{
internal class JIGAssist
{
}
}

View File

@@ -3,7 +3,6 @@ using System.Diagnostics;
using Autodesk.Revit.DB;
using JetBrains.Annotations;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
@@ -149,7 +148,6 @@ public static class SpatialAssist
/// <summary>创建一个新的实体,它是输入实体的副本</summary>
/// <param name="solid">要复制的输入实体</param>
/// <returns>新的实体</returns>
[Pure]
public static Solid Clone(this Solid solid)
{
return SolidUtils.Clone(solid);
@@ -159,11 +157,10 @@ public static class SpatialAssist
/// <param name="solid">要转换的输入实体</param>
/// <param name="transform">变换(必须是保角变换)</param>
/// <returns>新的实体</returns>
/// <exception cref="T:Autodesk.Revit.Exceptions.ArgumentOutOfRangeException">
/// <exception cref="Command:Autodesk.Revit.Exceptions.ArgumentOutOfRangeException">
/// 变换不保形。
/// 或变换的比例为负或零
/// </exception>
[Pure]
public static Solid CreateTransformed(this Solid solid, Transform transform)
{
return SolidUtils.CreateTransformed(solid, transform);
@@ -431,13 +428,13 @@ public static class SpatialAssist
public static List<List<Curve>> ToCurveLoops(List<Curve> curves)
{
List<List<Curve>> list = new();
List<List<Curve>> list = [];
while (curves.Any())
{
_curvesSorted = new()
{
_curvesSorted =
[
curves[0]
};
];
if (!curves[0].IsBound)
{
curves.Remove(curves[0]);
@@ -1382,10 +1379,9 @@ public static class SpatialAssist
/// </remarks>
/// <param name="solid">The solid</param>
/// <returns>分割实体几何图形</returns>
/// <exception cref="T:Autodesk.Revit.Exceptions.InvalidOperationException">
/// <exception cref="Command:Autodesk.Revit.Exceptions.InvalidOperationException">
/// 分割实体几何体失败
/// </exception>
[Pure]
public static IList<Solid> SplitVolumes(this Solid solid)
{
return SolidUtils.SplitVolumes(solid);
@@ -1409,10 +1405,10 @@ public static class SpatialAssist
/// 与输入实体的边界成分或输入壳体的成分相对应的三角形结构
/// 输入实体或输入壳体的分量
/// </returns>
/// <exception cref="T:Autodesk.Revit.Exceptions.ArgumentException">
/// <exception cref="Command:Autodesk.Revit.Exceptions.ArgumentException">
/// solidOrShell 对三角剖分无效(例如,它不包含任何面)
/// </exception>
/// <exception cref="T:Autodesk.Revit.Exceptions.InvalidOperationException">
/// <exception cref="Command:Autodesk.Revit.Exceptions.InvalidOperationException">
/// 无法对实体或外壳进行三角测量
/// </exception>
public static TriangulatedSolidOrShell TessellateSolidOrShell(this Solid solid, SolidOrShellTessellationControls tessellationControls)

View File

@@ -4,18 +4,22 @@ using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using adWin = Autodesk.Windows;
using CommunityToolkit.Diagnostics;
using UIFramework;
using UIFrameworkServices;
using System.Runtime.CompilerServices;
using Sai.Toolkit.Mvvm.Attributes;
using adWin = Autodesk.Windows;
namespace Sai.Toolkit.Revit.Assist;
@@ -23,15 +27,55 @@ public static class UIAssist
{
private static readonly string AddInPath = typeof(UIAssist).Assembly.Location;
/// <summary>
/// 查找内容
/// </summary>
/// <param name="hwndParent"></param>
/// <param name="hwndChildAfter"></param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindowEx(
IntPtr hwndParent,
IntPtr hwndChildAfter,
string lpszClass,
string lpszWindow
);
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern bool SetWindowText(IntPtr hWnd, string lpString);
private static BitmapSource ToBitmapSource(Bitmap bitmap)
/// <summary>
/// 面板上添加项
/// </summary>
/// <param name="panel"></param>
/// <param name="item"></param>
public static void AddAwItem(this adWin.RibbonPanel panel, adWin.RibbonItem item)
{
return bitmap == null
? null
: Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
panel.Source.Items.Add(item);
}
/// <summary>
/// 添加堆叠按钮组
/// </summary>
/// <param name="rowPanel"></param>
/// <param name="ribbonButtons"></param>
public static void AddAwStackItems(this adWin.RibbonRowPanel rowPanel, params adWin.RibbonButton[] ribbonButtons)
{
for (var i = 0; i < ribbonButtons.Length; i++)
{
rowPanel.Items.Add(ribbonButtons[i]);
//添加一个,打断一次
if (i < ribbonButtons.Length - 1)
{
//行打断=新建行
rowPanel.Items.Add(new adWin.RibbonRowBreak());
}
}
}
/// <summary>
/// Combobox是可以分组的
/// 组合框是与事件结合使用的
@@ -57,27 +101,7 @@ public static class UIAssist
};
return comboBx;
}
/// <summary>
/// 在Revit现有的标签下如不存在则创建创建创建面板
/// </summary>
/// <param name="application"></param>
/// <param name="panelName">创建的面板名称</param>
/// <param name="tabName">若Tab不存在则创建对应名称的Tab</param>
/// <returns></returns>
public static RibbonPanel AddPanel(this UIControlledApplication application, string panelName, string tabName)
{
var ribbonTab = adWin.ComponentManager.Ribbon.Tabs.FirstOrDefault(tab => tab.Id.Equals(tabName));
if (ribbonTab is null)
{
application.CreateRibbonTab(tabName);
return application.CreateRibbonPanel(tabName, panelName);
}
var ribbonPanel = application.GetRibbonPanels(tabName).Find(panel => panel.Name.Equals(panelName));
return ribbonPanel ?? application.CreateRibbonPanel(tabName, panelName);
}
/// <summary>
/// 创建一个下拉式按钮。
@@ -146,37 +170,6 @@ public static class UIAssist
return data;
}
/// <summary>
/// 单选框
/// </summary>
/// <param name="pnl">面板</param>
/// <param name="groupName">分组名称</param>
/// <param name="toggleButtonData"></param>
/// <returns></returns>
public static RadioButtonGroup AddRadioButtonGroup(
this RibbonPanel pnl,
string groupName,
params ToggleButtonData[] toggleButtonData
)
{
if (pnl is null)
{
throw new ArgumentNullException(nameof(pnl));
}
if (string.IsNullOrEmpty(groupName))
{
throw new ArgumentNullException(nameof(groupName));
}
RadioButtonGroupData groupData = new(groupName);
var radioButtonGroup = (RadioButtonGroup)pnl.AddItem(groupData);
foreach (var data in toggleButtonData)
{
radioButtonGroup.AddItem(data);
}
return radioButtonGroup;
}
/// <summary>
/// 创建一个分割记忆按钮。
/// </summary>
@@ -220,18 +213,7 @@ public static class UIAssist
return result;
}
public static void AddStackItems(this adWin.RibbonRowPanel rowPanel, params adWin.RibbonButton[] ribbonButtons)
{
for (var i = 0; i < ribbonButtons.Length; i++)
{
rowPanel.Items.Add(ribbonButtons[i]);
if (i < ribbonButtons.Length - 1)
{
//行打断=新建行
rowPanel.Items.Add(new adWin.RibbonRowBreak());
}
}
}
public static void AddTextBox(this RibbonPanel panel, TextBoxData txtBoxData)
{
@@ -247,13 +229,38 @@ public static class UIAssist
};
txtBox.Width = 180;
}
public static ToggleButton AddToggleButton<T>(this RadioButtonGroup group, string name)
where T : IExternalCommand
/// <summary>
/// 在Revit现有的标签下如不存在则创建创建创建面板
/// </summary>
/// <param name="application"></param>
/// <param name="panelName">创建的面板名称</param>
/// <param name="tabName">若Tab不存在则创建对应名称的Tab</param>
/// <returns></returns>
public static RibbonPanel AddUIPanel(this UIControlledApplication application, string tabName, string panelName)
{
//var addInPath = typeof(T).Assembly.Location;
var toggleData = new ToggleButtonData(name, name, typeof(T).Assembly.Location, typeof(T).FullName);
return group.AddItem(toggleData);
var ribbonTab = adWin.ComponentManager.Ribbon.Tabs.FirstOrDefault(tab => tab.Id.Equals(tabName));
if (ribbonTab == null)
{
application.CreateRibbonTab(tabName);
return application.CreateRibbonPanel(tabName, panelName);
}
var ribbonPanel = application.GetRibbonPanels(tabName).Find(panel => panel.Name.Equals(panelName));
return ribbonPanel ?? application.CreateRibbonPanel(tabName, panelName);
}
public static adWin.RibbonItem ConvertToAwRibbonItem(this RibbonButton btn)
{
return (adWin.RibbonItem)btn.GetType()
.InvokeMember(
"getRibbonItem",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod,
Type.DefaultBinder,
btn,
null
);
}
/// <summary>
@@ -287,26 +294,82 @@ public static class UIAssist
{
return new PushButtonData(typeof(T).FullName, name, typeof(T).Assembly.Location, typeof(T).FullName);
}
/// <summary>
/// 查找内容
/// 查找面板
/// </summary>
/// <param name="hwndParent"></param>
/// <param name="hwndChildAfter"></param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <param name="rt"></param>
/// <param name="panelName"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindowEx(
IntPtr hwndParent,
IntPtr hwndChildAfter,
string lpszClass,
string lpszWindow
);
public static adWin.RibbonPanel FindAwPanel(this adWin.RibbonTab rt, string panelName)
{
return rt.Panels.FirstOrDefault(p => p.Source.Name == panelName);
}
/// <summary>
/// 查找Tab
/// </summary>
/// <param name="tabName">标签名</param>
/// <returns></returns>
public static adWin.RibbonTab FindAwTab(string tabName)
{
return adWin.ComponentManager.Ribbon.Tabs.FirstOrDefault(tab => tab.Id.Equals(tabName));
}
public static ToggleButton GetToggleButton(this RadioButtonGroup radioButtonGroup)
{
return radioButtonGroup.Current;
}
/// <summary>
/// 创建按钮
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="showText"></param>
/// <param name="largeImage"></param>
/// <param name="image"></param>
/// <param name="command">RelayCommand</param>
/// <param name="parameter">命令的参数</param>
/// <param name="toolTip"></param>
/// <returns></returns>
public static adWin.RibbonButton NewAwButton(string showText, Bitmap largeImage, Bitmap image, ICommand command, object parameter, string toolTip = default)
{
return new()
{
Image = image.ToBitmapSource(),
LargeImage = largeImage.ToBitmapSource(),
Size = adWin.RibbonItemSize.Standard,
ShowText = true,
Id = $"ID_{showText}",
Name = $"Btn_{showText}",
ToolTip = toolTip ?? showText,
Text = showText,
IsCheckable = true,
CommandHandler = command,
CommandParameter = parameter,
//Orientation = System.Windows.Controls.Orientation.Vertical
};
}
/// <summary>
/// 创建ToggleButton
/// </summary>
/// <param name="showText"></param>
/// <param name="largeImage"></param>
/// <param name="toolTip"></param>
/// <returns></returns>
public static adWin.RibbonToggleButton NewAwToggleButton(string showText, Bitmap largeImage, string toolTip = null)
{
return new adWin.RibbonToggleButton()
{
LargeImage = largeImage?.ToBitmapSource(),
Size = adWin.RibbonItemSize.Large,
ToolTip = toolTip ?? showText,
ShowText = true,
Id = $"ID_{showText}",
Name = $"Tog_{showText}",
Text = showText,
IsCheckable = true,
Orientation = System.Windows.Controls.Orientation.Vertical,
};
}
/// <summary>
/// Revit默认打开文件对话框
@@ -332,24 +395,66 @@ public static class UIAssist
return filename;
}
/// <summary>
/// 设置按钮可用性
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pushButtonData"></param>
/// <returns></returns>
public static PushButtonData SetAvailability<T>(this PushButtonData pushButtonData)
where T : IExternalCommandAvailability
{
pushButtonData.AvailabilityClassName = typeof(T).FullName;
return pushButtonData;
}
/// <summary>
/// 设置面板右下角箭头对话框
/// </summary>
public static void SetAwDialogLauncher(this adWin.RibbonPanel panel, adWin.RibbonCommandItem item)
{
if (panel != null)
{
panel.Source.DialogLauncher = item;
}
}
public static adWin.RibbonItem SetAwImage(this adWin.RibbonItem ribbonItem, Bitmap image)
{
ribbonItem.Image = image.ToBitmapSource();
return ribbonItem;
}
public static void SetAwImage(this adWin.RibbonItem ribbonItem, string uri)
{
ribbonItem.Image = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
}
public static adWin.RibbonItem SetAwLargeImage(this adWin.RibbonItem ribbonItem, Bitmap largeImage)
{
ribbonItem.LargeImage = largeImage.ToBitmapSource();
return ribbonItem;
}
/// <summary>
/// 指定决定按钮可用性的类别
/// 从 URI 源添加 32x32px-96dpi 图像
/// </summary>
/// <param name="button">功能区中将受限制的按钮</param>
/// <typeparam name="T">类型继承 <see cref="Autodesk.Revit.UI.IExternalCommandAvailability"/></typeparam>
/// <remarks>T 类应与插件 "外部命令 "共享同一程序集</remarks>
public static void SetAvailabilityController<T>(this PushButton button)
where T : IExternalCommandAvailability, new()
/// <param name="button">添加图标的按钮</param>
/// <param name="uri">图标的相对或绝对路径</param>
/// <example>button.SetAwLargeImage("/RevitAddIn;component/Resources/Icons/RibbonIcon32.png")</example>
public static void SetAwLargeImage(this adWin.RibbonItem ribbonItem, string uri)
{
button.AvailabilityClassName = typeof(T).FullName;
ribbonItem.LargeImage = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
}
public static adWin.RibbonItem SetAwShowText(this adWin.RibbonItem ribbonItem, string text)
{
ribbonItem.Text = text;
return ribbonItem;
}
public static adWin.RibbonItem SetAwToolTip(this adWin.RibbonItem ribbonItem, string tooltip)
{
ribbonItem.ToolTip = tooltip;
return ribbonItem;
}
public static PushButtonData SetDescription(this PushButtonData pushButtonData, string longDescription)
@@ -357,31 +462,26 @@ public static class UIAssist
pushButtonData.LongDescription = longDescription;
return pushButtonData;
}
/// <summary>
/// 右下角箭头对话框
/// 设置面板右下角箭头对话框
/// </summary>
public static void SetDialogLauncher(string panelName)
public static void SetDialogLauncher(string tabName, string panelName)
{
var group = adWin.ComponentManager.Ribbon.Tabs
.First()
.Panels.FirstOrDefault(p => p.AutomationName == panelName);
if (group != null)
{
group.Source.DialogLauncher = group.Source.Items.First() as adWin.RibbonCommandItem;
}
.FirstOrDefault(tab => tab.Name == tabName)
.Panels.FirstOrDefault(p => p.AutomationName == panelName) ?? throw new ArgumentException("未找到标签或面板");
group.Source.DialogLauncher = group.Source.Items.First() as adWin.RibbonCommandItem;
}
/// <summary>
/// 设置面板右下角箭头对话框
/// </summary>
public static void SetDialogLauncher(adWin.RibbonTab tab, string panelName)
{
var group = tab.Panels.FirstOrDefault(p => p.AutomationName == panelName) ?? throw new ArgumentException("未找到标签或面板");
group.Source.DialogLauncher = group.Source.Items.First() as adWin.RibbonCommandItem;
}
/// <summary>
/// 右下角箭头对话框
/// </summary>
public static void SetDialogLauncher(this adWin.RibbonPanel panel, adWin.RibbonCommandItem item)
{
if (panel != null)
{
panel.Source.DialogLauncher = item;
}
}
/// <summary>
/// 双击选项
/// </summary>
@@ -392,14 +492,17 @@ public static class UIAssist
doubleOpt.SetAction(target, clickAction);
}
/// <summary>
/// 提示包含短视频
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="title"></param>
/// <param name="videoPath"></param>
/// <param name="videoPath">视频路径</param>
public static void SetExpandedVideo(this PushButtonData pushButtonData, string title, string videoPath)
{
//拿到Autodesk.Windows的RibbonItem转换
var internalGetRibbonItemMethod = typeof(RibbonItem).GetMethod(
"getRibbonItem",
BindingFlags.NonPublic | BindingFlags.Instance
@@ -410,17 +513,31 @@ public static class UIAssist
button.ToolTip = new adWin.RibbonToolTip { Title = title, ExpandedVideo = new Uri(videoPath) };
}
}
/// <summary>
/// 设置16x16的小图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="image"></param>
/// <returns></returns>
public static PushButtonData SetImage(this PushButtonData pushButtonData, Bitmap image)
{
pushButtonData.Image = ToBitmapSource(image);
pushButtonData.Image = image.ToBitmapSource();
return pushButtonData;
}
/// <summary>
/// 使用Uri设置16x16的小图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="uri"></param>
public static PushButtonData SetImage(this PushButtonData pushButtonData, string uri)
{
pushButtonData.Image = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
return pushButtonData;
}
public static void SetImage(this RibbonButton button, string uri)
{
button.Image = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
}
/// <summary>
/// 消息中心
@@ -441,23 +558,30 @@ public static class UIAssist
}; // 当鼠标点击气泡内容时触发此事件
paletteMgr.ShowBalloon(resultItem);
}
/// <summary>
/// 设置32x32-96dpi的大图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="largeImage"></param>
/// <returns></returns>
public static PushButtonData SetLargeImage(this PushButtonData pushButtonData, Bitmap largeImage)
{
pushButtonData.LargeImage = ToBitmapSource(largeImage);
pushButtonData.LargeImage = largeImage.ToBitmapSource();
return pushButtonData;
}
/// <summary>
/// Adds a 32x32px-96dpi image from the URI source
/// 从 URI 源添加 32x32px-96dpi 图像
/// </summary>
/// <param name="button">Button to which the icon will be added</param>
/// <param name="uri">Relative or Absolute path to the icon</param>
/// <example>button.SetLargeImage("/RevitAddIn;component/Resources/Icons/RibbonIcon32.png")</example>
public static void SetLargeImage(this RibbonButton button, string uri)
/// <param name="pushButtonData">添加图标的按钮</param>
/// <param name="uri">图标的相对或绝对路径</param>
/// <example>button.SetAwLargeImage("/RevitAddIn;component/Resources/Icons/RibbonIcon32.png")</example>
public static void SetLargeImage(this PushButtonData pushButtonData, string uri)
{
button.LargeImage = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
pushButtonData.LargeImage = new BitmapImage(new Uri(uri, UriKind.RelativeOrAbsolute));
}
/// <summary>
/// 状态栏
/// </summary>
@@ -478,84 +602,36 @@ public static class UIAssist
}
/// <summary>
/// 基于Revit封装的RibbonButton设置其快捷键.
/// 设置显示文字
/// </summary>
/// <param name="btn">RibbonButton.</param>
/// <param name="key">快捷键字符串.</param>
/// <param name="pushButtonData"></param>
/// <param name="text"></param>
/// <returns></returns>
public static bool SetShortCut(this Autodesk.Revit.UI.RibbonButton btn, string key)
{
if (btn == null)
return false;
var item = btn.GetType()
.InvokeMember(
"getRibbonItem",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod,
Type.DefaultBinder,
btn,
null
);
return item != null && (item as Autodesk.Windows.RibbonItem).SetShortCut(key);
}
/// <summary>
/// 基于通用库封装的RibbonCommandItem设置其快捷键.
/// </summary>
/// <param name="commandItem">RibbonCommandItem.</param>
/// <param name="key">快捷键字符串.</param>
/// <returns></returns>
public static bool SetShortCut(this Autodesk.Windows.RibbonItem commandItem, string key)
{
if (commandItem == null || string.IsNullOrEmpty(key))
return false;
Autodesk.Windows.ComponentManager.Ribbon.FindItem(
commandItem.Id,
false,
out var parentPanel,
out var parentTab,
true
);
if (parentTab == null || parentPanel == null)
return false;
var path = string.Format("{0}>{1}", parentTab.Id, parentPanel.Source.Id);
var cmdId = ControlHelper.GetCommandId(commandItem);
if (string.IsNullOrEmpty(cmdId))
{
cmdId = Guid.NewGuid().ToString();
ControlHelper.SetCommandId(commandItem, cmdId);
}
var shortcutItem = new ShortcutItem(commandItem.Text, cmdId, key, path)
{
ShortcutType = StType.RevitAPI
};
UIFrameworkServices.KeyboardShortcutService.applyShortcutChanges(
new Dictionary<string, ShortcutItem>() { { cmdId, shortcutItem } }
);
return true;
}
public static PushButtonData SetShowText(this PushButtonData pushButtonData, string text)
{
pushButtonData.Text = text;
return pushButtonData;
}
/// <summary>
/// 设置工具提示
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="tooltip"></param>
/// <returns></returns>
public static PushButtonData SetToolTip(this PushButtonData pushButtonData, string tooltip)
{
pushButtonData.ToolTip = tooltip;
return pushButtonData;
}
/// <summary>
/// 设置工具提示图片
/// </summary>
/// <param name="pushButtonData"></param>
/// <param name="toolTipImage"></param>
/// <returns></returns>
public static PushButtonData SetToolTipImage(this PushButtonData pushButtonData, Bitmap toolTipImage)
{
pushButtonData.ToolTipImage = ToBitmapSource(toolTipImage);
pushButtonData.ToolTipImage = toolTipImage.ToBitmapSource();
return pushButtonData;
}
@@ -563,15 +639,19 @@ public static class UIAssist
/// 通过判断keyTip来区分原始Tab与插件Tab然后切换插件Tab的可见性
/// </summary>
/// <param name="tabName"></param>
public static void SetVisible(string tabName)
/// <param name="visible"></param>
public static void SetVisible(string tabName, bool visible)
{
var ribbonControl = adWin.ComponentManager.Ribbon;
foreach (var tab in ribbonControl.Tabs)
var tab = ribbonControl.Tabs
.FirstOrDefault(
tab => !tab.IsContextualTab &&
!tab.IsMergedContextualTab &&
tab.KeyTip == null &&
tabName == tab.Name);
if (tab != null)
{
if (!tab.IsContextualTab && !tab.IsMergedContextualTab && tab.KeyTip == null && tabName == tab.Name)
{
tab.IsVisible = !tab.IsVisible;
}
tab.IsVisible = visible;
}
}
@@ -579,23 +659,23 @@ public static class UIAssist
/// <summary>
/// 新建命令按钮
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="Command"></typeparam>
/// <param name="text"></param>
/// <param name="image"></param>
/// <param name="largeImage"></param>
/// <param name="toolTip"></param>
/// <param name="longDescription"></param>
/// <returns></returns>
public static PushButtonData NewButtonData<T>(
public static PushButtonData NewPushButtonData<Command>(
string text,
Bitmap largeImage = null,
Bitmap image = null,
string toolTip = null,
string longDescription = null
)
where T : class, IExternalCommand
where Command : class, IExternalCommand
{
return new(typeof(T).FullName, text, AddInPath, typeof(T).FullName)
return new(typeof(Command).FullName, text, AddInPath, typeof(Command).FullName)
{
LargeImage = largeImage?.ToBitmapSource(),
Image = image?.ToBitmapSource(),
@@ -607,32 +687,33 @@ public static class UIAssist
/// <summary>
/// 新建可控的命令按钮
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="V"></typeparam>
/// <typeparam name="Command"></typeparam>
/// <typeparam name="Availablility"></typeparam>
/// <param name="text"></param>
/// <param name="bitmap"></param>
/// <param name="largeBitmap"></param>
/// <param name="toolTip"></param>
/// <param name="longDescription"></param>
/// <returns></returns>
public static PushButtonData NewButtonData<T, V>(
public static PushButtonData NewButtonData<Command, Availablility>(
string text,
Bitmap largeBitmap = null,
Bitmap bitmap = null,
string toolTip = null,
string longDescription = null
)
where T : class, IExternalCommand
where V : class, IExternalCommandAvailability
where Command : class, IExternalCommand
where Availablility : class, IExternalCommandAvailability
{
return new(typeof(T).FullName, text, AddInPath, typeof(T).FullName)
return new(typeof(Command).FullName, text, AddInPath, typeof(Command).FullName)
{
LargeImage = largeBitmap?.ToBitmapSource(),
Image = bitmap?.ToBitmapSource(),
ToolTip = toolTip ?? text,
LongDescription = longDescription,
AvailabilityClassName = typeof(V).FullName
AvailabilityClassName = typeof(Availablility).FullName
};
}
#endregion
}