Trouver les faces connectées d'un modèle CAO

voix
46

J'ai deux types de modèles CAO de tôles : Faces ; ModelFace (faces PLANAR) et ModelBend (NON-PLANAR, existent entre les ModelFaces et représentent les courbures d'une tôle). Ces faces sont stockées dans des vecteurs séparés. Ce que je veux faire, c'est trouver les faces auxquelles chaque coude se connecte. Chaque face et chaque coude se voit attribuer un ID entier positif et non nul. La sortie souhaitée est quelque chose comme ceci :

F1----B1-----F2 Angle : 90  Radius : 4
F2----B2-----F3 Angle : 90  Radius : 4

Cela signifie que le coude 1, de rayon 4 mm, relie la face 1 et la face 2 à un angle de 90 degrés, etc. Cependant, j'obtiens le résultat ci-dessous pour la plupart des modèles, quel que soit leur format (pas/igs) :

F1---B1---F2 Angle : 90 Radius : 4
F3---B2---F0 Angle : 0 Radius : 4
F4---B3---F5 Angle : 90 Radius : 1
F0---B4---F0 Angle : 0 Radius : 1

Un résultat de ce type F3---B2---F0signifie que le programme a détecté que B2 est connecté à la face 3 mais qu'il ne parvient pas à identifier l'autre face connectée, d'où la valeur F0. Pour certains modèles, une sortie peut également être F0---B2---F0obtenue, ce qui signifie qu'aucune face connectée au coude 2 n'a été trouvée.

Il semble que l'arête partagée par la face et les coudes ne soit pas détectée comme une arête similaire, c'est-à-dire que les points d'extrémité des lignes d'arête ne sont pas identiques ou sont séparés par un espace est supérieure à la tolérance. J'ai dessiné les modèles en utilisant Autodesk Inventor et SolidWorks. Je les ai visualisés même dans FreeCad et, quel que soit le degré de zoom, les bords sont connectés.

Un coude a deux arêtes droites qui se connectent à des faces comme le montre le schéma ci-dessous :

enter C'était ma solution initiale, mais elle ne tient pas compte de toutes les connexions, par exemple, je reçois des informations selon lesquelles certains coudes sont reliés à une face sur un bord et non sur l'autre bord :

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......... 
            }
          }

        }
      }
    }
  }
}

Une autre solution trouvée sur le forum OpenCascade :

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......... 
        }
      }
    }
  }
}

La deuxième solution se bloque après avoir exécuté GetAdjacentFace() pour la première fois

Le problème pourrait venir du fait que je ne comprends pas ce que les docs disent sur MapShapesAndUniqueAncestors() et GetAdjacentFace() :

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

Stocke dans la carte M toutes les sous-formes de S de type TS pour chaque on ajoute à la liste tous les ancêtres uniques de type TA. Par exemple cartographier tous les bords et lier la liste des faces. useOrientation = True : en tenant compte de l'orientation de l'ancêtre Avertissement : La carte n'est pas a d'abord été autorisé.

Besoin d'aide pour une correction ou une meilleure solution et/ou de clarté sur les documents. Merci d'avance.

Créé 06/04/2020 à 12:12
source utilisateur
Dans d'autres langues...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more