Navegar e atualizar um modelo no código do programaNavigate and Update a Model in Program Code

Você pode escrever código para criar e excluir elementos de modelo, definir suas propriedades e criar e excluir links entre elementos.You can write code to create and delete model elements, set their properties, and create and delete links between elements. Todas as alterações devem ser feitas em uma transação.All changes must be made within a transaction. Se os elementos forem exibidos em um diagrama, o diagrama será "corrigido" automaticamente no final da transação.If the elements are viewed on a diagram, the diagram will be "fixed up" automatically at the end of the transaction.

Um exemplo de definição de DSLAn Example DSL Definition

Essa é a parte principal do DslDefinition. DSL para os exemplos neste tópico:This is the main part of DslDefinition.dsl for the examples in this topic:

Diagrama de definição de DSL - modelo de árvore da família

Este modelo é uma instância desta DSL:This model is an instance of this DSL:

Modelo de árvore da família Tudor

Referências e namespacesReferences and Namespaces

Para executar o código neste tópico, você deve fazer referência a:To run the code in this topic, you should reference:

Microsoft.VisualStudio.Modeling.Sdk.11.0.dll

Seu código usará este namespace:Your code will use this namespace:

using Microsoft.VisualStudio.Modeling;

Além disso, se você estiver gravando o código em um projeto diferente daquele em que seu DSL está definido, você deverá importar o assembly criado pelo projeto 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.

PropriedadesProperties

As propriedades de domínio definidas na definição de DSL se tornam propriedades que você pode acessar no código do programa: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")) ...

Se você quiser definir uma propriedade, deverá fazer isso dentro de uma transação:If you want to set a property, you must do so inside a transaction:

henry.Name = "Henry VIII";

Se estiver na definição de DSL, o tipo de uma propriedade será calculado, você não poderá defini-la.If in the DSL definition, a property's Kind is Calculated, you cannot set it. Para obter mais informações, consulte Propriedades de armazenamento calculadas e personalizadas.For more information, see Calculated and Custom Storage Properties.

RelaçõesRelationships

As relações de domínio que você define na definição de DSL se tornam pares de propriedades, uma na classe em cada extremidade da relação.Domain relationships that you define in the DSL definition become pairs of properties, one on the class at each end of the relationship. Os nomes das propriedades aparecem no diagrama DslDefinition como rótulos nas funções em cada lado da relação.The names of the properties appear in the DslDefinition diagram as labels on the roles at each side of the relationship. Dependendo da multiplicidade da função, o tipo da propriedade é a classe na outra extremidade da relação, ou uma coleção dessa 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;

As propriedades em extremidades opostas de uma relação são sempre recíprocas.The properties at opposite ends of a relationship are always reciprocal. Quando um link é criado ou excluído, as propriedades de função em ambos os elementos são atualizadas.When a link is created or deleted, the role properties on both elements are updated. A expressão a seguir (que usa as extensões de System.Linq ) é sempre verdadeira para a relação ParentsHaveChildren no exemplo: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. Uma relação também é representada por um elemento de modelo chamado de link, que é uma instância do tipo de relação de domínio.A relationship is also represented by a model element called a link, which is an instance of the domain relationship type. Um link sempre tem um elemento de origem e um elemento de destino.A link always has one source element and one target element. O elemento de origem e o elemento de destino podem ser iguais.The source element and the target element can be the same.

Você pode acessar um link e suas propriedades: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

Por padrão, não é permitido que mais de uma instância de uma relação vincule qualquer par de elementos de modelo.By default, no more than one instance of a relationship is allowed to link any pair of model elements. Mas se, na definição de DSL, o Allow Duplicates sinalizador for verdadeiro para a relação, poderá haver mais de um link e você deverá usar 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)) { ... }

Também há outros métodos para acessar links.There are also other methods for accessing links. Por exemplo:For example:

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

