using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Autodesk.Revit.DB;
using DotNet.RevitUI.Helper;
namespace DotNet.RevitUI
{
///
/// Revit command interface.
///
public abstract class RevitCommand : ICommand, IExternalCommand
{
private static UIApplication m_Application;
public static UIApplication Application
{
get
{
return m_Application;
}
}
///
/// 当前激活文档.
///
public Document ActiveDocument { get; private set; }
///
/// 当前激活UI文档.
///
public UIDocument ActiveUIDocument { get; private set; }
///
/// Occurs when [can execute changed].
///
event EventHandler ICommand.CanExecuteChanged
{
add
{
CommandManager.RequerySuggested += value;
}
remove
{
CommandManager.RequerySuggested -= value;
}
}
///
/// Riibon控件是否可执行.
///
///
///
bool ICommand.CanExecute(object parameter)
{
var p = parameter == null ? null : parameter as Autodesk.Windows.RibbonItem;
if (p == null)
return CanExecute(p);
p.Tag = RevitApp.Application;
var flag = this.CanExecute(p);
if (flag)
{
p.IsEnabled = true;
}
else
{
p.IsEnabled = false;
}
if (RevitApp.Application == null || p is Autodesk.Windows.RibbonItem item)
{
return flag;
}
return flag;
}
Result IExternalCommand.Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Initialize(commandData);
m_Application = commandData.Application;
return this.Invoke(commandData, ref message, elements);
}
void ICommand.Execute(object parameter)
{
RevitCommandInvoke.ExecuteHandlers.Enqueue(((IExternalCommand)this).Execute);
RevitCommandHelper.Instance.Execute();
}
void Initialize(ExternalCommandData commandData)
{
if (RevitCommandHelper.Instance == null)
{
RevitCommandHelper.Instance = new RevitCommandHelper();
}
RevitCommandHelper.Instance.RegisterCommand();
if (commandData != null && commandData.Application != null)
{
this.ActiveUIDocument = commandData.Application.ActiveUIDocument;
if (this.ActiveUIDocument != null)
{
this.ActiveDocument = this.ActiveUIDocument.Document;
}
}
}
///
/// 此命令是否能执行.
///
///
///
protected abstract bool CanExecute(Autodesk.Windows.RibbonItem parameter);
///
/// 在revit上下文件环境执行命令.
///
///
///
///
///
protected abstract Result Invoke(ExternalCommandData commandData, ref string message, ElementSet elements);
}
}