Teigha BIM 中的元素可以具有内置参数。要获取元素的所有内置参数,可以使用此方法:
void getListParams(OdBuiltInParamArray& aParams) const;
每个具有参数的类都实现该方法并将其参数添加到数组中。如果类添加了参数,它也负责参数的值,并且如果访问参数以获取其值,它必须处理该参数。
众所周知,有一组用于获取参数值的方法:
OdResult getParam(const OdBm::BuiltInParameter::Enum& parameterId, double& value) const;
OdResult getParam(const OdBm::BuiltInParameter::Enum& parameterId, OdInt32& value) const;
OdResult getParam(const OdBm::BuiltInParameter::Enum& parameterId, OdString& value) const;
OdResult getParam(const OdBm::BuiltInParameter::Enum& parameterId, OdBmObjectId& value) const;
如果您不知道值的类型,则需要使用最常用的方法:
OdResult getParam(const OdBm::BuiltInParameter::Enum& parameterId, OdTfVariant& value) const;
BmParamsCmd 命令是处理元素内置参数的一个示例。您可以在 TB_DevGuideCommands 中找到该命令,并通过选择 Edit -> Registered Commands -> Parameters -> BmParamsCmd 在 OdaBimApp 中运行它。
OdBmElementPtr pElem = pDb->getObjectId(OdDbHandle(OdUInt64(iHandle))).safeOpenObject();
OdBuiltInParamArray aParams;
pElem->getListParams(aParams);
OdBmAUnitsPtr pUnits = pDb->getUnits();
for (OdBuiltInParamArray::iterator it = aParams.begin(); it != aParams.end(); it++)
{
OdString mesBP;
mesBP.format(OD_T("%s: "), OdBm::BuiltInParameter(*it).toString().c_str());
OdBmParamElemPtr pParamElem = pDb->getObjectId(*it).safeOpenObject();
OdBmParamDefPtr pDescParam = pParamElem->getParamDef();
OdBm::UnitType::Enum utEnum = pDescParam->getUnitType();
OdString mes;
OdTfVariant value;
OdResult res = pElem->getParam(*it, value);
if (res == eOk)
{
OdVariant::Type odType = value.type();
switch (odType) {
case OdVariant::kInt32: {
if (utEnum > -2)
mes.format(OD_T("integer %i asString %s"), value.getInt32(), OdBmLabelUtilsEnModule::format(*pUnits, utEnum, value.getInt32()).c_str());
else
mes.format(OD_T("integer %i"), value.getInt32());
} break;
case OdVariant::kDouble: {
mes.format(OD_T("double %f asString %s"), value.getDouble(), OdBmLabelUtilsEnModule::format(*pUnits, utEnum, value.getDouble()).c_str());
} break;
case OdVariant::kString: {
mes.format(OD_T("string %s"), value.getString().c_str());
} break;
default: {
if (odType == OdTfVariant::kDbStubPtr) {
OdDbStub* pStub = value.getDbStubPtr();
if (pStub)
{
OdBmObjectId rawValue = OdBmObjectId(pStub);
mes.format(OD_T("id %lld"), (OdUInt64)(rawValue.getHandle()));
}
else
mes.format(OD_T("0"));
}
}}
pIO->putString(mesBP + mes);
}
else
{
mes.format(OD_T(" Invalid param. OdResult %i"), res);
pIO->putString(mesBP + mes);
}
}