拡張ストレージメカニズムを使用すると、ユーザーデータをモデル要素に直接保存できます。このメカニズムは、プロジェクトまたはファミリのパラメータによって使用されず、また影響を与えません。情報はモデルのほぼすべての要素に保存できます。これを行うには、ユーザーデータを次のオブジェクトで記述する必要があります。
- フィールド — データ名、型、および単位情報を含み、エンティティ内の対応するデータにアクセスするためのキーとして使用されます。
- スキーマ — データフィールドオブジェクトのコレクション。
- エンティティ — 要素に挿入できるスキーマに対応するデータを含むオブジェクト。
BimRvは、スキーマベースのデータ構造を作成および操作する機能を提供します。この機能には、スキーマおよびフィールドビルダーとヘルパーが含まれます。
- OdBmSchemaBuilder — スキーマ定義の作成を可能にします。
- OdBmFieldBuilder — 新しいフィールドを作成する際にOdBmSchemaBuilderと共に使用されるヘルパークラス。
- OdBmESEntityHelper — 既存の拡張可能エンティティのフィールド値にアクセスするために使用されるヘルパークラス。
- OdBmESSchemaHelper — 既存のスキーマ属性とフィールドの読み取りを可能にします。
- OdBmESFieldHelper — フィールド属性と定義を読み取る際にOdBmESSchemaHelperと共に使用されるヘルパークラス。
次のデータ型がサポートされています。
- bool
- OdInt16
- OdInt32
- double
- float
- OdString
- OdGuid
- OdBmObjectId
- OdGePoint2d
- OdGePoint3d
- OdArray
- OdMap (double、float、OdGePoint2d、OdGePoint3dを除くすべての型がキーでサポートされています)
- OdBmObject (別のスキーマのインスタンス)
属性を使用すると、すべてのユーザー、特定のアプリケーションベンダー、またはベンダーからの特定のアプリケーションに対して、読み取りおよび/または書き込みのアクセスを制限するようにスキーマを構成できます。
次の手順では、ExtensibleStorageの簡単な使用法について説明します。
1. ストレージ記述の作成
新しいスキーマを作成するには、OdBmSchemaBuilderを使用します。
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クラスを使用します。
これには、フィールド属性を設定するメソッドが含まれています。たとえば、次のとおりです。
- OdBmESFieldBuilder& setDocumentation(const OdString&); — フィールドの説明。
- OdBmESFieldBuilder& setSubSchemaGUID(const OdGUID&); — フィールドに格納されているサブエンティティを記述するスキーマのGUID。
- OdBmESFieldBuilder& setUnitType(const OdBm::UnitType::Enum); — フィールドに格納されている値で表される単位の型。
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();
OdBmObjectPtr pESEntity = OdBmDynamicObject::createObject(pSchema);
フィールド属性、および単位タイプ、名前、ドキュメントなどのスキーマ属性は、作成後に変更することはできません。
2. 値を設定する
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<> のテンプレートパラメータは、フィールドの型(スキーマ作成時に指定)と完全に一致する必要があります。
3. データを保存する
アプリケーションは、スキーマのインスタンスをモデル内の任意の要素にアタッチできます。共有プロジェクトでの要素のロックを避けるため、特殊な要素 OdBmDataStorage を使用することをお勧めします。
OdBmDataStoragePtr pDataStorageElem = OdBmDataStorage::createObject();
pDataStorageElem->setName(L"DataStorageElem");
pDb->addElement(pDataStorageElem);
pDataStorageElem->upgradeOpenMode();
pDataStorageElem->setESEntity(pESEntity);
pDataStorageElem->downgradeOpenMode();
4. ストレージを読み取る
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<> メソッドの表示単位タイプパラメータは、データを目的の単位に変換するために使用されます。たとえば、以前にフィールドに設定された値の xyz は OdGePoint3d(200., 210., 220.) に等しくなります。
OdArray<OdGUID> guids = helper.get<OdArray<OdGUID> >(L"GUIDArrayField");
OdBmMap<OdString, OdString> strings =
helper.get<OdBmMap<OdString, OdString> >(L"StringMapField");
5. 情報を読み取る
記録された情報を読み取るには、モデル要素を取得し、ストレージ 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() — フィールドのタイプを返します: 1つの値を含む単純なフィールド、または複数の値のコンテナ。
- getEntryIndex() — フィールドのインデックスを返します。
- getSubSchemaGUID() — このフィールドに格納されているサブエンティティを記述するスキーマの GUID。
- getUnitType() — このフィールドに格納されている値によって表される単位のタイプ。
OdBmESSchemaHelper はスキーマに関する情報の取得に役立ちます。
OdBmESEntityHelper helper(pESEntity);
OdBmESSchemaHelper schHelper(helper.getSchema());
このヘルパーには以下のメソッドがあります。
- getDocumentation() — スキーマの説明。
- getVendorId() — ベンダーアクセスレベルでこのスキーマのエンティティにアクセスできるサードパーティベンダーの文字列ID。
- getSchemaName() — スキーマの名前。
- getSchemaGUID() — スキーマの識別子。
- getReadAccessLevel() — スキーマの読み取りアクセスレベル。
- getWriteAccessLevel() — スキーマの書き込みアクセスレベル。