データ ブロックとデータ ハンドル

ノードのアトリビュート値は、データ ブロックに格納されます。ノードはデータ ブロックを所有していて、計算に使用します。出力プラグの 1 つを更新するよう求める要求がノードに送信されると、データ ブロックがノードの compute() メソッドに渡されます。これは、基盤となるフレームワークによってデータ ブロック内のノードの入力値のいずれかが更新されたときに発生します。

データ ハンドルは、MDataBlock オブジェクトのデータにアクセスする場合に使用されます。MDataHandle オブジェクトは、MDataBlock 内の特定のデータの参照です。

重要: データ ブロックとそのデータは、ノードの compute() メソッドの実行中のみ有効です。compute() メソッドの終了後は、データ ブロックまたはいずれかのデータのポインタを保持しないでください。

入力データにアクセスするには、MDataBlock::inputValue() を使用して入力アトリビュートの MDataHandle オブジェクトを作成します。次に、適切な MDataHandle メソッドを使用してデータを抽出します。

たとえば、受信データ ブロックから浮動小数点数を抽出するには、MDataHandle::asFloat() メソッドを使用します。次の例では、input が入力アトリビュートです。

MStatus myNode::compute( const MPlug& plug, MDataBlock& datablock ) {

    [...]
    
    MDataHandle inputHandle = datablock.inputValue(input, &returnStatus);
    float& inputValue = inputHandle.asFloat();

出力アトリビュートを更新するには、MDataBlock::outputValue() を使用して出力アトリビュートの MDataHandle オブジェクトを作成します。MDataHandle::set() を使用して出力データを設定します。

次の例では、output がノードの出力アトリビュートです。

MStatus myNode::compute( const MPlug& plug, MDataBlock& data ) {

    [...]

    float result = sin(inputValue);
    MDataHandle outputHandle = data.outputValue(output);
    outputHandle.set(result);
    data.setClean(plug);

新しい出力アトリビュート値を設定したら、MDataBlock::setClean() を使用してプラグをクリーンに設定して、このプラグが新しく計算されてダーティではなくなったことを示します。