Files
AddinManager/AddInManager/AIM.cs
2025-09-04 09:53:20 +08:00

121 lines
3.5 KiB
C#

using System;
using System.Reflection;
using System.Windows;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
namespace AddInManager
{
public sealed class AIM
{
public Result ExecuteCommand(ExternalCommandData data, ref string message, ElementSet elements, bool faceless)
{
if (ActiveCmd != null && faceless)
{
return RunActiveCommand(data, ref message, elements);
}
var mainWindow = new Wpf.MainWindow(this);
var dialogResult = mainWindow.ShowDialog();
if (dialogResult != true)
{
return Result.Cancelled;
}
// 窗口关闭后,检查是否有选中的命令需要执行
if (ActiveCmd != null && ActiveCmdItem != null)
{
return RunActiveCommand(data, ref message, elements);
}
return Result.Succeeded; // 如果没有命令要执行,返回成功
}
public string ActiveTempFolder { get; set; } = string.Empty;
private Result RunActiveCommand(ExternalCommandData data, ref string message, ElementSet elements)
{
var filePath = ActiveCmd.FilePath;
var assemLoader = new AssemLoader();
Result result;
try
{
assemLoader.HookAssemblyResolve();
var assembly = assemLoader.LoadAddinsToTempFolder(filePath, false);
if (null == assembly)
{
result = Result.Failed;
}
else
{
ActiveTempFolder = assemLoader.TempFolder;
var externalCommand = assembly.CreateInstance(ActiveCmdItem.FullClassName) as IExternalCommand;
if (externalCommand == null)
{
result = Result.Failed;
}
else
{
ActiveEC = externalCommand;
result = ActiveEC.Execute(data, ref message, elements);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
result = Result.Failed;
}
finally
{
assemLoader.UnhookAssemblyResolve();
assemLoader.CopyGeneratedFilesBack();
}
return result;
}
public static AIM Instance
{
get
{
if (m_inst == null)
{
lock (typeof(AIM))
{
if (m_inst == null)
{
m_inst = new AIM();
}
}
}
return m_inst;
}
}
private AIM()
{
AddinManager = new AddinManager();
ActiveCmd = null;
ActiveCmdItem = null;
ActiveApp = null;
ActiveAppItem = null;
}
public IExternalCommand ActiveEC { get; set; }
public Addin ActiveCmd { get; set; }
public AddinItem ActiveCmdItem { get; set; }
public Addin ActiveApp { get; set; }
public AddinItem ActiveAppItem { get; set; }
public AddinManager AddinManager { get; set; }
private static volatile AIM m_inst;
}
}