Altova UModel 2024 Professional Edition

Wenn Sie ein Sequenzdiagramm aus einem Programm heraus über die UModel API von Grund auf neu erstellen, werden im Prinzip einfach Interaktionsfragmente wie z.B. Lebenslinien in ein Diagramm platziert und mit Nachrichten verknüpft.

 

Nachrichten können ganz einfach mit Hilfe der AddUMLLineElement() Methode von IUMLGuiLineLink erstellt werden, wodurch nicht mehrere zugrunde liegende UML-Elemente wie z.B. MessageEnds, ExecutionOccurrences und ähnliches manuell erstellt werden müssen.

 

Um das Erstellen von Nachrichten zwischen zwei Interaktionsfragmenten wie z.B. Lebenslinien einfacher zu machen, erstellen Sie eine kleine Hilfsfunktion, die AddUMLLineElement()aufruft und die erstellte Linie positioniert:

 

// Creates a message between two interaction fragments (i.e. lifelines, interaction uses,
// combined fragments or gates) and attaches all necessary elements like events and activation bars.
// Possible values for 'kind': "Message", "Reply", "Create", "Destruct"
protected static IUMLMessage addMessage(int ypos, string kind,
                                IUMLGuiNodeLink from, IUMLGuiNodeLink to,
                                DiagramWindow wnd)
{
  // add message
  IUMLGuiLineLink line = wnd.Diagram.AddUMLLineElement(kind, from, to);
 
  if (line == null)
      return null;
 
  // set position of the line where we want it to show up
  wnd.UpdateWindow();
 
  if (from == to && line.Waypoints.Count > 3)
  {
      // self-message
      ((IUMLGuiWaypoint)line.Waypoints[1]).SetPos(0, ypos);
      ((IUMLGuiWaypoint)line.Waypoints[4]).SetPos(0, ypos + 25);
  }  
  else
  if (line.Waypoints.Count > 1)
  {
      // normal message
      ((IUMLGuiWaypoint)line.Waypoints[1]).SetPos(0, ypos);
      ((IUMLGuiWaypoint)line.Waypoints[2]).SetPos(0, ypos);
  }
 
  return (IUMLMessage)line.Element;
}

 

 

Wie Sie sehen, akzeptiert IUMLDiagram.AddUMLLineElement() als Parameter nicht nur den String "Message", um eine Nachrichtenzeile zu erstellen, sondern auch "Reply", "Create" und "Destruct" für Antwortnachrichten, Erstellungsnachrichten und Löschungsnachrichten.

 

Um ein einfaches Diagramm zu erstellen, müssen Sie nur im GuiRoot-Objekt ein Sequenzdiagramm erstellen, das Diagramm öffnen, ein paar Lebenslinien hinzufügen und diese mit Hilfe dieser Hilfsfunktion mit Nachrichten verbinden:

 

IDocument document = theapplication.ActiveDocument;
 
// create diagram and open it
IUMLGuiSequenceDiagram sequenceDiagram =
  (IUMLGuiSequenceDiagram)document.GuiRoot.InsertOwnedDiagramAt(0, document.RootPackage, "SequenceDiagram");
 
DiagramWindow wnd = document.OpenDiagram(sequenceDiagram);
 
// create two lifelines
IUMLGuiNodeLink lifeline1 = sequenceDiagram.AddUMLElement("Lifeline", 0, 0);
IUMLGuiNodeLink lifeline2 = sequenceDiagram.AddUMLElement("Lifeline", 100, 70);
 
// connect these lifelines using some messages
addMessage(100, "Create", lifeline1, lifeline2, wnd);
addMessage(150, "Message", lifeline1, lifeline2, wnd);
addMessage(200, "Reply",   lifeline2, lifeline1, wnd);

 

Das erzeugte Diagramm sollte folgendermaßen aussehen:

SequenceGeneration_SimpleDiagram

 

Definieren des Typs einer Lebenslinie

Um den von einer Lebenslinie repräsentierten Typ - sei es eine Klasse, Schnittstelle, ein Datentyp oder ähnliches - anzuzeigen, verwenden Sie die Eigenschaft IUMLLifeline.Represents, die eine IUMLProperty referenziert. Wenn der Typ dieser Eigenschaft definiert ist, wird er ebenfalls im Diagramm angezeigt.

 

Mit dem folgenden Code wird eine Lebenslinie erstellt, die eine Klasse referenziert:

 

// create a class to be referenced by the lifeline
IUMLClass someclass = (IUMLClass)document.RootPackage.InsertPackagedElementAt(0, "Class");
 
// create a lifeline and a property with the class as type in the interaction
// of the sequence diagram to reference this class
IUMLInteraction interaction = (IUMLInteraction)sequenceDiagram.LinkedOwner;
 
IUMLProperty prop = interaction.InsertOwnedAttributeAt(0);
prop.Type = someclass;
 
UModelLib.IUMLLifeline lifeline = interaction.InsertLifelineAt(0);
lifeline.Represents = (IUMLConnectableElement)prop;
 
// show the lifeline on the diagram
sequenceDiagram.AddUMLGuiNodeLink(lifeline, 200, 0);

 

Die erzeugte Lebenslinie würde folgendermaßen aussehen:

 

 

SequenceGeneration_LifelineReferencingType

 

Definieren der Operation einer Nachricht

Nachrichten repräsentieren normalerweise den Aufruf einer Operation eines Objekts. Bitte beachten Sie: Je nach Typ der Nachricht (normale Nachricht, Erstellungsnachricht, Löschungsnachricht oder Antwortnachricht) und dem Vorhandensein bzw. Fehlen eines zugrunde liegenden UML-Elements wie z.B. MessageOccurenceSpecifications oder CallEvents, kann eine Nachricht nicht immer eine Operation repräsentieren und der Abruf des richtigen UML-Elements, das auf die Operation verweist, ist nicht immer so einfach.

 

Aus diesem Grund bietet die Schnittstelle IUMLMessage in der UModel API die Methode SetOperation(), mit Hilfe derer man eine Nachricht eine Operation referenzieren lassen kann, falls dies möglich ist:

 

// create a message, an operation in a class and let the message refer this operation
IUMLMessage msg = addMessage(250, "Message", lifeline1, lifeline2, wnd);
 
UModelLib.IUMLOperation someoperation = someclass.InsertOwnedOperationAt(0);
someoperation.Name = "SomeOperation";
 
msg.SetOperation(someoperation);

© 2017-2023 Altova GmbH