BimRv SDK:获取公式文本表示

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

公式在 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 中找到。

您可以在我们的文档中找到更多信息。

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用