[ブログに戻る](/ja/blog) # BimRv SDK: 数式テキスト表現の取得

Dmytro Kabenok 11月 02, 2023 [\#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>

数式を扱う際、ファミリパラメータとグローバルパラメータから数式テキスト表現を取得できます。

数式は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で見つけることができます。

[当社のドキュメント](https://docs.opendesign.com/tbim/bimrv_formula.html)で詳細情報を見つけることができます。

## 今すぐ始める

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

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