Accéder à un modèle et le mettre à jour dans le code du programmeNavigate and Update a Model in Program Code

Vous pouvez écrire du code pour créer et supprimer des éléments de modèle, définissez leurs propriétés et créer et supprimer des liens entre les éléments.You can write code to create and delete model elements, set their properties, and create and delete links between elements. Toutes les modifications doivent être effectuées dans une transaction.All changes must be made within a transaction. Si les éléments peuvent être affichés sur un diagramme, le diagramme sera « résolu « automatiquement à la fin de la transaction.If the elements are viewed on a diagram, the diagram will be "fixed up" automatically at the end of the transaction.

Un exemple de définition DSLAn Example DSL Definition

Il s’agit de la partie principale de DslDefinition.dsl pour les exemples de cette rubrique :This is the main part of DslDefinition.dsl for the examples in this topic:

Diagramme de définition DSL - modèle d’arbre généalogique

Ce modèle est une instance de cette solution DSL :This model is an instance of this DSL:

Modèle d’arbre généalogique de la famille Tudor

Espaces de noms et référencesReferences and Namespaces

Pour exécuter le code dans cette rubrique, vous devez référencer :To run the code in this topic, you should reference:

Microsoft.VisualStudio.Modeling.Sdk.11.0.dll

Votre code utilisera cet espace de noms :Your code will use this namespace:

using Microsoft.VisualStudio.Modeling;

En outre, si vous écrivez le code dans un projet différent de celui dans lequel votre solution DSL est défini, vous devez importer l’assembly qui est généré par le projet Dsl.In addition, if you are writing the code in a different project from the one in which your DSL is defined, you should import the assembly that is built by the Dsl project.

PropertiesProperties

Propriétés de domaine que vous définissez dans la définition DSL deviennent des propriétés auxquelles vous pouvez accéder dans le code de programme :Domain properties that you define in the DSL definition become properties that you can access in program code:

Person henry = ...;

if (henry.BirthDate < 1500) ...

if (henry.Name.EndsWith("VIII")) ...

Si vous souhaitez définir une propriété, vous devez le faire à l’intérieur d’un transaction:If you want to set a property, you must do so inside a transaction:

henry.Name = "Henry VIII";

En cas de la définition DSL, une propriété type est Calculated, vous ne pouvez pas la définir.If in the DSL definition, a property's Kind is Calculated, you cannot set it. Pour plus d’informations, consultez calculées et les propriétés de stockage personnalisé.For more information, see Calculated and Custom Storage Properties.

RelationsRelationships

Relations de domaine que vous définissez dans la définition DSL deviennent des paires de propriétés, l’autre sur la classe à chaque extrémité de la relation.Domain relationships that you define in the DSL definition become pairs of properties, one on the class at each end of the relationship. Les noms des propriétés apparaissent dans le diagramme DslDefinition comme des étiquettes sur les rôles de chaque côté de la relation.The names of the properties appear in the DslDefinition diagram as labels on the roles at each side of the relationship. En fonction de la multiplicité du rôle, le type de la propriété est la classe à l’autre extrémité de la relation, ou une collection de cette classe.Depending on the multiplicity of the role, the type of the property is either the class at the other end of the relationship, or a collection of that class.

foreach (Person child in henry.Children) { ... }

FamilyTreeModel ftree = henry.FamilyTreeModel;

Les propriétés à deux extrémités d’une relation sont toujours réciproque.The properties at opposite ends of a relationship are always reciprocal. Lorsqu’un lien est créé ou supprimé, les propriétés du rôle sur les deux éléments sont mis à jour.When a link is created or deleted, the role properties on both elements are updated. L’expression suivante (qui utilise les extensions de System.Linq) est toujours vrai pour la relation ParentsHaveChildren dans l’exemple :The following expression (which uses the extensions of System.Linq) is always true for the ParentsHaveChildren relationship in the example:

(Person p) => p.Children.All(child => child.Parents.Contains(p))

&& p.Parents.All(parent => parent.Children.Contains(p));

