IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Eclipse Platform Discussion :

Position d'une vue dans un diagramme


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut Position d'une vue dans un diagramme
    Bonjour,

    j'utilise l'outil RSM qui s'appuie sur Eclipse et GMF pour le dessin de ses diagrammes UML.
    Je sais exporter un diagramme en GIF ou BMP. Je voudrais maintenant savoir comment trouver la position des "vues" dans ce fichier GIF ou BMP.
    Par position, j'entend un truc du genre (X, Y, width, height) pour chaque élément graphique. Le X,Y,width,height étant "dans l'unité" du GIF ou BMP généré.

    L'objectif final étant de créer un "HTML ImageMap" pour définir des zones cliquables dans l'image.

    Par avance merci

  2. #2
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    Bonjour,

    RSM n'est pas Open Source

    Pas grave ^^

    Mais je pense qu'IBM utilise une version de GMF "à leur sauce".
    Toutefois, voici quelques points d'entrées pour faire ce que tu veux :

    org.eclipse.gmf.runtime.diagram.ui.render.actions.CopyToImageAction est l'action permettant de sauver un diagramme en image (IBM est le contributeur ce qui part pas trop mal )

    Le travail est ensuite délégué à CopyToImageUtil.

    Je pense pas qu'il faille modifier l'action existante. Le mieux est certainement de créer ta propre action qui va exporter l'image (en réutilisant CopyToImageAction) et de créer le fichier HTML associé.

    Tu peux voir comment récupérer la liste des edit part sélectionnés en regardant le code de CopyToImageAction. Ne connaissant pas tes compétences sur les techno Eclipse/GMF/GEF, je ne rentre pas dans le détail, il suffira de demander des précisions.

    Je vais prendre la cas où l'utilisateur clic droit sur le diagramme et choisi "save as Image File" (action présente de base dans GMF, à vérifier pour RSM).

    Tu as donc en entré un objet de type org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart. Il faut ensuite parcourir les EditPart enfants avec la méthode EditPart::getChildrent() : EditPart[*] (parcours récursif, donc).
    Pour récupérer les connexions : diagramEditPart.getConnections() : org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart[*].

    Ensuite, deux solutions

    S1. récupérer la position de la figure de l'edit part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ((GraphicalEditPart) editPart).getFigure().getBounds()
    S2. récupérer la position de l'objet org.eclipse.gmf.runtime.notation.View (objet du modèle GMF, donc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    View view = ((org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart) editPart).getNotationView()
    Pour S2, deux cas :
    View est une instance de org.eclipse.gmf.runtime.notation.Node :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.eclipse.gmf.runtime.notation.LayoutConstraint constraint = ((Node) view).getLayoutConstraint();
    constraint peut être de type Location, Size, Ratio ou Bounds (ce dernier hérite de Size et Location).

    View est une instance de org.eclipse.gmf.runtime.notation.Edge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bendpoints bendpoints = ((Edge) view).getBendpoints();
    Et là.... c'est vachement plus compliqué

    Bendpoints est une interface (au sens Ecore) et il n'y a qu'une seule classe qui la réalise : RelativeBendpoints.

    Bon là après c'est des "trucs" géométriques tu peux voir un exemple d'exploitation des contraintes spécifiées par des Bendpoints dans la classe org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart (méthode refreshBendpoints - traduite les contraints GMF en contraintes draw2d). Puis, l'exploitation de ces contraintes draw2d dans les classe :
    • org.eclipse.draw2d.RelativeBendpoint (méthode getLocation())
    • org.eclipse.draw2d.BendpointConnectionRouter (méthode route())


    Voilà ! Tout ça c'est bien joli, mais comment récupérer l'élément sémantique de la vue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (editPart instanceof org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart) {
      final EObject mySemanticObject = ((org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart) editPart).resolveSemanticElement();
       ...
    }
    voilà, ça laisse pas mal de pistes à approfondir.
    Et sache que si tu arrives à quelque chose de fonctionnel, ça devrait intéresser pas mal de monde ... enfin... voilà quoi... c'est open source GMF

    Sinon, l'alternative est de faire de la reconnaissance de forme sur l'image exportée

    Yann

  3. #3
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Déjà merci pour toutes ces infos, je vais creuser avec.

    Pour récupérer les "View" c'est facile car sous RSM on accède au modèle UML via l'API IBM et là, la récupération des View (objets représentant les éléments UML) est directe.
    Maitenant, avec ce que tu m'as donné, il faut que je trouve la position de ces éléments dans le diagramme et surtout trouver la transformation de ces coordonnées dans l'image bmp ou jpg que je créé via le CopyToImageUtil

    je vous tiens au courant et posterai le code si je trouve qq chose de correct

  4. #4
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Billets dans le blog
    2
    Par défaut
    Bon eh bien j'ai trouvé et il suffisait de savoir lire car c'est super simple en fait.

    La classe org.eclipse.gmf.runtime.diagram.ui.render.util.CopyToImageUtil permet de tout faire.
    Sa méthode copyToImage renvoie une liste de PartPositionInfo qui contient la position d'une zone graphique et l'élément sémantiquement associé. En fonction de l'outil qui utilise GMF, la sémantique associée à chaque zone est donc différente.
    Dans le cas d'outil RSM (modélisation UML), ces éléments sémantiques sont des "Element" du méta-modèle UML.
    J'ai mis ci-dessous un extrait du code d'un plugin, je pense que vous pourrez facilement éliminer ce qui est propre à mon besoin et que vous verrez comment créer une "image map" pour vos propres besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    List<PartPositionInfo> parts = imageUtility.copyToImage(d, path,
    					format, new NullProgressMonitor(),
    					PreferencesHint.USE_DEFAULTS);
     
    			if (useMap) {
    				w.write("<map name=\"" + d.getName() + "\">");
    				for (PartPositionInfo part : parts) {
    					if (part.getSemanticElement() != null
    							&& part.getSemanticElement() instanceof NamedElement) {
    						NamedElement element = (NamedElement) part
    								.getSemanticElement();
    						if (element.getName() != null
    								&& !(element instanceof Activity)) {
    							w.write("<area SHAPE='rect' href=\"#");
    							if (element instanceof CallBehaviorAction) {
    								CallBehaviorAction action = (CallBehaviorAction) element;
    								Behavior called = action.getBehavior();
    								if (called != null)
    									w.write(called.getQualifiedName());
    								else
    									w.write(element.getQualifiedName());
    							} else
    								w.write(element.getQualifiedName());
    							w.write("\" coords=\"");
    							Integer xupper = new Integer(part.getPartX());
    							Integer yupper = new Integer(part.getPartY());
    							Integer xlower = new Integer(part.getPartX()
    									+ part.getPartWidth());
    							Integer ylower = new Integer(part.getPartY()
    									+ part.getPartHeight());
    							w.write(xupper + " , " + yupper + " , " + xlower
    									+ " , " + ylower);
    							w.write("\" alt=\"");
    							w.write(element.getName());
    							w.write("\"/>");
    						}
    					}
    				}
    				w.write("</map>");
    			}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/07/2004, 22h30
  2. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 11h08
  3. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57
  4. Position d'une balise dans un document externe
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 02h56
  5. [VB6] Position d'une MDIchild dans un MDI
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2003, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo