문제

그래,그래서 일하게 진행되었으로 내 DSL 이후 요청 이 질문 몇 일 전에.

로 나 refactor 내 코드,나는 나 자신 그 해답을 하나,하지만 지금,나는 또 다른 문제가 발생할 수 있습니다.

나 동적으로 생성하는 하위에서 다이어그램 DSL 만든 모델을 저장하는 그들이 다이어그램으로 이미지를 생성하는 단어와 문서는 그 이미지를 포함합니다.지금까지,그래서 좋은.

하지만 어디서 나의 모양이 구획(예를 들어,운영에서의 서비스 계약-추측할 수 있습니다 그것이 무엇인지,아직?), 구획 헤더가 표시되지만 없음의 항목.

는 경우를 점검하고 내 모양체,그것은 하나의 중첩-아이 ElementListCompartment 에 번호가 있는 항목의 예를 표시합니다.이 ElementListCompartment.IsExpanded 속성 true 로 설정한(그리고 실 헤더가 있는 작은'붕괴가'아이콘이 있는)하지만 어디에,오는 내 항목?

모양에 추가되었 다이어그램을 사용하여

parentShape.FixupChildShapes(modelElement);

그래서,사람에 가이드 제 메리 방법이 있을까?

도움이 되었습니까?

해결책

나는 최근에 직면했 관련 문제가 및 관리 작동하도록,그래서 여기에는 이야기입니다.

작업 했을 구현하였을 로드 및 디스플레 도메인 모델 및 관련된 다이어그램에 의해 생성된 ActiveWriter 의 DSL 패키지입니다.

여기에 내가 어떻게 구현에 필요한 기능을(모든 방법은 아래에 속하 Form1 클래스를 만들어 보았을 놀):

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

이건 대부분이 잘:그것이 제대로드는 다이어그램에서 만든 파일을 Visual Studio,그린이어그램에서 사용자 지정 windows 양식,지원되는 스크롤 캔버스도 수을 끌어 모니다 여기에.그러나,하나는 것은 나를 귀찮게-구획은 비어 있었다고 했다는 기본 이름,즉"실".

Google 도움이 되지 않았다,그래서 내가에서 발굴했습니다.지 않은 매우 간단하지만의 도움으로 반사체와 지출 후 몇 시간 동안 나는 이런 시나리오를 예상대로 작동하!

문제는 다음과 같습니다.놀랍게 DSL 라이브러리하지 않는 올바르게 그릴 다이어그램 특정 요소 후 즉시 추가되어 있습니다.때로는 만 명세서의 특정한 모양을 그리는(그것의 표시에 첫 번째 사진).따라서,때로는 우리가 필요한 수동으로 물어 라이브러리를 다시 그리도 모양입니다.

이 기능을 구현할 수 있습니다 그래서 소위"규칙"사실은 이벤트 처리기를 트리거되는 특정 다이어그램 이벤트입니다.기본적으로 무엇이 우리가 할 일은 붙이 특정 핸들러 요소-추가되는 이벤트의 다이어그램을 보장 형태 초기화.

다행히도 우리가 없어도 코드를 작성후 DSL 디자이너를 자동 생성하는 두 fixup 규칙 및 유틸리티는 방법에 붙이는 그 규칙 다이어그램(보 EnableDiagramRules 아래).우리가 할 일은 이 메소드를 호출한 후에 바 저장을 만들었습(이전에 선적 모델 및 다이어그램).

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

위의 코드는 다음과 같습니다.

  1. 에 따라 새로운 요소를 추가되는 다이어그램(예:중 직렬화의 다이어그램)규칙"FixUpDiagram"가 시작됩니다.

  2. 이 규칙은 다음 전화 Diagram.FixUpDiagram(parentElement, childElement), 디 childElement 스탠드를 추가되는 요소이고 parentElement 서위 논리적 부모(결정을 사용하여 까다로운 조건 논리,그래서 시도 하지 않았을 재현하여 자).

  3. 아래로 스택 추적 FixUpDiagram 메소드 호출 EnsureCompartments 방법의 모든 클래스에서 모양의 다이어그램입니다.

  4. 이 EnsureCompartments 방법이 다시 그리기를 클래스의 구획을 돌 stub"[-]실은"그래픽으로 본격적인"속성"모양이 그림에 표시되는 링크된다.

P.S.스티브,나는 당신을 호출 수정을 하지만 그것은 여전히 작동하지 않았다.만,나는 프로 DSL SDK(만 사용하기 시작한 그것의 몇 일 전),수 없다 그래서 그 이유를 설명할 수 있습니다.

어쩌면 당신은 라는 수정은 잘못된 인수입니다.또 어쩌면 다이어그램입니다.FixupDiagram(부모,newChild)가에서 다르게 무엇이 부모입니다.FixupChildShapes(newChild)는 않습니다.그러나 여기 나의 변형이 있습니다.희망이 도움이 됩니다.

다른 팁

어쩌면 내 대답은 좀 너무 늦었어,하지만 당신은 확인을 사용하여 DSL 는 탐색기의 구획이 있는가?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top