ElementLinks.ElementLinks. Une relation est également représentée par un élément de modèle appelé un lien, qui est une instance du type de relation de domaine.A relationship is also represented by a model element called a link, which is an instance of the domain relationship type. Un lien a toujours l’élément d’une source et d’élément d’une cible.A link always has one source element and one target element. L’élément source et l’élément cible peuvent être le même.The source element and the target element can be the same.

Vous pouvez accéder à un lien et ses propriétés :You can access a link and its properties:

ParentsHaveChildren link = ParentsHaveChildren.GetLink(henry, edward);

// This is now true:

link == null || link.Parent == henry && link.Child == edward

Par défaut, pas plus d’une instance d’une relation est autorisée à lier une paire d’éléments de modèle.By default, no more than one instance of a relationship is allowed to link any pair of model elements. Mais si, dans la définition DSL, le Allow Duplicates indicateur a la valeur true pour la relation, puis il peut y avoir plusieurs liens, et vous devez utiliser GetLinks:But if in the DSL definition, the Allow Duplicates flag is true for the relationship, then there might be more than one link, and you must use GetLinks:

foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinks(henry, edward)) { ... }

Il existe également d’autres méthodes pour accéder à des liens.There are also other methods for accessing links. Exemple :For example:

foreach (ParentsHaveChildren link in ParentsHaveChildren.GetLinksToChildren(henry)) { ... }

Rôles masqués.Hidden roles. En cas de la définition DSL, est la propriété générée est false pour un rôle particulier, puis aucune propriété n’est générée qui correspond à ce rôle.If in the DSL definition, Is Property Generated is false for a particular role, then no property is generated that corresponds to that role. Toutefois, vous pouvez toujours accéder aux liens et parcourir les liens à l’aide des méthodes de la relation :However, you can still access the links and traverse the links using the methods of the relationship:

foreach (Person p in ParentsHaveChildren.GetChildren(henry)) { ... }

L’exemple plus fréquemment utilisée est la PresentationViewsSubject relation qui lie un élément de modèle à la forme qui l’affiche sur un diagramme :The most frequently used example is the PresentationViewsSubject relationship, which links a model element to the shape that displays it on a diagram:

PresentationViewsSubject.GetPresentation(henry)[0] as PersonShape

Répertoire d’élémentsThe Element Directory

Vous pouvez accéder à tous les éléments dans le magasin à l’aide de l’annuaire de l’élément :You can access all the elements in the store using the element directory:

store.ElementDirectory.AllElements

Il existe également des méthodes pour rechercher des éléments, tels que les éléments suivants :There are also methods for finding elements, such as the following:

store.ElementDirectory.FindElements(Person.DomainClassId);

store.ElementDirectory.GetElement(elementId);

L’accès aux informations de classeAccessing Class Information

Vous pouvez obtenir des informations sur les classes, les relations et les autres aspects de la définition DSL.You can get information about the classes, relationships, and other aspects of the DSL definition. Exemple :For example:

DomainClassInfo personClass = henry.GetDomainClass();

DomainPropertyInfo birthProperty =

personClass.FindDomainProperty("BirthDate")

DomainRelationshipInfo relationship =

link.GetDomainRelationship();

DomainRoleInfo sourceRole = relationship.DomainRole[0];

Les classes de l’ancêtre d’éléments de modèle sont les suivantes :The ancestor classes of model elements are as follows:

  • ModelElement - tous les éléments et les relations sont ModelElementsModelElement - all elements and relationships are ModelElements

  • ElementLink - toutes les relations sont ElementLinksElementLink - all relationships are ElementLinks

Effectuer des modifications à l’intérieur d’une TransactionPerform Changes inside a Transaction

Chaque fois que votre code de programme change quelque chose dans le Store, elle doit le faire à l’intérieur d’une transaction.Whenever your program code changes anything in the Store, it must do so inside a transaction. Cela s’applique à tous les éléments de modèle, relations, formes, diagrammes et leurs propriétés.This applies to all model elements, relationships, shapes, diagrams, and their properties. Pour plus d'informations, consultez Transaction.For more information, see Transaction.