Funções ocultas.Hidden roles. Se, na definição de DSL, a Propriedade gerada for false para uma função específica, nenhuma propriedade será gerada que corresponda a essa função.If in the DSL definition, Is Property Generated is false for a particular role, then no property is generated that corresponds to that role. No entanto, você ainda pode acessar os links e percorrer os links usando os métodos da relação:However, you can still access the links and traverse the links using the methods of the relationship:

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

O exemplo usado com mais frequência é a PresentationViewsSubject relação, que vincula um elemento de modelo à forma que o exibe em um diagrama: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

O diretório do elementoThe Element Directory

Você pode acessar todos os elementos no repositório usando o diretório do elemento:You can access all the elements in the store using the element directory:

store.ElementDirectory.AllElements

Também há métodos para localizar elementos, como o seguinte:There are also methods for finding elements, such as the following:

store.ElementDirectory.FindElements(Person.DomainClassId);

store.ElementDirectory.GetElement(elementId);

Acessando informações de classeAccessing Class Information

Você pode obter informações sobre as classes, relações e outros aspectos da definição de DSL.You can get information about the classes, relationships, and other aspects of the DSL definition. Por exemplo:For example:

DomainClassInfo personClass = henry.GetDomainClass();

DomainPropertyInfo birthProperty =

personClass.FindDomainProperty("BirthDate")

DomainRelationshipInfo relationship =

link.GetDomainRelationship();

DomainRoleInfo sourceRole = relationship.DomainRole[0];

As classes ancestrals dos elementos de modelo são as seguintes:The ancestor classes of model elements are as follows:

  • ModelElement-todos os elementos e relações são ModelElementsModelElement - all elements and relationships are ModelElements

  • ElementLink-todas as relações são ElementLinksElementLink - all relationships are ElementLinks

Executar alterações dentro de uma transaçãoPerform Changes inside a Transaction

Sempre que o código do programa altera qualquer coisa na loja, ele deve fazer isso dentro de uma transação.Whenever your program code changes anything in the Store, it must do so inside a transaction. Isso se aplica a todos os elementos de modelo, relações, formas, diagramas e suas propriedades.This applies to all model elements, relationships, shapes, diagrams, and their properties. Para obter mais informações, consulte Transaction.For more information, see Transaction.

O método mais conveniente de gerenciar uma transação é com uma using instrução colocada em uma try...catch instrução: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.
}

Você pode fazer qualquer número de alterações dentro de uma transação.You can make any number of changes inside one transaction. Você pode abrir novas transações dentro de uma transação ativa.You can open new transactions inside an active transaction.

Para tornar as alterações permanentes, você deve fazer Commit a transação antes que ela seja descartada.To make your changes permanent, you should Commit the transaction before it is disposed. Se ocorrer uma exceção que não é detectada dentro da transação, o repositório será redefinido para seu estado antes das alterações.If an exception occurs that is not caught inside the transaction, the Store will be reset to its state before the changes.

Criando elementos de modeloCreating Model Elements

Este exemplo adiciona um elemento a um modelo existente: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!
}

