Frage

OK, so haben sich die Dinge deutlich mit meinem DSL fortgeschritten, da ich diese Frage vor ein paar Tagen.

Sobald ich meinen Code Refactoring habe, werde ich meine eigene Antwort darauf veröffentlichen, aber für jetzt, ich habe ein anderes Problem.

Ich bin Erzeugung dynamisch Teildiagramme von einem DSL-Modell erstellt, diese Diagramme als Bilder speichern und dann ein Word-Dokument mit diesen Bildern eingebettet zu erzeugen. So weit, so gut.

Aber wo meine Formen Fächer haben (Beispiele Operationen auf einem Service-Vertrag - kann man erraten, was es ist, noch) nicht. Wird das Fach Header angezeigt, aber keines der Elemente

Wenn ich meine Form Objekt untersuche, hat es ein einziges geschachtelte Kind - eine ElementListCompartment die wiederum eine Reihe von Punkten hat, die ich erwarte angezeigt werden. Die ElementListCompartment.IsExpanded Eigenschaft auf true gesetzt ist (und die Fach-Header haben ein wenig ‚Zusammenbruch‘ Symbol), aber wo, oh wo sind meine Artikel?

Die Form wurde dem Diagramm hinzugefügt mit

parentShape.FixupChildShapes(modelElement);

So kann jeder leite mich auf meine fröhliche Art und Weise?

War es hilfreich?

Lösung

Ich habe ein ähnliches Problem vor kurzem konfrontiert, und schaffte es, damit es funktioniert, also hier ist die Geschichte.

Die Aufgabe war, ich war die Umsetzung von ActiveWriter DSL-Paket erzeugte ein Domain-Modell zu laden und anzuzeigen, und ein zugehöriges Diagramm.

Hier ist, wie ich die erforderliche Funktionalität implementiert haben (alle Methoden gehören unter zu der Klasse Form1 die ich angelegt habe zu spielen, um):

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);
}

Dieses Zeug arbeitet meist fein: es korrekt geladen das Diagramm von Dateien mit Visual Studio erstellt, zog das Diagramm in meiner benutzerdefinierten Fenstern Form, unterstützte die Leinwand Scrollen und auch mir erlaubt, Formen, hier zu ziehen. eine Sache, mir wurde jedoch nervt - die Abteile waren leer und hatte Standardnamen, das heißt „Compartment“

.

Google hat nicht helfen, also musste ich von mir selbst graben. Es war nicht ganz einfach, aber mit Hilfe von Reflektor und nach ein paar Stunden zu verbringen Ich habe es geschafft, dieses Szenario Arbeit zu machen, wie erwartet!

Das Problem war, wie folgt. Zu meiner Überraschung DSL-Bibliotheken zeichnen nicht richtig bestimmte Diagrammelemente unmittelbar, nachdem sie in das Diagramm hinzugefügt werden. Manchmal nur Stubs bestimmter Formen gezeichnet werden (wie es in dem ersten Bild angezeigt wird). So manchmal müssen wir die Bibliothek manuell bitten Diagramm Formen neu zu zeichnen.

Diese Funktionalität kann mit so genannten „Regeln“ umgesetzt wird, dass in der Tat sind Event-Handler, die von bestimmten Diagramm Ereignissen ausgelöst werden. Im Grunde, was wir tun müssen, ist sicher Handler auf ein Element schöpf Ereignis des Diagramms befestigen und Form Initialisierung gewährleisten.

Zum Glück haben wir nicht einmal einen Code, da DSL-Designer generiert automatisch schreiben müssen beide Fixup Regeln und eine Hilfsmethode, die diese Vorschriften auf das Diagramm (siehe EnableDiagramRules unten) misst. Alles, was wir tun müssen, ist diese Methode aufrufen, direkt nach dem Laden (vor dem Laden Modell und Diagramm) erstellt wurde.

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));
}

Der obige Code funktioniert wie folgt:

  1. Bei neuem Elemente in das Diagramm (zum Beispiel während der Deserialisierung des Diagramms) hinzugefügt wird die Regel "FixUpDiagram" ausgelöst wird.

  2. Die Regel ruft dann Diagram.FixUpDiagram(parentElement, childElement), wo childElement für ein Element steht hinzugefügt wird und parentElement steht für seine logisch Eltern (mit tricky bedingter Logik bestimmt, so versuchte ich es nicht selbst zu reproduzieren).

  3. Down the Stack-Trace FixUpDiagram Methode EnsureCompartments Methoden aller Klassen Formen im Diagramm nennt.

  4. Die EnsureCompartments Methode zeichnet Klasse Abteile Drehen den Stub ‚[-] Fach‘. Grafik in ausgewachsene ‚Eigenschaften‘ Form, wie oben im Bild angezeigt wird verknüpft

P. S. Steve, ich habe bemerkt, dass Sie die Fixup tat nennen, aber es immer noch nicht funktioniert. Nun, ich bin kein Profi in DSL-SDK (gerade angefangen es ein paar Tage mit vor), so kann es nicht erklären, warum Sie Probleme haben könnten.

Vielleicht haben Sie die Korrektur mit falschen Argumenten aufgerufen. Oder vielleicht Diagram.FixupDiagram (Eltern, newChild) tut etwas anders aus, was parent.FixupChildShapes (newChild) der Fall ist. Aber hier ist meine Variante, die einfach funktioniert. Hoffe, das hilft auch.

Andere Tipps

Vielleicht ist meine Antwort ein wenig zu spät, aber er bestätigen Sie DSL Explorer verwenden, die Ihre Fächer Elemente haben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top