相同的 Model3D 似乎彼此不相等?
Same Model3D does not seem equal each other?
我正在使用 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;
}
字典 class 使用键的 GetHashCode 方法获取字典中初始查找的散列。然后它使用键的 equals 方法来确定对象实际上是否匹配。 Model3d 的每个实例都返回一个不同的哈希值,或者决定这些实例不相等。如果您只是想确定之前是否加载过模型,请考虑使用完整的文件路径字符串作为键。否则,您可能需要为字典提供自定义 IEqualityComparer 以覆盖 Model3d 的默认 GetHashCode 和 Equals 方法的行为。这个url可能会帮助你更好地理解字典class:
http://www.codeproject.com/Articles/500644/Understanding-Generic-Dictionary-in-depth
更新 #1:问题已解决。在我的项目中,ModelImporter 不加载 3D 模型;它加载 3DModelGroup。因此,如果您添加 Models.Children 它会起作用。
if (!Models.ContainsKey(currModel.Children))
Models.Add(currModel.Children, modelName);
我正在使用 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;
}
字典 class 使用键的 GetHashCode 方法获取字典中初始查找的散列。然后它使用键的 equals 方法来确定对象实际上是否匹配。 Model3d 的每个实例都返回一个不同的哈希值,或者决定这些实例不相等。如果您只是想确定之前是否加载过模型,请考虑使用完整的文件路径字符串作为键。否则,您可能需要为字典提供自定义 IEqualityComparer 以覆盖 Model3d 的默认 GetHashCode 和 Equals 方法的行为。这个url可能会帮助你更好地理解字典class:
http://www.codeproject.com/Articles/500644/Understanding-Generic-Dictionary-in-depth
更新 #1:问题已解决。在我的项目中,ModelImporter 不加载 3D 模型;它加载 3DModelGroup。因此,如果您添加 Models.Children 它会起作用。
if (!Models.ContainsKey(currModel.Children))
Models.Add(currModel.Children, modelName);