拡張ストレージメカニズムにより、ユーザーデータをモデル要素に直接保存できます。このメカニズムはプロジェクトまたはファミリ内で使用されないため、プロジェクトまたはファミリのパラメータには影響しません。ユーザーデータを保存できるモデル要素は多岐にわたります。このメカニズムの共通の特性は、スキーマベースのテクノロジーの使用です。
このアプローチによると、モデル要素にユーザーデータを保存するには、次のオブジェクトでデータを定義する必要があります。
- フィールド — データ名、タイプ、および単位情報を含み、エンティティ内の対応するデータにアクセスするためのキーとして使用されます。
- スキーマ — データフィールドオブジェクトのコレクション。
- エンティティ — スキーマに対応するデータを含むオブジェクトで、要素に挿入できます。
BimRv SDKは、スキーマ、フィールドビルダー、およびヘルパーを実装する次のクラスを使用して、スキーマベースのデータ構造の作成と操作をサポートしています。
- OdBmESSchemaBuilder — スキーマ定義の作成を実行します。
- OdBmESFieldBuilder — 新しいフィールドを作成する際にOdBmESSchemaBuilderと共に使用されるヘルパークラスです。
- OdBmESEntityHelper — 既存の拡張可能エンティティのフィールド値にアクセスするために使用されるヘルパークラスです。
- OdBmESSchemaHelper — 既存のスキーマの属性とフィールドの読み取りを可能にします。
- OdBmESFieldHelper — フィールド属性と定義を読み取る際にOdBmESSchemaHelperと共に使用されるヘルパークラスです。
BimRv SDKの拡張ヘルパーは、次のデータ型をサポートしています。
- bool
- OdInt16
- OdInt32
- double
- float
- OdString
- OdGuid
- OdBmObjectId
- OdGePoint2d
- OdGePoint3d
- OdArray
- OdMap (double、float、OdGePoint2d、OdGePoint3dを除くすべてのタイプがキーでサポートされています)
- OdBmObject (別のスキーマのインスタンス)
属性を使用すると、スキーマは、すべてのユーザー、特定のアプリケーションベンダー、またはベンダーの特定のアプリケーションに対して、読み取りおよび/または書き込みのアクセスを制限するように構成できます。
次のセクションでは、拡張可能なストレージの簡単な使用法について説明します。
ストレージ記述の作成
新しいスキーマを作成するには、OdBmESSchemaBuilderクラスを使用します。
OdBmESSchemaBuilder schemaBuilder(pDb);
schemaBuilder.setSchemaName(L"WireSpliceLocation")
.setSchemaGUID(OdGUID("720080CB-DA99-40DC-9415-E53F280AA1F0"))
.setVendorId(L"BimRv")
.setDocumentation(L"WireSpliceLocation schema")
.setReadAccessLevel(OdBm::ESSchemaAccessLevel::Public)
.setWriteAccessLevel(OdBm::ESSchemaAccessLevel::Public);
ストレージ内にフィールドを作成するには、OdBmESFieldBuilderクラスを使用する必要があります。このクラスには、次のようなフィールド属性を設定するメソッドが含まれています。
- setDocumentation() — フィールドの説明。
- setSubSchemaGUID() — フィールドに格納されているサブエンティティを記述するスキーマのグローバル一意識別子 (GUID)。
- setUnitType() — フィールドに格納されている値によって表される単位のタイプ。
以下に、2つの単純なフィールド、1つの配列フィールド、および1つのマップフィールドを作成する方法の例を示します。
schemaBuilder.addSimpleField<bool>(L"BooleanField").setDocumentation(L"Boolean value");
schemaBuilder.addSimpleField<OdGePoint3d>(L"XYZField").setUnitType(OdBm::UnitType::UT_Length).setDocumentation(L"XYZ value");
schemaBuilder.addArrayField<OdGUID>(L"GUIDArrayField").setDocumentation(L"GUID array value");
schemaBuilder.addMapField<OdString, OdString>(L"StringMapField").setDocumentation(L"Map value");
フィールドの名前は、値の書き込みと読み取りのためにフィールドデータにアクセスするために使用されます。スキーマ内のすべてのフィールドを定義した後、finish()メソッドを呼び出してスキーマビルダーを完了します。
OdTfClass* pSchema = schemaBuilder.finish();
スキーマインスタンス (エンティティ) を作成するには、OdBmESEntityHelperクラスのcreateEntity()メソッドを呼び出します。
OdBmObjectPtr pESEntity = OdBmESEntityHelper::createEntity(pSchema);
フィールド属性、および単位タイプ、名前、ドキュメントなどのスキーマ属性は、作成後に変更することはできません。
値の設定
エンティティフィールドの新しい値を設定するには、OdBmESEntityHelperクラスを使用します。
OdBmESEntityHelper helper(pESEntity);
helper.set<bool>(L"BooleanField", true);
helper.set<OdGePoint3d>(L"XYZField", OdGePoint3d(20., 21., 22.), OdBm::DisplayUnitType::DUT_METERS);
OdArray<OdGUID>guids;
guids.push_back(OdGUID("60E23C30-169B-4C46-BD2B-DC9FC476FD09"));
guids.push_back(OdGUID("1BAD71AA-137E-4519-8D9B-B0ED1672D1BF"));
helper.set<OdArray<OdGUID>>(L"GUIDArrayField", guids);
OdBmMap<OdString, OdString> stringMap;
stringMap[L"key1"] = L"value1";
stringMap[L"key2"] = L"value2";
helper.set<OdBmMap<OdString, OdString>>(L"StringMapField", stringMap);
表示単位タイプパラメータは、float、double、OdGePoint3d、およびOdGePoint2dデータ型にのみ使用され、フィールドの単位タイプを設定します。このメソッド内では変換は実行されません。
OdBmObjectPtrの場合、OdBmESEntityHelperクラスインスタンスのset()メソッド呼び出しでclone()を使用します。
helper.set<OdBmObjectPtr>(L"EntityField", pESEntity->clone());
set<>()メソッドのテンプレートパラメータは、フィールドのタイプと正確に一致する必要があります (フィールドは、スキーマ作成の段階で指定されます)。
データの保存
アプリケーションは、スキーマのインスタンスをモデル内の任意の要素にアタッチできます。共有プロジェクトでの要素のロックを避けるために、OdBmDataStorageクラスで表される特殊な要素を使用します。
OdBmDataStoragePtr pDataStorageElem = OdBmDataStorage::createObject();
pDataStorageElem->setName(L"DataStorageElem");
ODBM_TRANSACTION_BEGIN(t, pDb)
t.start();
hStorage = pDb->addElement(pDataStorageElem).getHandle();
pDataStorageElem->setESEntity(pESEntity);
t.commit();
ODBM_TRANSACTION_END()
ストレージからのデータの読み取り
次のコード例は、ストレージヘルパーからデータを読み取る方法を示しています。
OdBmObjectPtr pESEntity = pDataStorageElem->getESEntity(OdGUID(L"720080CB-DA99-40DC-9415-E53F280AA1F0"));
OdBmESEntityHelper helper(pESEntity);
bool b = helper.get<bool>(L"BooleanField");
OdGePoint3d xyz = helper.get<OdGePoint3d>(L"XYZField", OdBm::DisplayUnitType::DUT_DECIMETERS);
get<>() メソッドのデータ型は、最初のセクションにリストされているいずれかになります。スキーマの作成者として、各フィールドの型を知っている必要があります。そうでない場合は、値を OdTfVariant オブジェクトとして処理できます。
OdTfVariant v;
pESEntity->getProperty(L"BooleanField", v);
OdTfVariant オブジェクトを文字列に変換する例は、BimRv/Examples/ExBimDump、特に BmDumper::dumpVariant メソッドの実装で見つけることができます。
get<>() メソッドの表示単位型パラメーターは、データを目的の単位に変換するために使用されます。たとえば、以前にフィールドに設定された値の座標は OdGePoint3d(200., 210., 220.) と等しくなります。
OdArray<OdGUID>guids = helper.get<OdArray<OdGUID>>(L"GUIDArrayField");
OdBmMap<OdString, OdString> strings = helper.get<OdBmMap<OdString, OdString>>(L"StringMapField");
情報読み取りルーチン
記録された情報を読み取るには、モデル要素を取得し、ストレージ GUID とフィールド名を決定します。データベース内のスキーマを取得するには、OdBmESSchemaHelper クラスの静的 listSchemas() メソッドを使用します。
std::set<OdGUID> schemas = OdBmESSchemaHelper::listSchemas(pDb);
スキーマに関連するデータベース内の要素にアクセスするには、静的 getElements() メソッドを使用します。
OdBmObjectIdArray objects = OdBmESSchemaHelper::getElements(guid, pDb);
フィールドから情報を取得する別の方法は、OdBmESFieldHelper を使用することです。
OdBmESFieldHelper fieldHelper(helper.getField(L"BooleanField"));
フィールドヘルパーオブジェクトは、フィールド属性にアクセスするためのメソッドを提供します。
- getDocumentation() — フィールドの説明を返します。
- getFieldName() — フィールド名を返します。
- getContainerType() — フィールドの型を返します。単一の値を含む単純なフィールド、または複数の値のコンテナです。
- getEntryIndex() — フィールドのインデックスを返します。
- getSubSchemaGUID() — フィールドに格納されているサブエンティティを記述するスキーマのグローバル一意識別子 (GUID) を返します。
- getUnitType() — フィールドに格納されている値によって表される単位の型を返します。
OdBmESSchemaHelper クラスは、スキーマに関する情報を取得するのに役立ちます。
OdBmESEntityHelper helper(pESEntity);
OdBmESSchemaHelper schHelper(helper.getSchema());
このヘルパークラスは、以下のメソッドで機能を提供します。
- getDocumentation() — スキーマの説明を返します。
- getVendorId() — ベンダーアクセスレベルでスキーマのエンティティにアクセスできるサードパーティベンダーの文字列識別子を返します。
- getSchemaName() — スキーマ名を返します。
- getSchemaGUID() — スキーマのグローバル一意識別子 (GUID) を返します。
- getReadAccessLevel() — スキーマの現在の読み取りアクセスレベルを取得します。
- getWriteAccessLevel() — スキーマの現在の書き込みアクセスレベルを取得します。