Teigha Publishを使用して3Dモデルに事前定義されたコントロールを追加する

はじめに

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オブジェクトの下部にあります。ビューの選択は、対応するボタンをクリックすることで行われます。矢印は、ビューのリストを前後にスクロールするために使用されます。例を以下に示します。

image1

関数 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 関数の結果を示しています。

image2

パーツのリスト

パーツリストを作成するには、以下の関数を使用します。

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番目の列はモデル内に存在するそのようなパーツの数量です。テーブルヘッダーは、対応する関数パラメータによって設定されます。テーブルの文字列が選択されると、対応する詳細がハイライト表示されます。ハイライト表示をオフにするには、モデル表示ウィンドウの空の領域をダブルクリックします。パーツリストの例を以下に示します。

image3

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つの部分で構成されています。上部はプロパティ名、下部はプロパティ値です。プロパティリストの例を以下に示します。

image4

3Dモデル要素が選択されると、リストにはその要素の名前と値のペアが入力されます(要素にプロパティがある場合)。

個別のテキストフィールド内の要素プロパティ

関数はこちらです。

void setPropertyToTextField(const OdString& property_name, const OdTextFieldPtr text_field);

この関数は、3Dモデルで選択されたオブジェクトの property_name プロパティ値をテキストフィールド text_field に出力します。要素にこの名前のプロパティがない場合、テキストフィールドは空のままになります。テキストフィールドに出力されたプロパティの例を以下に示します。

image5

 

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す