Teigha BIMで要素パラメータを取得する方法

この記事では、要素パラメータの取得と実装に使用される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®の[表示] -> [フィルタ]メニューを使用して設定されます。

これらのパラメータによるフィルタリングは、要素自体のパラメータ値ではなく、関連する要素から実行できます。例として、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日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す