方法: Visual Studio API を使用して UML モデルを開く
API を使用して、Visual Studio ユーザー インターフェイスでモデルおよび図を開くこともできます。
モデルをユーザーに表示せずに、プログラム コードでモデルの読み込みのみを行う場合は、次の方法を使用できます。
Visual Studio モデル バスを使用することにより、モデルおよびモデル内の要素にアクセスしたり、あるモデルと別のモデルをリンクする標準的な方法を使用したりできます。 詳細については、「方法: UML モデルを他のモデルおよびツールと統合する」を参照してください。
読み取り専用モードでモデルを開くことができます。 詳細については、「方法: プログラム コードで UML モデルを読み取る」を参照してください。
Visual Studio でモデルおよび図を開く
ユーザー インターフェイスでモデルを開くには、標準の Visual Studio API の EnvDTE.DTE を使用します。 モデリング プロジェクト項目に対して実行できる便利なキャストが 2 つあります。
プロジェクトがモデリング プロジェクトの場合で、そのプロジェクトが現在の AppDomain に読み込まれている場合、EnvDTE.Project と IModelingProject との間でキャストを行うことができます。
項目が UML 図の場合、EnvDTE.ProjectItem と IDiagramContext との間でキャストを行うことができます。
以降の例の場合、プロジェクトは次の参照をインポートする必要があります。
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
この例では、Visual Studio で UML モデルを開きます。
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
...
Visual Studio 拡張では、以下の宣言を行うことで、ホスト サービス プロバイダーへのアクセス権を取得できます。
[Import] public Microsoft.VisualStudio.Shell.SVsServiceProvider ServiceProvider {get;set;}
...
メソッドで、プロジェクト (たとえば、現在のプロジェクト) にアクセスできます。
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;
...
}
}
}