この記事では、要素パラメータの取得と実装に使用される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 で行われます。
ヘッダーがファイルに追加されます。
- 補助定義のマクロ:
ODBM_BUILTIN_PARAM_STUFF(OdBmFamilySymbolInternalImpl); - 必要に応じて、型別の内訳におけるパラメータの関数定義マクロ:
ODBM_BUILTIN_PARAM_METHOD_DECLARATION(OdInt32); ODBM_BUILTIN_PARAM_METHOD_DECLARATION(double); ODBM_BUILTIN_PARAM_METHOD_DECLARATION(OdString); ODBM_BUILTIN_PARAM_METHOD_DECLARATION(OdBmObjectId); - 必要に応じて、一般的なパラメータ処理用のマクロ:
ODBM_PARAM_SET_TYPES(ODBM_PARAM_METHODS_DECLARATION, ODBM_VIRTUAL, , ODBM_SEMICOLON); - パラメータのリストを取得する関数:
virtual void getListParams(OdBuiltInParamArray& aParams) const ODRX_OVERRIDE; - 必要に応じて、フィルタ関数:
virtual OdBmElementPtr getFilterElement(const OdBm::BuiltInParameter::Enum& parameterId) const ODRX_OVERRIDE;
cppファイルには以下が追加されます。
- マクロを使用したパラメータの一般的な処理の実装(この場合、パラメータは最初に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); - パラメータのリストを取得する実現(この場合、最初に基底クラスを呼び出してリストが作成され、次にFamilySymbolに固有のパラメータが追加されます):
void OdBmFamilySymbolImpl::getListParams(OdBuiltInParamArray& aParams) const { super::getListParams(aParams); //... } - マクロを介してパラメータを操作する関数の実装(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; } - フィルタリング関数の実装(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 — パラメータを静的な値として処理します。