Este exemplo ilustra esses pontos essenciais sobre a criação de um elemento:This example illustrates these essential points about creating an element:

  • Crie o novo elemento em uma partição específica do armazenamento.Create the new element in a specific partition of the Store. Para elementos de modelo e relações, mas não formas, essa é geralmente a partição padrão.For model elements and relationships, but not shapes, this is usually the default partition.

  • Torne-o o destino de uma relação incorporada.Make it the target of an embedding relationship. No DslDefinition deste exemplo, cada pessoa deve ser o destino da relação incorporada FamilyTreeHasPeople.In the DslDefinition of this example, each Person must be the target of embedding relationship FamilyTreeHasPeople. Para fazer isso, podemos definir a propriedade de função FamilyTreeModel do objeto Person ou adicionar a pessoa à propriedade de função People do objeto 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.

  • Defina as propriedades de um novo elemento, especialmente a propriedade para a qual IsName é verdadeira no DslDefinition.Set the properties of a new element, particularly the property for which IsName is true in the DslDefinition. Esse sinalizador marca a propriedade que serve para identificar o elemento exclusivamente dentro de seu proprietário.This flag marks the property that serves to identify the element uniquely within its owner. Nesse caso, a propriedade Name tem esse sinalizador.In this case, the Name property has that flag.

  • A definição de DSL dessa DSL deve ter sido carregada no repositório.The DSL definition of this DSL must have been loaded into the Store. Se você estiver escrevendo uma extensão como um comando de menu, isso normalmente já será verdadeiro.If you are writing an extension such as a menu command, this will typically be already true. Em outros casos, você pode carregar explicitamente o modelo na loja ou usar ModelBus para carregá-lo.In other cases, you can explicitly load the model into the Store, or use ModelBus to load it. Para obter mais informações, consulte como: abrir um modelo do arquivo no código do programa.For more information, see How to: Open a Model from File in Program Code.

    Quando você cria um elemento dessa forma, uma forma é criada automaticamente (se a DSL tiver um diagrama).When you create an element in this way, a shape is automatically created (if the DSL has a diagram). Ele aparece em um local atribuído automaticamente, com forma padrão, cor e outros recursos.It appears in an automatically assigned location, with default shape, color, and other features. Se você quiser controlar onde e como a forma associada é exibida, consulte criando um elemento e sua forma.If you want to control where and how the associated shape appears, see Creating an Element and its Shape.

Há duas relações definidas na definição de DSL de exemplo.There are two relationships defined in the example DSL definition. Cada relação define uma propriedade de função na classe em cada extremidade da relação.Each relationship defines a role property on the class at each end of the relationship.

Há três maneiras pelas quais você pode criar uma instância de uma relação.There are three ways in which you can create an instance of a relationship. Cada um desses três métodos tem o mesmo efeito:Each of these three methods has the same effect:

  • Defina a propriedade do representante da função de origem.Set the property of the source role player. Por exemplo:For example:

    • familyTree.People.Add(edward);

    • edward.Parents.Add(henry);

  • Defina a propriedade do representante da função de destino.Set the property of the target role player. Por exemplo:For example:

    • edward.familyTreeModel = familyTree;

      A multiplicidade dessa função é 1..1 , portanto, atribuímos o valor.The multiplicity of this role is 1..1, so we assign the value.

    • henry.Children.Add(edward);

      A multiplicidade dessa função é 0..* , portanto, adicionamos à coleção.The multiplicity of this role is 0..*, so we add to the collection.

  • Construa uma instância da relação explicitamente.Construct an instance of the relationship explicitly. Por exemplo:For example:

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

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

    O último método será útil se você quiser definir propriedades na própria relação.The last method is useful if you want to set properties on the relationship itself.

    Quando você cria um elemento dessa forma, um conector no diagrama é criado automaticamente, mas tem uma forma padrão, cor e outros recursos.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. Para controlar como o conector associado é criado, consulte criando um elemento e sua forma.To control how the associated connector is created, see Creating an Element and its Shape.

Excluindo elementosDeleting Elements

Exclua um elemento chamando Delete() :Delete an element by calling Delete():

henry.Delete();

Esta operação também será excluída:This operation will also delete:

  • Os links de relação de e para o elemento.Relationship links to and from the element. Por exemplo, edward.Parents não conterá mais henry .For example, edward.Parents will no longer contain henry.

  • Elementos em funções para os quais o PropagatesDelete sinalizador é verdadeiro.Elements at roles for which the PropagatesDelete flag is true. Por exemplo, a forma que exibe o elemento será excluída.For example, the shape that displays the element will be deleted.

Por padrão, cada relação incorporada tem PropagatesDelete true na função de destino.By default, every embedding relationship has PropagatesDelete true at the target role. Excluir não henry exclui o familyTree , mas familyTree.Delete() exclui todos os Persons .Deleting henry does not delete the familyTree, but familyTree.Delete() would delete all the Persons.

Por padrão, PropagatesDelete o não é verdadeiro para as funções de relações de referência.By default, PropagatesDelete is not true for the roles of reference relationships.

