Artikel

 
November 2009 | Artikel

GEF goes 3D Fortsetzung, Teil 5

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Diese beiden ersten Schritte sind relativ einfach. Schwieriger wird es nun bei der Modifikation der EditParts. Hierzu greifen wir nun auf Borg-Technologie zurück, also auf die BorgEditPartFactory (Listing 2).

Listing 2
  1. protected BorgEditPartFactory createBorgFactory(
  2. EditPartFactory originalFactory) {
  3. BorgEditPartFactory borgFactory = new BorgEditPartFactory(originalFactory);
  4. // replace diagram edit part
  5. borgFactory.addAssimilator(new EditPartReplacer(GraphEditPart.class,
  6. GraphEditPart3D.class));
  7. // modify diagram edit part's policies
  8. borgFactory.addAssimilator(new AbstractPolicyModifier() {
  9. public boolean match(EditPart part) {
  10. return part instanceof GraphEditPart3D;
  11. }
  12. public void modifyPolicies(EditPart io_editpart) {
  13. // feedback when creating a node:
  14. io_editpart.installEditPolicy(
  15. ShowLayoutFeedbackEditPolicy3D.ROLE,
  16. new ShowLayoutFeedbackEditPolicy3D());
  17. // handles and feedback when moving or resizing a node
  18. io_editpart.installEditPolicy(
  19. Handles3DEditPolicy.CHILD_DECORATOR,
  20. new Handles3DEditPolicy());
  21. }
  22. });
  23. // modify node edit part's policies
  24. borgFactory.addAssimilator(new IAssimilator.InstanceOf<EditPart>(
  25. NodeEditPart.class) {
  26. public EditPart assimilate(EditPart io_editpart) {
  27. // feedback when drawing a connection
  28. io_editpart.installEditPolicy(
  29. ShowSourceFeedback3DEditPolicy.ROLE,
  30. new ShowSourceFeedback3DEditPolicy());
  31. return io_editpart;
  32. }
  33. });
  34. return borgFactory;
  35. }


Der Code ist fast selbsterklärend. Zunächst wird die eigentliche Factory in der BorgEditPartFactory versteckt. Dann werden geeignete Assimilatoren installiert. Hier ist das zunächst ein EditPartReplacer, der einfach alle erzeugten Objekte vom Typ GraphEditPart gegen Instanzen vom Typ GraphEditPart3D austauscht. Der zweite Assimilator, ein AbstractPolicyModifier, ändert den EditPart selbst nicht, sondern installiert zwei neue Policies: ShowLayoutFeedbackEditPolicy3D zur Darstellung einer Feedback-Figur beim Erzeugen von Elementen sowie Handles3DEditPolicy, die dafür sorgt, dass später im Editor passende 3D-Handles und Feedback-Figuren bei der Bewegung von Knoten erzeugt werden. Der dritte Assimilator installiert ebenfalls eine neue Policy, ShowSourceFeedback3DEditPolicy. In diesem Fall wird eine Policy bei den VertexEditParts installiert, um eine Feedback-Figur bei der Erzeugung von Kanten anzuzeigen. Der Vollständigkeit halber hier noch die Funktion, um die BorgEditPartFactory gegen die originale Factory auszutauschen und einen speziellen RootEditPart zu setzen, der für den 3D-Editor benötigt wird:

  1. protected void configureGraphicalViewer() {
  2. super.configureGraphicalViewer();
  3. EditPartFactory originalFactory =
  4. getGraphicalViewer().getEditPartFactory();
  5. BorgEditPartFactory borgFactory = createBorgFactory(originalFactory);
  6. getGraphicalViewer().setEditPartFactory(borgFactory);
  7. ScalableFreeformRootEditPart root = new ScalableFreeformRootEditPart3D();
  8. getGraphicalViewer().setRootEditPart(root);
  9. }


Das waren tatsächlich alle Änderungen – der 3D-Editor ist fertig. Er muss jetzt nur noch über einen geeigneten Extension Point bei Eclipse registriert werden und kann dann die gleichen Diagramme öffnen und bearbeiten wie die 2D-Version.