La méthode la plus pratique de la gestion d’une transaction est avec un using instruction entre dans un try...catch instruction :The most convenient method of managing a transaction is with a using statement enclosed in a try...catch statement:

Store store; ...
try
{
  using (Transaction transaction =
    store.TransactionManager.BeginTransaction("update model"))
    // Outermost transaction must always have a name.
  {
    // Make several changes in Store:
    Person p = new Person(store);
    p.FamilyTreeModel = familyTree;
    p.Name = "Edward VI";
    // end of changes to Store

    transaction.Commit(); // Don't forget this!
  } // transaction disposed here
}
catch (Exception ex)
{
  // If an exception occurs, the Store will be
  // rolled back to its previous state.
}

Vous pouvez apporter autant de modifications à l’intérieur d’une seule transaction.You can make any number of changes inside one transaction. Vous pouvez ouvrir les nouvelles transactions à l’intérieur d’une transaction active.You can open new transactions inside an active transaction.

Pour conserver vos modifications, vous devez Commit la transaction avant sa suppression.To make your changes permanent, you should Commit the transaction before it is disposed. Si une exception se produit qui n’est pas interceptée dans la transaction, le Store réinitialisera à son état avant les modifications.If an exception occurs that is not caught inside the transaction, the Store will be reset to its state before the changes.

Création d’éléments de modèleCreating Model Elements

Cet exemple ajoute un élément à un modèle existant :This example adds an element to an existing model:

FamilyTreeModel familyTree = ...; // The root of the model.
using (Transaction t =
    familyTree.Store.TransactionManager
    .BeginTransaction("update model"))
{
  // Create a new model element
  // in the same partition as the model root:
  Person edward = new Person(familyTree.Partition);
  // Set its embedding relationship:
  edward.FamilyTreeModel = familyTree;
          // same as: familyTree.People.Add(edward);
  // Set its properties:
  edward.Name = "Edward VII";
  t.Commit(); // Don't forget this!
}

Cet exemple illustre ces points essentiels sur la création d’un élément :This example illustrates these essential points about creating an element:

  • Créer le nouvel élément dans une partition spécifique dans le Store.Create the new element in a specific partition of the Store. Pour les éléments de modèle et de relations, mais pas les formes, il s’agit généralement de la partition par défaut.For model elements and relationships, but not shapes, this is usually the default partition.

  • Rendre la cible d’une relation d’incorporation.Make it the target of an embedding relationship. Dans la DslDefinition de cet exemple, chaque personne doit être la cible de relation FamilyTreeHasPeople d’incorporation.In the DslDefinition of this example, each Person must be the target of embedding relationship FamilyTreeHasPeople. Pour ce faire, nous pouvons définir la propriété de rôle FamilyTreeModel de l’objet personne ou ajouter la personne à la propriété de rôle de personnes de l’objet FamilyTreeModel.To achieve this, we can either set the FamilyTreeModel role property of the Person object, or add the Person to the People role property of the FamilyTreeModel object.

  • Définir les propriétés d’un nouvel élément, en particulier la propriété pour laquelle IsName a la valeur true dans la DslDefinition.Set the properties of a new element, particularly the property for which IsName is true in the DslDefinition. Cet indicateur marque la propriété qui sert à identifier l’élément de façon unique au sein de son propriétaire.This flag marks the property that serves to identify the element uniquely within its owner. Dans ce cas, la propriété Name a cet indicateur.In this case, the Name property has that flag.

  • La définition DSL de cette solution DSL doit avoir été chargée dans le Store.The DSL definition of this DSL must have been loaded into the Store. Si vous écrivez une extension comme une commande de menu, ce sera généralement déjà true.If you are writing an extension such as a menu command, this will typically be already true. Dans d’autres cas, vous pouvez explicitement charger le modèle dans le Store, ou utiliser ModelBus pour le charger.In other cases, you can explicitly load the model into the Store, or use ModelBus to load it. Pour plus d’informations, consultez Comment : ouvrir un modèle depuis un fichier de Code de programme.For more information, see How to: Open a Model from File in Program Code.

    Lorsque vous créez un élément de cette façon, une forme est automatiquement créée (si la solution DSL possède un diagramme).When you create an element in this way, a shape is automatically created (if the DSL has a diagram). Il apparaît dans un emplacement automatiquement affecté, avec d’autres fonctionnalités, la couleur et la forme par défaut.It appears in an automatically assigned location, with default shape, color, and other features. Si vous souhaitez contrôler où et comment la forme associée s’affiche, consultez création d’un élément et sa forme.If you want to control where and how the associated shape appears, see Creating an Element and its Shape.

