コンポーネント上のバイナリ ユーザ データにアクセスする

 
 
 

UserDataMaps または UserDataMapsUserDataBlobs または UserDataBlobs·と似ていますが、オブジェクトレベルのバイナリ データではなく、コンポーネントごとのバイナリ データの格納をサポートしています。たとえば、あるユーザ データが頂点クラスタ内のすべてのポイントに適用される場合、そのユーザ データはUserDataBlob に保存されます。一方、ユーザ データが単一の頂点に適用される場合、ユーザ データは UserDataMap の適切なインデックスに保存されます。

プラグイン開発者はオブジェクト モデルを介して、UserDataMap オブジェクトとしてコンポーネントの生バイナリ ユーザ データを使用できます。 ユーザ データ マップはコンポーネントのクラスタに割り当てられ、マップ上の個々のユーザ データ アイテムはクラスタ内の各アイテムに対応します。 これらの各アイテムには、それぞれ独自のデータをバイナリ(BLOB)形式で含めることができます。 これは、ウェイト マップと似ていますが、浮動小数点値だけを格納するのではなく、あらゆる種類のデータを各コンポーネントに割り当てることができる点が異なります。

UserDataMap オブジェクトを取得すると、以下のいずれかのメソッドで、個々のコンポーネント(ポイントやエッジなど)上に格納されたデータを割り当てたり、取得したりすることができます。

C++の例:球のエッジへのユーザデータマップの適用

// C++ example (using the C++ API) giving an overview of accessing
// per-component user data on a cluster
using namespace XSI;

Application app;
Model root = app.GetActiveSceneRoot();

// equiv: oRoot.AddGeometry( "Sphere", "NurbsSurface" )
X3DObject sphere;
root.AddGeometry( L"Sphere", L"MeshSurface", "SphereWithUserData",sphere);

// Create a cluster containing all the edges on the geometry, then
// create a user data map
Cluster cls;
Geometry geom( myGrid.GetActivePrimitive().GetGeometry(0) );
CLongArray edges(4);
edges[0] = 31; edges[1] = 45; edges[2] = 46; edges[3] = 47; 
geom.AddCluster( siEdgeCluster, L"UserDataCls", edges, cls );

UserDataMap map;
cls.AddProperty( L"UserDataMap", false, L"UserDataBasicExample", map );

// In C++ it is easy and efficient to save binary data instead of strings
unsigned char aExampleData[] = { 0, 23, 1, 244, 20, 99 };

// Copy the data into the user data map
map.PutItemValue( 3, (unsigned char*)&aExampleData,sizeof(aExampleData) );