相同的Model3D似乎彼此不相同?

时间:2015-12-26 20:51:19

标签: c# wpf helix-3d-toolkit

我使用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;
    }

2 个答案:

答案 0 :(得分:1)

Dictionary类使用键的GetHashCode方法获取字典中初始查找的哈希值。然后,它使用键的equals方法来确定实际上对象是否匹配。 Model3d的每个实例返回不同的哈希值或者确定实例不相等。如果您只是尝试确定是否已加载模型,那么请考虑使用完整文件路径字符串作为键。否则,您可能需要为字典提供自定义IEqualityComparer以覆盖Model3d的默认GetHashCode和Equals方法的行为。这个网址可以帮助您更好地理解字典类:

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

答案 1 :(得分:0)

更新#1:问题解决了。在我的项目中,ModelImporter不加载3D模型;它加载3DModelGroup。因此,如果你添加Models.Children就可以了。

if (!Models.ContainsKey(currModel.Children))
        Models.Add(currModel.Children, modelName);