Il existe deux relations définies dans l’exemple de définition DSL.There are two relationships defined in the example DSL definition. Chaque relation définit un propriété de rôle sur la classe à chaque extrémité de la relation.Each relationship defines a role property on the class at each end of the relationship.

Il existe trois façons dans lequel vous pouvez créer une instance d’une relation.There are three ways in which you can create an instance of a relationship. Chacune de ces trois méthodes a le même effet :Each of these three methods has the same effect:

  • Définissez la propriété de l’acteur de rôle source.Set the property of the source role player. Exemple :For example:

    • familyTree.People.Add(edward);

    • edward.Parents.Add(henry);

  • Définissez la propriété de l’acteur de rôle cible.Set the property of the target role player. Exemple :For example:

    • edward.familyTreeModel = familyTree;

      La multiplicité de ce rôle est 1..1, donc nous attribuons la valeur.The multiplicity of this role is 1..1, so we assign the value.

    • henry.Children.Add(edward);

      La multiplicité de ce rôle est 0..*, de sorte que nous ajoutons à la collection.The multiplicity of this role is 0..*, so we add to the collection.

  • Construire explicitement une instance de la relation.Construct an instance of the relationship explicitly. Exemple :For example:

    • FamilyTreeHasPeople edwardLink = new FamilyTreeHasPeople(familyTreeModel, edward);

    • ParentsHaveChildren edwardHenryLink = new ParentsHaveChildren(henry, edward);

    La dernière méthode est utile si vous souhaitez définir des propriétés sur la relation proprement dite.The last method is useful if you want to set properties on the relationship itself.

    Lorsque vous créez un élément de cette façon, un connecteur sur le diagramme est automatiquement créé, mais il a une forme par défaut, la couleur et autres fonctionnalités.When you create an element in this way, a connector on the diagram is automatically created, but it has a default shape, color, and other features. Pour contrôler la façon dont le connecteur associé est créé, consultez création d’un élément et sa forme.To control how the associated connector is created, see Creating an Element and its Shape.

La suppression d’élémentsDeleting Elements

Supprimer un élément en appelant Delete():Delete an element by calling Delete():

henry.Delete();

Cette opération supprimera également :This operation will also delete:

  • Liens de relation vers et à partir de l’élément.Relationship links to and from the element. Par exemple, edward.Parents ne contient plus de henry.For example, edward.Parents will no longer contain henry.

  • Éléments à des rôles pour lesquels le PropagatesDelete indicateur a la valeur true.Elements at roles for which the PropagatesDelete flag is true. Par exemple, la forme qui affiche l’élément sera supprimée.For example, the shape that displays the element will be deleted.

    Par défaut, chaque relation d’incorporation a PropagatesDelete true au niveau du rôle cible.By default, every embedding relationship has PropagatesDelete true at the target role. Suppression henry ne supprime pas le familyTree, mais familyTree.Delete() supprime tous les Persons.Deleting henry does not delete the familyTree, but familyTree.Delete() would delete all the Persons. Pour plus d’informations, consultez personnalisation du comportement de suppression.For more information, see Customizing Deletion Behavior.

    Par défaut, PropagatesDelete n’est pas vrai pour les rôles de relations de référence.By default, PropagatesDelete is not true for the roles of reference relationships.

    Vous pouvez provoquer les règles de suppression omettre les propagations spécifiques lorsque vous supprimez un objet.You can cause the deletion rules to omit specific propagations when you delete an object. Cela est utile si vous remplacez un seul élément d’une autre.This is useful if you are substituting one element for another. Vous fournissez le GUID d’un ou plusieurs rôles pour lesquels la suppression ne doit pas être propagée.You supply the GUID of one or more roles for which deletion should not be propagated. Le GUID peut être obtenu à partir de la classe de relation :The GUID can be obtained from the relationship class:

    henry.Delete(ParentsHaveChildren.SourceDomainRoleId);

    (Cet exemple particulier n’a aucun effet, étant donné que PropagatesDelete est false pour les rôles de la ParentsHaveChildren relation.)(This particular example would have no effect, because PropagatesDelete is false for the roles of the ParentsHaveChildren relationship.)

    Dans certains cas, la suppression est interdite par l’existence d’un verrou, sur l’élément ou sur un élément qui serait supprimé par propagation.In some cases, deletion is prevented by the existence of a lock, either on the element or on an element that would be deleted by propagation. Vous pouvez utiliser element.CanDelete() pour vérifier si l’élément peut être supprimé.You can use element.CanDelete() to check whether the element can be deleted.

