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) );