도구 및 도구 상자 사용자 지정
사용자가 모델에 추가할 수 있는 요소에 대 한 도구 상자 항목을 정의 해야 합니다.두 가지 종류의 도구: 요소 및 도구가 연결 합니다.디자이너에서 생성 된 사용자가 셰이프를 다이어그램으로 끌어 하는 요소의 도구 선택 하 고 셰이프 사이의 링크를 그릴 수 있는 연결 도구를 선택할 수 있습니다.일반적으로 요소 도구 사용자 도메인 클래스의 인스턴스는 모델에 추가할 수 있습니다 및 연결 도구 도메인 관계의 인스턴스를 추가 하 여 수 있습니다.
항목 내용
도구 상자 탭을 수정합니다.
요소의 도구
도구에서 요소 그룹 만들기
연결 도구
도구 상자 항목의 순서를 변경합니다.
도구 상자가 정의 된 방법
DSL 탐색기에서 편집기 노드 및 그 아래에 있는 노드를 확장 합니다.일반적으로이 같은 계층 구조를 볼 수 있습니다.
Editor
Toobox Tabs
MyDsl //a tab
Tools
ExampleElement // an element tool
ExampleRelationship // a connection tool
DSL 탐색기의이 부분에서 수행할 수 있습니다.
새 탭을 만들.탭 섹션 제목에서 도구 상자를 정의합니다.
새로운 도구를 만듭니다.
복사 및 붙여넣기 도구입니다.
위쪽 또는 아래쪽 도구 목록에서 이동 합니다.
탭 및 도구를 삭제 합니다.
중요 |
---|
추가 또는 DSL 탐색기에서 항목을 붙여, 그 새 노드를 마우스 오른쪽 단추로 클릭.예를 들어, 도구를 추가 하려면 해당 탭을 마우스 오른쪽 및 않는 있는 도구 노드.탭을 추가 하려면 마우스 오른쪽 단추로 해당 편집기 노드. |
해당 도구 상자 아이콘 속성 마다 도구를 16 x 16 비트맵 파일을 참조 하십시오.이러한 파일은 일반적으로 보관 되는 Dsl\Resources 폴더입니다.
해당 클래스 속성 요소의 도구를 구체적인 도메인 클래스를 참조 합니다.기본적으로 도구는이 클래스의 인스턴스를 만듭니다.그러나 그룹 요소, 또는 다른 종류의 요소를 생성 하도록 도구를 설정 하는 코드를 작성할 수 있습니다.
해당 연결 작성기 속성은 연결 도구 도구 어떤 종류의 요소에 연결할 수 있고 어떤 관계 생성 간에 정의 하는 연결 작성기를 말합니다.연결 작성기 DSL 탐색기에서 노드 정의 됩니다.연결 작성기 사용자 지정 하는 코드를 작성할 수 있습니다 도메인 관계를 정의할 때 자동으로 만들어집니다.
도구 도구 상자에 추가 하려면
Shape 클래스를 만들고 도메인 클래스에 매핑한 후 일반적으로 요소의 도구를 만듭니다.
일반적으로 커넥터 클래스를 만들고 참조 관계를 매핑한 후에 연결선 도구를 만듭니다.
DSL 탐색기 확장은 편집기 노드 및 해당 도구 상자 탭 노드.
도구 상자 탭 노드를 마우스 오른쪽 단추로 클릭 하 고 다음을 클릭 요소 추가 도구 또는 추가 새 연결 도구.
설정에서 도구 상자 아이콘 16 x 16 비트맵을 참조 하는 속성입니다.
새 아이콘을 정의 하려면 솔루션 탐색기에서 비트맵 파일을 만듭니다의 Dsl\Resources 폴더입니다.파일은 다음과 같은 속성 값을 가집니다: 빌드 작업 = 콘텐츠. 출력 디렉터리로 복사로 = 복사 안 함.
요소의 도구에 대 한: 설정의 클래스 속성은 도구를 도형에 연결 되어 있는 구체적인 도메인 클래스를 참조 하십시오.
연결선 도구를: 설정에서 연결 작성기 속성의 드롭다운 목록에 제공 되는 항목 중 하나를 도구.연결 작성기 커넥터는 도메인 관계를 매핑하는 경우 자동으로 만들어집니다.커넥터가 최근에 만든 경우 정상적으로 연결 된 연결 작성기를 선택 합니다.
DSL을 테스트 하려면 f5 키 또는 CTRL + f 5를 키를 눌러 및 실험 인스턴스에서 Visual Studio, 샘플 모델 파일을 엽니다.새로운 도구는 도구 상자에 표시 되어야 합니다.이 새 요소를 생성 하는지 다이어그램으로 끌어다 놓습니다.
도구가 되지 않을 경우는 실험을 중지 Visual Studio.Windows에서 시작 실행 메뉴에서 Microsoft Visual Studio 2010 실험 인스턴스 다시.에 있는 Visual Studio빌드 메뉴를 클릭 솔루션 다시 빌드.DSL를 다시 테스트 합니다.
요소의 도구 사용자 지정
기본적으로 도구는 지정 된 클래스의 인스턴스가 만들어집니다 하지만 두 가지 방법으로 변경할 수 있습니다.
요소 병합 지시문이이 클래스의 새 인스턴스를 받아들일 수 있게 하 고 새 요소를 만들 때 추가 링크를 작성 하 여 다른 클래스에 정의 합니다.예를 들어, 사용자가 주석을 다른 요소를 끌어 놓을 수 하 고, 여 사이의 참조 링크를 만듭니다.
또한 이러한 사용자 지정 사용자 붙여 놓도록 및 요소를 삭제 하면 어떻게 됩니까 영향을 줍니다.
자세한 내용은 요소 만들기 및 이동 사용자 지정를 참조하십시오.
그룹의 요소를 만들 수 있는 도구를 사용자 지정 하는 코드를 작성 합니다.공구 메서드를 재정의 하 여 Toolboxhelper.cs에 의해 초기화 됩니다.자세한 내용은 요소를 만드는 그룹 도구에서.
도구에서 요소 그룹 만들기
각 요소의 도구 프로토타입을 만들어야 합니다 요소가 들어 있습니다.기본적으로 각 요소의 도구 단일 요소를 만들 수 있지만 하나의 도구에 관련 된 개체 그룹을 만들 수 있습니다.이 작업을 수행 하려면 사용 하는 도구를 초기화는 ElementGroupPrototype 는 관련 된 항목을 포함 합니다.
다음 예제는 형식 트랜지스터 DSL에서 가져온 것입니다.각 트랜지스터는 세 개의 명명 된 터미널입니다.요소의 도구 트랜지스터를 네 모델 요소에 대 한 세 가지 관계 링크를 포함 하는 프로토타입을 저장 합니다.사용자 도구를 다이어그램으로 끌면 프로토타입은 인스턴스화할 이며 모델 루트에 연결 됩니다.
이 코드에 정의 된 메서드 재정의 Dsl\GeneratedCode\ToolboxHelper.cs.
프로그램 코드를 사용 하 여 모델을 사용자 지정 하는 방법에 대 한 자세한 내용은 참조 하십시오. 프로그램 코드에서 모델 탐색 및 업데이트.
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
public partial class CircuitsToolboxHelper
{
/// <summary>
/// Toolbox initialization, called for each element tool on the toolbox.
/// This version deals with each Component subtype separately.
/// </summary>
/// <param name="store"></param>
/// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
/// <returns>prototype of the object or group of objects to be created by tool</returns>
protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
{
if (domainClassId == Transistor.DomainClassId)
{
Transistor transistor = new Transistor(store);
transistor.Base = new ComponentTerminal(store);
transistor.Collector = new ComponentTerminal(store);
transistor.Emitter = new ComponentTerminal(store);
transistor.Base.Name = "base";
transistor.Collector.Name = "collector";
transistor.Emitter.Name = "emitter";
// Create an ElementGroup for the Toolbox.
ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
elementGroup.AddGraph(transistor, true);
// AddGraph includes the embedded parts
return elementGroup.CreatePrototype();
}
else
{
return base.CreateElementToolPrototype(store, domainClassId);
} } }
연결 도구를 사용자 지정합니다.
일반적으로 새 커넥터 클래스를 만들 때 요소 도구를 만듭니다.또한 관계의 종류를 결정 하는 두 끝 유형을 허용 하 여 하나의 도구 오버 로드할 수 있습니다.예를 들어, 사람이 사람의 관계와 마을 사람 관계를 만들 수 있습니다 하나의 연결 도구를 정의할 수 있습니다.
연결 작성기 연결 도구를 호출합니다.연결 작성기 어떻게 사용자 요소 생성 된 디자이너에 연결할 수 있습니다 지정할 수 있습니다.연결 작성기 연결 될 수 있는 요소와 간에 만들어진 연결의 종류를 지정 합니다.
연결 작성기 참조 도메인 클래스 간의 관계를 만들 때 자동으로 만들어집니다.연결 도구를 매핑할 때이 연결 작성기를 사용할 수 있습니다.연결 도구를 만드는 방법에 대 한 자세한 내용은 참조 하십시오. 도구 및 도구 상자 사용자 지정.
다른 범위를 소스와 대상 형식으로 처리 하 고 서로 관계를 만들 수 있도록 기본 연결 작성기를 수정할 수 있습니다.
연결 작성기 연결에 대해 원본 및 대상 클래스를 지정 하 고, 수 있게 하려면 연결 유형을 정의 하 고 연결 만들기와 관련 된 다른 작업을 수행 하는 사용자 지정 코드를 작성할 수도 있습니다.
연결 작성기의 구조
연결 작성기 포함 또는 더 많은 링크가 연결 도메인 관계 및 원본 및 대상 요소를 지정할 지시문을.예를 들어, 작업 흐름 솔루션 템플릿을 Commentreferencessubjectsbuilder에서 볼 수 있는 DSL 탐색기.이 연결 작성기 하나의 링크를 포함 지시문에 연결 CommentReferencesSubjects, CommentReferencesSubjects 도메인 관계에 매핑됩니다.이 링크가 연결 지시문이 가리키는 원본 역할 지시문이 포함는 Comment 도메인 클래스와를 가리키는 대상 역할 지시문의 FlowElement 도메인 클래스입니다.
연결 작성기를 사용 하 여 소스 및 대상 역할을 제한 하
일치 하는 소스 역할 또는 특정된 도메인 관계의 대상 역할에 특정 클래스를 제한 하려면 연결 작성기를 사용 합니다.예를 들어, 다른 도메인 클래스, 도메인 관계 된 기본 도메인 클래스에 있을 수 있습니다 있지만 관계에서 동일한 역할을 가질 수 있도록 기본 클래스의 모든 파생된 클래스를 사용할 수 있습니다.작업 흐름 솔루션에는 추상 도메인 클래스에서 직접 FlowElement, 상속 된 4 개의 구체적인 도메인 클래스 (시작 점, 끝점, MergeBranch, 및 동기화) 직접 상속 하지는 두 가지 구체적인 도메인 클래스 (작업 및 ObjectInState).또한 해당 소스 역할 및 대상 역할에서 FlowElement 도메인 클래스를 사용 하는 흐름 참조 관계가입니다.그러나 끝점 도메인 클래스의 인스턴스는 원본을 흐름 관계의 인스턴스 수 없습니다 없으며 StartPoint 클래스의 인스턴스에 인스턴스 흐름 관계의 대상 이어야 합니다.FlowBuilder 연결 작성기 지시문 클래스를 재생할 수 있습니다 어떤 도메인 (작업, MergeBranch, 시작 점을, 및 동기화) 원본 역할 및 대상 역할 (MergeBranch, 끝점 및 동기화) 재생할 수를 지정 하는 흐름에 연결 하는 링크를 했습니다.
연결 작성기 여러 개의 링크가 포함 지시문에 연결
두 개 이상의 링크를 추가할 수 있습니다 지시문에 연결 작성기를 연결 합니다.일부 복잡 한 도메인 모델에서 사용자 숨기기 및 유지 수 있습니다 해당 도구 상자 에서 너무 복잡해.링크를 추가할 수 있습니다 몇 가지 다른 도메인 관계에 대 한 지시문을 단일 연결 작성기를 연결 합니다.그러나, 이들은 대략 동일한 기능을 수행 하는 경우 도메인 관계를 결합 해야 합니다.
작업 흐름 솔루션의 흐름 연결 도구 흐름과 전환과 도메인 관계의 인스턴스를 그리는 데 사용 됩니다.두 개의 링크가 연결 작성기, 흐름 연결 뿐만 아니라 연결 지시문 앞에서 설명한 FlowBuilder, 전환과 라는 지시문에 연결 합니다.ObjectInState 도메인 클래스 또는 인스턴스 작업을 있지만 않는 작업의 두 인스턴스 간에 Objectinstate의 인스턴스 또는 인스턴스 작업에는 Objectinstate의 인스턴스를 인스턴스 간의 전환과 관계의 인스턴스로 그려질 수 있습니다 이러한 지시문을 지정 합니다.그러나 흐름 관계의 인스턴스를 작업의 두 인스턴스 간에 그려질 수 있습니다.컴파일 및 작업 흐름 솔루션을 실행 하는 경우 흐름은 Objectinstate의 인스턴스를 작업의 인스턴스를 드로잉에 전환과의 인스턴스를 만들고 있지만 작업의 두 인스턴스 간에 흐름을 그리기는 흐름의 인스턴스를 만들고 볼 수 있습니다.
연결 작성기에 대 한 사용자 지정 코드
서로 다른 사용자 지정 작성기 연결을 정의 하는 4 개의 확인란 사용자 인터페이스에서입니다.
사용자 지정 허용 에서 원본 또는 대상 역할 지시문
사용자 지정 연결 에서 원본 또는 대상 역할 지시문
해당 사용자 지정 연결을 사용 하 여 연결 지시문에서 확인란
사용자 정의 된 연결 작성기의 속성
이러한 사용자 지정을 수행 하는 프로그램 코드를 제공 해야 합니다.제공 해야 할 코드를 검색 하려면 이러한 상자 중 하나를 선택 모든 템플릿 변환을 클릭 한 다음 솔루션을 빌드하십시오.오류 보고서가 생성 됩니다.추가 해야 코드에 설명 주석을 볼 수 있는 오류 보고서를 두 번 클릭 합니다.
[!참고]
사용자 지정 코드를 추가 하려면 partial 클래스 정을 코드 파일에 별도 코드 파일에 있는 GeneratedCode 폴더에서 만듭니다.작업을 계속 유지 하 여 생성 된 코드 파일 편집 해서는 안됩니다.자세한 내용은 생성된 클래스 재정의 및 확장를 참조하십시오.
사용자 지정 연결 코드를 만드는 방법
지시문, 각 링크에 연결을 소스 역할 지시문 탭을 정의 형식 내용을 끌어 놓을 수 있습니다.마찬가지로 대상 역할 지시문 탭을 정의 합니다 어떤 형식 끌어 놓을 수 있습니다.각 형식에 대해 더욱 지시문에 (링크 연결)을 설정 하 여 연결을 허용 하도록 지정할 수 있습니다에서 사용자 지정 허용 플래그를 지정 하 고 다음 추가 코드를 제공 하.
연결이 설정 된 경우 사용자 지정할 수 있습니다.위치 드래그 하거나 특정 클래스에서 방금 경우 사용자 지정할 수 있습니다 같이 모든 경우에 하나의 링크 연결 제어 지시문, 또는 전체 FlowBuilder 연결 작성기.각이 옵션에 대 한 사용자 지정 플래그를 적절 한 수준에서 설정할 수 있습니다.모든 서식 파일을 변환 하 고 솔루션을 빌드할 때 오류 메시지가 생성 된 코드에 주석을에 나와 있습니다.이러한 주석을 제공 해야 식별 합니다.
구성 요소 다이어그램 예제에서 연결 작성기 연결 도메인 관계에 대 한 포트 간에 설정할 수 있는 연결을 제한 하려면 사용자 지정 됩니다.다음 그림과 에서만 연결을 만들 수 있으므로, OutPort 요소에 InPort 요소를 있지만 다른 내부 구성 요소 중첩 시킬 합니다.
중첩된 구성 요소에서 오는 Outport에 연결
따라서 연결 된 Outport에 중첩된 구성 요소에서을 가져올 수 있습니다 지정 할 수 있습니다.이러한 연결을 지정 하려면 설정 를 사용 하 여 사용자 지정 허용 에 InPort 형식으로 소스 역할 하는 OutPort 형식에서 역할을 대상으로는 DSL 정보 다음 그림에 나와 있는 것 처럼 창:
지시문 DSL 탐색기에 연결 하는 링크
지시문 DSL 세부 정보 창에 연결 하는 링크
그런 다음 ConnectionBuilder 클래스의에서 메서드를 제공 해야 합니다.
public partial class ConnectionBuilder
{
/// <summary>
/// OK if this component has children
/// </summary>
private static bool CanAcceptInPortAsSource(InPort candidate)
{
return candidate.Component.Children.Count > 0;
}
/// <summary>
/// Only if source is on parent of target.
/// </summary>
private static bool CanAcceptInPortAndInPortAsSourceAndTarget (InPort sourceInPort, InPort targetInPort)
{
return sourceInPort.Component == targetInPort.Component.Parent;
}
// And similar for OutPorts…
프로그램 코드를 사용 하 여 모델을 사용자 지정 하는 방법에 대 한 자세한 내용은 참조 하십시오. 프로그램 코드에서 모델 탐색 및 업데이트.
비슷한 코드, 예를 들어, 사용자가 부모-자식 연결으로 루프를 만들지 않도록 사용 하면 수 있습니다.사용자가 언제 든 지 내용을 위반할 수 없습니다 때문에 이러한 제한 '하드' 제약 조건으로 간주 됩니다.'부드러운' 유효성 검사를 저장할 수 없습니다. 잘못 된 구성을 작성 하 여 사용자가 일시적으로 무시할 수 있습니다 만들 수도 있습니다.
연결 작성기를 정의 하는 것이 좋습니다
개념적으로 관련 된 경우 다양 한 종류의 관계를 만드는 하나의 연결 작성기를 정의 해야 합니다.작업 흐름 샘플에서는 작업 및 작업 및 개체 사이의 흐름을 만들고 동일한 작성기를 사용 합니다.그러나 동일한 작성기를 사용 하 여 메모 및 작업 간의 관계를 만드는 데에 혼란 스 러 울 수 있습니다.
연결 작성기를 여러 종류의 관계를 정의 하는 경우 한 쌍의 원본 및 대상 개체에서 하나 이상의 형식 일치 시킬 수 없는 것을 확인 해야 합니다.그렇지 않으면 결과 예측할 수 없습니다.
사용자 지정 코드를 사용 하 여 '하드' 구속을 적용할 수 있지만 사용자가 일시적으로 잘못 된 연결을 만들 수 있는지 여부를 고려해 야 합니다.해야 할 경우 사용자가 변경 내용을 저장 하려고 때까지 연결 유효성을 검사 하지 않도록 제약 조건을 수정할 수 있습니다.