Пример #1
0
        //-------------------------------------------------
        protected override CResultAErreur MySerialize(sc2i.common.C2iSerializer serializer)
        {
            int            nVersion = GetNumVersion();
            CResultAErreur result   = serializer.TraiteVersion(ref nVersion);

            if (!result)
            {
                return(result);
            }
            serializer.TraiteString(ref m_strIdUniverselLien);
            if (serializer.Mode == ModeSerialisation.Lecture)
            {
                m_lien = null;
                m_strIdUniverselDest   = "";
                m_strIdUniverselSource = "";
            }
            int nCol = m_couleurLien.ToArgb();

            serializer.TraiteInt(ref nCol);
            m_couleurLien = Color.FromArgb(nCol);

            serializer.TraiteInt(ref m_nEpaisseurLien);

            if (nVersion >= 1)
            {
                int nModeSortie = (int)m_modeSortie;
                serializer.TraiteInt(ref nModeSortie);
                m_modeSortie = (EModeSortieLien)nModeSortie;
            }

            return(result);
        }
Пример #2
0
        /// //////////////////////////////////////////////////////////////
        protected override sc2i.common.CResultAErreur MySerialize(sc2i.common.C2iSerializer serializer)
        {
            int            nVersion = GetNumVersion();
            CResultAErreur result   = serializer.TraiteVersion(ref nVersion);

            if (!result)
            {
                return(result);
            }
            serializer.TraiteInt(ref m_nIdActionArrivee);
            serializer.TraiteInt(ref m_nIdActionDepart);
            int nX, nY;

            AssurePositionOk();

            nX = m_lastPointArrivee.X;
            nY = m_lastPointArrivee.Y;
            serializer.TraiteInt(ref nX);
            serializer.TraiteInt(ref nY);
            m_lastPointArrivee.X = nX;
            m_lastPointArrivee.Y = nY;

            nX = m_lastPointDepart.X;
            nY = m_lastPointDepart.Y;
            serializer.TraiteInt(ref nX);
            serializer.TraiteInt(ref nY);
            m_lastPointDepart.X = nX;
            m_lastPointDepart.Y = nY;

            if (nVersion > 0)
            {
                serializer.TraiteInt(ref m_nId);
            }
            else
            {
                if (m_process != null)
                {
                    m_nId = m_process.GetIdNouvelObjetDeProcess();
                }
                else
                {
                    m_nId = -1;
                }
            }

            if (nVersion >= 2)
            {
                int nTmp = (int)m_modeSortie;
                serializer.TraiteInt(ref nTmp);
                m_modeSortie = (EModeSortieLien)nTmp;
            }
            if (serializer.Mode == ModeSerialisation.Lecture)
            {
                m_bPositionInvalide = true;
            }

            return(result);
        }
Пример #3
0
        public static CLienTracable GetLien(Point pt1, Point pt2, EModeSortieLien modeSortie)
        {
            if (modeSortie == EModeSortieLien.Straight)
            {
                return(new CLienTracable(pt1, pt2));
            }
            List <CSegmentDroite> lstSegments = new List <CSegmentDroite>();
            double fAngle = Math.PI / 2;

            if (pt1.X == pt2.X)
            {
                fAngle = Math.PI / 2 * Math.Sign(pt2.Y * pt1.Y);
            }
            else
            {
                fAngle = Math.Atan((double)((pt2.Y - pt1.Y)) / (double)((pt2.X - pt1.X)));
            }
            if (modeSortie == EModeSortieLien.Automatic)
            {
                if (Math.Abs(fAngle) < Math.PI / 4)
                {
                    modeSortie = EModeSortieLien.Horizontal;
                }
                else
                {
                    modeSortie = EModeSortieLien.Vertical;
                }
            }
            if (modeSortie == EModeSortieLien.Horizontal)
            {
                lstSegments.Add(new CSegmentDroite(pt1, new Point(pt2.X, pt1.Y)));
                if (pt2.Y != pt1.Y)
                {
                    lstSegments.Add(new CSegmentDroite(new Point(pt2.X, pt1.Y), pt2));
                }
            }
            else
            {
                lstSegments.Add(new CSegmentDroite(pt1, new Point(pt1.X, pt2.Y)));
                if (pt2.X != pt1.X)
                {
                    lstSegments.Add(new CSegmentDroite(new Point(pt1.X, pt2.Y), pt2));
                }
            }
            CLienTracable lien = new CLienTracable();

            lien.AddPoint(lstSegments[0].Point1);
            foreach (CSegmentDroite segment in lstSegments)
            {
                lien.AddPoint(segment.Point2);
            }

            return(lien);
        }
Пример #4
0
        public static CLienTracable GetLienPourLier(Rectangle rct1, Rectangle rct2, EModeSortieLien mode)
        {
            CLienTracable lien = GetLien(
                new Point(rct1.Left + rct1.Width / 2, rct1.Top + rct1.Height / 2),
                new Point(rct2.Left + rct2.Width / 2, rct2.Top + rct2.Height / 2),
                mode);
            List <CSegmentDroite> segments = new List <CSegmentDroite>();
            IEnumerable <Point>   pts      = lien.Points;

            for (int n = 1; n < pts.Count(); n++)
            {
                segments.Add(new CSegmentDroite(pts.ElementAt(n - 1), pts.ElementAt(n)));
            }

            int nRect = 0;

            while (true)
            {
                if (segments.Count == 0)
                {
                    return(lien);
                }
                bool           bIntersect = false;
                Rectangle      rct        = nRect == 0 ? rct1 : rct2;
                CSegmentDroite segment    = nRect == 0 ? segments[0] : segments[segments.Count() - 1];
                Point[]        ptsDeRect  = new Point[] {
                    new Point(rct.Left, rct.Top),
                    new Point(rct.Right, rct.Top),
                    new Point(rct.Right, rct.Bottom),
                    new Point(rct.Left, rct.Bottom)
                };
                for (int n = 0; n < 4; n++)
                {
                    CSegmentDroite seg = new CSegmentDroite(ptsDeRect[n],
                                                            ptsDeRect[(n + 1) % 4]);
                    Point pt = new Point(0, 0);
                    if (segment.GetIntersectionPoint(seg, ref pt))
                    {
                        if (nRect == 0)
                        {
                            segment.Point1 = pt;
                        }
                        else
                        {
                            segment.Point2 = pt;
                        }
                        bIntersect = true;
                        nRect++;
                        break;
                    }
                }
                if (nRect == 1 && !bIntersect)
                {
                    //Pas d'intersection
                    List <CSegmentDroite> lst = new List <CSegmentDroite>(segments);
                    lst.RemoveAt(lst.Count - 1);
                    segments = new List <CSegmentDroite>(lst);
                }
                if (nRect > 1)
                {
                    break;
                }
                if (nRect == 0)
                {
                    break;
                }
            }
            lien = new CLienTracable();
            lien.AddPoint(segments[0].Point1);
            for (int n = 0; n < segments.Count(); n++)
            {
                lien.AddPoint(segments[n].Point2);
            }
            return(lien);
        }
Пример #5
0
 public CMenuItemModeSortie(CModeSortieLien mode)
     : base(mode.Libelle)
 {
     m_mode = mode;
 }