模型元素由形狀來表示,而域關系則用連接器(Connectors)來表示.圖形映射定義了模型元素通過形狀可視化表示出來,而連接器映射定義了鏈接如何通過連接器可視化表示出來.
形狀映射
我們先來看一下形狀映射,接著打開我們的LanguageSm項目中的Dsl文件. 選中域類ExampleElement與圖形ExampleShape之間的線,可看下面的Dsl details:
這個窗口有兩個tab,General tab主要是定義域類和圖形間的連接, 可以選擇形狀,域類,設置他們之間的映射關系,Parent element path(父元素路徑)指出了引用的域類的邏輯父元素,以及當前形狀應當以哪個圖表元素作為父親.
為什麼需要指定父元素路徑呢?因為設計器在運行時,所有的圖表元素(除了圖表本身),都必須有父圖表元素(可以是圖表或形狀),這樣這個圖表才能夠知道自己放在哪裡,所以我們在這裡需要指定形狀被創建後哪個圖表元素將作為它的父親.
父元素路徑使用簡單的路徑語法來表示整個元素和鏈接結構,在我們這個例子中,它指出了從ExampleElement出發順著 ExampleModelHasElements.ExampleModel/!ExampleModel這條中徑得到的元素對對應的圖表元素,就是形狀的父元素所在的圖表,在這個例子裡,也就是圖表本身ExampleModel元素,因為我們的ExampleShape是直接放在圖形上的。
另外兩個可設置的項,具有自定義的父形狀(Has custome Parent Shape),具有自定義的父元素(Has custom parent element),當選中時,生成的代碼會添加自定義的代碼段,你必須實現對應的方法才能夠編譯通過,在指定的方法裡,你可以自已返回父元素和父形狀.
隱藏行號 復制代碼 ?
if(element is global::Company.LanguageSm.ExampleElement)
{
// Method:
// private DslDiagrams::NodeShape CreateShapeForExampleElement(ExampleElement newElement)
// {
// }
// must be implemented in a partial class of LanguageSmDiagram. Given an instance of ExampleElement,
// the method should return a new shape or connector instance that should be associated with this element. If no shape or connector should be created, the method should return null.
DslDiagrams::NodeShape newShape = CreateShapeForExampleElement((global::Company.LanguageSm.ExampleElement)element);
if(newShape != null) newShape.Size = newShape.DefaultSize; // set default shape size
return newShape;
}
你必須在LanguageSmDiagram的partial類裡面實現這個GetShapForExampleElement方法才能夠編譯通過.
裝飾器映射
我們再來看一下Decorator tab,這裡主要是映射屬性和裝飾器,在某些情況下,裝飾器的外觀可能會需要隨著模型信息的更改而動態更改,裝飾器映射主要是來定義這一行為。
上面顯示的是Dsl中的ExampleShape的Name裝飾器的裝飾器映射,顯示屬性(Display Property)主要是針對文本裝飾器(text decorator),在這裡也就是用來設置需要顯示的文本對應的域類的域屬性. 可見性篩選器(Visibility Filter)主要是用來設置裝飾器根據域類的域屬性來決定是否顯示,通過Filter property設置依據的屬性,在右面的Visibility entries裡設置值為多少時,裝飾器才會顯示,如果依據更復雜的邏輯,我們可以添加計算屬性。另外,可見性設置同樣可以針對圖標裝飾器(Icon decorator)進行設置,比如我們可以實現設置當某一實體為繼承實體時,就在右上角顯示一個小圖標。
以上是對所有的形狀共有的映射定義,不過對於一些形狀還是會有些特殊的地方,我們大概介紹一下:
1.隔間形狀.
除了形狀映射外,還需要映射隔間:
這個是我們在前面根據Class Diagrams模板創建的項目中的ClassShape的映射,在這裡我們可以看到屬性隔間(AttributesCompartment)和操作隔間 (OperationsCompartment)的映射, 左邊是設置用於創建隔間項的元素集合,在這裡也是通過屬性路徑從Class出發找到Attribute,當然這裡也可以設置使用自定義的元素集合,和上面一樣,你需要自定義實現對應的方法,右邊是每個元素需要顯示的實際信息,在這裡也就是設置對於Attribute元素需要顯示的屬性Name.
2.端口
端口映射需要注意的是父元素路徑確定的元素必須映射到一個可以接受端口的圖形上,包括幾何形狀.隔間形狀.另外一個端口形狀(或者將自定義父元素設為true),否則將會報錯。
3.泳道
當把元素映射到一個應包含在泳道裡的形狀時,父路徑必須標識出映射到泳道的元素。映射泳道時,必須在父路徑中標識圖表對應的元素,否則會報錯,泳道不能以幾何形狀作為父親.
連接器映射
形狀映射將形狀映射到域類,而連接器映射將連接器映射到一個域關系,而且在這裡不需要設置父元素路徑。連接器連接了對應的鏈接的源元素和目標元素對應的形狀,同樣,在這裡可以設置 具有自定義源(Has custom source),具有自定義目標(Has custom target).同樣的,可以對連接器映射設置裝飾器映射,因為域關系也是有屬性的.
好了,到現在為止,我們根據創建的默認的LanguageSm項目,已經大概介紹了Vs.net Dsl的一些基本知識,這些知識是我們在使用vs.net dsl之前必須要掌握的,接下來我們就開始實際創建我們自己的Dsl, 這個項目的需求已經在第二節中介紹過了。
出處:http://lonely7345.cnblogs.com/