सीएडी मॉडल के जुड़े हुए चेहरे खोजना

वोट
0

मेरे पास दो प्रकार की शीट धातु सीएडी मॉडल चेहरे हैं; ModelFace (PLANAR चेहरे) और ModelBend (NON-PLANAR, ModelFaces के बीच मौजूद हैं और एक शीटमेटल के मोड़ का प्रतिनिधित्व करते हैं)। ये चेहरे अलग-अलग वैक्टर में जमा होते हैं। मैं जो करना चाहता हूं वह उन चेहरों को ढूंढना है जो प्रत्येक मोड़ से जुड़ते हैं। प्रत्येक चेहरे और मोड़ को एक सकारात्मक और गैर शून्य पूर्णांक आईडी सौंपा गया है। वांछित आउटपुट कुछ इस तरह है:

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

मतलब कि त्रिज्या 4 मिमी का 1 मोड़, चेहरे 1 को और चेहरे को 90 डिग्री के कोण पर और इसी तरह जोड़ता है। हालाँकि, मुझे अधिकांश मॉडलों के लिए उनके प्रारूप (चरण / अंजीर) की परवाह किए बिना नीचे दिखाया गया है:

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 इसका मतलब है कि कार्यक्रम ने पता लगाया है कि बी 2 3 से जुड़ा हुआ है, लेकिन अन्य जुड़े चेहरे की पहचान करने में विफल रहता है इसलिए एफ 0 मूल्य। साथ ही कुछ मॉडल के लिए आउटपुट हो सकता है 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 फोरम पर पाया गया एक और समाधान:

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 () निष्पादित करने के बाद दूसरा समाधान क्रैश हो जाता है।

समस्या यह हो सकती है क्योंकि मुझे समझ नहीं आ रहा है कि डॉक्स मैपशैप्सएंड यूनीक आइनसॉस्टर्स () और गेटएडेकेंटफेस () के बारे में क्या कह रहे हैं:

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

मानचित्र में स्टोर, प्रत्येक टी के लिए टाइप टी के एस के सभी सब-मेप की सूची टाइप टीए के सभी अद्वितीय पूर्वजों के लिए। उदाहरण के लिए सभी किनारों को मैप करें और चेहरों की सूची को बांधें। 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