private void AnalyserFaces() { try { List <FaceGeom> ListeFaceCorps = new List <FaceGeom>(); // Tri des faces pour retrouver celles issues de la même foreach (var Face in Corps.eListeDesFaces()) { var faceExt = new FaceGeom(Face); Boolean Ajouter = true; foreach (var f in ListeFaceCorps) { // Si elles sont identiques, la face "faceExt" est ajoutée à la liste // de face de "f" if (f.FaceExtIdentique(faceExt)) { Ajouter = false; break; } } // S'il n'y avait pas de face identique, on l'ajoute. if (Ajouter) { ListeFaceCorps.Add(faceExt); } } List <FaceGeom> ListeFaceGeom = new List <FaceGeom>(); PlanSection = RechercherFaceProfil(ListeFaceCorps, ref ListeFaceGeom); ListeFaceSectionInt = TrierFacesConnectees(ListeFaceGeom); // Plan de la section et infos { var v = PlanSection.Normale; Double X = 0, Y = 0, Z = 0; Corps.GetExtremePoint(v.X, v.Y, v.Z, out X, out Y, out Z); ExtremPoint1 = new gPoint(X, Y, Z); v.Inverser(); Corps.GetExtremePoint(v.X, v.Y, v.Z, out X, out Y, out Z); ExtremPoint2 = new gPoint(X, Y, Z); } // ================================================================================= // On recherche la face exterieure // s'il y a plusieurs boucles de surfaces if (ListeFaceSectionInt.Count > 1) { { // Si la section n'est composé que de cylindre fermé Boolean EstUnCylindre = true; ListFaceGeom Ext = null; Double RayonMax = 0; foreach (var fg in ListeFaceSectionInt) { if (fg.ListeFaceGeom.Count == 1) { var f = fg.ListeFaceGeom[0]; if (f.Type == eTypeFace.Cylindre) { if (RayonMax < f.Rayon) { RayonMax = f.Rayon; Ext = fg; } } else { EstUnCylindre = false; break; } } } if (EstUnCylindre) { FaceSectionExt = Ext; ListeFaceSectionInt.Remove(Ext); } else { FaceSectionExt = null; } } { // Methode plus longue pour determiner la face exterieur if (FaceSectionExt == null) { // On créer un vecteur perpendiculaire à l'axe du profil var vect = this.PlanSection.Normale; if (vect.X == 0) { vect = vect.Vectoriel(new gVecteur(1, 0, 0)); } else { vect = vect.Vectoriel(new gVecteur(0, 0, 1)); } vect.Normaliser(); // On récupère le point extreme dans cette direction Double X = 0, Y = 0, Z = 0; Corps.GetExtremePoint(vect.X, vect.Y, vect.Z, out X, out Y, out Z); var Pt = new gPoint(X, Y, Z); // La liste de face la plus proche est considérée comme la peau exterieur du profil Double distMin = 1E30; foreach (var Ext in ListeFaceSectionInt) { foreach (var fg in Ext.ListeFaceGeom) { foreach (var f in fg.ListeSwFace) { Double[] res = f.GetClosestPointOn(Pt.X, Pt.Y, Pt.Z); var PtOnSurface = new gPoint(res); var dist = Pt.Distance(PtOnSurface); if (dist < 1E-6) { distMin = dist; FaceSectionExt = Ext; break; } } } if (FaceSectionExt.IsRef()) { break; } } // On supprime la face exterieur de la liste des faces ListeFaceSectionInt.Remove(FaceSectionExt); } } } else { FaceSectionExt = ListeFaceSectionInt[0]; ListeFaceSectionInt.RemoveAt(0); } } catch (Exception e) { this.LogErreur(new Object[] { e }); } }