[返回博客](/cn/blog) # 使用 Teigha Publish 为 3D 模型添加预定义控件

Sergey Sorvenkov 二月 09, 2018 [\#publish](/cn/blog/tag/publish) [\#export](/cn/blog/tag/export) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

#### 简介

为了使用 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](/files/inline-images/image001_24.png)函数 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](/files/inline-images/image002_12.png)#### 零件列表

以下函数用于创建零件列表：

```
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](/files/inline-images/image003_14.png)名称列表 (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](/files/inline-images/image004_11.png)当选择 3D 模型元素时，列表将填充该元素的名称-值对（如果该元素具有属性）。

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

函数如下：

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

```

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

![image5](/files/inline-images/image005_9.png)

## 今天就开始行动

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

[免费试用](https://www.opendesign.com/cn/free-trial)
