c++ - OpenCascade 在步骤文件内生成信息的树形 View

标签 c++ step opencascade

为了读取步骤文件中的所有形状,我已成功使用 STEPControl_reader 提取了所有形状。 现在我想找到一种方法(OCAF/XDE?)来提取一个 TreeView ,其中包含另一个形状所包含的形状。

任何人都可以提供一些使用 OCAF 或 XDE 在步骤文件中提取这些信息的示例。 我很难理解官方文档,因为它缺乏示例。

编辑: 通过使用 Mayo 项目: 您可以使用 XdeDocumentItem::XdeDocumentItem(...) 构造函数并递归创建节点。

XdeDocumentItem::XdeDocumentItem(const Handle_TDocStd_Document &doc)
: m_cafDoc(doc),
  m_shapeTool(XCAFDoc_DocumentTool::ShapeTool(doc->Main())),
  m_colorTool(XCAFDoc_DocumentTool::ColorTool(doc->Main())){
this->rebuildAssemblyTree();}

rebuildAssemblyTree 方法如下:

for (const TDF_Label& rootLabel : this->topLevelFreeShapes())
    this->deepBuildAssemblyTree(0, rootLabel);

最佳答案

您可以在 OCCT 7.4.0+ 中使用类 XCAFPrs_DocumentExplorer 进行类似堆栈的遍历,并使用以下代码片段(基于 XDisplay Draw Harness 命令)进行遍历:递归函数调用:

  //! Handle document root shapes.
  int traverseDocument (const Handle(TDocStd_Document)& theDoc)
  {
    TDF_LabelSequence aLabels;
    XCAFDoc_DocumentTool::ShapeTool (theDoc->Main())->GetFreeShapes (aLabels);
    for (TDF_LabelSequence::Iterator aLabIter (myLabels); aLabIter.More(); aLabIter.Next())
    {
      const TDF_Label& aLabel = aLabIter.Value();
      if (traverseLabel (aLabel, "", TopLoc_Location()) == 1)
      {
        return 1;
      }
    }
    return 0;
  }

  //! Handle single label.
  int traverseLabel (const TDF_Label& theLabel,
                     const TCollection_AsciiString& theNamePrefix,
                     const TopLoc_Location& theLoc)
  {
    TCollection_AsciiString aName;
    {
      Handle(TDataStd_Name) aNodeName;
      if (theLabel.FindAttribute (TDataStd_Name::GetID(), aNodeName))
      {
        aName = aNodeName->Get(); // instance name
      }
      if (aName.IsEmpty())
      {
        TDF_Label aRefLabel;
        if (XCAFDoc_ShapeTool::GetReferredShape (theLabel, aRefLabel)
         && aRefLabel.FindAttribute (TDataStd_Name::GetID(), aNodeName))
        {
          aName = aNodeName->Get(); // product name
        }
      }
    }
    aName = theNamePrefix + aName;

    TDF_Label aRefLabel = theLabel;
    XCAFDoc_ShapeTool::GetReferredShape (theLabel, aRefLabel);
    if (XCAFDoc_ShapeTool::IsAssembly (aRefLabel))
    {
      aName += "/";
      const TopLoc_Location aLoc = theLoc * XCAFDoc_ShapeTool::GetLocation (theLabel);
      for (TDF_ChildIterator aChildIter (aRefLabel); aChildIter.More(); aChildIter.Next())
      {
        if (traverseLabel (aChildIter.Value(), aName, aLoc) == 1)
        {
          return 1;
        }
      }
      return 0;
    }
    std::cout << aName << " ";
    return 0;
  }

关于c++ - OpenCascade 在步骤文件内生成信息的树形 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53497247/

相关文章:

c++ - for-lops 如何在 C++ 示例 : calculating hashes 中准确工作

Excel Vba从2个单元格值创建数组,步长为1

c++ - 无法在 vs2017 的 linux 子系统上包含 header

php - 如何使用 get_object_vars 获取属性的层次顺序?

c++ - QObject::connect: occQt.cpp:324 中没有这样的插槽 QWidget::makeyourbox()

python - 如何在 pythonOCC 中使用样条线?

c++ - OpenGL 扩展问题

C++ 11 GCC 4快速优化不在堆栈中存储抽象类的实现类

c++ - 获取MySQL查询返回数据的类型

neo4j - 符合 neo4j 中的模式