Você pode fazer com que as regras de exclusão omitam propagações específicas quando você exclui um objeto.You can cause the deletion rules to omit specific propagations when you delete an object. Isso será útil se você estiver substituindo um elemento para outro.This is useful if you are substituting one element for another. Você fornece o GUID de uma ou mais funções para as quais a exclusão não deve ser propagada.You supply the GUID of one or more roles for which deletion should not be propagated. O GUID pode ser obtido da classe relationship:The GUID can be obtained from the relationship class:

henry.Delete(ParentsHaveChildren.SourceDomainRoleId);

(Esse exemplo específico não teria nenhum efeito, porque PropagatesDelete é false para as funções da ParentsHaveChildren relação.)(This particular example would have no effect, because PropagatesDelete is false for the roles of the ParentsHaveChildren relationship.)

Em alguns casos, a exclusão é impedida pela existência de um bloqueio, seja no elemento ou em um elemento que seria excluído pela propagação.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. Você pode usar element.CanDelete() para verificar se o elemento pode ser excluído.You can use element.CanDelete() to check whether the element can be deleted.

Você pode excluir um link de relação removendo um elemento de uma propriedade de função:You can delete a relationship link by removing an element from a role property:

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

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

Você também pode excluir o link explicitamente:You can also delete the link explicitly:

edwardHenryLink.Delete();

Todos esses três métodos têm o mesmo efeito.These three methods all have the same effect. Você só precisa usar um deles.You only need to use one of them.

Se a função tiver uma multiplicidade de 0.. 1 ou 1.. 1, você poderá defini-la como null , ou para outro valor:If the role has 0..1 or 1..1 multiplicity, you can set it to null, or to another value:

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

edward.FamilyTreeModel = anotherFamilyTree;

Os links de uma relação específica que são originadas ou destinadas a um determinado elemento de modelo têm uma sequência específica.The links of a particular relationship that are sourced or targeted at a particular model element have a specific sequence. Eles aparecem na ordem em que foram adicionados.They appear in the order in which they were added. Por exemplo, essa instrução sempre produzirá os filhos na mesma ordem:For example, this statement will always yield the children in the same order:

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

Você pode alterar a ordem dos links: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);

BloqueaLocks

Suas alterações podem ser impedidas por um bloqueio.Your changes might be prevented by a lock. Os bloqueios podem ser definidos em elementos individuais, em partições e na loja.Locks can be set on individual elements, on partitions, and on the store. Se qualquer um desses níveis tiver um bloqueio que impeça o tipo de alteração que você deseja fazer, uma exceção poderá ser gerada quando você tentar.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. Você pode descobrir se os bloqueios são definidos usando o elemento. Getlocks (), que é um método de extensão definido no namespace 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.

Para obter mais informações, consulte definindo uma política de bloqueio para criar Read-Only segmentos.For more information, see Defining a Locking Policy to Create Read-Only Segments.

Copiar e colarCopy and Paste

Você pode copiar elementos ou grupos de elementos para um 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>());

Os elementos são armazenados como um grupo de elementos serializados.The elements are stored as a serialized Element Group.

Você pode mesclar elementos de um IDataObject em um modelo: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 () o pode aceitar um PresentationElement ou um ModelElement .Merge () can accept either a PresentationElement or a ModelElement. Se você der um PresentationElement , também poderá especificar uma posição no diagrama de destino como um terceiro parâmetro.If you give it a PresentationElement, you can also specify a position on the target diagram as a third parameter.

Em uma DSL, o elemento de modelo de domínio, que representa um conceito como Person ou Song, é separado do elemento Shape, que representa o que você vê no diagrama.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. O elemento de modelo de domínio armazena as propriedades e relações importantes dos conceitos.The domain model element stores the important properties and relationships of the concepts. O elemento Shape armazena o tamanho, a posição e a cor da exibição do objeto no diagrama e o layout de suas partes de componente.The shape element stores the size, position and color of the object's view on the diagram, and the layout of its component parts.

Elementos de apresentaçãoPresentation Elements

Diagrama de classe de forma base e tipos de elemento

