こんにちは、みなさん、
Autodesk Navisworks のプラグインを開発しています。ユーザーはテキスト ボックスにカテゴリ タイプの名前、プロパティ タイプ、およびキーワードを入力し、[カスタム] ボタンをクリックして、ファイル ツリーから一致するアイテムを検索して収集します。
次のコードは「小さな」ファイル ツリー (数百のアイテム) に対して機能しますが、ファイル全体 (数千のアイテムを含む) の検索を開始すると、プログラムがフリーズし、利用可能なすべての物理メモリを使用します。より大きなファイルを処理できるようにコードを改善する方法を知りたいですか?
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using Autodesk.Navisworks.Api;
using NavisworksApp = Autodesk.Navisworks.Api.Application;
namespace ClashPlugin.Ctr
{
public partial class ClashPlugin : UserControl
{
public ClashPlugin()
{
InitializeComponent();
}
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
Dock = DockStyle.Fill;
}
private static string GetPropValue(DataProperty prop)
{
try
{
return prop.Value.IsDisplayString ? prop.Value.ToDisplayString() : prop.Value.ToString().Split(':')[1];
}
catch (Exception)
{
return "Prop Error";
}
}
private void btCustom_MouseUp(object sender, MouseEventArgs e)
{
//Find all
try
{
var result = new List<ModelItem>();
foreach (var item in NavisworksApp.ActiveDocument.CurrentSelection.SelectedItems)
{
var cat = item.DescendantsAndSelf.Where(i => i.PropertyCategories.FindCategoryByDisplayName(tbCatName.Text) != null);
var pro = cat.Where(m => m.PropertyCategories.FindCategoryByDisplayName(tbCatName.Text).Properties.FindPropertyByDisplayName(tbPropName.Text) != null);
result.AddRange(pro.Where(m => GetPropValue(m.PropertyCategories.FindCategoryByDisplayName(tbCatName.Text).Properties.FindPropertyByDisplayName(tbPropName.Text)).Contains(tbValueName.Text)));
}
NavisworksApp.ActiveDocument.CurrentSelection.Clear();
NavisworksApp.ActiveDocument.CurrentSelection.AddRange(result);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}