UserDataMaps または UserDataMaps は UserDataBlobs または UserDataBlobs·と似ていますが、オブジェクトレベルのバイナリ データではなく、コンポーネントごとのバイナリ データの格納をサポートしています。たとえば、あるユーザ データが頂点クラスタ内のすべてのポイントに適用される場合、そのユーザ データはUserDataBlob に保存されます。一方、ユーザ データが単一の頂点に適用される場合、ユーザ データは UserDataMap の適切なインデックスに保存されます。
プラグイン開発者はオブジェクト モデルを介して、UserDataMap オブジェクトとしてコンポーネントの生バイナリ ユーザ データを使用できます。 ユーザ データ マップはコンポーネントのクラスタに割り当てられ、マップ上の個々のユーザ データ アイテムはクラスタ内の各アイテムに対応します。 これらの各アイテムには、それぞれ独自のデータをバイナリ(BLOB)形式で含めることができます。 これは、ウェイト マップと似ていますが、浮動小数点値だけを格納するのではなく、あらゆる種類のデータを各コンポーネントに割り当てることができる点が異なります。
UserDataMap オブジェクトを取得すると、以下のいずれかのメソッドで、個々のコンポーネント(ポイントやエッジなど)上に格納されたデータを割り当てたり、取得したりすることができます。
スクリプトおよび C# では、UserDataMap.Item(Python の場合は UserDataMap.GetItem2)から各 UserDataItem を個別に取得し、UserDataItem.Value プロパティを使用してクラスタ エレメント(コンポーネント)の値を取得できます。
オブジェクト モデルおよび C++ API では、クラスタ エレメント(コンポーネント)で UserDataMap.ItemValue プロパティ(オブジェクト モデル)または UserDataMap.GetItemValue メンバ関数(C++ API)を使用して直接アイテムの値を取得できます。
C++API では、UserDataMap::GetValues を使用して、配列のクラスタに格納されているユーザ データの値の全セットを取得できます。
// 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) );