BimRvにおける拡張ストレージヘルパー

拡張ストレージメカニズムを使用すると、ユーザーデータをモデル要素に直接保存できます。このメカニズムは、プロジェクトまたはファミリのパラメータによって使用されず、また影響を与えません。情報はモデルのほぼすべての要素に保存できます。これを行うには、ユーザーデータを次のオブジェクトで記述する必要があります。

  • フィールド — データ名、型、および単位情報を含み、エンティティ内の対応するデータにアクセスするためのキーとして使用されます。
  • スキーマ — データフィールドオブジェクトのコレクション。
  • エンティティ — 要素に挿入できるスキーマに対応するデータを含むオブジェクト。

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() — スキーマの書き込みアクセスレベル。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す