Fazit
Wie das kleine Beispiel gezeigt hat, ist die Entwicklung von 3D-Editoren mit GEF3D überraschend einfach. Allerdings ist GEF3D zurzeit noch nicht vollkommen ausgereift. Näheres zu aktuellen Einschränkungen findet sich im Kasten "Incubator". Durch die einfache Portierung vorhandener Editoren fällt der Einstieg in die 3D-Welt leicht. Mit GEF3D ist aber auch die Umsetzung "echter" 3D-Editoren möglich. Dabei bietet sich GEF3D vor allem dann an, wenn nicht einzelne Elemente gezeichnet werden sollen (wie bei CAD-Programmen), sondern vorgefertigte Elemente in Beziehung zueinander gesetzt werden sollen. Im Fokus der Entwicklung von GEF3D steht momentan jedoch vor allem die 3D-fizierung von 2D-Editoren, da diese gerade im Umfeld modellgetriebener Verfahren interessant ist. Im zweiten Teil der Artikelserie zu GEF3D (zu lesen in Eclipse Magazin 1.10) werden wir auf weitere Features eingehen wie die Anzeige mehrerer Diagramme in einer 3D-Szene sowie die Anpassung von GMF-basierten Editoren.

Incubator
GEF3D befindet sich momentan bei Eclipse in der Incubator-Phase, also einem sehr frühen Projektstadium. Ein fertiges Release ist noch nicht erhältlich. Wie man GEF3D installiert, ist im Kasten "Installation" beschrieben. Bekannte Fehler sind, wie bei Eclipse-Projekten üblich, in Bugzilla dokumentiert. Wichtigste Einschränkung ist aktuell die fehlende Möglichkeit, 3D-Figuren im Raum nicht nur entlang einer Ebene zu bewegen, sondern auch zu rotieren. GEF3D unterstützt Rotation prinzipiell, wie beim mitgelieferten Graphbeispiel nachvollzogen werden kann. Allerdings fehlen momentan entsprechende Elemente für die Benutzerschnittstelle, also entsprechende Handles.

Die Incubator-Phase bedeutet übrigens nicht nur, dass die Software eventuell noch nicht stabil ist, sondern auch, dass sich das Projekt als Ganzes noch in der Aufbauphase befindet. Zurzeit sind lediglich zwei Committer an dem Projekt beteiligt. Vielleicht wird ja die eine oder der andere durch diesen Artikel auf das Projekt aufmerksam. Eine Webseite mit Wiki, eine Newsgroup sowie eine Entwickler-Mailingliste stehen bei Fragen (und Antworten) zur Verfügung.

Installation von GEF3D
GEF3D setzt die neueste Eclipse-Version 3.5 voraus. Um GEF3D zu installieren müssen die relevanten Projekte aus dem Subversion-Repository [12] geladen werden.

  • org.eclipse.draw3d
  • org.eclipse.draw3d.geometry
  • org.eclipse.draw3d.graphics3d
  • org.eclipse.draw3d.lwjgl
  • org.eclipse.draw3d.ui
  • org.eclipse.gef3d
  • org.eclipse.gef3d.ext

Die Beispielprojekte finden sich unter org.eclipse.gef3d.examples.*, spezielle Hilfsklassen zur 3D-fizierung von GMF-basierten Editoren unter org.eclipse.gef3d.gmf.

Zum Zeichnen der 3D-Szene wird ein zusätzlicher Renderer benötigt. Für die Ausgabe auf dem Bildschirm wird dafür OpenGL verwendet. Da OpenGL nur eine C-API anbietet, wird für Java eine Wrapper-Bibliothek wie LWJGL [10] nötig. Ein im Rahmen von GEF3D erstelltes Plug-in, das LWJGL in Eclipse einbindet, kann über die LWJGL-Update-Seite [13] installiert werden. Eine Installationsanleitung findet sich auch im GEF3D-Wiki [14].

Jens von Pilgrim ist Projektleiter und Committer des Eclipse-Projekts GEF3D. Er arbeitet als wissenschaftlicher Mitarbeiter an der FernUniversität in Hagen und promoviert dort über semi-automatische modellgetriebene Verfahren.
  1. Voormann, H.: "Quo vadis Eclipse?"
  2. Eclipse GEF3D
  3. Jacobson, I.: Object-Oriented Software Engineering: A Use Case Driven Approach. Addison-Wesley Professional, 1992 (acm press)
  4. Eclipse GEF
  5. Eclipse GMF
  6. Eclipse Modeling Framework Technology (EMFT)
  7. Eclipse Model Development Tools (MDT)
  8. Eclipse EMF
  9. Bokowski, B.; Gerhardt, F.: GEF: Maßgeschneiderte grafische Editoren selbst erstellen. In: Eclipse Magazin 2.05
  10. Lighweight Java Game Library (LWJGL)
  11. Java Bindings for OpenGL API (JOGL)
  12. Subversion Repository
  13. LWJGL-Update-Seite
  14. GEF3D-Wiki

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Anzeige

Kommentare


Anzeige

zurück zum Seitenanfang