요소 만들기 및 이동 사용자 지정
요소를 다른 끌어다 붙여 또는 도구 상자에서 끌어 올 수 또는 이동 작업을 할 수 있습니다.사용자가 지정 하는 관계를 사용 하 여 이동된 대상 요소에 연결 된 요소를 가질 수 있습니다.
모델 요소입니다 때 요소 병합 지시어 (EMD) 지정 병합 된 다른 모델 요소에 있습니다.이 문제가 발생 하는 경우:
사용자가 다이어그램 또는 셰이프를 도구 상자에서 끌어 놓습니다.
사용자가 탐색기 또는 구획 모양에는 추가 메뉴를 사용 하 여 요소를 만듭니다.
사용자가 항목을 하나의 스윔 레인을 이동합니다.
사용자가 요소를 붙여넣습니다.
프로그램 코드 요소 병합 지시어를 호출합니다.
만들기 작업과 복사 작업에서 서로 다른 것 처럼 보일 수 있지만 실제로 동일한 방식으로 작동 합니다.예를 들어 요소를 추가 하면 도구 상자에서 프로토타입은 복제 됩니다.프로토타입 모델에 모델의 다른 부분에서 복사 된 요소와 같은 방식으로 병합 됩니다.
책임은 EMD는 개체 또는 개체 그룹의 개체 모델의 특정 위치에 병합 해야 결정 하는 것입니다.특히, 병합 된 그룹의 모델에 연결 하려면 어떤 관계 인스턴스화할 수 합니다 결정 합니다.또한이 속성을 설정 하 고 추가 개체를 만들려면 사용자 지정할 수 있습니다.
병합 하는 요소 지시어의 역할
포함 되는 관계를 정의할 때 EMD가 자동으로 생성 됩니다.부모를 하위 인스턴스를 새 사용자를 추가할 때이 기본 EMD 관계의 인스턴스를 만듭니다.예를 들어 사용자 지정 코드를 추가 하 여 이러한 기본 EMDs 수정할 수 있습니다.
DSL 정의에서 끌거나 붙여넣은 병합 된 및 수신 클래스의 서로 다른 조합을 사용자가 직접 Emds을 추가할 수도 있습니다.
정의 하는 요소 병합 지시어
도메인 클래스, 도메인 관계, 도형, 연결선 및 다이어그램 요소 병합 지시문을 추가할 수 있습니다.추가 하거나 받는 도메인 클래스에서 DSL 탐색기에서 찾을 수 있습니다.받는 클래스는 도메인 클래스 모델에서을 새 또는 복사한 요소의 병합 됩니다 표시 되어 요소입니다.
해당 클래스 인덱싱 받는 클래스의 멤버에 병합할 수 있는 요소가 도메인 클래스입니다.인덱싱 클래스의 하위 클래스의 인스턴스를 또한 병합이 EMD가 설정한 경우가 아니면 적용 됩니다. 서브 클래스 False로.
병합 지시문의 두 가지 종류가 있습니다.
A 병합 프로세스 지시문으로 새 요소 해야 될 연결을 트리에 관계를 지정 합니다.
A 앞으로 병합 지시문 새 요소가 다른 받는 요소를 일반적으로 부모를 리디렉션합니다.
지시문을 병합 하는 사용자 지정 코드를 추가할 수 있습니다.
설정 사용 하 여 사용자 지정 허용 대상 요소에 특정 인스턴스 색인 요소를 병합할 수 있는지 여부를 확인 하는 코드를 직접 추가 합니다.도구 상자에서 사용자가 끌 때 코드 병합을 허용 하지 않는 경우 "잘못 된" 포인터를 보여 줍니다.
예를 들어, 받는 요소의 특정 상태에서 경우에 병합을 수 있습니다.
설정 사용자 지정 병합을 사용 하 여 추가할 병합을 수행할 때 해당 변경 내용을 모델에 정의 하는 자체 코드를 제공 합니다.
예를 들어, 모델에 새 위치에서 데이터를 사용 하 여 병합 된 요소에 속성을 설정할 수 있습니다.
[!참고]
병합 사용자 지정 코드를 작성 하는 경우이 EMD를 사용 하 여 수행 하는 유일한 병합을 영향을 줍니다.있을 경우 같은 형식의 개체를 병합 하는 다른 EMDs 나는 EMD를 사용 하지 않고 이러한 개체를 만드는 다른 사용자 지정 코드가 없는 경우 다음 해당 사용자 지정 병합 코드에 의해 적용 되지 않습니다.
새 요소 또는 새 관계 사용자 정의 코드에서 항상 처리 되었는지 확인 하려는 경우를 정의할 수 있습니다는 AddRule 포함 관계에 따라 하는 DeleteRule 요소의 도메인 클래스에 있습니다.자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.
예제: 사용자 지정 코드 없이 EMD 정의
다음 예제에서는 사용자가 요소 및 커넥터는 기존 셰이프 도구 상자에서 끌어 동시에 만들 수 있습니다.이 예제는 EMD DSL 정의에 추가 됩니다.이 수정 하기 전에 사용자가 도구에서 다이어그램, 있지만 않은 기존 셰이프를 끌 수 있습니다.
사용자가 다른 요소에 요소를 붙여넣을 수도 있습니다.
요소 및 커넥터를 동시에 만들 수 있도록.
새 DSL을 사용 하 여 만들은 최소한의 언어 솔루션 템플릿.
이 DSL을 실행 하는 경우 셰이프와 셰이프 사이 연결선을 만들 수 있습니다.새를 끌 수 없습니다 ExampleElement 에서 기존 셰이프 도구 상자에서 모양입니다.
요소에 병합 하는 사용자가 ExampleElement 모양 만들기는 새 EMD에 있는 ExampleElement 도메인 클래스:
DSL 탐색기, 확장 도메인 클래스.마우스 오른쪽 단추로 ExampleElement 하 고 다음을 클릭 새 요소 병합 지시어를 추가.
있는지 확인은 DSL 정보 새 EMD의 세부 정보를 볼 수 있도록 창 열기입니다.(메뉴: 보기, 다른 Windows, DSL 정보입니다.)
설정에서 인덱싱 클래스 클래스의 요소를 병합할 수 있습니다 정의 DSL 세부 정보 창에서 ExampleElement 개체입니다.
이 예제에서는 선택 ExampleElements로 지정 하 여 사용자가 기존 요소에 새로운 요소를 끌 수 있습니다.
인덱싱 클래스 EMD DSL 탐색기에서의 이름으로 바뀝니다.
아래에서 프로세스 병합에 대 한 링크를 만드는, 두 개의 경로 추가 합니다.
하나의 경로 상위 모델에 새 요소를 연결합니다.입력 해야 하는 경로 식 기존 요소에서 위로 포함 관계를 통해 부모 모델을 탐색 합니다.마지막으로 새 요소에 할당 됩니다 링크를 새 역할을 지정 합니다.경로 다음과 같습니다.
ExampleModelHasElements.ExampleModel/!ExampleModel/.Elements
다른 경로 기존 요소에 새로운 요소를 연결합니다.경로 식은 참조 관계 및 역할을 새 요소에 할당 됩니다 지정 합니다.이 경로 다음과 같습니다.
ExampleElementReferencesTargets.Sources
각 패스를 만들려면 [경로 탐색] 도구를 사용할 수 있습니다.
아래에서 경로에 대 한 링크를 만드는 프로세스가 병합를 클릭 < 경로 추가 >.
목록 항목의 오른쪽에 있는 드롭다운 화살표를 클릭 합니다.트리 뷰를 표시 합니다.
지정 하려는 경로 구성 하려면 트리에서 노드를 확장 합니다.
DSL을 테스트 합니다.
다시 빌드하고 솔루션을 실행 하려면 F5 키를 누릅니다.
새 DSL 정의에 맞게 텍스트 서식 파일에서 생성 된 코드가 업데이트 됩니다 때문에 다시 평소 보다 오래 걸립니다.
때 실험 인스턴스를 Visual Studio 가 DSL 모델 파일 열기 시작 합니다.일부 예제에서는 요소를 만듭니다.
드래그를 예제에서는 요소 는 기존 셰이프 도구입니다.
새 도형을 표시 되 고 기존 셰이프를 연결선으로 연결 됩니다.
기존 도형을 복사 합니다.다른 셰이프를 선택 하 여 붙여 넣습니다.
도형 1의 복사본이 만들어집니다.새 이름이 고 두 번째 셰이프를 연결선으로 연결 된.
이 프로시저에서 다음 사항을 확인 합니다.
병합 지시문 요소를 만들어 요소에 적용 된 다른 모든 클래스를 허용할 수 있습니다.EMD는 받는 도메인 클래스에 생성 되 고 허용된 도메인 클래스에 지정 된 해당 인덱스 클래스 필드입니다.
경로 정의 하 여 링크 해야 합니다 지정할 수 있습니다 사용 하 여 새 요소를 기존 모델에 연결할 수 있습니다.
지정한 링크 포함 관계를 포함 해야 합니다.
EMD는 도구 상자와도 붙여넣기 작업에서 모두 만들기를 영향을 줍니다.
새 요소를 생성 하는 사용자 지정 코드를 작성 하는 경우를 명시적으로 EMD는를 사용 하 여 호출할 수 있습니다의 ElementOperations.Merge 메서드가 있습니다.이렇게 코드를 새 요소를 모델에 동일한 방식으로 다른 작업에 연결 됩니다.자세한 내용은 복사 동작 사용자 지정를 참조하십시오.
예:는 EMD에 사용할 사용자 지정 코드 추가
EMD에 사용자 지정 코드를 추가 하 여 보다 복잡 한 병합 동작을 정의할 수 있습니다.간단한 예제 사용자를 다이어그램에는 고정 된 수의 요소가 더 추가할 수 없습니다.이 예제에서는 기본 포함 되는 관계와 함께 제공 되는 EMD 수정 합니다.
형식을 제한 하려면 허용 사용자 지정 코드를 작성 하는 사용자를 추가할 수 있습니다.
DSL을 사용 하 여 만들은 최소한의 언어 솔루션 템플릿.DSL 정의 다이어그램을 엽니다.
DSL 탐색기 확장 도메인 클래스, ExampleModel, 요소 병합 지시문.이름이 지정 된 요소 병합 지시어를 선택 ExampleElement.
어떻게 새로운 사용자를 만들 수 있습니다이 EMD 제어 ExampleElement 예를 들어 도구 상자를 드래그 하 여 모델에 있습니다.
에 DSL 정보 창에서 사용 하 여 사용자 지정 허용.
솔루션을 다시 빌드합니다.모델에서 생성 된 코드가 업데이트 됩니다 때문에 평소 보다 시간이 오래 걸립니다.
빌드 오류가 보고 됩니다 유사 합니다: "Company.ElementMergeSample.ExampleElement 에 대 한 정의가 없습니다 CanMergeExampleElement…"
이 메서드를 구현 해야 CanMergeExampleElement.
새 코드 파일에 Dsl 프로젝트입니다.콘텐츠를 다음 코드로 대체 하 고 프로젝트의 네임 스페이스에 네임 스페이스를 변경 합니다.
using Microsoft.VisualStudio.Modeling; namespace Company.ElementMergeSample // EDIT. { partial class ExampleModel { /// <summary> /// Called whenever an ExampleElement is to be merged into this ExampleModel. /// This happens when the user pastes an ExampleElement /// or drags from the toolbox. /// Determines whether the merge is allowed. /// </summary> /// <param name="rootElement">The root element in the merging EGP.</param> /// <param name="elementGroupPrototype">The EGP that the user wants to merge.</param> /// <returns>True if the merge is allowed</returns> private bool CanMergeExampleElement(ProtoElementBase rootElement, ElementGroupPrototype elementGroupPrototype) { // Allow no more than 4 elements to be added: return this.Elements.Count < 4; } } }
이 간단한 예제에서는 상위 모델에 병합 될 수 있는 요소의 수를 제한 합니다.보다 재미 있는 조건에 대 한 모든 속성 및 링크를 받는 개체의 메서드를 검사할 수 있습니다.병합에서 전달 된 요소의 속성을 또한 검사할 수 있는 ElementGroupPrototype.ElementGroupPrototypes에 대한 자세한 내용은 복사 동작 사용자 지정를 참조하십시오.모델을 표시 하는 코드를 작성 하는 방법에 대 한 자세한 내용은 참조 하십시오. 프로그램 코드에서 모델 탐색 및 업데이트.
DSL을 테스트 합니다.
F5 키를 눌러 솔루션을 다시 빌드해야 합니다.때 실험 인스턴스를 Visual Studio 열리면을 DSL의 인스턴스를 엽니다.
여러 가지 방법으로 새 요소를 만듭니다.
드래그를 예제 요소 에서 다이어그램 도구입니다.
에 있는 은 모델 탐색기루트 노드를 마우스 오른쪽 단추로 클릭 하 고 다음을 클릭 새 예제에서는 요소를 추가.
복사 하 고 요소를 다이어그램에 붙여넣습니다.
모델에 4 개 이상의 요소를 추가 하려면 다음이 방법 중 하나를 사용할 수 없습니다 있는지 확인 하십시오.이 모든 병합이 지시문 요소를 사용 하기 때문입니다.
예: 사용자 지정 병합 코드는 EMD에 추가
사용자 지정 병합 코드에서 사용자가 끌 수 있는 도구 또는 요소를 붙여 넣는 경우 정의할 수 있습니다.사용자 지정 병합을 정의 하는 두 가지 방법이 있습니다.
설정 를 사용 하 여 사용자 지정 병합 필요한 코드를 제공 하 고 있습니다.코드는 생성 된 병합 코드를 대체합니다.완전히 병합의 용도 다시 정의 하려는 경우이 옵션을 사용 합니다.
재정의 MergeRelate 메서드를 선택적으로 MergeDisconnect 메서드.이렇게 하려면 설정 해야 합니다의 생성 이중 파생 도메인 클래스의 속성입니다.코드를 기본 클래스에서 생성 된 병합 코드를 호출할 수 있습니다.병합 수행 된 후 추가 작업을 수행 하려는 경우이 옵션을 사용 합니다.
이러한 방법만이 EMD를 사용 하 여 수행 하는 병합에 영향을.모든 방법에서 결합 된 요소 만들 수에 영향을 하려면 대체 정의 하는 것은 AddRule 포함 관계에 따라 하는 DeleteRule 병합 된 도메인 클래스에.자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.
Mergerelate를 재정의.
DSL 정의에 코드를 추가 하려면 EMD를 정의 해야 합니다.필요한 경우 경로 추가 하 고 정의 사용자 지정 이전 단원에 설명 된 대로 코드에 동의 합니다.
DslDefinition 다이어그램에서 병합 받는 클래스를 선택 합니다.일반적으로 포함 되는 관계의 소스 end에 클래스입니다.
최소한의 언어 솔루션에서 생성 되는 DSL의 예를 들어, 선택 ExampleModel.
에 속성 창 설정 생성 이중 파생 된 에 true.
솔루션을 다시 빌드합니다.
콘텐츠를 검사 Dsl\Generated Files\DomainClasses.cs.명명 된 메서드를 검색 MergeRelate 하 고 그 내용을 검토 합니다.자신의 버전을 작성 하는 데 도움이 됩니다.
코드 파일에서 새 받는 클래스에 대 한 partial 클래스를 작성할 및 재정의 MergeRelate 메서드.기본 메서드를 호출 해야 합니다.예를 들면 다음과 같습니다.
partial class ExampleModel { /// <summary> /// Called when the user drags or pastes an ExampleElement onto the diagram. /// Sets the time of day as the name. /// </summary> /// <param name="sourceElement">Element to be added</param> /// <param name="elementGroup">Elements to be merged</param> protected override void MergeRelate(ModelElement sourceElement, ElementGroup elementGroup) { // Connect the element according to the EMD: base.MergeRelate(sourceElement, elementGroup); // Custom actions: ExampleElement mergingElement = sourceElement as ExampleElement; if (mergingElement != null) { mergingElement.Name = DateTime.Now.ToLongTimeString(); } } }
사용자 지정 병합 코드를 작성 하려면
Dsl\Generated Code\DomainClasses.cs, 명명 된 메서드를 검사 MergeRelate.이러한 메서드는 기존 모델에 새 요소 사이의 링크를 만듭니다.
또한 명명 된 메서드를 검사 MergeDisconnect.삭제 될 경우 이러한 메서드 요소는 모델에서 연결을 끊습니다.
DSL 탐색기에서 선택 하거나 사용자 정의할 요소의 병합 지시문을 만듭니다.에 있는 DSL 정보 창 설정 사용자 지정 병합을 사용 하 여.
이 옵션을 설정 하면 해당 병합 프로세스 및 앞으로 병합 옵션은 무시 됩니다.코드 대신 사용 됩니다.
솔루션을 다시 빌드합니다.모델에서 생성 된 코드 파일 업데이트할 수 있기 때문에 평소 보다 시간이 오래 걸립니다.
오류 메시지가 표시 됩니다.생성 된 코드에서 지침을 볼 수 있는 오류 메시지를 두 번 클릭 합니다.다음 절차에이 따라 두 가지 방법을 제공 하 게 MergeRelateYourDomainClass 및 MergeDisconnectYourDomainClass
별도 코드 파일에 partial 클래스 정의에 메서드를 작성 합니다.이전 검사 한 예로 필요한 내용을 제안할 수 있습니다.
사용자 지정 병합 코드 개체 및 관계를 직접 작성 하는 코드에 영향을 주지와 다른 Emds에 영향을 줍니다.작성은 요소를 만든 방법에 관계 없이 추가 변경 사항을 구현 되었는지 확인 하려면 고려해는 AddRule a DeleteRule 대신 합니다.자세한 내용은 규칙으로 모델 내부의 변경 내용 전파을 참조하십시오.
병합 작업 리디렉션
앞으로 병합 지시문 병합 작업의 대상을으로 리디렉션합니다.일반적으로 새 대상 포함 부모 초기 대상입니다.
예를 들어, 구성 요소 다이어그램 템플릿으로 작성 된 DSL에서 포트 구성 요소에 포함 됩니다.포트 구성 요소 셰이프의 가장자리에 작은 모양으로 표시 됩니다.사용자가 포트 구성 요소 셰이프 끌어다 포트 도구를 드래그 하 여 만듭니다.하지만 경우에 따라 사용자가 실수로 해당 구성 요소를 대신 기존 포트에 포트 도구를 끌 및 작업이 실패 합니다.기존 포트가 있는 경우이 쉽게 실수입니다.사용자가이 문제가 될을 방지 하려면 포트는 기존 포트를 끌 수 있지만 부모 구성 요소를 이동 하는 작업을 허용할 수 있습니다.Target 요소는 구성 요소 처럼 작동 합니다.
구성 요소 모델 솔루션에서 앞으로 병합 지시문을 만들 수 있습니다.컴파일 및 원래 솔루션을 실행 하는 경우 사용자가 원하는 만큼 끌어 있습니다 표시 되어야 입력 포트 또는 출력 포트 요소에서의 도구 상자 에 구성 요소 요소.그러나, 기존 포트에 포트를 끌 수 없습니다.사용할 수 없는 포인터를이 이동 사용 하지 않는 경고를 보냅니다.그러나 포트는 본의 아니게 수 있도록 앞으로 병합 지시문을 만들 수 있습니다는 기존 삭제 입력 포트 전달 되는 구성 요소 요소.
앞으로 병합 지시문을 만들 수
만들기는 도메인별 언어 도구 모델 구성 요소 서식 파일을 사용 하 여 솔루션입니다.
디스플레이 DSL 탐색기 Dsldefinition.dsl를 열어.
에 있는 DSL 탐색기, 확장 도메인 클래스.
ComponentPort 도메인 추상 클래스는 기본 클래스의 두 InPort 및 OutPort.마우스 오른쪽 단추로 ComponentPort 하 고 다음을 클릭 새 요소 병합 지시어를 추가.
새로운 요소 지시어 병합 노드 아래에 나타납니다에 요소 병합 지시문 노드.
선택은 요소 지시어 병합 노드 및 열기는 DSL 정보 창.
인덱싱 클래스 목록에서를 선택 ComponentPort.
선택 전달할 다른 도메인 클래스에 병합.
경로 선택 목록에서 확장 ComponentPort, 확장 ComponentHasPorts를 선택한 다음 구성 요소.
새 경로이 이와 유사 합니다.
ComponentHasPorts.Component/!구성 요소
솔루션을 저장 한 후 서식 파일의 오른쪽에 있는 단추를 클릭 하 여 변환의 솔루션 탐색기 도구 모음입니다.
솔루션을 빌드하고 실행합니다.새 인스턴스를 Visual Studio 나타납니다.
솔루션 탐색기에서 sample.mydsl를 엽니다.다이어그램 및 ComponentLanguage 도구 상자 표시 됩니다.
드래그를 입력 포트 에서 도구 상자 다른 입력 포트 다음으로 드래그를 OutputPort 에 InputPort 및 다음 다른 OutputPort.
사용할 수 없음 포인터가 나타납니다 및 새 드롭 수 있습니다 입력 포트 기존에.새 선택 입력 포트 다른 지점으로 드래그 하 고 있는 구성 요소.