Trovare le facce collegate di un modello CAD

voti
0

Ho due tipi di modelli CAD in lamiera Faces; ModelFace (facce PLANAR) e ModelBend (NON-PLANAR, esistono tra ModelFaces e rappresentano le curve di una lamiera). Queste facce sono memorizzate in vettori separati. Quello che voglio fare è trovare le facce a cui ogni curva si collega. Ad ogni faccia e curva viene assegnato un ID positivo e non zero intero. L'output desiderato è qualcosa del genere :

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

Significa che la curva 1, di raggio 4mm, collega la faccia 1 e la faccia 2 ad un angolo di 90 gradi e così via. Tuttavia, sto ottenendo un risultato mostrato qui sotto per la maggior parte dei modelli indipendentemente dal loro formato (step/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 risultato come F3---B2---F0questo significa che il programma ha rilevato che B2 è collegato alla faccia 3 ma non riesce ad identificare l'altra faccia collegata e quindi il valore F0. Anche per alcuni modelli può essere un'uscita, il F0---B2---F0che significa che non è stata trovata nessuna faccia che si collega alla faccia 2.

Sembra che il bordo condiviso sia dalla faccia che dalle curve non sia stato rilevato come bordo simile, cioè i punti finali delle linee di bordo non sono gli stessi o sono separati da uno spazio è maggiore della tolarence. Ho disegnato i modelli utilizzando Autodesk Inventor e SolidWorks. Li ho visti anche in FreeCad e non importa quanto sia collegato lo zoom dei bordi.

Una curva ha due bordi in linea retta che si collegano alle facce come mostrato nel diagramma qui sotto:

enter Questa è stata la mia soluzione iniziale, ma non cattura tutte le connessioni, ad esempio, sto ricevendo l'informazione che alcune curve sono collegate ad una faccia su un bordo e non sull'altro:

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

        }
      }
    }
  }
}

Un'altra soluzione trovata su 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......... 
        }
      }
    }
  }
}

La seconda soluzione va in crash dopo aver eseguito GetAdjacentFace() per la prima volta

Il problema potrebbe essere dovuto al fatto che non capisco cosa dicono i documenti su MapShapesAndUniqueAncestors() e GetAdjacentFace():

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

Memorizza nella mappa M tutte le sotto-forme di S di tipo TS per ogni un'appendice alla lista tutti gli antenati unici di tipo TA. Per esempio mappare tutti i bordi e legare l'elenco delle facce. useOrientation = True : tenendo conto dell'orientamento degli antenati Attenzione: La mappa non è all'inizio.

Ho bisogno di aiuto per una correzione o una migliore soluzione e/o chiarezza sui documenti. Grazie in anticipo.

È pubblicato 06/04/2020 alle 12:12
fonte dall'utente
In altre lingue...                            

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