Udostępnij za pośrednictwem


Porady: wyświetlanie modelu na diagramach

W kodzie programu z rozszerzeniem do Visual Studio Ultimate, można kontrolować sposób wyświetlania elementów modelu na diagramach.

  • W tym temacie:

    • Aby wyświetlić element na diagramie

    • Uzyskiwanie dostępu do kształtów, które stanowią element

    • Przenoszenie i zmiana rozmiaru kształtów

    • Aby usunąć kształt z diagramu

    • Otwieranie i tworzenia diagramów

    • Przykład: Polecenie wyrównywania kształtów

Aby wyświetlić element na diagramie

Podczas tworzenia elementu, takie jak przypadek użycia lub akcję, użytkownik może go wyświetlić w Eksploratorze modelu UML, ale nie zawsze automatycznie wyświetlane na diagramie.W niektórych przypadkach należy napisać kod, aby go wyświetlić.W następującej tabeli podsumowano alternatyw.

 

Typ elementu

Na przykład

Aby wyświetlić to, musi kodu

Klasyfikatora

Class

Component

Actor

Use Case

Tworzenie kształtów skojarzonych na diagramach określony.Można utworzyć dowolną liczbę kształtów, dla każdego klasyfikatora.

diagram.Display<modelElementType>

(modelElement, parentShape,

xPosition , yPosition);

Ustaw parentShape do null dla kształtu najwyższego poziomu diagramu.

Aby wyświetlić jeden kształt wewnątrz innego:

IShape<IUseCase> usecaseShape =

useCaseDiagram.Display

(useCase,

subsystemShape,

subsystemShape.XPosition + 5,

subsystemShape.YPosition + 5);

[!UWAGA]

Jeżeli wykonuje się wyświetlania wewnątrz ILinkedUndo transakcji, metoda zwraca czasami nr IShape.Jednak kształt jest tworzony poprawnie i jest dostępny przy użyciuIElement.Shapes().

Dziecko klasyfikatora

Atrybutów, operacji,

Część, Port

Automatyczny — kod nie jest wymagany.

Jest on wyświetlany jako część obiektu nadrzędnego.

Zachowanie

Interakcja (sekwencja)

Działalność

Powiązać diagramie odpowiednie zachowanie.

Każde działanie mogą być powiązane z co najwyżej jeden diagram naraz.

Na przykład:

sequenceDiagram.Bind(interaction);

activityDiagram.Bind(activity);

Dziecko zachowanie

Linie życia, wiadomości, akcje, węzły obiektów

Automatyczny — kod nie jest wymagany.

Jest on wyświetlany, jeśli nadrzędny jest powiązany z diagramu.

Relacja

Skojarzenia, generalizacji, przepływu, zależność

Automatyczny — kod nie jest wymagany.

Jest on wyświetlany na każdy diagram, w którym oba końce są wyświetlane.

 

Uzyskiwanie dostępu do kształtów, które stanowią element

Kształt przedstawiający element należy do typów:

IShape

IShape<Element ElementType>

gdy ElementType jest typ elementu modelu, takich jak IClass lub IUseCase.

anElement.Shapes ()

Wszystkie IShapes reprezentujące ten element na diagramach otwarte.

anElement.Shapes(aDiagram)

Wszystkie IShapes reprezentujące ten element, w szczególności diagramu.

anIShape.GetElement()

IElement , Który reprezentuje kształt.Można byłoby zwykle oddanych do podklasy IElement.

anIShape.Diagram

IDiagram , Która zawiera kształtu.

anIShape.ParentShape

Kształt, który zawiera anIShape.Na przykład kształt portu znajduje się w obrębie kształtu składnik.

anIShape.ChildShapes

Kształty zawarte w IShape lub IDiagram.

anIShape.GetChildShapes<IUseCase>()

Kształty, zawartych w IShape lub IDiagram reprezentujące elementy określonego typu, takich jak IUseCase.

IShape iShape = ...;

IShape<IClass> classShape = iShape.ToIShape<IClass>();

IClass aClass = classShape.Element;

Rzutowanie rodzajowego IShape do jednoznacznie określonym typie IShape<IElement>.

IShape<IClassifier> classifierShape;

IShape<IUseCase> usecaseShape =

classifierShape.ToIShape<IUseCase>();

Rzutowanie kształt z jednego kształtu sparametryzowana typu.

Przenoszenie i zmiana rozmiaru kształtów

anIShape.Move(x, y, [width], [height])

Przenoszenie lub zmiana rozmiaru kształtu.

IDiagram.EnsureVisible( IEnumerable<IShape> shapes, bool zoomToFit = false)

Uaktywnij okno, a następnie przewiń diagramu, tak, że będą widoczne wszystkie kształty danym.Wszystkie kształty muszą być na diagramie.Jeśli zoomToFit ma wartość true, diagram będzie być skalowane w razie potrzeby, tak aby wszystkie kształty są widoczne.