Na definição de DSL, cada elemento especificado cria uma classe que é derivada de uma das classes padrão a seguir.In your DSL Definition, each element that you specify creates a class that is derived from one of the following standard classes.

Tipo de elementoKind of element Classe baseBase class
Classe de domínioDomain class ModelElement
Relação de domínioDomain relationship ElementLink
FormaShape NodeShape
ConnectorConnector BinaryLinkShape
DiagramaDiagram Diagram

Um elemento em um diagrama geralmente representa um elemento de modelo.An element on a diagram usually represents a model element. Normalmente (mas nem sempre), um NodeShape representa uma instância de classe de domínio e um BinaryLinkShape representa uma instância de relação de domínio.Typically (but not always), a NodeShape represents a domain class instance, and a BinaryLinkShape represents a domain relationship instance. A PresentationViewsSubject relação vincula um nó ou forma de link ao elemento de modelo que ele representa.The PresentationViewsSubject relationship links a node or link shape to the model element that it represents.

Cada nó ou forma de link pertence a um diagrama.Every node or link shape belongs to one diagram. Uma forma de link binário conecta duas formas de nó.A binary link shape connects two node shapes.

As formas podem ter formas filhas em dois conjuntos.Shapes can have child shapes in two sets. Uma forma no NestedChildShapes conjunto é confinada à caixa delimitadora de seu pai.A shape in the NestedChildShapes set is confined to the bounding box of its parent. Uma forma na RelativeChildShapes lista pode aparecer fora ou parcialmente fora dos limites do pai, por exemplo, um rótulo ou uma porta.A shape in the RelativeChildShapes list can appear outside or partly outside the bounds of the parent - for example a label or a port. Um diagrama não tem nenhum RelativeChildShapes Parent .A diagram has no RelativeChildShapes and no Parent.

Elementos de modelo de domínio e elementos de forma são relacionados pela PresentationViewsSubject relação.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;

A mesma relação vincula os relacionamentos com os conectores no diagrama: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

Essa relação também vincula a raiz do modelo ao diagrama:This relationship also links the root of the model to the diagram:

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

Para obter o elemento de modelo representado por uma forma, use:To get the model element represented by a shape, use:

henryShape.ModelElement as Person

diagram.ModelElement as FamilyTreeModel

Em geral, não é aconselhável navegar entre as formas e os conectores no diagrama.In general it is not advisable to navigate between shapes and connectors on the diagram. É melhor navegar pelas relações no modelo, movendo entre as formas e os conectores somente quando for necessário trabalhar na aparência do diagrama.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. Esses métodos vinculam conectores às formas em cada extremidade:These methods link connectors to the shapes at each end:

personShape.FromRoleLinkShapes, personShape.ToRoleLinkShapes

connector.FromShape, connector.ToShape

Muitas formas são compostas; Eles são compostos de uma forma pai e uma ou mais camadas de filhos.Many shapes are composites; they are made up of a parent shape and one or more layers of children. As formas que são posicionadas em relação a outra forma são consideradas seus filhos.Shapes that are positioned relative to another shape are said to be its children. Quando a forma pai se move, os filhos se movem com ela.When the parent shape moves, the children move with it.

Os filhos relativos podem aparecer fora da caixa delimitadora da forma pai.Relative children can appear outside the bounding box of the parent shape. Filhos aninhados aparecem estritamente dentro dos limites do pai.Nested children appear strictly inside the bounds of the parent.

Para obter o conjunto superior de formas em um diagrama, use:To obtain the top set of shapes on a diagram, use:

Diagram.NestedChildShapes

As classes ancestrals de formas e conectores são:The ancestor classes of shapes and connectors are:

ModelElement

-- PresentationElement

-- ShapeElement

----- NodeShape

------- Diagram

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

----- LinkShape

------- BinaryLinkShape

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

Propriedades de formas e conectoresProperties of Shapes and Connectors

