使用 Teigha Publish 为 3D 模型添加预定义控件

简介

为了使用 Teigha Publish 快速创建 3D 模型文档,有一个 OdAnnotation 类,其中包含一组函数,可实现即用型基本控件,这些控件可以:

  • 切换 3D 模型视图
  • 显示 3D 模型元素列表并选择这些元素
  • 显示所选元素的属性列表
  • 在文本字段中显示特定元素的属性

轮播按钮

要创建一组用于在 3D 模型视图之间切换的按钮,请使用以下两个函数:

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 模型零件。第一列是编号,第二列是零件名称,第三列是模型中此类零件的数量。表头由相应的函数参数设置。当选择表格字符串时,相应的详细信息会突出显示。要关闭突出显示,请双击模型显示窗口中的空白区域。零件列表示例如下所示。

image3

名称列表 (OdStringArray node_names) 是 setPartsList 函数参数,应包含从 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);

此列表的每个项目都包含两部分:上面是属性名称,下面是属性值。属性列表示例如下所示。

image4

当选择 3D 模型元素时,列表将填充该元素的名称-值对(如果该元素具有属性)。

单独文本字段中的元素属性

函数如下:

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

此函数将 3D 模型中选定对象的 property_name 属性值输出到文本字段 text_field。如果元素没有此名称的属性,则文本字段将保持为空。属性输出到文本字段的示例如下所示。

image5

 

今天就开始行动

免费试用 ODA 软件 60 天。
无风险,无需信用卡。

免费试用