BimRv SDKで要素をフィルタリングして収集するには、開発者はOdBmElementCollectorクラスを使用して、一連の基準を満たす要素を収集できます。OdBmIteratorクラスは、述語またはフィルター規則と連携して使用することもできます。
- OdBmElementCollector — 一連の基準を満たすデータベース内の要素を収集します。Database/BmElementCollector.hで定義されています。
一般的なメソッド:- OdBmElementCollector& wherePasses(const OdBmFilterRulePtr& pRule) — コレクターに要素フィルターを適用します。
- OdBmElementPtrArray collect() const — フィルターを通過した要素のセットを返します。
- OdBmElementCollector& ofCategory(OdBm::BuiltInCategory::Enum category) — コレクターにElementCategoryFilterを適用します。
- OdBmElementCollector& ofClass(const OdTfClass* pClass) — コレクターにElementClassFilterを適用します。
- OdBmElementCollector::iterator_type getElementIterator() const — 収集された要素への要素イテレーター (OdBmElementIterator) を返します。
- OdBmIterator — 型Tのオブジェクトのイテレーターを定義するクラステンプレートです。Common/BmIterator.hで定義されています。イテレーターの一般的なメソッド:
- T object() — イテレーターが指すオブジェクトを返します。
- bool done() — 繰り返し処理するオブジェクトがこれ以上ない場合にtrueを返します。
- bool next() — 配列内の次の要素を返します。
- OdBmIterator::pointer_type clone() — イテレーターのクローンを返します。
- OdArray< T > collect() — 繰り返し処理されたオブジェクトの配列を返します。
- OdBmIterator::pointer_type filter() — イテレーターのクローンを作成し、クローン内の各オブジェクトにフィルター条件を適用します。
- OdBmElementIterator — このイテレーターは、データベース内の要素を繰り返し処理するために使用されます。Database/Entities/BmElemTable.hで定義されています。
- OdBmElemTableIterator — OdBmElementIteratorの公開子孫です。Database/Entities/BmElemTable.hで定義されています。
OdBmElemTableIteratorを作成するには、OdBmDatabase::newElemTableIterator()メソッドを使用します。
OdBmElementCollectorクラスとOdBmIteratorクラスの主な違いは、OdBmIteratorが設計上ステートレスであり、collect()メソッドがイテレーターを終了させる点です(以下の例を参照)。OdBmElementCollectorはデータを保持します。
イテレータを複数回使用するには、collect() または next() メソッドを呼び出す前にクローンを作成するだけです。
OdBmElementIteratorPtr pElementsIt = pDb->newElemTableIterator()->filter(pCategoryRule);
OdBmElementIteratorPtr pElementsItClone = pElementsIt->clone();
次の例は、データベース内の要素を反復処理およびフィルタリングするプロセスを示しています。
サンプルファイルには7つのダクト曲線が含まれていますが、コメントに「foo」が含まれているのはそのうちの1つだけです。
要素のカテゴリのフィルタリングルールを構築するには:
OdBmDatabasePtr pDb = app->readFile(L"sample_file.rvt");
// Create filter rule based on OST_DuctCurves category
OdBmFilterCategoryRulePtr pCategoryRule = OdBmFilterCategoryRule::createObject();
pCategoryRule->addCategory(pDb->getObjectId(OdBm::BuiltInCategory::OST_DuctCurves, true));
// Collect elements using category rule
{
// Create new ElemTable iterator and call filter method to get iterator of Elements that pass the filter rule
OdBmElementIteratorPtr pElementsIt = pDb->newElemTableIterator()->filter(pCategoryRule);
// Collect filtered elements into array
OdBmElementPtrArray elements = pElementsIt->collect();
// Please notice that the elements1 array will be empty, because iterator is stateless by design
OdBmElementPtrArray elements1 = pElementsIt->collect();
}
要素のコメントプロパティの文字列ルールを構築するには:
// Create Parameter value provider
OdBmParameterValueProviderPtr pParamEvalProvider = OdBmParameterValueProvider::createObject();
// Set flags and properties
pParamEvalProvider->setElemOrSymbol(1);
pParamEvalProvider->setParameter(OdBmParameterId(pDb->getObjectId(OdBm::BuiltInParameter::ALL_MODEL_INSTANCE_COMMENTS, true)));
// Create string rule with Equal evaluator
OdBmFilterStringRulePtr pStringRule = OdBmFilterStringRule::createObject();
pStringRule->setValueProvider(pParamEvalProvider);
OdBmFilterStringEqualsPtr pEvaluator = OdBmFilterStringEquals::createObject();
pStringRule->setEvaluator(pEvaluator);
pStringRule->setRuleString(L"foo");
カテゴリと文字列ルールを使用して要素をフィルタリングするには:
OdBmElementIteratorPtr pElementsIt = pDb->newElemTableIterator()->filter(pCategoryRule)->filter(pStringRule);
OdBmElementPtrArray elements = pElementsIt->collect();
OdBmElementCollector を使用して要素を収集するには:
OdBmDatabasePtr pDb_ = app->readFile(L"rooms.rvt");
// Create a filter rule for anything with ROOM_NAME that isn't "CLOSET"
OdBmParameterValueProviderPtr pParamEvalProvider = OdBmParameterValueProvider::createObject();
pParamEvalProvider->setElemOrSymbol(1);
pParamEvalProvider->setParameter(OdBmParameterId(pDb_->getObjectId(OdBm::BuiltInParameter::ROOM_NAME, true)));
OdBmFilterStringRuleEvaluatorPtr pEvaluator = OdBmFilterStringEquals::createObject();
OdBmFilterStringRulePtr pStringRule = OdBmFilterStringRule::createObject();
pStringRule->setValueProvider(pParamEvalProvider);
pStringRule->setEvaluator(pEvaluator);
pStringRule->setRuleString("CLOSET");
OdBmFilterInverseRulePtr pInverter = OdBmFilterInverseRule::createObject();
pInverter->setInnerRule(pStringRule);
// Get elements without a ROOM_NAME of "CLOSET"
OdBmElementCollector pFilterTest5 = OdBmElementCollector(pDb_).wherePasses(pInverter);
OdBmElementPtrArray arr5 = pFilterTest5.collect();
// Create a rule to filter out all rooms
OdBmFilterCategoryRulePtr pCategoryRule = OdBmFilterCategoryRule::createObject();
pCategoryRule->addCategory(pDb_->getObjectId(OdBm::BuiltInCategory::OST_Rooms, true));
// Get only rooms without a ROOM_NAME of "CLOSET"
OdBmElementCollector pFilterTest6 = pFilterTest5.wherePasses(pCategoryRule);
// Do the same by combining calls of wherePasses()
OdBmElementCollector pFilterTest7 = OdBmElementCollector(pDb_).wherePasses(pInverter).wherePasses(pCategoryRule);
// Get all elements of OdBm::BuiltInCategory::OST_Rooms category
OdBmElementCollector pFilterTest8 = OdBmElementCollector(pDb_).ofCategory(OdBm::BuiltInCategory::OST_Rooms);
// Get all elements of OdBmRoomElem class
OdBmElementCollector pFilterTest9 = OdBmElementCollector(pDb_).ofClass(OdBmRoomElem::desc());
OdBmIterator で述語を使用して要素を収集する
また、イテレータと連携して述語を使用することもできます。例:
struct c_elemHandle : std::unary_function<OdBmElementPtr, bool> {
c_elemHandle(OdBm::BuiltInCategory::Enum category)
: m_hndl(OdDbHandle(category)) {}
bool operator()(const OdBmElementPtr& pObj) const {
return m_hndl == pObj->getCategroryId().getHandle();
}
private:
OdDbHandle m_hndl;
};
OdBmElementIteratorPtr pElementsIt =
pDb->newElemTableIterator()->filter(c_elemHandle(OdBm::BuiltInCategory::OST_Rooms));
フィルター ルールを作成するために使用される評価子を含む、クラスとメソッドの詳細については、BimRv ドキュメント (ログインが必要です) を参照してください。