azukipochette's weblog

memory dump (mini)

有向グラフ (DGML) の研究 : 1

有向グラフとは

Visual Studio のコード依存関係などの表示に使われるもので、英語では "Directed Graphs" と呼んでいる。

Wikipedia

Directed Graphs を記述するための XML ベースのマークアップ言語が定義されており、これを DGML と呼ぶ。具体的な DGML の例を次に示す。

<?xml version='1.0' encoding='utf-8'?>
<DirectedGraph xmlns="http://schemas.microsoft.com/vs/2009/dgml">
  <Nodes>
    <Node Id="a" Label="a" Size="10" />
    <Node Id="b" Background="#FF008080" Label="b" />
    <Node Id="c" Label="c" Start="2010-06-10" />
  </Nodes>
  <Links>
    <Link Source="a" Target="b" />
    <Link Source="a" Target="c" />
  </Links>
  <Properties>
    <Property Id="Background" Label="Background" DataType="Brush" />
    <Property Id="Label" Label="Label" DataType="String" />
    <Property Id="Size" DataType="String" />
    <Property Id="Start" DataType="DateTime" />
  </Properties>
</DirectedGraph>

参考文献

DGML を作成するための APIs

API による記述例

なぜかどこにもサンプル コードがないが、次のように記述することで上記相当の DGML を生成することができる。

using System;
using System.Windows.Media;
using Microsoft.VisualStudio.GraphModel;

namespace AzukiPochette.Sample.Dgml
{
    class Program
    {
        static void Main(string[] args)
        {
            Graph graph = new Graph();
            
            GraphPropertyCollection properties = graph.DocumentSchema.Properties;
            GraphProperty background = properties.AddNewProperty("Background", typeof(Brush));
            GraphProperty size = properties.AddNewProperty("Size", typeof (String));
            GraphProperty start = properties.AddNewProperty("Start", typeof (DateTime));

            GraphNode nodeA = graph.Nodes.GetOrCreate("a");
            nodeA.Label = "a";
            nodeA[size] = "10";

            GraphNode nodeB =  graph.Nodes.GetOrCreate("b");
            nodeB.Label = "b";
            nodeB[background] = new SolidColorBrush(Color.FromArgb(0xFF, 0x00, 0x80, 0x80));

            GraphNode nodeC = graph.Nodes.GetOrCreate("c");
            nodeC.Label = "c";
            nodeC[start] = new DateTime(2010, 6, 10);
            
            graph.Links.GetOrCreate(nodeA, nodeB);
            graph.Links.GetOrCreate(nodeA, nodeC);

            graph.Save(@"C:\works\Sample.dgml");
        }
    }
}

(2013.01.27 追記) : github:gist に公開しました。