简介
为了使用 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 对象的底部。通过单击相应的按钮执行视图选择。箭头用于来回滚动视图列表。示例如下所示。
函数 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 模型零件。第一列是编号,第二列是零件名称,第三列是模型中此类零件的数量。表头由相应的函数参数设置。当选择表格字符串时,相应的详细信息会突出显示。要关闭突出显示,请双击模型显示窗口中的空白区域。零件列表示例如下所示。
名称列表 (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);
此列表的每个项目都包含两部分:上面是属性名称,下面是属性值。属性列表示例如下所示。
当选择 3D 模型元素时,列表将填充该元素的名称-值对(如果该元素具有属性)。
单独文本字段中的元素属性
函数如下:
void setPropertyToTextField(const OdString& property_name, const OdTextFieldPtr text_field);
此函数将 3D 模型中选定对象的 property_name 属性值输出到文本字段 text_field。如果元素没有此名称的属性,则文本字段将保持为空。属性输出到文本字段的示例如下所示。