Het vinden van verbonden gezichten van een CAD-model

stemmen
0

Ik heb twee types van plaatwerk CAD modellen Faces; ModelFace (PLANAR vlakken) en ModelBend (NON-PLANAR, bestaan tussen de ModelFaces en vertegenwoordigen de bochten van een plaatmetaal). Deze vlakken worden in afzonderlijke vectoren opgeslagen. Wat ik wil doen is de vlakken vinden waar elke bocht mee verbonden is. Aan elk vlak en elke bocht wordt een positief en niet nul-geheel getal toegekend. De gewenste output is zoiets als dit:

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

Dat betekent dat bocht 1, van radius 4 mm, gezicht 1 en gezicht 2 onder een hoek van 90 graden met elkaar verbindt en zo verder. Ik krijg echter een resultaat dat hieronder wordt getoond voor de meeste modellen, ongeacht hun formaat (stap/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

Een resultaat als F3---B2---F0dit betekent dat het programma heeft gedetecteerd dat B2 is verbonden met gezicht 3, maar het andere verbonden gezicht niet identificeert vandaar de F0 waarde. Ook kan er voor sommige modellen een uitgang zijn, F0---B2---F0wat betekent dat er geen gezicht is gevonden dat verbonden is met bocht 2.

Het lijkt erop dat de rand gedeeld door zowel het gezicht als de bochten niet worden gedetecteerd omdat de eindpunten van de randlijnen niet gelijk zijn of gescheiden zijn door een spatie die groter is dan de tolarence. Ik heb de modellen getekend met behulp van Autodesk Inventor en SolidWorks. Ik heb ze zelfs in FreeCad bekeken en het maakt niet uit hoeveel ik de randen met elkaar verbind.

Een bocht heeft twee rechte lijnkanten die verbonden zijn met gezichten zoals in het onderstaande diagram:

enter Dit was mijn eerste oplossing, maar het legt niet alle verbindingen vast. Zo krijg ik bijvoorbeeld informatie dat sommige bochten verbonden zijn met een gezicht aan de ene kant en niet aan de andere kant:

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

        }
      }
    }
  }
}

Een andere oplossing gevonden op 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......... 
        }
      }
    }
  }
}

De tweede oplossing crasht na het uitvoeren van GetAdjacentFace() voor de eerste keer

Het probleem zou kunnen zijn dat ik niet begrijp wat de docs zeggen over MapShapesAndUniqueAncestors() en GetAdjacentFace():

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

Bewaart in de kaart M alle subvormen van S van het type TS voor elke een bijlage bij de lijst alle unieke voorouders van het type TA. Bijvoorbeeld breng alle randen in kaart en bind de lijst met gezichten. useOrientation = True : rekening houdend met de oriëntatie van de voorouder Waarschuwing: De kaart is niet in het begin.

Hulp nodig hebben met een correctie of betere oplossing en/of duidelijkheid over de docs. Alvast bedankt.

De vraag is gesteld op 06/04/2020 om 12:12
bron van user
In andere talen...                            

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