はじめに
Teigha Publishを使用して3Dモデルのドキュメントを迅速に作成するために、すぐに使用できる基本的なコントロールを実装する一連の関数を持つOdAnnotationクラスがあります。これらのコントロールは次のことができます。
- 3Dモデルビューを切り替える
- 3Dモデル要素リストを表示し、それらの要素を選択する
- 選択した要素のプロパティリストを表示する
- 特定の要素のプロパティをテキストフィールドに表示する
カルーセルボタン
3Dモデルビューを切り替えるために使用できるボタンのグループを作成するには、次の2つの関数を使用します。
void setCarouselButtons(const OdStringArray& button_names, const OdString& previous_button_name, const OdString& next_button_name, OdUInt16 scroll_size);
と
void setCarouselViews(const OdUInt32Array& indices, const OdImagePtrArray& images);
このボタンのグループは、OdAnnotationオブジェクトの下部にあります。ビューの選択は、対応するボタンをクリックすることで行われます。矢印は、ビューのリストを前後にスクロールするために使用されます。例を以下に示します。
関数 setCarouselButtons は、ボタン名、および必要に応じて(オプションで)リストを前後に移動するボタンを設定します。リストボタン名は、追加のアクション(リスト表示だけでなく)を設定するためにも使用できます。この関数によって設定される最後のパラメータは、リスト表示のステップです。
関数 setCarouselViews は、対応する OdArtworkPtr オブジェクト内のビューインデックス配列と、ボタン用の画像配列を設定します。画像配列は、OdPrcPreviewGenerator クラスオブジェクトを使用して 3D モデルから取得できます。
OdStreamBufPtr pStreamPrc = odrxSystemServices()->createFile(sIn, Oda::kFileRead);
OdStaticRxObject<OdExPrcHostAppServices> prcHostAppServ;
OdPrcFilePtr pPrcFile = prcHostAppServ.readFile(pStreamPrc);
OdGiRasterImagePtrArray arrRasImg;
OdPrcPreviewGeneratorPtr pPreviewGen = OdPrcPreviewGenerator::createObject();
ODA_VERIFY(pPreviewGen->init(pDb) == eOk);
pPreviewGen->setBackground(ODRGB(192, 220, 248));
pPreviewGen->setBitmapSize(286, 150);
ODA_VERIFY(pPreviewGen->generatePreviewSet(arrRasImg) == eOk);
ビューのリスト
3Dモデルのビューを切り替えるには、別の関数ペアがあります。
void setViewList(const OdRect& location, const OdListBoxPtr& list);
OdListBox オブジェクトにビューのリストを作成し、このオブジェクトを所定の位置に設定します。
void setViewListByField(const OdString& field);
名前付きビューのリストを含む OdListBox オブジェクトを作成します。この名前は OdAnnotation オブジェクトの右上部分に表示されます。このリスト(右上)から項目を選択すると、ビューが選択されます。下の図の上部は setViewListByField 関数の結果を示し、下部は setViewList 関数の結果を示しています。
パーツのリスト
パーツリストを作成するには、以下の関数を使用します。
void setPartsList(const OdStringArray node_names, const OdRect& location, const OdStringArray& headers, const OdDoubleArray& columns,
const OdTextFieldPtr text_style, const OdTextFieldPtr header_style);
3Dモデルのパーツリストを含む3つの列で構成されるテーブルを作成します。最初の列は番号、2番目の列はパーツ名、3番目の列はモデル内に存在するそのようなパーツの数量です。テーブルヘッダーは、対応する関数パラメータによって設定されます。テーブルの文字列が選択されると、対応する詳細がハイライト表示されます。ハイライト表示をオフにするには、モデル表示ウィンドウの空の領域をダブルクリックします。パーツリストの例を以下に示します。
setPartsList 関数のパラメータである名前リスト (OdStringArray node_names) には、3D モデルから取得したノード名のリストが含まれている必要があります。選択機能を提供するには、これらのノードにジオメトリモデルが含まれている必要があります。パーツ名のリストを取得するには、CalculateUniqueNames 関数を使用できます。
void traverseTree(OdPrcProductOccurrencePtr productOccurrence, OdStack<OdPrcProductOccurrencePtr> &stackPO)
{
OdString name = productOccurrence->name().name();
int count = productOccurrence->referencesOfProductOccurrence().getSonProductOccurrences().size();
for (int idx = 0; idx < count; ++idx)
{
// - child.traverse
OdPrcObjectPtr objPO = productOccurrence->referencesOfProductOccurrence().getSonProductOccurrences()[idx].openObject();
OdPrcProductOccurrencePtr pPO = (OdPrcProductOccurrence *) objPO.get(); ODA_ASSERT(!pPO.isNull());
OdString name1 = pPO->name().name();
traverseTree(pPO, stackPO);
}
const OdPrcPartDefinition *pPartDef = productOccurrence->getPartDefinition();
if(pPartDef)
{
const OdPrcObjectIdArray &rItemArr = pPartDef->representationItem();
if(0 != rItemArr.size())
stackPO.push(productOccurrence);
}
}
OdStringArray CalculateUniqueNames(const OdPrcFilePtr &pPrcFile)
{
OdStringArray arrOutStr;
if (!pPrcFile.isNull())
{
const OdPrcObjectIdArray &roots = pPrcFile->modelFileData().getStartRootOccurrences();
OdUInt32 countRoots = roots.size();
for (OdUInt32 idx = 0; idx < countRoots; idx++)
{
OdPrcProductOccurrencePtr rootProductOccurrence = pPrcFile->modelFileData().getStartRootOccurrences()[idx].safeOpenObject();
if (!rootProductOccurrence.isNull())
{
OdStack<OdPrcProductOccurrencePtr> stackPO;
traverseTree(rootProductOccurrence, stackPO);
while(!stackPO.empty())
{
if (stackPO.top())
{
OdPrcProductOccurrencePtr &pTopPO = *stackPO.top();
if (!pTopPO.isNull())
{
arrOutStr.push_back(pTopPO->calculateUniqueName(NULL));
}
}
stackPO.pop();
}
}
}
}
return arrOutStr;
}
プロパティのリスト
3Dモデル要素のすべてのプロパティをリスト表示するコントロールを作成するには、以下の関数を使用します。
void setPropertyList(const OdRect& location);
このリストの各項目は2つの部分で構成されています。上部はプロパティ名、下部はプロパティ値です。プロパティリストの例を以下に示します。
3Dモデル要素が選択されると、リストにはその要素の名前と値のペアが入力されます(要素にプロパティがある場合)。
個別のテキストフィールド内の要素プロパティ
関数はこちらです。
void setPropertyToTextField(const OdString& property_name, const OdTextFieldPtr text_field);
この関数は、3Dモデルで選択されたオブジェクトの property_name プロパティ値をテキストフィールド text_field に出力します。要素にこの名前のプロパティがない場合、テキストフィールドは空のままになります。テキストフィールドに出力されたプロパティの例を以下に示します。