Găsirea fețelor conectate ale unui model CAD

voturi
0

Am două tipuri de modele CAD de tablă Fețe; ModelFace (fețe PLANAR) și ModelBend (NON-PLANAR, există între ModelFaces și reprezintă coturile unui tabel). Aceste fețe sunt stocate în vectori separați. Ce vreau să fac este să găsesc fețele cu care se leagă fiecare îndoire. Fiecare față și îndoire i se atribuie un ID întreg pozitiv și nenul. Rezultatul dorit este ceva de genul:

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

În sensul că îndoirea 1, cu raza 4mm, face legătura cu fața 1 și fața 2 la un unghi de 90 de grade și așa mai departe. Cu toate acestea, primesc un rezultat prezentat mai jos pentru majoritatea modelelor, indiferent de formatul lor (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 rezultat ca. F3---B2---F0 înseamnă că programul a detectat că B2 este conectat la fața 3, dar nu reușește să identifice cealaltă față conectată, deci valoarea F0. De asemenea, pentru un anumit model poate fi o ieșire F0---B2---F0 ceea ce înseamnă că nu a fost găsită nicio față care să se conecteze la îndoirea 2.

Se pare că marginea împărtășită atât de față, cât și de curburi nu sunt detectate ca muchie similară, adică punctele finale ale liniilor de margine nu sunt aceleași sau sunt separate de un spațiu mai mare decât toleranța. Am desenat modelele folosind Autodesk Inventor și SolidWorks. Le-am vizualizat chiar și în FreeCad și oricât de mult am zoom-urile sunt conectate.

O curbă are două muchii drepte care se conectează la fețe așa cum se arată în diagrama de mai jos:

introduceți Aceasta a fost soluția mea inițială, dar nu surprinde toate conexiunile, de exemplu, primesc informații despre faptul că unele coturi sunt conectate la o față de pe o margine și nu pe cealaltă margine:

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

        }
      }
    }
  }
}

O altă soluție găsită pe 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......... 
        }
      }
    }
  }
}

A doua soluție se prăbușește după executarea pentru prima dată a GetAdjacentFace ().

Problema s-ar putea pentru că nu înțeleg ce spun documentele despre 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
    )   

Stochează pe harta M toată sub-forma S din tipul TS pentru fiecare anexează la listă toți strămoșii unici de tip TA. De exemplu, hartați toate marginile și legați lista fețelor. useOrientation = True: ținând cont de orientarea strămoșului Avertisment: harta nu este ștersă la început.

Aveți nevoie de ajutor pentru o corecție sau o soluție mai bună și / sau claritate în documente. Mulțumesc anticipat.

Întrebat 06/04/2020 la 12:12
sursa de către utilizator
În alte limbi...                            

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