2012-01-16 6 views
2

j'écris un plugin Eclipse qui dessine un système d'états finis. comme il peut être grand, je voudrais attacher un algorithme de disposition de graphique existant (par exemple, la disposition hiérarchique, la disposition basée sur la force, ...) qui optimisent automatiquement la visualisation du système.éclipse (Fem) et la visualisation graphique (zeste)

est-il un moyen d'intégrer le plugin j'écris (écrit à l'aide du FEM) afin que les parties d'édition pourraient être générés place sur la zone de l'éditeur ci-dessous certains des algorithmes de mise en page graphique commun?

J'ai trouvé ce interesting article mais au lieu d'optimiser la visualisation des pièces d'édition, il se concentre sur le dessin d'un graphique complètement nouveau.

jusqu'à ce que je fais est d'ajouter le code suivant (à base de zestes 1)

private static void createNewGraph(String autName) { 
    Shell tmpShell = new Shell(); 
    currGraph = new Graph(tmpShell, SWT.NONE); 
    mapStateAndNodes = new HashMap<State, GraphNode>(); 
} 

private static void addGraphNode(State currState) 
{ 
    GraphNode newNode = new GraphNode(currGraph, SWT.NONE, currState.getName()); 
    mapStateAndNodes.put(currState, newNode); 
} 

private static void addGraphConnection(Transition currTrans) 
{ 
    GraphNode source = mapStateAndNodes.get(currTrans.getOrigState()); 
    GraphNode dest = mapStateAndNodes.get(currTrans.getDestState()); 

    GraphConnection newConn = new GraphConnection(currGraph, SWT.NONE, source, dest); 

} 

private static void completeGraph() 
{ 
    currGraph.setLayoutAlgorithm(new SpringLayoutAlgorithm(LayoutStyles.NO_LAYOUT_NODE_RESIZING), true); 
} 

et tout en construisant mon modèle, je l'appelle également createNewGraph(...), addGraphNode(...), addGraphConnection(...) et completeGraph(...). le problème est: après currGraph.setLayoutAlgorithm(..., true) que true signifie qu'il devrait appliquer l'algorithme et placer les objets dans le "bon" ordre. à ce stade (comme suggéré par certains lecteurs), il est possible d'extraire les coordonnées calculées à l'aide d'une méthode GraphNode.getLocation(). malheureusement, après avoir défini une mise en page et l'avoir appliquée, tous les états ont Point(0,0) comme emplacement. J'ai aussi trouvé ce commentaire:

/** 
* Runs the layout on this graph. It uses the reveal listener to run the 
* layout only if the view is visible. Otherwise it will be deferred until 
* after the view is available. 
*/ 
public void applyLayout() { 
    ... 
} 

en org.eclipse.zest.core.widgets.Graph sources: - [pour moi, il semble que je ne peux pas utiliser la bibliothèque zestes graphique pour faire ce travail. ai-je tort? Y a-t-il des alternatives?

toute aide serait appréciée :)

Répondre

3

En bref, Zest ne prend pas en charge ce scénario directement.

Cependant, vous pouvez construire une représentation en mémoire de vous modifier des pièces qui peuvent être layouted en utilisant Zest. Dans Zest 1.0, vous devez fournir une traduction aux nœuds de graphe et au graphe Arcs Relations manuellement; En Zest 2.0, il suffit de fournir un LayoutContext. Zest 2.0 n'est pas encore sorti, mais il me semble plus facile de gérer ce scénario.

idée supplémentaire: le projet open source soutien de pulvérisation Zest layouting pour les graphes Graphiti (FEM Graphiti étend - peut-être il y a quelques idées qui peuvent être réutilisés). Voir le fichier de code suivant: http://code.google.com/a/eclipselabs.org/p/spray/source/browse/plugins/org.eclipselabs.spray.runtime.graphiti.zest/src/org/eclipselabs/spray/runtime/graphiti/zest/features/ZestLayoutDiagramFeature.java pour quelques idées.

EDIT: J'ai regardé dans un code lié dans mon ordinateur; nous avons réussi à obtenir un tel travail en mise en page d'Zest 1.0 de la manière suivante:

  1. Avoir un seul GraphNode pour chaque noeud, et une connexion pour chaque arc entre les noeuds. Vous pouvez les collecter dans deux tableaux différents; par exemple. SimpleNode[] nodes; SimpleRelationship[] relationships;
  2. instancier une classe d'algorithme, et définissez vos paramètres optionnels que vous le souhaitez.
  3. Appel algorithm.applyLayout(nodes, relationships, 0, 0, diagram.width, diagram.height, false, false) - désolé, n'ont pas l'installation disponible Zest 1.0 pour vérifier la signification exacte des paramètres; les deux premiers sont les noeuds et les relations utilisés; puis les quatre suivants fixent la planche à dessin; et je n'ai honnêtement aucune idée de ce que sont les deux derniers pour.: D

Précision supplémentaire: Zest utilise des nœuds et des relations comme terminologie - remplace mon précédent arc par une relation.

+0

J'ai édité ma question et ajouté un code qui fait ce que vous avez suggéré. mon problème est que je ne sais pas comment extraire les coordonnées calculées de l'objet 'Graph': -/aussi, je me demande si je pourrais directement appliquer un algorithme de la bibliothèque zest à mes objets ... – FSp

+0

Vous devez maintenir un lien entre les GraphNodes et votre objet modèle (par exemple, en utilisant une hashtable, ou en utilisant le magasin d'objets du modèle GraphNode). Ensuite, vous pouvez parcourir tous les nœuds, obtenir leurs coordonnées (si je me souviens bien, il existe un type de méthode getPosition ou getX sur GraphNodes que vous pouvez utiliser). A propos de l'application directe: comme les algorithmes de mise en page Zest attendent des entrées spécifiques, vous devez traduire pour cela. L'entrée est moins restrictive dans Zest 2.0, donc il serait plus facile à traduire, mais c'est encore possible dans Zest 1.0. –

+0

bonjour, j'ai édité à nouveau ma question pour le rendre plus précis. Néanmoins, il me semble que je ne peux pas utiliser zest pour calculer une mise en page pour mon graphique sans réellement le montrer: [ – FSp

Questions connexes