ofxCLIを作った


ofxCLIというaddonを作ったので紹介

ことの始まり

できること

1行テキストエディタ

このgifでは改行してるように見えるけど、実際は履歴に溜めてるだけで、戻って編集はできない。
カーソル移動の操作や仕様はXcodeのエディタの挙動を参考にした。
(Option押しながらで単語ごと、Command押しながらで行全体の移動)
上下キーで履歴を辿れる。
TABキーで、バインディング(後述)されてる候補を表示できる。

関数バインディング

prompt_.subscribe("bgcolor", [](float r, float g, float b, float a) {
    ofBackground(ofFloatColor(r,g,b,a));
}, {0,0,0,1});

こんな感じで登録するとbgcolor [r,g,b,a]でofBackgroundを呼べる。
ちなみに登録時の引数{0,0,0,1}は指定しなかった場合のデフォルト値(省略可)。
ラムダ関数、メンバ関数、std::functionが登録可能。

変数バインディング

prompt_.subscribe("textcolor", text_color_.r, text_color_.g, text_color_.b, text_color_.a);

void ofApp::draw() {
    ofPushStyle();
    ofSetColor(text_color_);
    prompt_.drawDebug(0,10);
    ofPopStyle();
}

こんな感じで登録するとtextcolor [r,g,b,a]でテキストカラーを変えられる。
デフォルト値は登録時の値になる。

OSCバインディング(Receive)

ofx::cli::Prompt prompt_;
ofx::cli::BindOscReceiver osc_receiver_;

void ofApp::setup() {
    prompt_.subscribe("print", [](std::string s) { std::cout << s << std::endl; });
    osc_receiver_.bind(prompt_);
}

こうしておけば、アドレス/printに飛んできたOSCメッセージの第一引数をコンソールに表示する。
※先頭のスラッシュの有無は設定可能
※デフォルトのポートは6000番(変更可能)

OSCバインディング(Send)

ofx::cli::Prompt prompt_;
ofx::cli::BindOscSender osc_sender_;

void ofApp::setup() {
    prompt_.subscribe("print", [](std::string,int){});
    osc_sender_.bind(prompt_);
}

こうしておけば、printに続けて打ち込んだ内容がOSCで送信される。
例えばprint a 3だったらアドレス/printに文字列sと整数3が送られる。
もしprintがsubscribeされてなかった場合は変数の型が全てstringになる。
※先頭にスラッシュを付与するかどうかは設定可能
※デフォルトの送信先はlocalhost:6000(変更可能)
※subscribeしてるコマンドしか送らない設定も可能
※subscribeしてないコマンドしか送らない設定も可能

応用

Prompt::proc(const std::string&)
Prompt::proc(const std::string &program, const std::vector<std::string> &args)

Promptに直接打ち込まなくても、これを使えば外部から直接コマンドを叩ける。
subscribeを呼び出すコマンドを登録しておけばoFとofxCLIの上で自作のスクリプト言語を動かすみたいなことも可能・・・?(知らんけど)