数式を扱う際、ファミリパラメータとグローバルパラメータから数式テキスト表現を取得できます。
数式はRVTおよびRFA形式で一連の式として表現されます。各式は数式の一部、いわゆるトークンを担当します。トークンは、特定の文字で区切られた文字列のより小さな断片です。式には、文字列、数値、演算子(二項または単項)、関数、または上記のすべてを含む部分式が含まれる場合があります。
式の連鎖から数式を文字列に戻すには、保存されたデータに応じて、すべての依存する式を下から上にたどり、正しく処理します。
ファミリーパラメータから数式を取得する
数式を取得する方法の1つは、getFormula()メソッドを使用することです。このメソッドを使用するには、RFA形式を扱う際に作成できるOdBmFamilyManagerクラスのオブジェクトが必要です。
指定されたIDを持つファミリーパラメータから数式を取得する例:
#include "Database/BmDatabase.h"
#include "Database/Managers/BmFamilyManager.h"
OdBmDatabasePtr pDb = pHostAppServices->readFile(L"rac_advanced_sample_family.rfa");
const OdBmObjectId paramId = pDb->getObjectId(OdDbHandle(2534));
OdString formula;
OdResult res = pDb->getFamilyManager()->getFormula(paramId, formula);
if (res == eOk) {
// do something
}
else {
// do something else
}
その結果、以下の数式が得られます。
L"roundup((Shadow_Length / 1 mm) * tan(Rel_Angle)) * 1 mm"
数式を取得するもう1つの方法は、getFormula()メソッドを使用することです。ファミリーパラメータから数式を取得する例:
#include "Database/BmDatabase.h"
#include "Database/Entities/BmParamElem.h"
OdBmDatabasePtr pDb = pHostAppServices->readFile(L"rac_advanced_sample_family.rfa");
OdBmParamElemPtr pParamElem = pDb->getObjectId(OdDbHandle(2534)).safeOpenObject();
OdString formula;
if (pParamElem->getFormula(formula) == eOk) {
// do something
}
else {
// do something else
}
OdBmFamilyManagerクラスのgetFormula()メソッドとOdBmParamElemクラスのgetFormula()メソッドは、どちらも内部的に同じアクションを実行するため、その実行結果は同じです。
これら2つのメソッドの使用法の違いは、パラメータのタイプによって異なります。パラメータがファミリパラメータの場合は、OdBmFamilyManagerクラスのメソッドを使用します。パラメータのタイプが不明な場合(ファミリまたはグローバル)は、OdBmParamElemクラスのメソッドを使用します。
グローバルパラメータから数式を取得する
グローバルパラメータから数式を取得できます。この場合、グローバルパラメータはRVT形式で存在し、ファミリマネージャにアクセスできない可能性があるため、OdBmFamilyManagerは使用できません。OdBmParamElemGlobalケースに特化した実装を含むOdBmParamElemクラスのメソッドを使用します(メソッドの説明は前のセクションで説明されています)。
グローバルパラメータから数式を取得する例:
#include "Database/BmDatabase.h"
#include "Database/Entities/BmParamElemGlobal.h"
OdBmDatabasePtr pDb = pHostAppServices->readFile(
L"BIM_Projekt_Golden_Nugget-Architektur_und_Ingenieurbau.rvt");
const OdBmObjectId paramId = pDb->getObjectId(OdDbHandle(2685889));
OdBmParamElemGlobalPtr pGlobalParam = paramId.safeOpenObject();
OdString formula;
OdResult res = pGlobalParam->getFormula(formula);
if (res == eOk) {
// do something
}
else {
// do something
}
選択されたグローバルパラメータに式がないため、結果のOdString数式は空です。
例
TB_CommandsのBmGetFormulaCmdコマンドの例を参照してください:
#include "Database/Entities/BmParamElemGlobal.h"
#include "Database/Managers/BmFamilyManager.h"
void _BmGetFormulaCmd_func(OdEdCommandContext* pCmdCtx) {
OdBmCommandContextPtr pDbCmdCtx(pCmdCtx);
OdBmDatabasePtr pDb = pDbCmdCtx->database();
OdSmartPtr pIO = pDbCmdCtx->userIO();
const OdInt32 inputId = pIO->getInt(OD_T("Enter parameter ID in decimal system:"), OdEd::kInpDefault, -1);
if (inputId == -1) {
return;
}
const OdBmObjectId paramId = pDb->getObjectId(OdDbHandle(inputId));
if (paramId.isNull()) {
return;
}
OdBmParamElemPtr pParamElem = OdBmParamElem::cast(paramId.openObject());
if (pParamElem.isNull()) {
pIO->putString(OD_T("Invalid input. ID must belong to a class derived from OdBmParamElem"));
return;
}
OdString formula;
OdResult result = pParamElem->getFormula(formula);
if (result == eOk) {
pIO->putString(OD_T("Formula: ") + formula);
}
else {
pIO->putString(OD_T("Failed to retrieve formula: ") + OdError(result).description());
}
}
OdBmFamilyManagerクラスのgetFormula()メソッドの使用例は、OdaBimAppアプリケーションの例にあるFamilyTypesDialogで見つけることができます。
当社のドキュメントで詳細情報を見つけることができます。