- Since
-
- See also
-
数値データ、または数値の配列データを送受信する型です。 double型またはそのリストとして送受信されます。
コマンドライン
を実行し、数字を入力すると送信されます。(1つ入力するごとに改行してください)
オプションでclientやデータの名前を変更できます。 詳細は webcface-send のページを参照
送信
C++ Value::set() でデータを代入し、Client::sync()することで送信されます。
wcli.value("hoge").set(5);
wcli.value("fuga").set({1, 2, 3, 4, 5});
- Note
- webcfaceのvalueは浮動小数型のみを扱いますが、値が整数だった場合シリアライズ時に自動的に整数型として送受信されるようなので、整数値やbool値を送りたい場合でも通信量を気にする必要はありません。(msgpack/msgpack-c#1017)
-
1.7 配列データは
std::vector<double>
だけでなく、std::arrayや生配列などstd::ranges::rangeに合うものならなんでも使えます。 要素の型はdoubleに変換可能ならなんでもokです。
set() の代わりに代入演算子(Value::operator=)でも同様のことができます。 また、 operator+= など、doubleやintの変数で使える各種演算子も使えます
1.11 valueに直接[]
(またはchild()
) (2.8 または at()
) で配列の要素アクセスが可能です。 また、resize() で配列を初期化し push_back() で追加する使い方もできます。 ただしValueにセットしたデータはsync等で自動的にリセットされることはないので、push_backとsyncを繰り返す場合は resize(0) や set({}) などで初期化してください。 cpp wcli.value("fuga").resize(5); for(int i = 0; i < 5; i++){ wcli.value("fuga")[i] = i; // wcli.value("fuga").at(i) も同じ } wcli.value("fuga").push_back(100);
2.8 []
やat()
は ValueElementRef 型を返すようになりました。使い方は今までと変わりません。
- C double型の単一の値は wcfValueSet, (2.0 wcfValueSetW)
wcfStatus wcfValueSet(wcfClient *wcli, const char *field, double value)
単一の値を送信する
Definition value.cc:111
配列データは wcfValueSetVecD, (2.0 wcfValueSetVecDW) double value[5] = {1, 2, 3, 4, 5};
wcfStatus wcfValueSetVecD(wcfClient *wcli, const char *field, const double *values, int size)
複数の値を送信する(doubleの配列)
Definition value.cc:117
で送信できます。
- JavaScript Value.set() でデータを代入し、Client.sync()することで送信されます。
wcli.value("hoge").set(5);
wcli.value("fuga").set([1, 2, 3, 4, 5]);
Python Value.set() でデータを代入し、Client.sync()することで送信されます。
wcli.value("hoge").set(5)
wcli.value("fuga").set([1, 2, 3, 4, 5])
2.0 数値型はfloatに変換可能なもの(SupportsFloat型)であればなんでもokです。(例えばnumpyの数値型なども使用可能です。)
複数の値をまとめて送る
- Todo:
- Pythonの辞書型への対応は未実装
- JavaScript オブジェクトを渡すことができます。
wcli.value("a").set({
x: 1,
y: 2,
vec: [1, 2, 3],
a: {
a: 1,
b: 1,
},
});
/* 結果は以下のようになる
value("a.x") -> 1
value("a.y") -> 2
value("a.vec") -> {1, 2, 3}
value("a.a.a") -> 1
value("a.a.b") -> 1
*/
(ver1.11まで) C++でwebcface::Value::Dictを使った値のセット
webcface::Value::Dict オブジェクトを使うと複数の値をまとめて送ることができます。 これは構造体などのデータを送るときに使えます
struct A {
double x, y;
operator webcface::Value::Dict() const {
return {
{"x", x},
{"y", y},
{"vec", {1, 2, 3}},
{"a", {
{"a", 1},
{"b", 1},
}}
}
}
};
A a_instance;
wcli.value("a").set(a_instance);
受信
C++ Value::tryGet(), Value::tryGetVec() などで値のリクエストをするとともに受信した値を取得できます。
例えばfoo
というクライアントのhoge
という名前のデータを取得したい場合は次のようにします。
std::optional<double> hoge = wcli.member("foo").value("hoge").tryGet();
std::optional<std::vector<double>> hoge = wcli.member("foo").value("hoge").tryGetVec();
- 値をまだ受信していない場合 tryGet(), tryGetVec() はstd::nulloptを返し、そのデータのリクエストをサーバーに送ります。
- リクエストは
次にClient::sync()したときに 1.2自動的に別スレッドで送信されます。
- そのデータを受信した後(4-1. Clientを参照)、再度tryGet()することで値が得られます。
- Value::get(), Value::getVec() はstd::nulloptの代わりに0を返します。
- また、doubleやstd::vector<double> などの型にキャストすることでも同様に値が得られます。
1.7 Value::request() で明示的にリクエストを送信することもできます。
1.8 std::ostreamにValueを直接渡して表示することもできます。 まだ受信していない場合nullと表示されます。
std::cout << "hoge = " << wcli.member("foo").value("hoge") << std::endl;
1.11 送信時と同様、配列データは[]
またはchild()
2.8またはat()
を使ってもアクセスできます。
double hoge = wcli.member("foo").value("hoge")[3].get();
2.8 size()
で配列データのサイズを取得できます。 ただし tryGet() などと同様、まだ受信していないデータに関しては0を返し、リクエストが送られます。
- Warning
- 1.11 Valueオブジェクト同士を
==
, !=
で比較するとValueが参照するデータの名前が一致するかどうかで判定されます。 (Textなど他のデータ型でも同様です。)
- ver1.10まではdoubleにキャストされた上で値を比較していたので、異なる挙動になります。 値を比較したい場合は明示的にキャストするか
get()
などを呼んでください。
C wcfValueGetVecD, (2.0 wcfValueGetVecDW) で受信できます。
例えばfoo
というクライアントのhoge
という名前のデータを取得したい場合は次のようにします。
double value[5];
int size;
wcfStatus wcfValueGetVecD(wcfClient *wcli, const char *member, const char *field, double *values, int size, int *recv_size)
値を受信する
Definition value.cc:125
- sizeに受信した値の個数、valueに受信した値が入ります。
- 値をまだ受信していない場合
WCF_NOT_FOUND
2.0 WCF_NO_DATA
を返し、そのデータのリクエストをサーバーに送ります。
- そのデータを受信した後(4-1. Clientを参照)、再度wcfValueGetVecD()することで値が得られます。
1.7 1つの値のみを受信する場合は wcfValueGet, (2.0 wcfValueGetW) も使えます。 double型1つのみが受け取れる以外、動作はwcfValueGetVecDと同様です。
double value;
wcfStatus wcfValueGet(wcfClient *wcli, const char *member, const char *field, double *value)
値を受信する
Definition value.cc:135
- Note
- 1.7 member名に空文字列またはNULLを指定すると自分自身を指します。
JavaScript Value.tryGet(), Value.tryGetVec() などで値のリクエストをするとともに受信した値を取得できます。
例えばfoo
というクライアントのhoge
という名前のデータを取得したい場合は次のようにします。
const hoge: double | null = wcli.member("foo").value("hoge").tryGet();
const hoge: double[] | null = wcli.member("foo").value("hoge").tryGetVec();
- 値を受信していない場合 tryGet(), tryGetVec() はnullを返し、そのデータのリクエストをサーバーに送ります。
- リクエストは
次にClient.sync()したときに 1.1自動的に別スレッドで送信されます。
- そのデータを受信した後(4-1. Clientを参照)、再度tryGet()することで値が得られます。
- get(), getVec() はnullの代わりに0を返します。
1.1 Value.request()で明示的にリクエストを送信することもできます。
Python Value.try_get(), Value.try_get_vec() などで値のリクエストをするとともに受信した値を取得できます。
例えばfoo
というクライアントのhoge
という名前のデータを取得したい場合は次のようにします。
hoge = wcli.member("foo").value("hoge").try_get()
hoge = wcli.member("foo").value("hoge").try_get_vec()
- 値をまだ受信していない場合 try_get(), try_get_vec() はNoneを返し、そのデータのリクエストをサーバーに送ります。
- get(), getVec() はNoneの代わりに0を返します。
Value.request()で明示的にリクエストを送信することもできます。
Entry, イベントについて
4-3. Field に移動しました。そちらを参照してください