为什么是选择PickOjects过滤比IExternalCommand(外接)与输出选择器的PickObjects慢。我试着输入里面的Revit宏代码,看看在这两种方法没有什么区别。
我的代码工作正常(请参见下文),唯一的区别是性能。与选择过滤器PickObjects感觉慢了一点,laggy。
如果我写我的代码不同?也许我的IselectionFilter是不是一个好写?
任何帮助,意见,建议,将不胜感激。
#region Namespaces
using System;
using System.Collections.Generic;
using System.Diagnostics;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
#endregion
namespace ConduitSizeShowInfo
{
[Transaction(TransactionMode.Manual)]
public class Command : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Application app = uiapp.Application;
Document doc = uidoc.Document;
try
{
//Filter Selection
SelectElementsFilter conduitFilter = new SelectElementsFilter("Conduits");
//Pick Multiple Conduits
IList<Reference> selectedConduits = uidoc.Selection.PickObjects(ObjectType.Element, conduitFilter, "Please select conduits");
//Show Conduit Size Information
string showConduitSize = "";
foreach (Reference conduit in selectedConduits)
{
Element e = doc.GetElement(conduit);
Parameter conduitSize = e.LookupParameter("Size");
showConduitSize += e.Name + ": " + conduitSize.AsString() + Environment.NewLine;
}
TaskDialog.Show("Conduit Sizes", showConduitSize);
}
catch(Autodesk.Revit.Exceptions.OperationCanceledException)
{
return Result.Cancelled;
}
catch(Exception ex)
{
message = ex.Message;
return Result.Failed;
}
return Result.Succeeded;
}
public class SelectElementsFilter : ISelectionFilter
{
static string CategoryName = "";
public SelectElementsFilter(string name)
{
CategoryName = name;
}
public bool AllowElement(Element e)
{
if (e.Category.Name == CategoryName)
return true;
return false;
}
public bool AllowReference(Reference r, XYZ p)
{
return false;
}
}
}
}
您可以通过检查类元素的id,而不是类别名称加快您的选择过滤器(最小)。比较两个整数比比较两个字符串更快。
public bool Equals( Category x, Category y )
{
return x.Id.IntegerValue.Equals(
y.Id.IntegerValue );
}