Comment : ouvrir un modèle UML à l'aide de l'API Visual Studio
Vous pouvez également ouvrir des modèles et des diagrammes dans l'interface utilisateur de Visual Studio à l'aide de l'API.
Si vous voulez seulement lire un modèle dans le code du programme sans le rendre visible pour l'utilisateur, vous pouvez utiliser les méthodes suivantes :
Le bus de modèle Visual Studio vous permet d'accéder aux modèles et aux éléments qu'ils contiennent ; il fournit par ailleurs une méthode standard pour créer des liens entre deux modèles. Pour plus d'informations, consultez Comment : intégrer des modèles UML à d'autres modèles et outils.
Vous pouvez ouvrir un modèle en lecture seule. Pour plus d'informations, consultez Comment : lire un modèle UML dans le code de programme.
Ouverture des modèles et des diagrammes dans Visual Studio
Pour ouvrir un modèle dans l'interface utilisateur, utilisez l'API Visual Studio standard EnvDTE.DTE. Deux casts utiles peuvent être exécutés sur les éléments de projet de modélisation :
EnvDTE.Project peut être casté vers et depuis IModelingProject dans le cas d'un projet de modélisation chargé dans l'AppDomain actuel.
EnvDTE.ProjectItem peut être casté vers et depuis IDiagramContext, si l'élément est un diagramme UML.
Pour l'exemple suivant, votre projet doit importer ces références :
EnvDTE
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Microsoft.VisualStudio.Modeling.Sdk.10.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0
Microsoft.VisualStudio.Uml.Interfaces
System.ComponentModel.Composition
Cet exemple ouvre un modèle UML dans Visual Studio :
using EnvDTE; // Visual Studio API for loading diagrams
using
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
// for ICommandExtension and other handler types
using Microsoft.VisualStudio.Uml.Classes;
// for basic UML types
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
// for model construction methods
using EnvDTE;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility;
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
// for IDiagram
...
Dans une extension Visual Studio, vous pouvez définir la déclaration suivante pour obtenir l'accès au fournisseur de services hôte :
[Import] public Microsoft.VisualStudio.Shell.SVsServiceProvider ServiceProvider {get;set;}
...
Dans une méthode, vous pouvez accéder à un projet, tel que le projet actuel :
DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;
IModelingProject modelingProject = project as IModelingProject;
if (modelingProject == null) return; // not a modeling project
// Access the model's store and contents.
IModelStore store = modelingProject.Store;
foreach (IElement element in store.Root.OwnedElements) {...}
// Open all the project's diagrams.
foreach (ProjectItem item in project.ProjectItems)
{
IDiagramContext modelingItem = item as IDiagramContext;
if (modelingItem == null)
continue; // not a model diagram
IDiagram diagram = modelingItem.CurrentDiagram;
if (diagram == null)
{
// Diagram is closed. Open it.
item.Open().Activate();
diagram = modelingItem.CurrentDiagram;
}
// Access the shapes.
foreach (IShape<IElement> shape
in diagram.GetChildShapes<IElement>())
{
IElement displayedElement = shape.Element;
...
}
}
}