/// /////////////////////////////////////////////// public override bool IsPointIn(Point pt) { AssurePositionOk(); //Calcule la distance entre la droite et le point CSegmentDroite segment = new CSegmentDroite(m_lastPointArrivee, m_lastPointDepart); double fA = 0, fB = 0, fC = 0; segment.GetEquationDroite(ref fA, ref fB, ref fC); double fSqrt = Math.Sqrt(fA * fA + fB * fB); if (fSqrt == 0) { return(false); } double fDistance = (fA * (double)pt.X + fB * (double)pt.Y + fC) / fSqrt; if (fDistance < 16) { //Vérifie que le point est environ sur le segment if (pt.X >= Math.Min(m_lastPointArrivee.X, m_lastPointDepart.X) && pt.X <= Math.Max(m_lastPointArrivee.X, m_lastPointDepart.X) && pt.Y >= Math.Min(m_lastPointArrivee.Y, m_lastPointDepart.Y) && pt.Y <= Math.Max(m_lastPointArrivee.Y, m_lastPointDepart.Y)) { return(true); } } return(false); }
//----------------------------------------------------- private CSegmentDroite DrawLien( Graphics g, ISatisfactionBesoin besoinSatisfait, ISatisfactionBesoin satisfaction, Pen p) { if (besoinSatisfait == null || satisfaction == null) { return(null); } CInfoDessinSatisfaction dessin1 = null; CInfoDessinSatisfaction dessin2 = null; m_dicSatisfactionToRect.TryGetValue(besoinSatisfait, out dessin1); m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin2); CSegmentDroite segment = null; if (dessin1 != null && dessin2 != null) { segment = new CSegmentDroite(new Point(dessin1.Rectangle.Right, dessin1.Rectangle.Top + m_nHauteurSatisfactionDefaut / 2), new Point(dessin2.Rectangle.Left, dessin2.Rectangle.Top + m_nHauteurSatisfactionDefaut / 2)); g.DrawLine(p, segment.Point1, segment.Point2); segment.DrawFlechePt1(g, p, 4); } return(segment); }
//----------------------------------------------------- private void Invalidate(CRelationBesoin_Satisfaction sat) { if (sat != null) { CSegmentDroite segment = null; m_dicSatisfactionToSegment.TryGetValue(sat, out segment); if (segment != null) { Rectangle rct = new Rectangle(PointToDisplay(new Point(segment.Left - 5, segment.Top - 5)), new Size(SizeToDisplay(segment.SizeEnglobant.Width + 10), SizeToDisplay(segment.SizeEnglobant.Height + 10))); rct.Inflate(2, 2); m_panelDessin.Invalidate(rct); } } }
//----------------------------------------------------- private CSegmentDroite DrawLien( Graphics g, ISatisfactionBesoin besoinSatisfait, ISatisfactionBesoin satisfaction, Pen p) { if (besoinSatisfait == null || satisfaction == null) { return(null); } CDessinSatisfaction dessin1 = m_baseMap.GetDessin(besoinSatisfait); CDessinSatisfaction dessin2 = m_baseMap.GetDessin(satisfaction); CSegmentDroite segment = null; if (dessin1 != null && dessin2 != null) { segment = new CSegmentDroite(new Point(dessin1.Rectangle.Right, dessin1.Rectangle.Top + m_baseMap.m_nHauteurSatisfactionDefaut / 2), new Point(dessin2.Rectangle.Left, dessin2.Rectangle.Top + m_baseMap.m_nHauteurSatisfactionDefaut / 2)); g.DrawLine(p, segment.Point1, segment.Point2); segment.DrawFlechePt1(g, p, 4); CBesoin besoin = besoinSatisfait as CBesoin; if (besoin != null) { double fCpt = CUtilSatisfaction.GetPourcentageFor(besoin, satisfaction); if (fCpt < 99) { Point pt = segment.Milieu; string strChaine = fCpt.ToString("0.##") + "%"; SizeF sz = g.MeasureString(strChaine, Font); pt.Offset(-(int)(sz.Width / 2), -(int)(sz.Height / 2)); Rectangle rct = new Rectangle(pt, new Size((int)sz.Width, (int)sz.Height)); Brush br = new SolidBrush(Color.FromArgb(128, Color.White)); g.FillRectangle(br, rct); br.Dispose(); g.DrawString(strChaine, Font, Brushes.Black, pt); } } } return(segment); }
protected void DrawLien( CContextDessinObjetGraphique ctx, Pen pen, Font ft, CRepresentationExpressionGraphique de, CRepresentationExpressionGraphique vers, string strText ) { CLienTracable lien = CTraceurLienDroit.GetLienPourLier(de.RectangleAbsolu, vers.RectangleAbsolu, EModeSortieLien.Automatic); lien.RendVisibleAvecLesAutres(ctx.Liens); ctx.AddLien(lien); ctx.Graphic.DrawLines(pen, lien.Points.ToArray()); if (strText != "" && lien.Points.Count() > 0) { CSegmentDroite segment = lien.Segments[0]; Point ptMilieu = segment.Milieu; Brush br = new SolidBrush(pen.Color); ctx.Graphic.DrawString(strText, ft, br, ptMilieu); br.Dispose(); } }
private void AssurePositionOk( ) { if (!m_bPositionInvalide)//Vérifie que le départ et l'arrivé n'ont pas bougé { if (ActionDepart != null && ActionDepart.RectangleAbsolu != m_lastRectangleDepart || ActionArrivee != null && ActionArrivee.RectangleAbsolu != m_lastRectangleArrivee) { m_bPositionInvalide = true; } } if (m_bPositionInvalide) { Point pt1; CAction actionDepart = ActionDepart; if (actionDepart == null) { pt1 = m_lastPointDepart; } else { m_lastRectangleDepart = actionDepart.RectangleAbsolu; pt1 = GetCentreRect(m_lastRectangleDepart); } Point pt2; CAction actionArrivee = ActionArrivee; if (actionArrivee == null) { pt2 = m_lastPointArrivee; } else { m_lastRectangleArrivee = actionArrivee.RectangleAbsolu; pt2 = GetCentreRect(m_lastRectangleArrivee); } m_lienTracable = CTraceurLienDroit.GetLien(pt1, pt2, ModeSortieDuLien); if (actionDepart != null) { Point[] pts1 = actionDepart.GetPolygoneDessin(); //Suppression des segments inutiles int nLastIntersect = 0; CSegmentDroite[] segments = m_lienTracable.Segments; for (nLastIntersect = segments.Count() - 1; nLastIntersect > 0; nLastIntersect--) { Point dummy = new Point(0, 0); if (segments[nLastIntersect].GetIntersectionPoint(pts1, ref dummy)) { break; } } for (int n = 0; n < nLastIntersect; n++) { m_lienTracable.RemovePoint(0); } if (m_lienTracable.Points.Count() > 1) { CSegmentDroite segment = new CSegmentDroite(m_lienTracable.Points.ElementAt(0), m_lienTracable.Points.ElementAt(1)); if (segment.GetIntersectionPoint(pts1, ref pt1)) { m_lienTracable.RemplacePoint(0, pt1); } } } if (actionArrivee != null) { Point[] pts2 = actionArrivee.GetPolygoneDessin(); //Suppression des segments inutiles CSegmentDroite[] segments = m_lienTracable.Segments; int nLastIntersect = segments.Count() - 1; for (nLastIntersect = 0; nLastIntersect < segments.Count() - 1; nLastIntersect++) { Point dummy = new Point(0, 0); if (segments[nLastIntersect].GetIntersectionPoint(pts2, ref dummy)) { break; } } for (int n = nLastIntersect + 1; n < segments.Count(); n++) { m_lienTracable.RemovePoint(m_lienTracable.Points.Count() - 1); } if (m_lienTracable.Points.Count() > 1) { CSegmentDroite segment = new CSegmentDroite( m_lienTracable.Points.ElementAt(m_lienTracable.Points.Count() - 2), m_lienTracable.Points.ElementAt(m_lienTracable.Points.Count() - 1)); if (segment.GetIntersectionPoint(pts2, ref pt2)) { m_lienTracable.RemplacePoint(m_lienTracable.Points.Count() - 1, pt2); } } } m_lastPointDepart = m_lienTracable.Points.ElementAt(0);; m_lastPointArrivee = m_lienTracable.Points.ElementAt(m_lienTracable.Points.Count() - 1); m_bPositionInvalide = false; } }
private void m_panelDessin_Paint(object sender, PaintEventArgs e) { Matrix m = new Matrix(); e.Graphics.FillRectangle(Brushes.White, e.ClipRectangle); PrepareGraphic(e.Graphics); int nX0 = PointToLogical(new Point(0, 0)).X; int nIndexNiveauStart = (nX0) / (m_nLargeurNiveauDefaut + m_nLargeurFleches); if (nX0 < 0) { nIndexNiveauStart--; } int nNbNiveauxVisibles = SizeToLogical(m_panelDessin.Width) / (m_nLargeurNiveauDefaut + m_nLargeurFleches) + 2; List <ISatisfactionBesoin> satisfactionsDessines = new List <ISatisfactionBesoin>(); if (nIndexNiveauStart < 0) { nIndexNiveauStart = 0; } for (int nIndexNiveau = nIndexNiveauStart; nIndexNiveau <= nIndexNiveauStart + nNbNiveauxVisibles && nIndexNiveau < m_listeNiveaux.Count; nIndexNiveau++) { CNiveau niveau = m_listeNiveaux[nIndexNiveau]; int nNiveau = niveau.Niveau; Color couleurNiveau = Color.LightGreen; if (nNiveau > 0) { couleurNiveau = Color.White; } else if (nNiveau < 0) { couleurNiveau = Color.LightBlue; } foreach (ISatisfactionBesoin satisfaction in niveau.Satisfactions) { CInfoDessinSatisfaction dessin = null; if (m_dicSatisfactionToRect.TryGetValue(satisfaction, out dessin)) { Point pt = PointToDisplay(new Point(dessin.Rectangle.Left, dessin.Rectangle.Bottom)); if (pt.Y > 0) { pt = PointToDisplay(new Point(dessin.Rectangle.Left, dessin.Rectangle.Top)); if (pt.Y < m_panelDessin.Height) { bool bSel = dessin.Satisfaction.Equals(m_satisfactionSel); dessin.Draw(this, couleurNiveau, bSel, e.Graphics); satisfactionsDessines.Add(satisfaction); } } } } } //Trace les lignes HashSet <CRelationBesoin_Satisfaction> liensDessines = new HashSet <CRelationBesoin_Satisfaction>(); Pen p = new Pen(Color.Black); Pen pSel = new Pen(Color.Yellow, 2); //p.EndCap = LineCap.ArrowAnchor; m_dicSatisfactionToSegment.Clear(); foreach (ISatisfactionBesoin satDessinee in satisfactionsDessines) { CBesoin besoin = satDessinee as CBesoin; if (besoin != null) { foreach (CRelationBesoin_Satisfaction rel in besoin.RelationsSatisfactions) { if (!liensDessines.Contains(rel)) { CSegmentDroite segment = DrawLien( e.Graphics, rel.Besoin, rel.Satisfaction, rel == m_lienSel ? pSel : p); liensDessines.Add(rel); if (segment != null) { m_dicSatisfactionToSegment[rel] = segment; } } } } foreach (CRelationBesoin_Satisfaction rel in satDessinee.RelationsSatisfaits) { if (!liensDessines.Contains(rel)) { CSegmentDroite segment = DrawLien( e.Graphics, rel.Besoin, rel.Satisfaction, rel == m_lienSel ? pSel : p); liensDessines.Add(rel); if (segment != null) { m_dicSatisfactionToSegment[rel] = segment; } } } } pSel.Dispose(); p.Dispose(); e.Graphics.ResetTransform(); }
private void m_panelDessin_Paint(object sender, PaintEventArgs e) { Matrix m = new Matrix(); e.Graphics.FillRectangle(Brushes.White, e.ClipRectangle); PrepareGraphic(e.Graphics); int nX0 = PointToLogical(new Point(0, 0)).X; int nIndexNiveauStart = (nX0) / (m_baseMap.m_nLargeurNiveauDefaut + m_baseMap.m_nLargeurFleches); if (nX0 < 0) { nIndexNiveauStart--; } int nNbNiveauxVisibles = SizeToLogical(m_panelDessin.Width) / (m_baseMap.m_nLargeurNiveauDefaut + m_baseMap.m_nLargeurFleches) + 2; List <ISatisfactionBesoin> satisfactionsDessines = new List <ISatisfactionBesoin>(); if (nIndexNiveauStart < 0) { nIndexNiveauStart = 0; } List <CDessinSatisfaction> lstToDraw = m_baseMap.GetListeADessiner(); foreach (CDessinSatisfaction dessin in lstToDraw) { if (dessin.IsPositionValide() && dessin.IsVisible()) { Rectangle rct = dessin.Rectangle; Point pt = PointToDisplay(new Point(rct.Left, rct.Top)); rct = new Rectangle(pt, rct.Size); if (rct.IntersectsWith(m_panelDessin.ClientRectangle)) { bool bSel = dessin.Satisfaction.Equals(m_satisfactionSel); satisfactionsDessines.Add(dessin.Satisfaction); dessin.Draw(Color.White, Font, bSel, e.Graphics); } } } //Trace les lignes HashSet <CRelationBesoin_Satisfaction> liensDessines = new HashSet <CRelationBesoin_Satisfaction>(); Pen p = new Pen(Color.Black); Pen pSel = new Pen(Color.Yellow, 2); //p.EndCap = LineCap.ArrowAnchor; m_dicSatisfactionToSegment.Clear(); foreach (ISatisfactionBesoin satDessinee in satisfactionsDessines) { CBesoin besoin = satDessinee as CBesoin; if (besoin != null) { foreach (CRelationBesoin_Satisfaction rel in besoin.RelationsSatisfactions) { if (!liensDessines.Contains(rel)) { CSegmentDroite segment = DrawLien( e.Graphics, rel.Besoin, rel.Satisfaction, rel == m_lienSel ? pSel : p); liensDessines.Add(rel); if (segment != null) { m_dicSatisfactionToSegment[rel] = segment; } } } } foreach (CRelationBesoin_Satisfaction rel in satDessinee.RelationsSatisfaits) { if (!liensDessines.Contains(rel)) { CSegmentDroite segment = DrawLien( e.Graphics, rel.Besoin, rel.Satisfaction, rel == m_lienSel ? pSel : p); liensDessines.Add(rel); if (segment != null) { m_dicSatisfactionToSegment[rel] = segment; } } } } pSel.Dispose(); p.Dispose(); e.Graphics.ResetTransform(); }