最終更新日 2024-09-25

HD.version.SDKからIronPythonModを使う場合②

概要

前節では、HD.version.SDKからIronPythonを呼び出すサンプルでした。
ここでは、HD.version.SDKの値そのものをIronPythonとやりとりする例をみてみましょう。

HD.version.SDKのほとんどすべてのインスタンス(クラスオブジェクト)は、
CLI(CLR)に沿ったものですので、IronPythonとインスタンスやクラスをやり取りし、
直接情報を扱うことが出来ます。

HD.version.SDK側

HD.version.SDK側のソース
#include "天翔記クラス.h"
#include "天翔記クラス_初期化.h"


using namespace System::Collections;

using namespace IronPython::Hosting;
using namespace Microsoft::Scripting::Hosting;


ref class GREF {
public:
  static ScriptEngine^ pe;
  static ScriptScope^ scope;
};


void 天翔記クラス::On_ゲームウィンドウ起動時() {
  try {
    GREF::pe = Python::CreateEngine();

    // ファイルを実行。
    GREF::scope = GREF::pe->ExecuteFile("script.py");
  }
  catch (Exception^ e) {
    デバッグ出力 << e->Message << endl;
  }
}


void 天翔記クラス::On_戦略_軍団ターン変更時(int 軍団番号) {

  // スクリプトエラー等をキャッチできるようにしよう。
  try {
    // 「武将」のインスタンスを引数として、渡して、ArrayList^型を受け取る。
    // ArrayList型の各要素は、武将情報型 (=武将->配列[i]の1人の武将分の型)とする。
    auto funcDoBushouSomething = GREF::pe->Operations->GetMember< Func<武将リスト情報型^, ArrayList^>^ >(GREF::scope, "DoBushouSomething");
    ArrayList^ blist = funcDoBushouSomething(武将);
    for each (Object^ o in blist) {
      武将情報型^ b = (武将情報型^)o;
      デバッグ出力 << b->姓名 << endl;
    }
  }
  catch (Exception^ e) {
    デバッグ出力 << e->Message << endl;
  }


}

Python側

「武将」クラスオブジェクトを受け取って、50歳を超える年齢の武将だけをArrayListに追加して返しています。

IronPythonのソース:script.py
# coding: cp932

from System.Collections import *

def DoBushouSomething(武将):
    blist = []
    for b in 武将.配列:
        if b.年齢 > 50:
            blist.append(b)

    blist_array = ArrayList(blist)
    return blist_array

以上となります。

今回の例をみてもわかるように、HD.versino.SDKのほどんど全てのクラスオブジェクトは
IronPython側のスクリプトでも直接操作可能です。