Na maioria dos casos, não é necessário fazer alterações explícitas nas formas.In most cases, it is not necessary to make explicit changes to shapes. Quando você alterou os elementos do modelo, as regras "corrigir" atualizam as formas e os conectores.When you have changed the model elements, the "fix up" rules update the shapes and connectors. Para obter mais informações, consulte respondendo e propagando alterações.For more information, see Responding to and Propagating Changes.

No entanto, é útil fazer algumas alterações explícitas em formas em propriedades que são independentes dos elementos do modelo.However, it is useful to make some explicit changes to shapes in properties that are independent of the model elements. Por exemplo, você pode alterar essas propriedades:For example, you could change these properties:

  • Size -determina a altura e a largura da forma.Size - determines the height and width of the shape.

  • Location -posição relativa à forma ou ao diagrama paiLocation - position relative to the parent shape or diagram

  • StyleSet -o conjunto de canetas e pincéis usado para desenhar a forma ou o conectorStyleSet - the set of pens and brushes used for drawing the shape or connector

  • Hide -torna a forma invisívelHide - makes the shape invisible

  • Show -torna a forma visível após um Hide()Show - makes the shape visible after a Hide()

Criando um elemento e sua formaCreating an Element and its Shape

Quando você cria um elemento e o vincula à árvore de relações de inserção, uma forma é automaticamente criada e associada a ela.When you create an element and link it into the tree of embedding relationships, a shape is automatically created and associated with it. Isso é feito pelas regras de "correção" que são executadas no final da transação.This is done by the "fixup" rules that execute at the end of the transaction. No entanto, a forma aparecerá em um local atribuído automaticamente e sua forma, cor e outros recursos terão valores padrão.However, the shape will appear in an automatically assigned location, and its shape, color and other features will have default values. Para controlar como a forma é criada, você pode usar a função Merge.To control how the shape is created, you can use the merge function. Você deve primeiro adicionar os elementos que deseja adicionar a um grupo de elementos e, em seguida, mesclá-los no diagrama.You must first add the elements you want to add into an ElementGroup, and then merge the group into the diagram.

Este método:This method:

  • Define o nome, se você tiver atribuído uma propriedade como o nome do elemento.Sets the name, if you have assigned a property as the element name.

  • Observa quaisquer diretivas de mesclagem de elementos que você especificou na definição de DSL.Observes any Element Merge Directives that you specified in the DSL Definition.

Este exemplo cria uma forma na posição do mouse quando o usuário clica duas vezes no diagrama.This example creates a shape at the mouse position, when the user double-clicks the diagram. Na definição de DSL deste exemplo, a FillColor propriedade de ExampleShape foi exposta.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();
    }
  }
}

Se você fornecer mais de uma forma, defina suas posições relativas usando o AbsoluteBounds .If you provide more than one shape, set their relative positions using the AbsoluteBounds.

Você também pode definir a cor e outras propriedades expostas de conectores usando esse método.You can also set the color and other exposed properties of connectors using this method.

Usar transaçõesUse Transactions

Formas, conectores e diagramas são subtipos de ModelElement e ao vivo na loja.Shapes, connectors and diagrams are subtypes of ModelElement and live in the Store. Portanto, você deve fazer alterações a eles somente dentro de uma transação.You must therefore make changes to them only inside a transaction. Para obter mais informações, consulte como: usar transações para atualizar o modelo.For more information, see How to: Use Transactions to Update the Model.

Exibição de documentos e dados de documentosDocument View and Document Data

Diagrama de classe de tipos de diagrama padrão

Armazenar partiçõesStore Partitions

Quando um modelo é carregado, o diagrama que o acompanha é carregado ao mesmo tempo.When a model is loaded, the accompanying diagram is loaded at the same time. Normalmente, o modelo é carregado em Store. DefaultPartition e o conteúdo do diagrama é carregado em outra partição.Typically, the model is loaded into Store.DefaultPartition, and the diagram content is loaded into another Partition. Normalmente, o conteúdo de cada partição é carregado e salvo em um arquivo separado.Usually, the content of each partition is loaded and saved to a separate file.

Confira tambémSee also