使用ODA Publish准备用于文档创建的3D (PRC) 模型

引言

要在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模型元素设置相应的属性。

 

image1

 

属性规范代码示例如下:

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);

今天就开始行动

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

免费试用