EmbPythonに特殊な関数を追加する をテンプレートにして作成
開始行:
[[開発ノウハウ集]]
EmbPythonSwigの標準的なグルーコードとは異なる処理をしたい場合,.iファイル内に独自のグルーコードの実装を記述して与えることができます.
クラスにない関数を新たに追加したりもできます.
- 使用例
-- コールバック関数(PyObject*)を引数に取り,コールバック登録を行う関数を作りたい場合.
-- GetHogeshi(int i)とNHogeshis()から,リスト化して返すGetHogeshis()を自動生成するなど.
--- src/EmbPython/Utility/EPObject.i の EXTEND_N_GETS_TO_LIST で使われていますので参照してください.
** NantokaクラスのHogeshiメソッドの実装を与える例 [#gc7a82a7]
// まずignoreすることでSWIGが標準のグルーコードを吐き出すのを抑制します.
%ignore Nantoka::Hogeshi;
// 次に独自実装のグルーコードを定義します.
%extend Nantoka{
PyObject* Hogeshi(){
// この中にグルーコードの独自実装を書く.
// selfのC++オブジェクトは $self で取得できる.
// 例 :
PyObject* result;
result = $self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる
return result;
}
}
%enddef
~
上記の記述で,以下のような関数が生成されます.
- 前処理や後処理が多数追加されること
- $selfが Nantoka* c_self に置き換わること
- return が ret_tmp= に置き換わること
に注意してください.
PyObject* __PYDECL EPNantoka_Hogeshi( PyObject* self )
{
UTAutoLock LOCK(EPCriticalSection);
if( EPObject_Ptr(self) == NULL )
{
PyErr_SetString( PyErr_Spr_NullReference , "Null Reference in Nantoka.GetContacts");
return NULL;
}
if(true)
{
PyObject* ret_tmp;
{
PyObject * py_self = self;
Nantoka* c_self = EPObject_Cast(py_self,Nantoka);
// この中にグルーコードの独自実装を書く.
// selfのC++オブジェクトは $self で取得できる.
// 例 :
PyObject* result;
result = c_self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる
ret_tmp = result;
}
PyObject* c_ret = ret_tmp;
PyObject* py_ret = c_ret;
if ( !py_ret )
{
PyErr_BadInternalCall();
return NULL;
}
if ( py_ret == Py_None ) Py_RETURN_NONE;
return py_ret;
}
PyErr_BadArgument();
return NULL;
}
* グルーコードヘッダにそのまま出力されるコードを書く [#e2f9ea9a]
.iファイルで
%begin%{
// ...
}
で囲んだ部分は,グルーコードヘッダにそのまま出力されます.
終了行:
[[開発ノウハウ集]]
EmbPythonSwigの標準的なグルーコードとは異なる処理をしたい場合,.iファイル内に独自のグルーコードの実装を記述して与えることができます.
クラスにない関数を新たに追加したりもできます.
- 使用例
-- コールバック関数(PyObject*)を引数に取り,コールバック登録を行う関数を作りたい場合.
-- GetHogeshi(int i)とNHogeshis()から,リスト化して返すGetHogeshis()を自動生成するなど.
--- src/EmbPython/Utility/EPObject.i の EXTEND_N_GETS_TO_LIST で使われていますので参照してください.
** NantokaクラスのHogeshiメソッドの実装を与える例 [#gc7a82a7]
// まずignoreすることでSWIGが標準のグルーコードを吐き出すのを抑制します.
%ignore Nantoka::Hogeshi;
// 次に独自実装のグルーコードを定義します.
%extend Nantoka{
PyObject* Hogeshi(){
// この中にグルーコードの独自実装を書く.
// selfのC++オブジェクトは $self で取得できる.
// 例 :
PyObject* result;
result = $self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる
return result;
}
}
%enddef
~
上記の記述で,以下のような関数が生成されます.
- 前処理や後処理が多数追加されること
- $selfが Nantoka* c_self に置き換わること
- return が ret_tmp= に置き換わること
に注意してください.
PyObject* __PYDECL EPNantoka_Hogeshi( PyObject* self )
{
UTAutoLock LOCK(EPCriticalSection);
if( EPObject_Ptr(self) == NULL )
{
PyErr_SetString( PyErr_Spr_NullReference , "Null Reference in Nantoka.GetContacts");
return NULL;
}
if(true)
{
PyObject* ret_tmp;
{
PyObject * py_self = self;
Nantoka* c_self = EPObject_Cast(py_self,Nantoka);
// この中にグルーコードの独自実装を書く.
// selfのC++オブジェクトは $self で取得できる.
// 例 :
PyObject* result;
result = c_self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる
ret_tmp = result;
}
PyObject* c_ret = ret_tmp;
PyObject* py_ret = c_ret;
if ( !py_ret )
{
PyErr_BadInternalCall();
return NULL;
}
if ( py_ret == Py_None ) Py_RETURN_NONE;
return py_ret;
}
PyErr_BadArgument();
return NULL;
}
* グルーコードヘッダにそのまま出力されるコードを書く [#e2f9ea9a]
.iファイルで
%begin%{
// ...
}
で囲んだ部分は,グルーコードヘッダにそのまま出力されます.
ページ名:
サイト内検索
and
or
メニュー
Springhead
トップページ
スクリーンショットと紹介
ダウンロード
ドキュメント
開発者向け情報
SprBlender
SprBlender
SprBlenderの特徴
SprBlender使用例
ダウンロード
ドキュメント
Choreonoid Springhead Plugin
CnoidSprPlugin
Counter: 0, today: 0, yesterday: 0