为什么是选择过滤PickObjects减慢我的选择 - PickObjects(对象类型,ISelectionFilter,字符串)

问题描述 投票:0回答:1

为什么是选择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;
            }
        }
    }
}
c# revit-api revit
1个回答
0
投票

您可以通过检查类元素的id,而不是类别名称加快您的选择过滤器(最小)。比较两个整数比比较两个字符串更快。

public bool Equals( Category x, Category y )
{
  return x.Id.IntegerValue.Equals(
    y.Id.IntegerValue );
}
© www.soinside.com 2019 - 2024. All rights reserved.