[ブログに戻る](/ja/blog) # Teigha BIMで要素パラメータを取得する方法

Artur Vakhramov 3月 30, 2018 [\#rvt](/ja/blog/tag/rvt) [\#rfa](/ja/blog/tag/rfa) [\#Example](/ja/blog/tag/example)

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

この記事では、要素パラメータの取得と実装に使用されるTeigha BIMの機能の一部について説明します。

利用可能な組み込みパラメータのリストは、BmBuiltInParameter.hファイルにあります。要素パラメータを取得するためのTeigha BIMユーザーインターフェースは、BmElement.hおよびBmObject.hファイルで利用できます。

- getListParams関数 — 要素で利用可能な組み込みパラメータのリストを取得します。
- getParam関数 — 指定されたパラメータの値を取得します。パラメータには、整数 (OdInt32)、浮動小数点数 (double)、文字列 (OdString)、オブジェクト識別子 (OdBmObjectId) の4つのタイプがあります。パラメータはOdTfVariantとしても利用可能です。
- getFilterElement関数 — フィルタリングを実行するためにパラメータを取得する必要がある要素を取得します。

パラメータを操作する一般的な原則は次のとおりです。

- 必要に応じて、getListParamsを介して利用可能な要素パラメータのリストを要求します。
- フィルタリングを実行する際に使用すべきパラメータを持つ要素を取得するには、getFilterElementを介してそれを要求します。
- 要求されたパラメータの要素は、getParamを介してその値を要求します。
- 関数の戻り値がチェックされます。
    - eOk — 要求されたパラメータが利用可能なパラメータのリストに存在し、パラメータ値が正常に受信されました。
    - eNotImplementedYet — 要求されたパラメータが利用可能なパラメータのリストに存在しますが、パラメータ値はまだ実装されていません。
    - eNotApplicable — 要求されたパラメータが利用可能なパラメータのリストに存在しますが、パラメータの値がありません (HasValue = False)。
    - eKeyNotFound — 要求されたパラメータが利用可能なパラメータのリストにありません。

#### getFilterElementの使用

Teigha BIMでは、OdBmFilterDoubleRule、OdBmFilterElementIdRule、OdBmFilterIntegerRule、およびOdBmFilterStringRuleの各ルールで可視要素のフィルタリングを実行する際に、getFilterElement関数が使用されます。

これらのルールは、Autodesk® Revit®の\[表示\] -&gt; \[フィルタ\]メニューを使用して設定されます。

これらのパラメータによるフィルタリングは、要素自体のパラメータ値ではなく、関連する要素から実行できます。例として、FamilyInstance要素では、UNIFORMAT\_CODEパラメータの値が要素自体からではなく、関連するMasterSymbolId要素から使用されてフィルタリングが行われます。

```
OdBmElementPtr OdBmFamilyInstanceImpl::getFilterElement(const OdBm::BuiltInParameter::Enum& parameterId) const {
  switch (parameterId) {
    case OdBm::BuiltInParameter::UNIFORMAT_CODE: {
      if (!getMasterSymbolId().isNull()) {
        return getMasterSymbolId().safeOpenObject();
      }
    } break;
  }

  return super::getFilterElement(parameterId);
}

```

デフォルトでは、要素のgetFilterElement関数は要素自体を返します。

```
OdBmElementPtr OdBmElementImpl::getFilterElement(const OdBm::BuiltInParameter::Enum& parameterId) const {
  return this->getFacade();
}

OdBmElementPtr OdBmElementImpl::getFilterElement(const OdBmObjectId& parameterId) const {
  OdUInt64 value = parameterId.getHandle();
  if (OdBm::BuiltInParameter::contains(value)) {
    return getFilterElement(static_cast<OdBm::BuiltInParameter::Enum>(value));
  }
  return this->getFacade ();
}

```

#### 仕組み

パラメータ DESIGN\_OPTION\_ID の実装

DESIGN\_OPTION\_ID パラメータはすべての要素に存在するパラメータであるため、OdBmElementImpl::getListParams 関数内のパラメータリストに追加されました。

Teigha BIM での実装は、関数 (マクロでラップされています) で実行されます。

```
ODBM_BUILTIN_PARAMETERS_COMMON_IMPLEMENTATION(OdBmElementImpl, OdBmObjectId,
                                                    pThis, parameter, value).

```

ただし、パラメータの値が「-4」を取る場合、Revit Lookup はそれを「-1」に置き換えます。この置換は Teigha BIM で実装されました。

```
const OdBmObjectId& OdBmElementImpl::getDesignOptionIdAsParam() const {
  const OdBmObjectId& designOptionId = getDesignOptionId();
  return OdBmObjectId::isRegularHandle(designOptionId.getHandle()) ? designOptionId : OdBmObjectId::kNull;
}

```

FamilySymbol 要素の例を使用したパラメータの取得

パラメータ取得の内部実装は、impl ファイル、この場合は BmFamilySymbolImpl.h と BmFamilySymbolImpl.cpp で行われます。

ヘッダーがファイルに追加されます。

1. 補助定義のマクロ:
    ```
    ODBM_BUILTIN_PARAM_STUFF(OdBmFamilySymbolInternalImpl);
    
    ```
2. 必要に応じて、型別の内訳におけるパラメータの関数定義マクロ:
    ```
    ODBM_BUILTIN_PARAM_METHOD_DECLARATION(OdInt32);
    ODBM_BUILTIN_PARAM_METHOD_DECLARATION(double);
    ODBM_BUILTIN_PARAM_METHOD_DECLARATION(OdString);
    ODBM_BUILTIN_PARAM_METHOD_DECLARATION(OdBmObjectId);
    
    ```
3. 必要に応じて、一般的なパラメータ処理用のマクロ:
    ```
    ODBM_PARAM_SET_TYPES(ODBM_PARAM_METHODS_DECLARATION, ODBM_VIRTUAL, , ODBM_SEMICOLON);
    
    ```
4. パラメータのリストを取得する関数:
    ```
    virtual void getListParams(OdBuiltInParamArray& aParams) const ODRX_OVERRIDE;
    
    ```
5. 必要に応じて、フィルタ関数:
    ```
    virtual OdBmElementPtr getFilterElement(const OdBm::BuiltInParameter::Enum& parameterId) const ODRX_OVERRIDE;
    
    ```

cppファイルには以下が追加されます。

1. マクロを使用したパラメータの一般的な処理の実装（この場合、パラメータは最初にFamilyParams属性で検索されます）：
    ```
    #define ODBM_PARAM_METHOD_FAMILYSYMBOLIMPL_IMPLEMENTATION(METHOD)            \
      {                                                                          \
        OdResult es =                                                   \
            OdBmFamilyParamsPtr(getParams())->METHOD##Param(parameterId, value); \
        if (es == eOk || es == eNotImplementedYet || es == eNotApplicable) {      \
          return es;                                                             \
        }                                                                        \
        return super::METHOD##Param(parameterId, value);                         \
      }
    
    
    ODBM_PARAM_SET_TYPES(ODBM_PARAM_METHODS_DECLARATION, ,
      OdBmFamilySymbolImpl::,
      ODBM_PARAM_METHOD_FAMILYSYMBOLIMPL_IMPLEMENTATION);
    
    ```
2. パラメータのリストを取得する実現（この場合、最初に基底クラスを呼び出してリストが作成され、次にFamilySymbolに固有のパラメータが追加されます）：
    ```
    void OdBmFamilySymbolImpl::getListParams(OdBuiltInParamArray& aParams) const {
      super::getListParams(aParams);
      
      //...
    }
    
    ```
3. マクロを介してパラメータを操作する関数の実装（OdInt32の1つの型のみの一般的なビューの例として示されています）：
    ```
    ODBM_BUILTIN_PARAMETERS_COMMON_IMPLEMENTATION(OdBmFamilySymbolImpl, OdInt32,
      pThis, parameter, value) {
      switch (parameter) {
        case OdBm::BuiltInParameter::SOME_PARAMETER_1: {
          //...
        } break;
    
        case OdBm::BuiltInParameter::SOME_NOT_IMPLEMENTED_PARAMETER: {
          return eNotImplementedYet;
        } break;
      }
    
      return eKeyNotFound;
    }
    
    ```
4. フィルタリング関数の実装（FamilyInstance要素から取得）：
    ```
    OdBmElementPtr OdBmFamilyInstanceImpl::getFilterElement(const OdBm::BuiltInParameter::Enum& parameterId) const {
      switch (parameterId) {
        case OdBm::BuiltInParameter::UNIFORMAT_CODE: {
          if (!getMasterSymbolId().isNull()) {
            return getMasterSymbolId().safeOpenObject();
          }
        } break;
      }
    
      return super::getFilterElement(parameterId);
    }
    
    ```

パラメータを実装する際のテンプレートメソッドの使用

パラメータを実装する際には、テンプレートメソッドが使用されます。

- forwardParam — パラメータの処理を別のオブジェクトにスローします。
- universalAccess — パラメータへのアクセス関数を示します。
- onlyStaticValue — パラメータを静的な値として処理します。

## 今すぐ始める

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

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