Na przykład, zobacz Definiowanie polecenia wyrównania.

Aby usunąć kształt z diagramu

Kształty niektóre typy element można usunąć bez usuwania elementu.

Element modelu

Aby usunąć kształt

Klasyfikatora: klasa, interfejs, wyliczenie, aktor, przypadek użycia lub składnika

shape.Delete();

Zachowania: interakcja lub aktywności

Diagram można usunąć z projektu.Użyj IDiagram.FileName celu uzyskania ścieżki.

To zachowanie nie powoduje usunięcia z modelu.

Inny kształt

Nie można jawnie usunąć innych kształtów z diagramu.Kształt automatycznie zniknie, element jest usuwany z modelu lub kształtem nadrzędnym jest usuwany z diagramu.

Otwieranie i tworzenia diagramów

Dostęp użytkownika bieżącego diagramu z rozszerzenia poleceń lub gestu

Ta właściwość przywożonych w klasie, oświadczam:

[Import]

IDiagramContext Context { get; set; }

 

W metodzie dostępu do diagramu:

IClassDiagram classDiagram =

Context.CurrentDiagram as IClassDiagram;

[!UWAGA]

Wystąpienie IDiagram (i jego podtypów, takich jak IClassDiagram) jest prawidłowy tylko wewnątrz polecenia są przetwarzania.Nie zaleca się aby zachować IDiagram obiektu w zmiennej, która będzie się powtarzał, podczas gdy sterowanie jest zwracane do użytkownika.

Aby uzyskać więcej informacji, zobacz Porady: definiowanie polecenia menu na diagramie modelowania.

Aby uzyskać listę otwarte diagramy

Lista diagramów, które są aktualnie otwarte w projekcie:

Context.CurrentDiagram.ModelStore.Diagrams()

Aby uzyskać dostęp do diagramów w projekcie do

Visual Studio API może służyć do otwierania i tworzenia projektów do modelowania i diagramów.

Zawiadomienie cast z EnvDTE.ProjectItem do IDiagramContext.

using EnvDTE; // Visual Studio API
...
[Import]
public IServiceProvider ServiceProvider { get; set; }
...
// Get Visual Studio API
DTE dte = ServiceProvider.GetService(typeof(DTE)) as DTE;
// Get current Visual Studio project
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;
// Open and process every diagram in the project.
foreach (ProjectItem item in project.ProjectItems)
{
  // Cast ProjectItem to IDiagramContext
  IDiagramContext context = item as IDiagramContext;
  if (context == null)
  {
     // This is not a diagram file.
     continue;
  }
  // Open the file and give the window the focus.
  if (!item.IsOpen)
  {
      item.Open().Activate();
  }
  // Get the diagram.
  IDiagram diagram = context.CurrentDiagram;
  // Deal with specific diagram types.
  ISequenceDiagram seqDiagram = diagram as ISequenceDiagram;
  if (seqDiagram != null)
  { ... } } }

Wystąpienia IDiagram i jego podtypów nie są ważne po zwraca sterowania do Visual Studio.

Można również uzyskać w magazynie modelu z Visual Studio projektu:

Project project = ...;
IModelStore modelStore = (project as IModelingProject).Store;

Przykład: Polecenie wyrównywania kształtów

Poniższy kod implementuje polecenie menu, które niezupełnie wyrównywanie kształtów.Użytkownik należy wcześniej umieścić dwa lub więcej kształtów w przybliżonej wyrównanie pionowo lub poziomo.Następnie polecenie Wyrównaj można wyrównać ich punkty środkowe.

Aby udostępnić polecenie Dodaj ten kod do projektu polecenia menu, a następnie wdrożyć rozszerzenia Wynikowy użytkownikom.Aby uzyskać więcej informacji, zobacz Porady: definiowanie polecenia menu na diagramie modelowania.

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

namespace AlignCommand
{
  // Implements a command to align shapes in a UML class diagram.
  // The user first selects shapes that are roughly aligned either vertically or horizontally.
  // This command will straighten them up.

  // Place this file in a menu command extension project.
  // See https://msdn.microsoft.com/library/ee329481.aspx

  [Export(typeof(ICommandExtension))]
  [ClassDesignerExtension] // TODO: Add other diagram types if needed
  class CommandExtension : ICommandExtension
  {
    /// <summary>
    /// See https://msdn.microsoft.com/library/ee329481.aspx
    /// </summary>
    [Import]
    IDiagramContext context { get; set; }

    /// <summary>
    /// Transaction context.
    /// See https://msdn.microsoft.com/library/ee330926.aspx
    /// </summary>
    [Import]
    ILinkedUndoContext linkedUndo { get; set; }

    /// <summary>
    /// Called when the user selects the command.
    /// </summary>
    /// <param name="command"></param>
    public void Execute(IMenuCommand command)
    {
      Align(context.CurrentDiagram.SelectedShapes);
    }

