Suche nach verbundenen Flächen eines CAD-Modells

stimmen
0

Ich habe zwei Arten von Blech-CAD-Modellen Faces; ModelFace (PLANAR-Flächen) und ModelBend (NON-PLANAR, existieren zwischen ModelFaces und stellen die Biegungen eines Blechs dar). Diese Flächen werden in getrennten Vektoren gespeichert. Es geht darum, die Flächen zu finden, mit denen jede Biegung verbunden ist. Jeder Fläche und Biegung wird eine positive und nicht null ganze ID zugewiesen. Die gewünschte Ausgabe ist etwa wie folgt:

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

Das bedeutet, dass die Biegung 1 mit einem Radius von 4 mm die Fläche 1 und die Fläche 2 in einem 90-Grad-Winkel verbindet, und so weiter. Ich erhalte jedoch ein Ergebnis, das unten für die meisten Modelle unabhängig von ihrem Format (step/igs) gezeigt wird:

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

Ein Ergebnis wie F3---B2---F0bedeutet, dass das Programm erkannt hat, dass B2 mit Fläche 3 verbunden ist, aber die andere verbundene Fläche nicht identifizieren kann, daher der F0-Wert. Bei einigen Modellen kann auch ein Ausgang seinF0---B2---F0, was bedeutet, dass keine Fläche gefunden wurde, die mit Biegung 2 verbunden ist.

Es scheint, dass die Kante, die sowohl von der Fläche als auch von den Biegungen geteilt wird, nicht als ähnliche Kante erkannt wird, d.h. die Endpunkte der Kantenlinien sind nicht gleich oder durch einen Zwischenraum getrennt, der größer als die Toleranz ist. Ich habe die Modelle mit Autodesk Inventor und SolidWorks gezeichnet. Ich habe sie sogar in FreeCad betrachtet, und egal, wie sehr ich zoome, die Kanten sind miteinander verbunden.

Eine Biegung hat zwei geradlinige Kanten, die wie in der Abbildung unten dargestellt an Flächen anschließen:

enter Das war meine ursprüngliche Lösung, aber sie erfasst nicht alle Verbindungen, z.B. erhalte ich die Information, dass einige Biegungen an einer Kante mit einer Fläche verbunden sind und nicht an der anderen Kante:

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

        }
      }
    }
  }
}

Eine weitere Lösung wurde im OpenCascade Forum gefunden:

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

Die zweite Lösung stürzt ab, nachdem GetAdjacentFace() zum ersten Mal ausgeführt wurde

Das Problem könnte daran liegen, dass ich nicht verstehe, was in den Dokumenten über MapShapesAndUniqueAncestors() und GetAdjacentFace() gesagt wird:

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

Speichert in der Karte M alle Unterformen von S vom Typ TS für jede ein der Liste alle einzigartigen Vorfahren des Typs TA anhängen. Zum Beispiel alle Kanten abbilden und die Liste der Flächen binden. useOrientation = True : unter Berücksichtigung der Ahnenorientierung Warnung: Die Karte ist nicht zunächst geräumt.

Ich brauche Hilfe bei einer Korrektur oder einer besseren Lösung und/oder Klarheit über die Dokumente. Vielen Dank im Voraus.

Veröffentlicht am 06/04/2020 um 12:12
quelle vom benutzer
In anderen Sprachen...                            

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