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