Vous pouvez supprimer un lien de relation en supprimant un élément à partir d’une propriété de rôle :You can delete a relationship link by removing an element from a role property:

henry.Children.Remove(edward); // or:

edward.Parents.Remove(henry); // or:

Vous pouvez également supprimer le lien explicitement :You can also delete the link explicitly:

edwardHenryLink.Delete();

Ces trois méthodes ont toutes le même effet.These three methods all have the same effect. Vous devez uniquement utiliser un d’eux.You only need to use one of them.

Si le rôle a une multiplicité de valeur 0.. 1 ou 1.. 1, vous pouvez la définir sur null, ou à une autre valeur :If the role has 0..1 or 1..1 multiplicity, you can set it to null, or to another value:

edward.FamilyTreeModel = null; ou :edward.FamilyTreeModel = null; // or:

edward.FamilyTreeModel = anotherFamilyTree;

Réorganisation les liens d’une relationRe-ordering the Links of a Relationship

Les liens d’une relation particulière qui sont source ou ciblé sur un élément de modèle particulier ont un ordre spécifique.The links of a particular relationship that are sourced or targeted at a particular model element have a specific sequence. Ils apparaissent dans l’ordre dans lequel ils ont été ajoutés.They appear in the order in which they were added. Par exemple, cette instruction donne toujours les enfants dans le même ordre :For example, this statement will always yield the children in the same order:

foreach (Person child in henry.Children) ...

Vous pouvez modifier l’ordre des liens :You can change the order of the links:

ParentsHaveChildren link = GetLink(henry,edward);

ParentsHaveChildren nextLink = GetLink(henry, elizabeth);

DomainRoleInfo role =

link.GetDomainRelationship().DomainRoles[0];

link.MoveBefore(role, nextLink);

VerrousLocks

Vos modifications peuvent être évitées en un verrou.Your changes might be prevented by a lock. Verrous peuvent être définies sur des éléments individuels sur les partitions et sur le magasin.Locks can be set on individual elements, on partitions, and on the store. Si un de ces niveaux possède un verrou qui empêche le type de modification que vous souhaitez apporter, une exception peut levée lorsque vous essayez d’elle.If any of these levels has a lock that prevents the kind of change that you want to make, an exception might be thrown when you attempt it. Vous pouvez découvrir si les verrous sont définis à l’aide d’élément. GetLocks(), qui est une méthode d’extension qui est définie dans l’espace de noms Microsoft.VisualStudio.Modeling.Immutability.You can discover whether locks are set by using element.GetLocks(), which is an extension method that is defined in the namespace Microsoft.VisualStudio.Modeling.Immutability.

Pour plus d’informations, consultez définition d’une stratégie de verrouillage pour créer des Segments en lecture seule.For more information, see Defining a Locking Policy to Create Read-Only Segments.

Copier et collerCopy and Paste

Vous pouvez copier des éléments ou des groupes d’éléments à un IDataObject:You can copy elements or groups of elements to an IDataObject:

Person person = personShape.ModelElement as Person;
Person adopter = adopterShape.ModelElement as Person;
IDataObject data = new DataObject();
personShape.Diagram.ElementOperations
      .Copy(data, person.Children.ToList<ModelElement>());

