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