如何提高寻找元素的速度?

Posted

技术标签:

【中文标题】如何提高寻找元素的速度?【英文标题】:How to increase the speed of finding elements? 【发布时间】:2021-09-18 15:33:30 【问题描述】:

这段代码执行了很长时间,最终没有实现它的目标——在一个时间表内组合元素的参数。这显然是由于项目中“管件”类别的大量元素而发生的。如何提高速度?是通过使用某些预定类来选择元素吗?

使用 Win Forms GUI。

Document revitDoc  get; set; 

            public Form1(Document doc)
            
                InitializeComponent();

                this.revitDoc = doc;
                //Create a list of the parameters you want your user to choose from 
                List<string> stringParameters = new List<string>
            
                "GP_Description",
                "GP_Model",
                "GP_Angle"             
            ;
                //Add list to comboboxes on form 
                foreach (string parameterName in stringParameters)
                
                    comboBox1.Items.Insert(0, parameterName);
                    comboBox2.Items.Insert(0, parameterName);
                    comboBox3.Items.Insert(0, parameterName);
                   
                

            

        private void button1_Click(object sender, EventArgs e)
        

            FilteredElementCollector collector = new FilteredElementCollector(revitDoc);
            ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_PipeFitting);
              
            IList<Element> ducts = collector.WherePasses(filter).WhereElementIsNotElementType().ToElements();

            foreach (Element duct in ducts)
            
     
                Parameter parameter1 = duct.LookupParameter(comboBox1.Text);
                Parameter parameter2 = duct.LookupParameter(comboBox2.Text);
                Parameter parameter3 = duct.LookupParameter(comboBox3.Text);
               
                List<string> parameterValues = new List<string>();


                if (parameter1 != null)
                
                    string parameterValue1 = parameter1.AsString();
        
                    if (parameterValue1 != "") parameterValues.Add(parameterValue1);
                               
                
    
                if (parameter2 != null)
                
                    string parameterValue2 = parameter2.AsString();
          
                    if (parameterValue2 != "") parameterValues.Add(parameterValue2);
                                       
                
        
                if (parameter3 != null)
                
                    string parameterValue3 = parameter3.AsString();
                  
                    if (parameterValue3 != "") parameterValues.Add(parameterValue3);

                
                   
                if (parameterValues.Count > 0) 
                
                  
                    string newValue = String.Join(" ,", parameterValues);

                    using (Transaction t = new Transaction(revitDoc, "Set Parameter name"))
                    
                        t.Start();
                        duct.LookupParameter("Outcome").Set(newValue);
                        t.Commit();
                    

【问题讨论】:

Document是什么类型? 显然,这就是我们使用 Revit API 的方式。上面的代码 sn-p 属于“public partial class Form1 : System.Windows.Forms.Form”这个类。这些行来自 Command.cs "Document doc = uidoc.Document; Form1 form = new Form1(doc)" 我猜您已经检查过性能下降实际上是在foreach 中,而不是在它上面的几行代码中。可以提高性能的一件事是不要在循环内创建新对象。您可以在循环上方创建parameterValues 并在循环中清除它。我发现这样做有时会有所作为,但不能保证偏离轨道。 Transaction 对象也是如此 我注意到 Button 不是异步的,这可能意味着您为创建参数而读取的 comboboxX.Text 值不会改变。一定要把它从foreach(管道中的元素管道)循环中取出。 【参考方案1】:

这是未经测试的。最大的项目是事务的位置。我建议用事务包装 foreach 循环。

public void Process(Document doc, string text1, string text2, string text3)

    FilteredElementCollector collector =
        new FilteredElementCollector(doc)
            .OfCategory(BuiltInCategory.OST_PipeFitting)
            .WhereElementIsNotElementType();

    using (Transaction t = new Transaction(doc))
    
        if (t.Start("Set Parameter Names") == TransactionStatus.Started)
        
            foreach (Element elem in collector)
            
                string newValue = string.Empty;

                Parameter outcomeParam = elem.LookupParameter("Outcome");

                if (outcomeParam == null)
                
                    continue;
                

                newValue += this.GetParameterValue(elem, text1);
                newValue += this.GetParameterValue(elem, text2);
                newValue += this.GetParameterValue(elem, text3);

                newValue.TrimEnd(',', ' ');

                outcomeParam.Set(newValue);
            

            t.Commit();
        
    


public string GetParameterValue(Element elem, string parameterName)

    Parameter param = elem.LookupParameter(parameterName);

    return param == null ? string.Empty : param.AsString() + ", ";

【讨论】:

以上是关于如何提高寻找元素的速度?的主要内容,如果未能解决你的问题,请参考以下文章

提高在具有许多条目设置为 np.inf 的二维 numpy 数组中查找最小元素的速度

如何确定 html 视频元素的预期帧速率

selenium 概念及练习 !

js如何从列表中寻找一个元素是不是存在?

如何寻找消失的元素

如何避免在thrust::device_vector 中默认构造元素?