【问题标题】:C# Interacting with ModelVisual3D objects in WPFC# 与 WPF 中的 ModelVisual3D 对象交互
【发布时间】:2016-05-25 14:05:47
【问题描述】:

嘿,我正在使用 WPF 3D 场景并成功地将一些 .stl 模型加载到其中。 我基本上使用一种方法来选择和取消选择这些对象,具体取决于我的鼠标在窗口中的位置:

 private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
        {
            var viewport = (HelixViewport3D)sender;
            var firstHit = viewport.Viewport.FindHits(e.GetPosition(viewport)).FirstOrDefault();
            if (firstHit != null)
            {
                this.viewModel.Select(firstHit.Visual);

            }
            else
            {
                this.viewModel.Select(null);

            }
        }

所以我选择了 ModelVisual3D 并且可以存储它。然而,这是主要问题:

我的模型是根据某些数据和关联的 .stl 模型生成的。 基本上我导入 .stl 模型并将其显示在我的 3D 场景中,但问题是我不知道如何将其他数据连接到模型。

例如,当我选择视觉对象时,我想显示另一个窗口,其中包含以下信息:材料、尺寸、公司。

但我现在不知道如何确定选择了哪个唯一的 ModelVisual3D 对象。似乎没有我可以利用的属性来做类似的事情:

ModelImporter tr = new ModelImporter();
            var model = tr.Load("C:\\Users\\...\\Pictures\\a.stl");
            ModelVisual3D test = new ModelVisual3D();

            test.Content = model;

//Here I would like to save the id of my visual model to identify and
//associate it with my other data later

            int myUniqueModelID=test.Properties.UNIQUEID

【问题讨论】:

  • 您的其他“数据”是否在单独的对象中?

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


【解决方案1】:

如何使用字典来保持数据引用和ModelVisual3D 引用之间的映射。

喜欢

    Dictionary<ModelVisual3D, StlDataObject> modelDataMap = new Dictionary<ModelVisual3D, StlDataObject>();
    public void LoadModelWithData(string dataFilePath, string stlModelPath)
    {
        ModelImporter tr = new ModelImporter();
        var model = tr.Load("C:\\Users\\...\\Pictures\\a.stl");
        ModelVisual3D test = new ModelVisual3D();

        test.Content = model;

        //Load the datafile from file (or pass it this method)
        StlDataObject IdForOurStlModel = GetStlDataFromFile(dataFilePath);
        modelDataMap.Add(test, IdForOurStlModel);
    }

然后,当您需要从视口中的命中测试中查找数据时,您只需检查此字典是否包含按下的 ModelVisual3d 的键,如果包含则返回与该键相关的值。

【讨论】:

  • 听起来是个不错的解决方案,谢谢!但是我如何“只检查这个字典是否包含按下的 ModelVisual3d 的键”?抱歉,我对字典不太熟悉,因为我没有 ID,所以我不知道如何以 if(id=1){ do...} 之类的方式检查某些内容
  • 如果我没记错的话,当您将实例添加为 Key 时,实例的 GetHashCode 将成为 ID :) 这意味着您可以执行 if(modelDataMap.Contains(test)) 来检查它是否在字典中以及 @ 987654325@检索数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多