Les éléments sont stockés en tant qu’un groupe d’élément sérialisé.The elements are stored as a serialized Element Group.

Vous pouvez fusionner des éléments à partir d’un IDataObject dans un modèle :You can merge elements from an IDataObject into a model:

using (Transaction t = targetDiagram.Store.
        TransactionManager.BeginTransaction("paste"))
{
  adopterShape.Diagram.ElementOperations.Merge(adopter, data);
}

Merge () peut accepter soit un PresentationElement ou un ModelElement.Merge () can accept either a PresentationElement or a ModelElement. Si vous lui donnez un PresentationElement, vous pouvez également spécifier une position sur le diagramme cible en tant que troisième paramètre.If you give it a PresentationElement, you can also specify a position on the target diagram as a third parameter.

Navigation et mise à jour des diagrammesNavigating and updating diagrams

Dans une solution DSL, l’élément de modèle de domaine, qui représente un concept telles que la personne ou à une chanson, est distincte de l’élément de forme, qui représente ce que vous voyez sur le diagramme.In a DSL, the domain model element, which represents a concept such as Person or Song, is separate from the shape element, which represents what you see on the diagram. L’élément de modèle de domaine stocke les propriétés importantes et les relations des concepts.The domain model element stores the important properties and relationships of the concepts. L’élément de forme stocke la taille, la position et la couleur de la vue de l’objet sur le diagramme et la disposition de ses composants.The shape element stores the size, position and color of the object's view on the diagram, and the layout of its component parts.

Éléments de présentationPresentation Elements

Diagramme de classes de la forme de base et des types d'éléments

Dans votre définition DSL, chaque élément que vous spécifiez crée une classe qui est dérivée d’une des classes standards suivantes.In your DSL Definition, each element that you specify creates a class that is derived from one of the following standard classes.

Type d’élémentKind of element Classe de baseBase class
Classe de domaineDomain class ModelElement
Relation de domaineDomain relationship ElementLink
FormeShape NodeShape
ConnecteurConnector BinaryLinkShape
DiagrammeDiagram Diagram

Un élément dans un diagramme représente généralement un élément de modèle.An element on a diagram usually represents a model element. Généralement (mais pas toujours), un NodeShape représente une instance de classe de domaine et un BinaryLinkShape représente une instance de relation de domaine.Typically (but not always), a NodeShape represents a domain class instance, and a BinaryLinkShape represents a domain relationship instance. Le PresentationViewsSubject relation lie une forme de nœud ou un lien à l’élément de modèle qu’il représente.The PresentationViewsSubject relationship links a node or link shape to the model element that it represents.

Chaque forme de nœud ou lien appartient à un diagramme.Every node or link shape belongs to one diagram. Une forme de lien binaire connecte deux formes de nœud.A binary link shape connects two node shapes.

Formes peuvent avoir des formes enfants dans deux jeux.Shapes can have child shapes in two sets. Une forme dans le NestedChildShapes ensemble ne se limite à la zone englobante de son parent.A shape in the NestedChildShapes set is confined to the bounding box of its parent. Une forme dans le RelativeChildShapes liste peut apparaître en dehors ou en partie en dehors des limites du parent - par exemple une étiquette ou un port.A shape in the RelativeChildShapes list can appear outside or partly outside the bounds of the parent - for example a label or a port. Un diagramme n’a aucun RelativeChildShapes et aucun Parent.A diagram has no RelativeChildShapes and no Parent.

Navigation entre les formes et les élémentsNavigating between shapes and elements

Les éléments de modèle de domaine et des éléments de forme sont liés par le PresentationViewsSubject relation.Domain model elements and shape elements are related by the PresentationViewsSubject relationship.

// using Microsoft.VisualStudio.Modeling;
// using Microsoft.VisualStudio.Modeling.Diagrams;
// using System.Linq;
Person henry = ...;
PersonShape henryShape =
  PresentationViewsSubject.GetPresentation(henry)
    .FirstOrDefault() as PersonShape;

