BimRv SDK: 数式テキスト表現の取得

数式を扱う際、ファミリパラメータとグローバルパラメータから数式テキスト表現を取得できます。

数式はRVTおよびRFA形式で一連の式として表現されます。各式は数式の一部、いわゆるトークンを担当します。トークンは、特定の文字で区切られた文字列のより小さな断片です。式には、文字列、数値、演算子(二項または単項)、関数、または上記のすべてを含む部分式が含まれる場合があります。

式の連鎖から数式を文字列に戻すには、保存されたデータに応じて、すべての依存する式を下から上にたどり、正しく処理します。

ファミリーパラメータから数式を取得する

数式を取得する方法の1つは、getFormula()メソッドを使用することです。このメソッドを使用するには、RFA形式を扱う際に作成できるOdBmFamilyManagerクラスのオブジェクトが必要です。

指定された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"

数式を取得するもう1つの方法は、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()メソッドは、どちらも内部的に同じアクションを実行するため、その実行結果は同じです。

これら2つのメソッドの使用法の違いは、パラメータのタイプによって異なります。パラメータがファミリパラメータの場合は、OdBmFamilyManagerクラスのメソッドを使用します。パラメータのタイプが不明な場合(ファミリまたはグローバル)は、OdBmParamElemクラスのメソッドを使用します。

グローバルパラメータから数式を取得する

グローバルパラメータから数式を取得できます。この場合、グローバルパラメータはRVT形式で存在し、ファミリマネージャにアクセスできない可能性があるため、OdBmFamilyManagerは使用できません。OdBmParamElemGlobalケースに特化した実装を含むOdBmParamElemクラスのメソッドを使用します(メソッドの説明は前のセクションで説明されています)。

グローバルパラメータから数式を取得する例:

#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日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す