++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

SilverlightへのPython組み込み

leave a comment »

このエントリは Silverlight Advent Calendar 2011の17日目です。

いやー、NuGet便利だなー、的な。

経緯

  • なんか、動的実行の類の記事書くか
  • IronPython、NuGet経由で入手できるし、Silverlightプロジェクトでも使えるじゃない
  • IronPythonで入力した式のグラフでも出してみるか
  • あっ、Silverlight ToolkitのData Visualization(チャート コントロール)もNuGet経由で入るっぽい
  • 作るのちょろそう!
  • ちょろかった←今ここ

まずはNuGet

Silverlightのプロジェクトを作ったら、「参照設定」を右クリックして、「Manage NuGet Packages…」をクリック。

IronPython

IronPythonは、「iron」で検索すれば見つかります。

codeplexの方で手に入る最新版が2.7で、NuGetの方は2.6なので、実は1バージョン古いですが…

チャート コントロール

Silverlight Toolkit – Data Visualization (Charting)は、「datavis」で検索すれば見つかります。

Silverlight Toolkitは、Silverlight SDKの方に入りきらなかった(リリース タイミングに間に合わなあった)コントロールを、codeplex上で公開しているものです。安定度に応じて、

  • Mature: 十分成熟。SDKの方に取り込み
  • Stable: 安定して使える
  • Preview: バグってる可能性あり。API変更もあり得る
  • Experimental: 実験段階。場合によっては開発打ち切りもあり得る

の4段階あります。Data VisualizationはPreview段階です。

サンプル プログラム

ということで、1・2時間ほどでサンプル、作りました。

 

ロジックらしいコードは↓これだけ。

public void Run()
{
    try
    {
        var scope = _engine.CreateScope();
        _engine.Execute(“from math import *”, scope);
        var f = _engine.Execute<Func<doubledouble>>(
“lambda x:” + SourceCode, scope);
       var p =
            from i in Enumerable.Range(0, Count)
            let x = Delta * i + Min
            select new Point
            {
                X = x,
                Y = f(x),
            };

        Points = p.ToArray();
    }
    catch
    {
        Message = 
不正な計算をしました;
    }
}

残りはデータ バインディングと、MVVM的お約束コードです。お約束コードの方が多いです、ええ。

XAMLの方は、チャート コントロールがらみの部分だけ出しておきます。

<UserControl
    x:Class=”IronPythonChart.MainPage”
中略
    xmlns:charting=”clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit”
>
    <Grid x:Name=”LayoutRoot” Background=”White”>
中略
        <charting:Chart Grid.ColumnSpan=”3″ LegendTitle=”x”>
            <charting:Chart.Series>
                <charting:LineSeries
                    Title=”{Binding SourceCode}”
                    ItemsSource=”{Binding Points}”
                    IndependentValueBinding=”{Binding X}”
                    DependentValueBinding=”{Binding Y}”/>
            </charting:Chart.Series>
        </charting:Chart>
中略
    </Grid>
</UserControl>

 

実行してみよう

以下の条件入れてみたりするとよいかもしれず。

  • 式: (sqrt(cos(x))*cos(200*x)+sqrt(abs(x))-0.7)*pow((4-x*x),0.01)
  • 最小値: -1.57 (-π/2)
  • 最大値: 1.57 (π/2)
  • 間隔: 0.005

ちょっと前、Google検索で数式入れたらグラフを出してくれるようになった直後に流行ってた例のアレです。以下のようなグラフが出るはず。

と、画面キャプチャを貼ったところで、Legendの文字が適当(x)なままだとか、凡例に式全体を出しちゃうと結構うっとおしいとか気づいたり…

Written by ufcpp

2011年12月16日 @ 15:08

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。