La même relation lie des relations aux connecteurs sur le diagramme :The same relationship links relationships to connectors on the diagram:

Descendants link = Descendants.GetLink(henry, edward);
DescendantConnector dc =
   PresentationViewsSubject.GetPresentation(link)
     .FirstOrDefault() as DescendantConnector;
// dc.FromShape == henryShape && dc.ToShape == edwardShape

Cette relation lie également la racine du modèle vers le diagramme :This relationship also links the root of the model to the diagram:

FamilyTreeDiagram diagram =
   PresentationViewsSubject.GetPresentation(familyTree)
      .FirstOrDefault() as FamilyTreeDiagram;

Pour obtenir l’élément de modèle représenté par une forme, utilisez :To get the model element represented by a shape, use:

henryShape.ModelElement as Person

diagram.ModelElement as FamilyTreeModel

En général, il n’est pas recommandé pour naviguer entre les formes et connecteurs sur le diagramme.In general it is not advisable to navigate between shapes and connectors on the diagram. Il est préférable de parcourir les relations dans le modèle, le déplacement entre les formes et connecteurs uniquement lorsqu’il est nécessaire travailler sur l’apparence du diagramme.It is better to navigate the relationships in the model, moving between the shapes and connectors only when it is necessary to work on the appearance of the diagram. Ces méthodes lien connecteurs vers les formes à chaque extrémité :These methods link connectors to the shapes at each end:

personShape.FromRoleLinkShapes, personShape.ToRoleLinkShapes

connector.FromShape, connector.ToShape

De nombreuses formes sont composites ; elles sont constituées d’une forme parent et une ou plusieurs couches d’enfants.Many shapes are composites; they are made up of a parent shape and one or more layers of children. Les formes sont positionnés par rapport à une autre forme sont dits se situer ses enfants.Shapes that are positioned relative to another shape are said to be its children. Lorsque la forme parente se déplace, les enfants se déplacent avec lui.When the parent shape moves, the children move with it.

Enfants relatifs peut apparaître en dehors de la zone englobante de la forme parent.Relative children can appear outside the bounding box of the parent shape. Imbriqué enfants apparaissent strictement l’intérieur des limites du parent.Nested children appear strictly inside the bounds of the parent.

Pour obtenir le jeu du haut de formes sur un diagramme, utilisez :To obtain the top set of shapes on a diagram, use:

Diagram.NestedChildShapes

Les classes de l’ancêtre de formes et connecteurs sont :The ancestor classes of shapes and connectors are:

ModelElement

-- PresentationElement

-- ShapeElement

----- NodeShape

------- Diagram

------- YourShape------- YourShape

----- LinkShape

------- BinaryLinkShape

--------- YourConnector--------- YourConnector

Propriétés des formes et connecteursProperties of Shapes and Connectors

Dans la plupart des cas, il n’est pas nécessaire apporter des modifications explicites aux formes.In most cases, it is not necessary to make explicit changes to shapes. Lorsque vous avez modifié les éléments de modèle, les règles de « correction » mettre à jour les formes et connecteurs.When you have changed the model elements, the "fix up" rules update the shapes and connectors. Pour plus d’informations, consultez réponse en cours à et propagation des modifications.For more information, see Responding to and Propagating Changes.

Toutefois, il est utile apporter des modifications explicites aux formes de propriétés qui sont indépendantes des éléments de modèle.However, it is useful to make some explicit changes to shapes in properties that are independent of the model elements. Par exemple, vous pouvez modifier ces propriétés :For example, you could change these properties:

  • Size -Détermine la hauteur et la largeur de la forme.Size - determines the height and width of the shape.

  • Location -position par rapport à la forme parent ou d’un diagrammeLocation - position relative to the parent shape or diagram

  • StyleSet -l’ensemble des stylets et des pinceaux utilisés pour dessiner la forme ou un connecteurStyleSet - the set of pens and brushes used for drawing the shape or connector

  • Hide -rend la forme invisibleHide - makes the shape invisible

  • Show -rend la forme visible après une Hide()Show - makes the shape visible after a Hide()

Création d’un élément et sa formeCreating an Element and its Shape

