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); } }