Ясность в использовании TopOpeBRepBuild_Tools :: GetAdjacentFace и TopExp :: MapShapesAndUniqueAncestors - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть два типа CAD-моделей из листового металла Faces; ModelFace (грани PLANAR) и ModelBend (НЕ-ПЛАНАРНЫЕ, существуют между ModelFaces и представляют изгибы листового металла). Эти лица хранятся в отдельных векторах. Я хочу найти грани, с которыми соединяется каждый изгиб.

Изгиб имеет два ребра прямой линии, которые соединяются с гранями, как показано на рисунке ниже:

enter image description here Это было мое первоначальное решение, но оно не захватывает все соединения, например, я получаю информацию о том, что некоторые изгибы связаны с гранью на одном ребре, а не на другом ребре:

for (auto& bend: mModelBends){
  for (auto& edge: bend.getFaceEdges()){
    if (edge.getEdgeType() == EdgeType::LINE) {
      TopoDS_Edge anEdge = edge.getTModelEdge(); // returns a TopoDS_Edge from the edge object

      for (auto& face: mModelFaces)
      {
        if (face.getFaceType() == FaceType::NONE) {
          TopoDS_Face aFace = face.getTModelFace(); // returns a TopoDS_Face from the face object

          for( TopExp_Explorer anExp(aFace, TopAbs_EDGE); anExp.More(); anExp.Next()) {
            if(anExp.Current().IsSame(anEdge)) {
              // Do something......... 
            }
          }

        }
      }
    }
  }
}

Другое решение, найденное на OpenCascade Forum :

TopTools_IndexedDataMapOfShapeListOfShape edgeFaceMap;

// mModelShape is a TopoDS_Shape with the entire model
TopExp::MapShapesAndAncestors(mModelShape, TopAbs_EDGE, TopAbs_FACE, edgeFaceMap);

for (auto& bend: mModelBends){
  for (auto& edge: bend.getFaceEdges()){
    if (edge.getEdgeType() == EdgeType::LINE) {
      TopoDS_Edge anEdge = edge.getTModelEdge();
      TopoDS_Shape anAdjFaceObj;

      // Find adjacent face
      for (auto& a : mModelFaces)
      {
        bool faceFound = TopOpeBRepBuild_Tools::GetAdjacentFace(a.getTModelFace(), anEdge,
        edgeFaceMap, anAdjFaceObj);

        if (faceFound)
        {
           // Do something......... 
        }
      }
    }
  }
}

Второе решение дает сбой после первого выполнения GetAdjacentFace ().

Проблема может заключаться в том, что я не понимаю, что документы говорят о MapShapesAndUniqueAncestors () и GetAdjacentFace ():

 TopExp::MapShapesAndUniqueAncestors(const TopoDS_Shape &S,
        const TopAbs_ShapeEnum  TS,
        const TopAbs_ShapeEnum  TA,
        TopTools_IndexedDataMapOfShapeListOfShape &M,
        const Standard_Boolean  useOrientation = Standard_False
    )   

Хранит на карте M все формы S типа TS для каждого добавьте в список всех уникальных предков типа TA. Например, сопоставьте все ребра и свяжите список граней. useOrientation = True: с учетом ориентации предка. Предупреждение: сначала карта не очищается.

Нужна помощь с исправлением или лучшим решением и ясностью в документах. Заранее спасибо.

...