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 :
((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) :
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 :
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
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 ?
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
Partager