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