Personalizar e estender uma linguagem específica de domínio

O VMSDK (SDK de Modelagem e Visualização) do Visual Studio fornece vários níveis nos quais você pode definir ferramentas de modelagem:

  1. Defina uma DSL (linguagem específica de domínio) usando o diagrama Definição de DSL. É possível criar com rapidez uma DSL com uma notação diagramática, uma forma XML legível e as ferramentas básicas necessárias para gerar código e outros artefatos. Para obter mais informações, confira Como definir uma Linguagem Específica de Domínio.

  2. Ajuste a DSL usando mais recursos avançados da Definição de DSL. Por exemplo, você pode fazer links adicionais aparecerem quando o usuário cria um elemento. Essas técnicas são obtidas, em sua maioria, na Definição de DSL, e alguns deles necessitam de algumas linhas do código do programa.

  3. Estenda suas ferramentas de modelagem usando o código do programa. O VMSDK foi projetado especificamente para facilitar a integração de suas extensões com o código gerado a partir da Definição de DSL. Para obter mais informações, confira Escrever código para personalizar uma linguagem específica de domínio.

Observação

Quando você tiver atualizado o arquivo de Definições de DSL, não se esqueça de clicar em Transformar Todos os Modelos na barra de ferramentas do Gerenciador de Soluções antes de recompilar sua solução.

Referência de artigo

Para obter esse efeito Confira este tópico
Permitir que o usuário defina as propriedades de cor e estilo de uma forma. Clique com o botão direito do mouse na forma ou na classe do conector, aponte para Adicionar Exposto e clique em um item.
Diferentes classes de elemento de modelo são semelhantes no diagrama, compartilhando propriedades como altura e largura iniciais, cor, dicas de ferramenta. Use a herança entre formas ou classes de conector. Mapeamentos entre formas derivadas e classes de domínio derivadas herdam os detalhes de mapeamento dos pais.

Ou mapeie classes de domínio diferentes para a mesma classe de forma.
Uma classe de elemento de modelo é exibida por diferentes contextos de formas. Mapeie mais de uma classe de forma para a mesma classe de domínio. Ao criar a solução, siga o relatório de erro e forneça o código solicitado para decidir qual forma usar.
A cor da forma ou outras características, como fonte, indicam o estado atual. Confira Atualizar formas e conectores para refletir o modelo.

Crie uma regra que atualize as propriedades expostas. Confira Regras propagam alterações dentro do modelo.

Ou use OnAssociatedPropertyChanged() para atualizar recursos não expostos, como setas de link ou fonte.
O ícone na forma se altera para indicar o estado. Defina a visibilidade do mapeamento do decorador na janela Detalhes do DSL. Localize vários decoradores de imagem na mesma posição. Confira Atualizar formas e conectores para refletir o modelo.

Ou substitua ImageField.GetDisplayImage(). Veja o exemplo em ImageField.
Definir uma imagem de plano de fundo em qualquer forma Substitua InitializeInstanceResources() para adicionar um ImageField ancorado.
Aninhar formas a qualquer profundidade Configure uma árvore de inserção recursiva. Defina BoundsRules para conter as formas.
Anexar conectores em pontos fixos no limite de um elemento. Defina elementos de terminal inseridos, representados por portas pequenas no diagrama. Use BoundsRules para corrigir as portas em vigor. Confira o exemplo de Diagrama de Circuito no SDK de Visualização e Modelagem.
O campo de texto exibe um valor derivado de outros valores. Mapeie o decorador de texto para uma propriedade de domínio de Armazenamento Calculado ou Personalizado. Para obter mais informações, confira Propriedades de armazenamento calculado e personalizado.
Propagar alterações entre elementos de modelo ou entre formas Confira Validação em uma linguagem específica de domínio.
Propagar alterações em recursos como outras extensões do Visual Studio fora do repositório. Confira Manipuladores de eventos propagam alterações fora do modelo.
A janela Propriedades exibe propriedades de um elemento relacionado. Configure o Encaminhamento de Propriedades. Confira Personalizar a janela Propriedades.
Categorias de propriedade A janela de propriedades é dividida em seções chamadas categorias. Defina a Categoria de suas propriedades de domínio. As propriedades com o mesmo nome de categoria serão exibidas na mesma seção. Você também pode definir a Categoria de uma função de relação.
Controlar o acesso do usuário às propriedades do domínio Defina Is Browsable como false para impedir que uma propriedade de domínio apareça no janela Propriedades em tempo de execução. Você ainda pode mapeá-la para decoradores de texto.

A interface do usuário é somente leitura impede que os usuários alterem uma propriedade de domínio.

