私は、openFrameworksを介してさまざまなプログラムを実行している背景を必要とするパフォーマンスアーティストのためのプログラムを開発しています。彼はどういうわけかそれらを簡単に切り替えることができる方法を必要としています。他のopenframeworksファイルをロードまたはアンロードするマスターシェルを作成する方法はありますか?
1 に答える
クライアント側から(終了ボタンを使用して)RunApp()を終了する方法がある場合は、tclまたはpythonを使用してスクリプト言語で呼び出しをラップできます。最終的には、さまざまなアプリを実行してパラメーターを設定できるインタラクティブなシェルになります。
簡単にするために、いくつかの詳細を省略し、boost::pythonを使用して言語バインディングを行うと仮定します。これについてのより詳細な読みはこの記事にあり、boost::pythonのドキュメントはここにあります。
主なアイデアは、OFのドメイン固有言語/ラッパーのセットを作成することです。これを使用して、OFオブジェクトを作成し、シェルまたはスクリプトを介してインタラクティブにメソッドにアクセスできます。
Boostオブジェクトのバインディングは、おおよそ次のように機能します( 1からの引用)。
まず、C++でクラスを定義します
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
次に、それをpython-moduleとして公開します
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
これは、インタラクティブなPythonセッションで使用されているように見えます。
>>> import hello
>>> planet = hello.World()
>>> planet.set('howdy')
>>> planet.greet()
'howdy'
これで、任意のクラスまたはメソッドをラップできるため、実際にOFを利用する方法には多くの可能性があります。この回答で私が言及していたのは、C ++ / OFで実装された2つのアプリを作成App1
しApp2
、Pythonでその実装にリンクすることです。
インタラクティブセッションは次のようになります。
>>> import myofapps
>>> a1 = myofapps.App1()
>>> a2 = myofapps.App2()
>>> a1.run() # blocked here, until the app terminates
>>> a2.run() # then start next app .. and so forth
>>> a1.run()
私はOFハッカーではありませんが、別の(より簡単な)可能性はofApp::draw()
、アプリ内のfeのコンテンツをインタラクティブに変更することです(スレッドで実行されます)。これは、Pythonインタープリター内からパラメーター化可能なカスタムオブジェクトを埋め込むことで実行できます。
/// custom configurator class
class MyObj {
private int colorRed;
// getter
int getRed () {
return colorRed;
}
// setter
void setRed(int r) {
colorRed = r;
}
/// more getters/setters code
...
};
/// the boost wrapping code (see top of post)
...
/// OF code here
void testApp::draw() {
// grab a reference to MyObj (there are multiple ways to do that)
// let's assume there's a singleton which holds the reference to it
MyObj o = singleton.getMyObj();
// grab values
int red = o.getRed ();
// configure color
ofSetColor(red,0,0,100);
// other OF drawing code here...
}
OFアプリが実行されると、インタプリタ内からインタラクティブに色を変更するために使用できます。
>>> import myofapps
>>> a1 = myofapps.App1()
>>> c1 = myofapps.MyObj();
>>> a1.run() # this call would have to be made non-blocking by running the
>>> # app in a thread and returning right away
>>> c1.setRed(100);
... after a minute set color to a different value
>>>> c1.setRed(200);