Lorsque vous créez un élément et le liez dans l’arborescence de relations d’incorporation, une forme est automatiquement créée et associée.When you create an element and link it into the tree of embedding relationships, a shape is automatically created and associated with it. Cela est effectué par les règles de « correction » qui s’exécutent à la fin de la transaction.This is done by the "fixup" rules that execute at the end of the transaction. Toutefois, la forme s’affiche dans un emplacement automatiquement affecté, et sa forme, de couleur et d’autres fonctionnalités auront des valeurs par défaut.However, the shape will appear in an automatically assigned location, and its shape, color and other features will have default values. Pour contrôler la façon dont la forme est créée, vous pouvez utiliser la fonction de fusion.To control how the shape is created, you can use the merge function. Vous devez tout d’abord ajouter les éléments que vous souhaitez ajouter dans un ElementGroup et puis de fusionner le groupe dans le diagramme.You must first add the elements you want to add into an ElementGroup, and then merge the group into the diagram.

Cette méthode :This method:

  • Définit le nom, si vous avez affecté une propriété en tant que le nom d’élément.Sets the name, if you have assigned a property as the element name.

  • Observe les Directives de fusion d’éléments que vous avez spécifié dans la définition DSL.Observes any Element Merge Directives that you specified in the DSL Definition.

Cet exemple crée une forme à la position de la souris, lorsque l’utilisateur double-clique sur le diagramme.This example creates a shape at the mouse position, when the user double-clicks the diagram. Dans la définition DSL pour cet exemple, le FillColor propriété du ExampleShape a été exposé.In the DSL Definition for this sample, the FillColor property of ExampleShape has been exposed.

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
partial class MyDiagram
{
  public override void OnDoubleClick(DiagramPointEventArgs e)
  {
    base.OnDoubleClick(e);

    using (Transaction t = this.Store.TransactionManager
        .BeginTransaction("double click"))
    {
      ExampleElement element = new ExampleElement(this.Store);
      ElementGroup group = new ElementGroup(element);

      { // To use a shape of a default size and color, omit this block.
        ExampleShape shape = new ExampleShape(this.Partition);
        shape.ModelElement = element;
        shape.AbsoluteBounds = new RectangleD(0, 0, 1.5, 1.0);
        shape.FillColor = System.Drawing.Color.Azure;
        group.Add(shape);
      }

      this.ElementOperations.MergeElementGroupPrototype(
        this,
        group.CreatePrototype(),
        PointD.ToPointF(e.MousePosition));
      t.Commit();
    }
  }
}

Si vous fournissez plusieurs formes, définissez leurs positions relatives à l’aide de la AbsoluteBounds.If you provide more than one shape, set their relative positions using the AbsoluteBounds.

Vous pouvez également définir la couleur et autres propriétés exposées de connecteurs à l’aide de cette méthode.You can also set the color and other exposed properties of connectors using this method.

Utiliser des TransactionsUse Transactions

Formes, des connecteurs et des diagrammes sont des sous-types de ModelElement et en direct dans le Store.Shapes, connectors and diagrams are subtypes of ModelElement and live in the Store. Vous devez donc les modifier uniquement à l’intérieur d’une transaction.You must therefore make changes to them only inside a transaction. Pour plus d’informations, consultez Comment : utiliser les Transactions pour mettre à jour le modèle.For more information, see How to: Use Transactions to Update the Model.

Affichage de document et les données de DocumentDocument View and Document Data

Diagramme de classes des types de diagramme standard

Partitions de StoreStore Partitions

Lorsqu’un modèle est chargé, le diagramme qui accompagne cet article est chargé en même temps.When a model is loaded, the accompanying diagram is loaded at the same time. En règle générale, le modèle est chargé dans Store.DefaultPartition, et le contenu du diagramme est chargé dans une autre Partition.Typically, the model is loaded into Store.DefaultPartition, and the diagram content is loaded into another Partition. En règle générale, le contenu de chaque partition est chargé et enregistré dans un fichier distinct.Usually, the content of each partition is loaded and saved to a separate file.

Voir aussiSee also