Visual Studio DSL 入門 7—DSL的圖形表示2

來源:互聯網
上載者:User

     在上一節介紹了vs.net dsl的圖形符號,其中包括圖表,編輯器,形狀.在這一節,我們來看一形符號與中繼資料之間的關係,他們是怎麼映射在一起的. 
     模型元素由形狀來表示,而域關係則用連接器(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),當選中時,產生的程式碼會添加自訂的程式碼片段,你必須實現對應的方法才能夠編譯通過,在指定的方法裡,你可以自已返回父元素和父形狀.

隱藏行號 複製代碼 ?
  1. if(element is global::Company.LanguageSm.ExampleElement)
  2.             {
  3.                 // Method:
  4.                 // private DslDiagrams::NodeShape CreateShapeForExampleElement(ExampleElement newElement)
  5.                 // {
  6.                 // }
  7.                 // must be implemented in a partial class of LanguageSmDiagram.  Given an instance of ExampleElement,
  8.                 // 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.
  9.                 DslDiagrams::NodeShape newShape = CreateShapeForExampleElement((global::Company.LanguageSm.ExampleElement)element);
  10.                 if(newShape != null) newShape.Size = newShape.DefaultSize; // set default shape size
  11.                 return newShape;
  12.             }

     你必須在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, 這個項目的需求已經在第二節中介紹過了。

參考資源
      1. Visual Stuido DSL 工具特定領域開發指南
      2. DSL Tools Lab     http://code.msdn.microsoft.com/DSLToolsLab  系列教程

作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.