[ブログに戻る](/ja/blog) # BimRvにおける拡張ストレージヘルパー

Evgeniy Tikhonov 6月 27, 2019 [\#rvt](/ja/blog/tag/rvt) [\#rfa](/ja/blog/tag/rfa)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

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

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

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&amp; setDocumentation(const OdString&amp;); — フィールドの説明。
- OdBmESFieldBuilder&amp; setSubSchemaGUID(const OdGUID&amp;); — フィールドに格納されているサブエンティティを記述するスキーマのGUID。
- OdBmESFieldBuilder&amp; 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&lt;&gt; のテンプレートパラメータは、フィールドの型（スキーマ作成時に指定）と完全に一致する必要があります。

#### 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&lt;&gt; メソッドの表示単位タイプパラメータは、データを目的の単位に変換するために使用されます。たとえば、以前にフィールドに設定された値の 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日間無料でお試しください。  
リスクなし、クレジットカード不要。**

[無料で試す](https://www.opendesign.com/ja/free-trial)