O acesso do programa à propriedade de domínio não é afetado.
Alterar o nome, o ícone e a visibilidade dos nós no gerenciador de modelos da DSL. Confira Personalizar o Gerenciador de Modelos.
Habilitar copiar, recortar e colar No Gerenciador de DSL, defina a propriedade Habilitar Copiar e Colar do nó Editor.
Copiar links de referência e os respectivos destinos sempre que um elemento for copiado. Por exemplo, copiar Comentários anexados a um item. Defina a propriedade Propagates Copy da função de origem (representada pela linha em um lado da relação de domínio no diagrama da Definição de DSL).

Escreva código para substituir ProcessOnCopy a fim de obter efeitos mais complexos.

Confira Personalizar o comportamento de cópia.
Excluir, redefinir o pai ou revincular elementos relacionados quando um elemento é excluído. Defina o valor de Propagates Delete de uma função de relação. Para efeitos mais complexos, substitua os métodos ShouldVisitRelationship e ShouldVisitRolePlayer na classe MyDslDeleteClosure, definidos em DomainModel.cs.
Preservar o layout e a aparência da forma na cópia e ao arrastar-soltar. Adicione as formas e os conectores ao ElementGroupPrototype copiado. O método mais conveniente para substituir é ElementOperations.CreateElementGroupPrototype()

Confira Personalizar o comportamento de cópia.
Cole formas em um local escolhido, como a posição atual do cursor. Substitua ClipboardCommandSet.ProcessOnCopy() para usar a versão específica do local de ElementOperations.Merge(). e confira Personalizar o comportamento de cópia.
Criar links adicionais ao colar Substitua ClipboardCommandSet.ProcessOnPasteCommand()
Habilitar arrastar e soltar deste diagrama, outros DSLs e elementos do Windows Confira Como adicionar um manipulador de evento de arrastar e soltar
Permitir que uma forma ou ferramenta seja arrastada para uma forma filho, como uma porta, como se tivesse sido arrastada para o pai. Defina uma diretiva de mesclagem de elementos na classe de objeto de destino para encaminhar o objeto removido para o pai. Confira Personalizar a criação e a movimentação do elemento.
Permitir que uma forma ou ferramenta seja arrastada para uma forma e tenha links ou objetos adicionais criados. Por exemplo, para permitir que um comentário seja solto em um item ao qual ele deva ser vinculado. Defina uma diretiva de mesclagem de elementos na classe de domínio de destino e defina os links a serem gerados. Em casos complexos, você pode adicionar código personalizado. Confira Personalizar a criação e a movimentação do elemento.
Criar um grupo de elementos com uma ferramenta. Por exemplo, um componente com um conjunto fixo de portas. Substitua o método de inicialização da caixa de ferramentas em ToolboxHelper.cs. Crie um Protótipo de Grupo de Elementos (EGP) que contenha os elementos e respectivos links de relação. Confira Personalizar as ferramentas e a caixa de ferramentas.

Inclua as formas de entidade de segurança e de porta no EGP ou defina BoundsRules para posicionar as formas da porta quando o EGP for instanciado.
Usar uma ferramenta de conexão para instanciar vários tipos de relação. Adicione LCDs (diretivas de conexão de link) ao construtor de conexões invocado pela ferramenta. As LCDs determinam o tipo da relação dos tipos dos dois elementos. Para fazer isso depender dos estados dos elementos, você pode adicionar código personalizado. Confira Personalizar as ferramentas e a caixa de ferramentas.
Ferramentas autoadesivas – o usuário pode clicar duas vezes em qualquer ferramenta para criar muitas formas ou conectores sucessivamente. No Gerenciador de DSL, selecione o nó Editor. No janela Propriedades, defina Usa itens autoadesivos da caixa de ferramentas.
Definir os comandos do menu Confira Como modificar um comando de menu padrão
Restringir o modelo com regras de validação Confira Validação em uma linguagem específica de domínio
Gerar código, arquivos de configuração ou documentos a partir de uma DSL. Gerando código a partir de uma linguagem específica do domínio
Personalizar como os modelos são salvos no arquivo. Confira Personalizar o armazenamento de arquivos e a serialização XML
Salvar modelos em bancos de dados ou em outras mídias. Substitua YourLanguageDocData

Confira Personalizar o armazenamento de arquivos e a serialização XML
Integre várias DSLs para que elas funcionem como parte de um aplicativo. Confira Integrar modelos usando o Visual Studio Modelbus.
Permitir que a DSL seja estendida por terceiros e controle a extensão. Estender a DSL usando MEF

Compartilhando classes entre DSLs por meio de uma biblioteca de DSLs

Definindo uma política de bloqueio para criar segmentos somente leitura

Observação

O componente Transformação de Modelo de Texto é instalado automaticamente como parte da carga de trabalho de Desenvolvimento de extensões do Visual Studio. Você também pode instalá-lo na guia Componentes individuais do Instalador do Visual Studio, na categoria SDKs, bibliotecas e estruturas. Instale o componente SDK de Modelagem na guia Componentes individuais.