    /// <summary>
    /// Called when the user right-clicks on the diagram.
    /// Determines whether the command is enabled.
    /// </summary>
    /// <param name="command"></param>
    public void QueryStatus(IMenuCommand command)
    {
      IEnumerable<IShape> currentSelection = context.CurrentDiagram.SelectedShapes;
      // Make it visible if there are shapes selected:
      command.Visible = currentSelection.Count() > 0 && !(currentSelection.FirstOrDefault() is IDiagram);

      // Make it enabled if there are two or more shapes that are roughly in line:
      command.Enabled = currentSelection.Count() > 1
        && (HorizontalAlignCenter(currentSelection) > 0.0
        || VerticalAlignCenter(currentSelection) > 0.0);

    }

    /// <summary>
    /// Title of the menu command.
    /// </summary>
    public string Text
    {
      get { return "Align Shapes"; }
    }

    /// <summary>
    /// Find a horizontal line that goes through a list of shapes.
    /// </summary>
    /// <param name="shapes"></param>
    /// <returns></returns>
    private static double HorizontalAlignCenter(IEnumerable<IShape> shapes)
    {
      double Y = -1.0;
      double top = 0.0, bottom = shapes.First().Bottom();
      foreach (IShape shape in shapes)
      {
        top = Math.Max(top, shape.Top());
        bottom = Math.Min(bottom, shape.Bottom());
      }
      if (bottom > top) Y = (bottom + top) / 2.0;
      return Y;
    }

    /// <summary>
    /// Find a vertical line that goes through a list of shapes.
    /// </summary>
    /// <param name="shapes"></param>
    /// <returns></returns>
    private static double VerticalAlignCenter(IEnumerable<IShape> shapes)
    {
      double X = -1.0;
      double left = 0.0, right = shapes.First().Right();
      foreach (IShape shape in shapes)
      {
        left = Math.Max(left, shape.Left());
        right = Math.Min(right, shape.Right());
      }
      if (right > left) X = (right + left) / 2.0;
      return X;
    }

    /// <summary>
    /// Line up those shapes that are roughly aligned.
    /// </summary>
    /// <param name="shapes"></param>
    private void Align(IEnumerable<IShape> shapes)
    {
      if (shapes.Count() > 1)
      {
        // The shapes must all overlap either horizontally or vertically.
        // Find a horizontal line that is covered by all the shapes:
        double Y = HorizontalAlignCenter(shapes);
        if (Y > 0.0) // Negative if they don't overlap.
        {
          // Adjust all the shape positions in one transaction:
          using (ILinkedUndoTransaction t = linkedUndo.BeginTransaction("align"))
          {
            foreach (IShape shape in shapes)
            {
              shape.AlignYCenter(Y);
            }
            t.Commit();
          }
        }
        else
        {
          // Find a vertical line that is covered by all the shapes:
          double X = VerticalAlignCenter(shapes);
          if (X > 0.0) // Negative if they don't overlap.
          {
            // Adjust all the shape positions in one transaction:
            using (ILinkedUndoTransaction t = linkedUndo.BeginTransaction("align"))
            {
              foreach (IShape shape in shapes)
              {
                shape.AlignXCenter(X);
              }
              t.Commit();
            }
          }
        }
      }
    }
  }
  
  /// <summary>
  /// Convenience extensions for IShape.
  /// </summary>
  public static class IShapeExtension
  {
    public static double Bottom(this IShape shape)
    {
      return shape.YPosition + shape.Height;
    }

    public static double Top(this IShape shape)
    {
      return shape.YPosition;
    }

    public static double Left(this IShape shape)
    {
      return shape.XPosition;
    }

    public static double Right(this IShape shape)
    {
      return shape.XPosition + shape.Width;
    }

    public static void AlignYCenter(this IShape shape, double Y)
    {
      shape.Move(shape.XPosition, Y - shape.YCenter());
    }

    public static void AlignXCenter(this IShape shape, double X)
    {
      shape.Move(X - shape.XCenter(), shape.YPosition);
    }

    /// <summary>
    /// We can adjust what bit of the shape we want to be aligned.
    /// The default is the center of the shape.
    /// </summary>
    /// <param name="shape"></param>
    /// <returns></returns>
    public static double YCenter(this IShape shape)
    {
        return shape.Height / 2.0;
    } 
    
    /// <summary>
    /// We can adjust what bit of the shape we want to be aligned.
    /// The default is the center of the shape.
    /// </summary>
    /// <param name="shape"></param>
    /// <returns></returns>
    public static double XCenter(this IShape shape)
    {
        return shape.Width / 2.0;
    }
  }
}

Zobacz też

Koncepcje

Rozszerzanie diagramów i modeli UML

Porady: nawigowanie po modelu UML

Inne zasoby

Próbki: Wyrównywanie kształtów na diagramie polecenia menu

próbki: tworzenie elementów, kształtów i stereotypów