Znalezienie połączonych powierzchni modelu CAD

głosy
46

Mam dwa rodzaje blachowych modeli CAD Faces; ModelFace (powierzchnie PLANAR) i ModelBend (NON-PLANAR, istnieją pomiędzy ModelFaces i reprezentują zagięcia blachy). Powierzchnie te są przechowywane w oddzielnych wektorach. To co chcę zrobić, to znaleźć twarze, z którymi łączy się każde zgięcie. Każdej powierzchni i zagięciu przypisany jest dodatni i niezerowy identyfikator liczby całkowitej. Pożądane wyjście to coś takiego :

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

Oznacza to, że łuk 1, o promieniu 4 mm łączy twarz 1 i twarz 2 pod kątem 90 stopni itd. Jednak otrzymuję wynik pokazany poniżej dla większości modeli niezależnie od ich formatu (krok/krok) :

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

Wynik taki F3---B2---F0oznacza, że program wykrył, że B2 jest połączony z twarzą 3, ale nie potrafi zidentyfikować drugiej połączonej twarzy stąd wartość F0. Również dla niektórych modeli może być F0---B2---F0wyjście, co oznacza, że nie znaleziono twarzy, która łączy się z zakrętem 2.

Wygląda na to, że krawędź wspólna dla obu stron nie jest wykrywana jako podobna, tzn. punkty końcowe linii brzegowych nie są takie same lub są oddzielone spacją większą od tolarencji. Narysowałem modele za pomocą programów Autodesk Inventor i SolidWorks. Przeglądałem je nawet w programie FreeCad i bez względu na to, jak bardzo powiększam krawędzie są połączone.

Zakręt ma dwie proste linie brzegowe, które łączą się z powierzchniami czołowymi, jak pokazano na rysunku poniżej:

enter To było moje wstępne rozwiązanie, ale nie wychwytuje ono wszystkich połączeń, np. otrzymuję informację, że niektóre zakręty są połączone z twarzą na jednej krawędzi, a nie na drugiej:

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

        }
      }
    }
  }
}

Kolejne rozwiązanie znalezione na 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......... 
        }
      }
    }
  }
}

Drugie rozwiązanie zawiesza się po pierwszym wykonaniu GetAdjacentFace()

Problem może wynikać z tego, że nie rozumiem co mówią dokumenty o MapShapesAndUniqueAncestors() i GetAdjacentFace():

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

Zapisuje na mapie M wszystkie podkatalogi typu S TS dla każdego z nich jeden dodatek do listy wszystkich unikalnych przodków typu TA. Na przykład mapuj wszystkie krawędzie i opraw listę twarzy. useOrientation = Prawdziwa : biorąc pod uwagę orientację przodków Ostrzeżenie: Mapa nie jest na początku oczyszczone.

Potrzebna jest pomoc przy korekcie lub lepszym rozwiązaniu i/lub przejrzystości w dokumentach. Dziękuję z góry.

Utwórz 06/04/2020 o 12:12
źródło użytkownik
W innych językach...                            

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