Ist es möglich, ein Multipatch zu verwenden, um IFeatureRenderer.Draw in einem benutzerdefinierten Renderer zu implementieren

8

Ich habe einen benutzerdefinierten Renderer, der geänderte Geometrie rendern muss. Die Eingabefunktionen werden alle über die IFeatureCursorals Polygonelemente eingegeben . (Dies ähnelt diesem Beispiel , obwohl ich keine Punkte rendere.)

Ich kann Polygone, Linien und Punkte einfach rendern, indem ich entweder die neue Geometrie übergebe IFeatureDraw.Drawoder IDisplay.DrawPolygon/ IDisplay.DrawPoint/ etc. Aufrufe .

Bietet IDisplayjedoch keinen Mechanismus zum Zeichnen eines Multipatchs, und das Übergeben dieses als Geometrie führt dazu, IFeatureDraw.Drawdass nichts auf den Bildschirm gezeichnet wird.

Gibt es eine Möglichkeit, ein Multipatch-Element (vorzugsweise mit Texturierung) innerhalb dieser Methode direkt zu "zeichnen"?

Reed Copsey
quelle
Ist dies in 2D-Anzeige (ArcMap) oder in ArcScene oder Globe?
Craig Williams
@Craig: Dies muss in allen drei unterstützt werden, obwohl ich bereit bin, mehrere Codepfade zu verwenden, um damit umzugehen. Dies ist für eine Plugin-Datenquelle, daher muss die Unterstützung "global" sein.
Reed Copsey

Antworten:

3

Wie Craig sagt, ist OpenGL der richtige Weg für 3D.

Siehe Erstellen einer ArcGIS Engine-Anwendung mit C-Sharp und OpenGL . Frühere Versionen von ArcGIS Explorer unterstützten auch OpenGL-Aufrufe , aber als ich das letzte Mal überprüft habe, dass Esri dies nicht mehr unterstützt.

Ich weiß nicht, warum sie das getan haben - OpenGL-Zeichnungen haben wirklich dazu beigetragen, AGX von Google Earth zu unterscheiden.

Aktualisieren

Selbst wenn Ihr Plugin Multipatches korrekt zurückgegeben hat, bietet ArcObjects meines Erachtens keine Methoden zum Unterstützen des Zeichnens von Multipatches mit OpenGL-Aufrufen. Es wäre wahrscheinlich einfacher, nur aus ihrem nativen Format zu zeichnen (mit anderen Worten, das Plugin zu umgehen). Ich habe es noch nie verwendet, aber hier ist ein Skript, das zeigt, wie OpenGL mit ArcScene verwendet wird .

Kirk Kuykendall
quelle
1

Die 2D-Anzeige (IDisplay) unterstützt das direkte Zeichnen von Multipatches nicht. Sie müssen sie in Footprints umwandeln (Informationen zum Extrahieren des Footprints finden Sie unter IMultipatch :: XYFootprint). Wenn Sie eine 2D-Darstellung der Multipatch-Texturen wünschen, müssen Sie aus einer 2D-Projektion des Multipatch ein Bild erstellen und dieses zeichnen.

Für 3D sollten Sie in der Lage sein, nur mehrere Patches im Cursor zurückzugeben, und es wird funktionieren, aber ehrlich gesagt implementieren die meisten Leute einfach eine benutzerdefinierte Ebene für den Globus und erledigen ihre eigene Arbeit in OpenGL.

Craig Williams
quelle
Ich versuche, ArcScene hauptsächlich (nicht Globe), aber auch Map / Globe als sekundäre zu unterstützen. Leider funktioniert die Rückgabe von Multipatches im Cursor in einem Plugin-Dataset nicht richtig, soweit ich das beurteilen kann ...
Reed Copsey