0

こんにちは、みなさん、

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);
            }
        }
    }
}
4

0 に答える 0