引言
要在ODA Publish中使用动画和一些预定义控件,您需要获取唯一的节点名称并能够为节点设置属性。本文概述了如何使用此功能。
从3D模型获取节点名称
要将动画与Publish SDK一起使用,您需要知道节点的唯一名称,以便更改其颜色、可见性和移动集。下面是一个用于移动节点“Car_08_4.a0d4eb333557af83ada02ad56b4ba54da02a60”的JavaScript代码片段示例。
var node = scene.nodes.getByName('Car_08_4.a0d4eb333557af83ada02ad56b4ba54da02a60');
var transform_matrix = node.transform;
transform_matrix.translateInPlace(new Vector3(12, 0, 0));
有关在Publish SDK中使用动画的更多信息,请参阅Publish SDK文档(需要登录)。
零件列表的预定义控件也需要节点名称列表。
void setPartsList(const OdStringArray node_names, const OdRect& location, const OdStringArray& headers, const OdDoubleArray& columns,
const OdTextFieldPtr text_style, const OdTextFieldPtr header_style);
有关在Publish SDK中使用零件列表的更多信息,请参阅Publish SDK文档。
要获取节点名称列表,可以使用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模型中检索所有节点的列表。没有表示项的元素不能用于创建动画或零件列表。通过更改CalculateUniqueNames函数,您可以获取3D模型任何部分的零件列表。
更改3D模型元素的属性以用于属性列表
要使用预定义的属性列表控件(见下文),您必须为3D模型元素设置相应的属性。
属性规范代码示例如下:
OdPrcObjectPtr objPO = productOccurrence->referencesOfProductOccurrence().getSonProductOccurrences()[idx].openObject();
OdPrcProductOccurrencePtr pPO = (OdPrcProductOccurrence *) objPO.get(); ODA_ASSERT(!pPO.isNull());
OdPrcAttributeData attrdata = pPO->attributeData();
OdPrcAttributeArray &attrArr = attrdata.attributes();
OdPrcAttribute* newAttribute = attrArr.append();
// create pair
OdPrcContentSingleAttribute attributeDataPair;
attributeDataPair.setData(data);
// add pair to attribute
newAttribute->AddDataPair(attributeDataPair);
OdPrcAttributeEntry title;
title.setData(strTitle);
newAttribute->SetTitle(title);