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