Finne tilkoblede ansikter til en CAD-modell

stemmer
46

Jeg har to typer CAD-modeller av ansikter; ModelFace (PLANAR-ansikter) og ModelBend (NON-PLANAR, eksisterer mellom ModelFaces og representerer bøyene til et arkmetall). Disse ansiktene er lagret i separate vektorer. Det jeg vil gjøre er å finne ansiktene som hver bøy kobles til. Hvert ansikt og bøy er tildelt en positiv og ikke null heltall ID. Den ønskede utgangen er noe som dette:

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

Dette betyr at bøy 1, med radius 4mm, forbinder ansikt 1 og ansikt 2 i 90 graders vinkel og så videre. Imidlertid får jeg et resultat vist nedenfor for de fleste modeller uavhengig av format (trinn / 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

Et resultat som F3---B2---F0 betyr at programmet har oppdaget at B2 er koblet til ansikt 3, men ikke klarer å identifisere den andre tilkoblede ansiktet derav F0-verdien. Også for noen modeller kan en utgang være F0---B2---F0 noe som betyr at det ikke ble funnet noe ansikt som kobles til bøy 2.

Det ser ut til at kanten som deles av både ansiktet og bøyene ikke blir oppdaget som lignende kant, dvs. at endepunktene på kantlinjene ikke er like eller atskilt med et rom er større enn tolarensen. Jeg har tegnet modellene ved hjelp av Autodesk Inventor og SolidWorks. Jeg har sett dem selv i FreeCad, og uansett hvor mye jeg zoomer er kantene koblet til.

En sving har to rettlinjede kanter som kobles til ansikter som vist i diagrammet nedenfor:

legg Dette var den første løsningen min, men det fanger ikke alle tilkoblingene, for eksempel får jeg informasjon om at noen bøyer er koblet til et ansikt på den ene kanten og ikke på den andre kanten:

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

        }
      }
    }
  }
}

En annen løsning funnet på 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......... 
        }
      }
    }
  }
}

Den andre løsningen krasjer etter å ha kjørt GetAdjacentFace () for første gang.

Problemet kan være fordi jeg ikke forstår hva dokumentene sier om MapShapesAndUniqueAncestors () og GetAdjacentFace ():

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

Lagrer på kartet M alle underformene til S av type TS for hver og en legger til listen alle unike aner fra type TA. For eksempel kartlegge alle kantene og bind listen over ansikter. useOrientation = True: tar hensyn til stamfarens retning Advarsel: Kartet er ikke slettet med det første.

Trenger du hjelp med en korreksjon eller bedre løsning og / eller klarhet i dokumentene. Takk på forhånd.

Publisert på 06/04/2020 klokken 12:12
kilden bruker
På andre språk...                            

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