使用公式时,您可以从族参数和全局参数中获取公式的文本表示。
公式在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() 方法的示例。
您可以在我们的文档中找到更多信息。