OpenCascade создает древовидное представление информации внутри шагового файла.

Чтобы прочитать все фигуры в моем пошаговом файле, мне удалось извлечь все фигуры с помощью STEPControl_reader. Теперь я хочу найти способ (OCAF/XDE?) Извлечь древовидное представление, содержащее форму, содержащуюся в другой.

Может ли кто-нибудь дать несколько указателей на примеры извлечения этой информации в пошаговом файле с использованием 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();}

Метод ребилдаAssemblyTree выглядит так:

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

person Valimo Ral    schedule 27.11.2018    source источник
comment
Я нашел здесь пример извлечения информации о дереве из проекта Mayo Mayo. Я также заметил, что этот код не может извлечь название продукта, как это делает FreeCAD.   -  person Valimo Ral    schedule 11.12.2018
comment
Есть ли у вас новости по этой теме? Я также заинтересован в создании древовидного представления файла шага. Спасибо.   -  person Bub Espinja    schedule 18.02.2019


Ответы (1)


Вы можете использовать класс XCAFPrs_DocumentExplorer для стекового обхода в OCCT 7.4.0+ и следующий фрагмент кода (на основе команды 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;
  }
person gkv311    schedule 13.02.2020