Εύρεση συνδεδεμένων προσώπων ενός μοντέλου CAD

ψήφοι
0

Έχω δύο τύπους λαμαρίνας μοντέλα CAD Faces. ModelFace (πρόσοψη PLANAR) και ModelBend (NON-PLANAR, υπάρχουν μεταξύ ModelFaces και αντιπροσωπεύουν τις στροφές ενός φύλλου). Αυτά τα πρόσωπα αποθηκεύονται σε ξεχωριστά διανύσματα. Αυτό που θέλω να κάνω είναι να βρω τα πρόσωπα στα οποία συνδέεται κάθε στροφή. Σε κάθε πρόσωπο και στροφή έχει ένα θετικό και μη μηδενικό ακέραιο αναγνωριστικό. Η επιθυμητή έξοδος είναι κάπως έτσι:

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

Αυτό σημαίνει ότι η κάμψη 1, της ακτίνας 4mm συνδέει την όψη 1 και την όψη 2 σε γωνία 90 μοιρών και ούτω καθεξής. Ωστόσο, λαμβάνω ένα αποτέλεσμα που εμφανίζεται παρακάτω για τα περισσότερα μοντέλα ανεξάρτητα από τη μορφή τους (βήμα / 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

Ένα αποτέλεσμα σαν F3---B2---F0 σημαίνει ότι το πρόγραμμα έχει εντοπίσει ότι το B2 είναι συνδεδεμένο στην όψη 3 αλλά δεν αναγνωρίζει την άλλη συνδεδεμένη όψη, εξ ου και την τιμή F0. Επίσης για κάποιο μοντέλο μπορεί να είναι μια έξοδος F0---B2---F0 που σημαίνει ότι δεν βρέθηκε πρόσωπο που να συνδέεται με την κάμψη 2.

Φαίνεται ότι το άκρο που μοιράζεται τόσο το πρόσωπο όσο και οι στροφές δεν ανιχνεύονται ως παρόμοιο άκρο, δηλαδή τα τελικά σημεία των ακμών δεν είναι τα ίδια ή χωρίζονται από ένα διάστημα μεγαλύτερο από την αντοχή. Έχω σχεδιάσει τα μοντέλα χρησιμοποιώντας το Autodesk Inventor και το SolidWorks. Τους έχω δει ακόμη και στο FreeCad και ανεξάρτητα από το πόσο ζουμ είναι συνδεδεμένες οι άκρες.

Μια στροφή έχει δύο ευθείες άκρες που συνδέονται με πρόσωπα όπως φαίνεται στο παρακάτω διάγραμμα:

εισάγετε Αυτή ήταν η αρχική μου λύση, αλλά δεν καταγράφει όλες τις συνδέσεις, π.χ. λαμβάνω πληροφορίες ότι ορισμένες στροφές συνδέονται με ένα πρόσωπο στη μία άκρη και όχι στην άλλη άκρη:

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

        }
      }
    }
  }
}

Μια άλλη λύση που βρέθηκε στο 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......... 
        }
      }
    }
  }
}

Η δεύτερη λύση διακόπτεται μετά την εκτέλεση του GetAdjacentFace () για πρώτη φορά.

Το πρόβλημα μπορεί να οφείλεται στο ότι δεν καταλαβαίνω τι λένε τα έγγραφα σχετικά με το MapShapesAndUniqueAncestors () και το GetAdjacentFace ():

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

Αποθηκεύει στο χάρτη M όλο το υποσύνολο του S του τύπου TS για καθένα προσαρτά στη λίστα όλους τους μοναδικούς προγόνους του τύπου TA. Για παράδειγμα χαρτογραφήστε όλες τις άκρες και συνδέστε τη λίστα των προσώπων. useOrientation = True: λαμβάνοντας υπόψη τον προσανατολισμό των προγόνων Προειδοποίηση: Ο χάρτης δεν διαγράφεται στην αρχή.

Χρειάζεστε βοήθεια με μια διόρθωση ή καλύτερη λύση ή / και σαφήνεια στα έγγραφα. Ευχαριστώ εκ των προτέρων.

Δημοσιεύθηκε 06/04/2020 στις 12:12
πηγή χρήστη
Σε άλλες γλώσσες...                            

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