Esempio n. 1
0
            private eOrientation Orientation(FaceGeom f1, FaceGeom f2)
            {
                var val = eOrientation.Indefini;

                if (f1.Type == eTypeFace.Plan && f2.Type == eTypeFace.Plan)
                {
                    val = Orientation(f1.Origine, f1.Normale, f2.Origine, f2.Normale);
                }
                else if (f1.Type == eTypeFace.Plan && (f2.Type == eTypeFace.Cylindre || f2.Type == eTypeFace.Extrusion))
                {
                    gPlan P = new gPlan(f2.Origine, f2.Direction);
                    if (P.SurLePlan(f1.Origine, 1E-10) && P.SurLePlan(f1.Origine.Composer(f1.Normale), 1E-10))
                    {
                        val = eOrientation.Coplanaire;
                    }
                }
                else if (f2.Type == eTypeFace.Plan && (f1.Type == eTypeFace.Cylindre || f1.Type == eTypeFace.Extrusion))
                {
                    gPlan P = new gPlan(f1.Origine, f1.Direction);
                    if (P.SurLePlan(f2.Origine, 1E-10) && P.SurLePlan(f2.Origine.Composer(f2.Normale), 1E-10))
                    {
                        val = eOrientation.Coplanaire;
                    }
                }


                return(val);
            }
Esempio n. 2
0
            private gPlan RechercherFaceProfil(List <FaceGeom> listeFaceGeom, ref List <FaceGeom> faceExt)
            {
                gPlan?p = null;

                try
                {
                    // On recherche les faces de la section
                    foreach (var fg in listeFaceGeom)
                    {
                        if (EstUneFaceProfil(fg))
                        {
                            faceExt.Add(fg);

                            // Si c'est un cylindre ou une extrusion, on recupère le plan
                            if ((p == null) && (fg.Type == eTypeFace.Cylindre || fg.Type == eTypeFace.Extrusion))
                            {
                                p = new gPlan(fg.Origine, fg.Direction);
                            }
                        }
                    }

                    // S'il n'y a que des faces plane, il faut calculer le plan de la section
                    // a partir de deux plan non parallèle
                    if (p == null)
                    {
                        gVecteur?v1 = null;
                        foreach (var fg in faceExt)
                        {
                            if (v1 == null)
                            {
                                v1 = fg.Normale;
                            }
                            else
                            {
                                var vtmp = ((gVecteur)v1).Vectoriel(fg.Normale);
                                if (Math.Abs(vtmp.Norme) > 1E-8)
                                {
                                    p = new gPlan(fg.Origine, vtmp);
                                }
                            }
                        }
                    }
                }
                catch (Exception e) { this.LogErreur(new Object[] { e }); }

                return((gPlan)p);
            }
Esempio n. 3
0
            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 }); }
            }