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

 
 
 

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