2016-05-25 8 views
0

Hey, ich benutze eine WPF 3D-Szene und habe erfolgreich ein paar .stl-Modelle darin geladen. Ich verwende basicall eine Methode, um diese Objekte auswählen und deaktivieren, auf, wo meine Maus in den Fenstern:C# Interaktion mit ModelVisual3D-Objekten in WPF

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

      } 
     } 

Also habe ich die ausgewählte ModelVisual3D haben und speichern können. Aber hier ist das Hauptproblem:

Meine Modelle werden basierend auf bestimmten Daten und einem zugehörigen STL-Modell generiert. Basicall Ich importiere das .stl-Modell und zeige es in meiner 3D-Szene, aber das Problem ist, ich habe keine Ahnung, wie meine anderen Daten mit dem Modell verbinden.

Zum Beispiel, wenn ich das visuelle auswählen, möchte ich ein anderes Fenster mit Informationen wie zeigen: Material, Abmessungen, Firma.

Aber ich kann nicht herausfinden, wie zu bestimmen, welches einzigartige ModelVisual3D Objekt im Moment ausgewählt ist. Es scheint keine Eigenschaften, die ich zu meinem Vorteil, etwas zu tun wie verwenden:

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 
+0

Sind Ihre anderen "Daten" in einem separaten Objekt? – Giffesnaffen

Antwort

0

Was ist mit einem Wörterbuch, um die Zuordnung zwischen Datenreferenz und ModelVisual3D Bezug zu halten.

Wie

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

Dann, wenn Sie Ihre Daten aus dem Hit-Test in Ihrem Ansichtsfenster finden müssen, überprüfen Sie nur, wenn das Wörterbuch einen Schlüssel für die gedrückte ModelVisual3d enthält und gibt die auf diesen Schlüssel bezogenen Wert, wenn es tut.

+0

Klingt wie eine gute Lösung, danke! Aber wie würde ich "nur überprüfen, ob dieses Wörterbuch eine Taste für das gedrückte ModelVisual3d enthält"? Entschuldigung, ich bin nicht so vertraut mit Wörterbüchern und da ich keine ID habe, weiß ich nicht, wie man etwas auf eine Weise wie if (id = 1) {do ...} – DerBenutzer

+0

Die Instanz 'GetHashCode wird die ID, wenn Sie die hinzufügen Instanz als der Schlüssel, wenn ich mich nicht irre :) Dies bedeutet, Sie könnten 'if (modelDataMap.Contains (test))' zu überprüfen, ob es im Wörterbuch sowie 'modelDataMap [test]', um die Daten abrufen – Giffesnaffen