CAD modelinin bağlı yüzlerini bulma

oy
48

İki tip sac metal CAD model yüzüm var; ModelFace (PLANAR yüzleri) ve ModelBend (NON-PLANAR, ModelFaces arasında bulunur ve bir sacın kıvrımlarını temsil eder). Bu yüzler ayrı vektörlerde saklanır. Yapmak istediğim her virajın bağlandığı yüzleri bulmak. Her yüze ve büküme pozitif ve sıfır olmayan bir tamsayı kimliği atanır. İstenen çıktı şu şekildedir:

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

Bu, yarıçapı 4 mm olan dirsek 1'in yüz 1 ve yüz 2'yi 90 derecelik bir açıyla birleştirdiği anlamına gelir. Ancak, ben onların biçimi (adım / igs) ne olursa olsun çoğu model için aşağıda gösterilen bir sonuç alıyorum:

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

Gibi bir sonuç F3---B2---F0 programın B2'nin yüz 3'e bağlı olduğunu tespit ettiği, ancak diğer bağlı yüzü tanımlayamadığı ve bu nedenle F0 değerinin tespit edildiği anlamına gelir. Ayrıca bazı modeller için bir çıktı olabilir F0---B2---F0 bu da kıvrım 2'ye bağlanan hiçbir yüz bulunmadığı anlamına gelir.

Hem yüz tarafından paylaşılan kenarın hem de kıvrımların benzer kenar olarak algılanmadığı anlaşılmaktadır, yani kenar çizgilerinin uç noktaları aynı değildir veya bir boşlukla ayrılır ve tolerenstan daha büyüktür. Modelleri Autodesk Inventor ve SolidWorks kullanarak çizdim. FreeCad'de bile izledim ve kenarları ne kadar yakınlaştırsam da önemli değil.

Bir büküm, aşağıdaki şemada gösterildiği gibi yüzlere bağlanan iki düz çizgi kenarına sahiptir:

resim Bu benim ilk çözüm oldu ama tüm bağlantıları yakalamıyor örneğin bazı virajlar bir kenarda bir yüzüne bağlı değil diğer kenarda bilgi alıyorum:

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 Forumunda bulunan başka bir çözüm:

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 () ilk kez çalıştırıldıktan sonra ikinci çözüm çöker.

Sorun, belgelerin MapShapesAndUniqueAncestors () ve GetAdjacentFace () hakkında ne söylediğini anlamadığım için olabilir:

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

Haritadaki M mağazalar, her biri için TS tipi S'nin tüm alt şekillerini, TA tipi tüm benzersiz ataları listeye ekler. Örneğin, tüm kenarları eşleyin ve yüz listesini bağlayın. useOrientation = True: ata yönünü dikkate alarak Uyarı: Harita ilk başta temizlenmez.

Dokümanlar üzerinde düzeltme veya daha iyi bir çözüm ve / veya netlik konusunda yardıma ihtiyacınız var. Şimdiden teşekkürler.

Oluştur 06/04/2020 saat 12:12
kaynak kullanıcı
Diğer dillerde...                            

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