Pergunta

OK, então as coisas têm progredido significativamente com o meu DSL desde que eu pedi esta questão há poucos dias.

Assim que eu reformulado meu código, eu vou postar minha própria resposta para essa pergunta, mas por agora, estou tendo um outro problema.

Eu estou gerando dinamicamente sub-diagramas a partir de um modelo criado-DSL, salvando aqueles diagramas como imagens e, em seguida, gerar um documento do Word com as imagens incorporadas. Tão longe, tão bom.

Mas onde minhas formas têm compartimentos (para exemplos, Operações em um contrato de serviço? - você pode adivinhar o que é, até o momento), o cabeçalho do compartimento é exibido, mas nenhum dos itens

Se eu analisar a minha forma do objeto, ele tem uma única criança aninhada - uma ElementListCompartment que por sua vez, tem uma série de itens que eu estou esperando para ser exibido. A propriedade ElementListCompartment.IsExpanded é definido como verdadeiro (e o cabeçalho do compartimento tem um pequeno ícone 'colapso' nele), mas onde, oh onde, seja meus itens?

A forma foi adicionado ao diagrama usando

parentShape.FixupChildShapes(modelElement);

Então, alguém pode me orientar sobre a minha maneira alegre?

Foi útil?

Solução

Eu enfrentei recentemente um problema relacionado, e conseguiu fazê-lo funcionar, então aqui está a história.

A tarefa que eu estava implementando era para carregar e exibir um modelo de domínio e um diagrama associado gerado pelo pacote de DSL de ActiveWriter.

Aqui está como eu tenho implementado a funcionalidade necessária (todos os métodos abaixo pertencem à classe Form1 eu criei para brincar):

private Store LoadStore()
{
    var store = new Store();
    store.LoadDomainModels(typeof(CoreDesignSurfaceDomainModel), typeof(ActiveWriterDomainModel));
    return store;
}

private void LoadDiagram(Store store)
{
    using (var tx = store.TransactionManager.BeginTransaction("tx", true))
    {
        var validator = new ValidationController();
        var deserializer = ActiveWriterSerializationHelper.Instance;
        deserializer.LoadModelAndDiagram(store,
            @"..\..\ActiveWriter1.actiw", @"..\..\ActiveWriter1.actiw.diagram", null, validator);
        tx.Commit();
    }
}

private DiagramView CreateDiagramView()
{
    var store = LoadStore();
    LoadDiagram(store);

    using (var tx = store.TransactionManager.BeginTransaction("tx2", true))
    {
        var dir = store.DefaultPartition.ElementDirectory;
        var diag = dir.FindElements<ActiveRecordMapping>().SingleOrDefault();
        var view = new DiagramView(){Diagram = diag};
        diag.Associate(view);
        tx.Commit();

        view.Dock = DockStyle.Fill;
        return view;
    }
}

protected override void OnLoad(EventArgs e)
{
    var view = CreateDiagramView();
    this.Controls.Add(view);
}

Este material trabalhou principalmente finamente: é carregado corretamente o diagrama de arquivos criados com o Visual Studio, desenhou o diagrama dentro das minhas janelas personalizadas formar, com o apoio de rolagem da tela e até mesmo me permitido formas arrastar aqui. No entanto, uma coisa que estava me incomodando -. Os compartimentos estavam vazios e tinha nome padrão, ou seja, "Compartimento"

O Google não ajudou em tudo, então eu tive que escavar sozinho. Não foi muito fácil, mas com a ajuda de refletor e depois de passar um par de horas que eu consegui fazer este trabalho cenário como esperado!

O problema foi como segue. Para minhas bibliotecas DSL surpresa não chamar corretamente certos elementos do diagrama imediatamente após serem adicionados ao diagrama. Às vezes, apenas topos de certas formas são desenhados (como é mostrado na primeira foto). Assim, às vezes precisamos de pedir manualmente a biblioteca para redesenhar formas de diagrama.

Esta funcionalidade pode ser implementada com os chamados "regras" que na verdade são manipuladores de eventos que são desencadeados por determinados eventos diagrama. Basicamente o que temos a fazer é anexar certas manipulador para um evento-elemento adicionado do diagrama e garantir a forma inicialização.

Felizmente nós nem sequer tem que escrever qualquer código desde designer de DSL autogenerates ambas as regras de correcção e um método utilitário que atribui essas regras com o diagrama (ver EnableDiagramRules abaixo). Tudo o que temos a fazer é chamar esse método logo após a loja foi criado (antes do modelo de carga e diagrama).

private Store LoadStore()
{
    var store = new Store();
    store.LoadDomainModels(typeof(CoreDesignSurfaceDomainModel), typeof(ActiveWriterDomainModel));
    ActiveWriterDomainModel.EnableDiagramRules(store);
    return store;
}

/// <summary>
/// Enables rules in this domain model related to diagram fixup for the given store.
/// If diagram data will be loaded into the store, this method should be called first to ensure
/// that the diagram behaves properly.
/// </summary>
public static void EnableDiagramRules(DslModeling::Store store)
{
    if(store == null) throw new global::System.ArgumentNullException("store");

    DslModeling::RuleManager ruleManager = store.RuleManager;
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.FixUpDiagram));
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.ConnectorRolePlayerChanged));
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.CompartmentItemAddRule));
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.CompartmentItemDeleteRule));
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.CompartmentItemRolePlayerChangeRule));
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.CompartmentItemRolePlayerPositionChangeRule));
    ruleManager.EnableRule(typeof(global::Altinoren.ActiveWriter.CompartmentItemChangeRule));
}

O código acima funciona da seguinte forma:

  1. Após novo elemento a ser adicionado ao diagrama (por exemplo, durante deserialização do diagrama) a regra "FixUpDiagram" for disparada.

  2. A regra seguida, chama Diagram.FixUpDiagram(parentElement, childElement), onde childElement representa um elemento que está sendo adicionado e parentElement destaca por seu pai lógico (determinado usando a lógica condicional complicado, então eu não tentar reproduzi-lo por mim mesmo).

  3. Para baixo o rastreamento de pilha método FixUpDiagram chamadas EnsureCompartments métodos de todas as formas de classes no diagrama.

  4. Os compartimentos redraws método EnsureCompartments classe transformando o toco "[-] Compartimento". Gráfico em forma full-blown "Propriedades", como mostrado na imagem ligada acima

P.S. Steve, eu tenho notado que você fez chamar a correção, mas ainda não funcionou. Bem, eu não sou um profissional em DSL SDK (só comecei a usar um par de dias atrás), por isso não pode explicar por que você pode ter problemas.

Talvez, você chamou a correção com argumentos errados. Ou talvez Diagram.FixupDiagram (pai, newChild) faz algo diferente do que parent.FixupChildShapes (newChild) faz. No entanto, aqui é minha variante que simplesmente funciona. Espero que isso também ajuda.

Outras dicas

Talvez minha resposta é um pouco tarde demais, mas você confirmar usando DSL Explorer que seus compartimentos têm itens?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top