有时候我们希望某个外部命令或者通俗的说某个按钮只能在平面视图下可用,而在三维视图下不可用,那怎么办呢?其实Revit API 已经给我们开放了一个接口:IExternalCommandAvailability 我们需要在外部命令里新建一个类然后继承这个接口,然后在外部应用(也就是IExternalApplication)的相应按钮命令下指定目标属性即可!
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Mechanical;
using System.Xml;
namespace HelloWorld
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class Test : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiApp = commandData.Application;
UIDocument uiDoc = uiApp.ActiveUIDocument;
Document Doc = uiDoc.Document;
Reference refer = uiDoc.Selection.PickObject(ObjectType.Element);
Transaction ts = new Transaction(Doc,"delete");
ts.Start();
Doc.Delete(Doc.GetElement(refer).Id);
ts.Commit();
return Result.Succeeded;
}
}
class Enable : IExternalCommandAvailability
{
public bool IsCommandAvailable(UIApplication applicationData, CategorySet selectedCategories)
{
if (null != applicationData.ActiveUIDocument)
{
Autodesk.Revit.DB.View view = applicationData.ActiveUIDocument.Document.ActiveView;
if (view.ViewType == ViewType.ThreeD || view.ViewType == ViewType.ProjectBrowser || view.ViewType == ViewType.Elevation || view.ViewType == ViewType.Section)
{
return false;
}
}
return true;
}
}
}
PushButtonData button = new PushButtonData("delete", "删除构件", @"C:\ProgramData\Autodesk\Revit\Addins\2016\BIM工具箱\BIM\HelloWorld.dll", "HelloWorld.Test");
Uri uriImage = new Uri(@"C:\ProgramData\Autodesk\Revit\Addins\2016\BIM工具箱\BIM\Image\1.ico");
BitmapImage largeimage = new BitmapImage(uriImage);
button.LargeImage = largeimage;
当然这个属性也可以写在配置文件里,依情况而定
button.AvailabilityClassName = "HelloWorld.Enable";