Nalezení propojených ploch modelu CAD

hlasů
46

Mám dva typy CAD modelů plechů Faces; ModelFace (obličeje PLANAR) a ModelBend (NON-PLANAR, existují mezi ModelFaces a představují ohyby plechu). Tyto tváře jsou uloženy v samostatných vektorech. Co chci udělat, je najít tváře, s nimiž se každý ohyb spojí. Každému obličeji a ohybu je přiřazeno kladné a nenulové celé číslo. Požadovaný výstup je něco podobného:

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

To znamená, že ohyb 1 o poloměru 4 mm spojuje plochu 1 a plochu 2 pod úhlem 90 stupňů atd. Nicméně pro většinu modelů se zobrazuje níže uvedený výsledek bez ohledu na jejich formát (krok / ig):

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

Výsledek jako F3---B2---F0 znamená, že program zjistil, že B2 je připojen k obličeji 3, ale nedokáže identifikovat další připojený obličej, a proto hodnotu F0. Také u některých modelů může být výstup F0---B2---F0 což znamená, že nebyla nalezena žádná tvář, která by se spojila s ohybem 2.

Zdá se, že hrana sdílená jak čelem, tak ohyby není detekována jako podobná hrana, tj. Koncové body okrajových čar nejsou stejné nebo jsou odděleny mezerou větší než tolarence. Modely jsem nakreslil pomocí aplikací Autodesk Inventor a SolidWorks. Díval jsem se na ně dokonce ve FreeCadu a bez ohledu na to, jak moc zvětšuji okraje, které jsou spojeny.

Ohyb má dva přímé hrany, které se připojují k plochám, jak je znázorněno na obrázku níže:

zde Toto bylo moje počáteční řešení, ale nezachycuje všechna spojení, např. Získávám informace, že některé ohyby jsou spojeny s obličejem na jedné hraně a nikoli na druhé hraně:

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

        }
      }
    }
  }
}

Další řešení na fóru 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......... 
        }
      }
    }
  }
}

Druhé řešení havaruje po prvním spuštění GetAdjacentFace ().

Problém může být proto, že nerozumím tomu, co dokumenty říkají o MapShapesAndUniqueAncestors () a GetAdjacentFace ():

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

Uloží na mapě M všechny dílčí tvary S typu TS pro každý z nich připojí k seznamu všechny jedinečné předky typu TA. Například namapujte všechny hrany a spojte seznam ploch. useOrientation = True: s ohledem na orientaci předků Varování: Mapa není nejprve vymazána.

Potřebujete pomoc s opravou nebo lepším řešením a / nebo jasností v dokumentech. Díky předem.

Položena 06/04/2020 v 12:12
zdroj uživatelem
V jiných jazycích...                            

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