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