0

HelixToolKit ModelImporter 関数を使用して、ローカル ファイルから STL ファイルをロードしています。Model3D を読み込んだ後、ファイル名の値を持つキーとして辞書に保存しています。同じモデルをロードしないようにモデルを比較したいという私の目的。同じパスから同じモデルをロードした後、そのモデルの辞書をキーとして検索します。しかし、そのモデルのようには見つかりません。どこが間違っていますか、助けてください。

    private Model3D currModel = null;
    private string modelName = null;
    // A record of the 3D models we build.
    private Dictionary<Model3D, string> Models= new Dictionary<Model3D, string>();
    private Model3D device = null;     

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog open = new Microsoft.Win32.OpenFileDialog();
        if (open.ShowDialog() == true)
        {
            try
            {
                string path = open.FileName;
                modelName = open.SafeFileName;

                currModel = display3D(path);

                if (!Models.ContainsKey(currModel))
                    Models.Add(currModel, modelName);
                ModelVisual3D device3D = new ModelVisual3D();
                device3D.Content = currModel;
                mainViewport.Children.Add(device3D);
                mainViewport.ZoomExtents();//modeli ekrana sığdırmak için
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error\n" + ex.Message.ToString(), "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
    private Model3D display3D(string path)
    {
        //Import 3D model file
        ModelImporter import = new ModelImporter();
        //Load the 3D model file
        device = import.Load(path);        
        return device;
    }
4

2 に答える 2

1

Dictionary クラスは、キーの GetHashCode メソッドを使用して、ディクショナリでの最初のルックアップ用のハッシュを取得します。次に、キーの equals メソッドを使用して、実際にオブジェクトが一致するかどうかを判断します。Model3d の各インスタンスは、異なるハッシュ値を返すか、インスタンスが等しくないと判断しています。モデルが以前にロードされたかどうかを判断するだけの場合は、完全なファイル パス文字列をキーとして使用することを検討してください。それ以外の場合は、辞書にカスタム IEqualityComparer を提供して、Model3d のデフォルトの GetHashCode および Equals メソッドの動作をオーバーライドする必要がある場合があります。この URL は、辞書クラスをよりよく理解するのに役立ちます。

http://www.codeproject.com/Articles/500644/Understanding-Generic-Dictionary-in-depth

于 2015-12-28T19:58:12.690 に答える
0

更新 #1: 問題は解決しました。私のプロジェクトでは、ModelImporter は 3D モデルをロードしません。3DModelGroup をロードします。したがって、Models.Children を追加すると機能します。

if (!Models.ContainsKey(currModel.Children))
        Models.Add(currModel.Children, modelName);
于 2015-12-29T21:43:14.203 に答える