[返回博客](/cn/blog) # BimRv SDK：获取公式文本表示

Dmytro Kabenok 十一月 02, 2023 [\#rvt](/cn/blog/tag/rvt) [\#rfa](/cn/blog/tag/rfa)

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

使用公式时，您可以从族参数和全局参数中获取公式文本表示。

公式在 RVT 和 RFA 格式中表示为一组表达式。每个表达式负责公式的一部分，即所谓的*标记*。标记是字符串中由特定字符分隔的较小片段。表达式可能包含字符串、数字、运算符（二元或一元）、函数或包含上述所有内容的子表达式。

要将公式从表达式链恢复为字符串，请从下到上遍历所有依赖表达式，并根据存储的数据正确处理它们。

#### 从族参数获取公式

获取公式的一种方法是使用 getFormula() 方法。要使用此方法，您需要一个 OdBmFamilyManager 类的对象，您可以在使用 RFA 格式时创建该对象。

从具有指定 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"
```

获取公式的另一种方法是使用 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() 方法在内部执行相同的操作，因此它们的执行结果是相同的。

使用这两种方法的区别取决于参数类型。如果参数是族参数，请使用 OdBmFamilyManager 类中的方法；如果参数类型未知（族或全局），请使用 OdBmParamElem 类中的方法。

#### 从全局参数获取公式

可以从全局参数获取公式。在这种情况下，不能使用 OdBmFamilyManager，因为全局参数可能存在于 RVT 格式中，而族管理器无法访问。请使用 OdBmParamElem 类中的方法，该方法包含 OdBmParamElemGlobal 情况的专门实现（该方法的描述在上一节中）。

从全局参数获取公式的示例：

```
#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://staging.opendesign.com/cn/free-trial)
