A CAD modell csatlakoztatott felületeinek megkeresése

szavazat
46

Kétféle típusú fémlemez CAD modell van: Arcok; A ModelFace (PLANAR arcok) és a ModelBend (NON-PLANAR, léteznek a ModelFaces között és egy fémlemez hajlítását képviselik). Ezeket az arcokat különálló vektorokban tárolják. Azt akarom csinálni, hogy megtaláljam azokat az arcokat, amelyekhez az egyes kanyarok kapcsolódnak. Mindegyik arc és kanyar pozitív és nulla egész szám azonosítóval van ellátva. A kívánt kimenet valami ilyen:

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

Ez azt jelenti, hogy az 1 kanyar, a 4 mm sugár összekapcsolja az 1. és a 2. oldalt 90 fokos szögben és így tovább. Ugyanakkor az alább bemutatott eredményt kapok a legtöbb modell számára, formátumtól függetlenül (lépés / 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

Olyan eredmény, mint F3---B2---F0 azt jelenti, hogy a program észlelte, hogy a B2 csatlakozik a 3. oldalhoz, de nem azonosítja a másik csatlakoztatott arcot, tehát az F0 érték. Néhány modellnél a kimenet is lehet F0---B2---F0 ami azt jelenti, hogy nem található olyan arc, amely összekötné a 2. kanyarral.

Úgy tűnik, hogy az arc és a kanyarok által megosztott szélt nem észlelik hasonló élként, azaz a szélvonalak végpontjai nem azonosak, vagy egy szóközzel elválasztva nagyobb, mint a tolarencia. Rajzoltam a modelleket az Autodesk Inventor és a SolidWorks segítségével. Még a FreeCad-ben is megnéztem őket, és nem számítom, mennyire nagyítom az éleket.

A kanyar két egyenes vonallal rendelkezik, amelyek az alábbiak szerint ábrázoltak az arcokkal:

írja Ez volt a kezdeti megoldásom, de nem fedi le az összes kapcsolatot, pl. Információkat kapok arról, hogy egyes kanyarok az egyik oldalán egy archoz vannak csatlakoztatva, a másik oldalon nem:

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

        }
      }
    }
  }
}

Egy másik megoldás található az OpenCascade fórumon :

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

A második megoldás a GetAdjacentFace () első végrehajtása után összeomlik.

A probléma azért lehet, mert nem értem, mit mondanak a dokumentumok a MapShapesAndUniqueAncestors () és a GetAdjacentFace () vonatkozásában:

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

Az M térképen tárolt összes TS S típusú alfajtja mindegyikhez hozzáteszi a listához az összes TA típusú egyedi ősöt. Például térképezze fel az összes szélt és kösse össze az arcok listáját. useOrientation = True: figyelembe véve az ősei tájolását Figyelem: A térkép nem kerül törlésre.

Segítségre van szüksége a javításhoz vagy jobb megoldáshoz és / vagy a dokumentumok egyértelműségéhez. Előre is köszönöm.

A kérdést 06/04/2020 12:12
a forrás felhasználó
Más nyelveken...                            

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