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());
  }
}

在 OdaBimApp 应用程序示例中的 FamilyTypesDialog 中可以找到使用 OdBmFamilyManager 类的 getFormula() 方法的示例。

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

今天就开始行动

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

免费试用