ノードのアトリビュート値は、データ ブロックに格納されます。ノードはデータ ブロックを所有していて、計算に使用します。出力プラグの 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() を使用してプラグをクリーンに設定して、このプラグが新しく計算されてダーティではなくなったことを示します。