/// <summary> /// Draws the limit line (if it contains at least 2 positions) /// </summary> /// <param name="display">The display to draw to</param> internal void Render(ISpatialDisplay display) { if (m_Limit==null || m_Limit.Count==0 || m_Mouse==null) return; // Draw dotted line from the last point on the limit line to the last known mouse position int lastIndex = m_Limit.Count-1; IPosition last = m_Limit[lastIndex]; DottedStyle dottedLine = new DottedStyle(Color.Gray); dottedLine.Render(display, new IPosition[] { last, m_Mouse }); // If we have two or more positions, draw an additional dotted line to the start of // the limit line. if (m_Limit.Count>=2) dottedLine.Render(display, new IPosition[] { m_Mouse, m_Limit[0] }); // Draw the limit line if (m_Limit.Count>1) dottedLine.Render(display, m_Limit.ToArray()); // Draw any limit line selection if (m_LimSel.Count>0) { HighlightStyle style = new HighlightStyle(); style.ShowLineEndPoints = false; new SpatialSelection(m_LimSel).Render(display, style); } }
/// <summary> /// Draws the current state of the edit /// </summary> internal void Draw() { Debug.Assert(m_Line!=null); ISpatialDisplay view = ActiveDisplay; // Figure out the positions for the ends of the parallel line (if any) ... // Assume we already know both terminals. IPosition start = m_Term1; IPosition end = m_Term2; // If either one is undefined, but a dialog for it is active, // try to get the terminal from there instead. if (m_TermDial1!=null && start==null) start = m_TermDial1.TerminalPosition; if (m_TermDial2!=null && end==null) end = m_TermDial2.TerminalPosition; // If they weren't actually defined, use the parallel points instead. if (start==null) start = m_Par1; if (end==null) end = m_Par2; // If those weren't defined either, try to calculate them now. if (end==null && Calculate()) { start = m_Par1; end = m_Par2; } // Any offset point if (m_OffsetPoint!=null) m_OffsetPoint.Draw(view, Color.Green); // Everything else should draw in usual command-style colour. IDrawStyle style = EditingController.Current.Style(Color.Magenta); IDrawStyle dottedStyle = new DottedStyle(); // If the reference line is a curve, get the curve info. ArcFeature arc = m_Line.GetArcBase(); if (arc != null) { bool iscw = arc.IsClockwise; // Reverse the direction if necessary. if (m_IsReversed) iscw = !iscw; // Draw the parallel line (the rest of the circle being dotted). if (start!=null) { CircularArcGeometry parArc = new CircularArcGeometry(arc.Circle, start, end, iscw); style.Render(view, parArc); parArc.IsClockwise = !parArc.IsClockwise; dottedStyle.Render(view, parArc); } } else { // PARALLEL IS STRAIGHT // If we've got something, figure out positions for dotted portion. if (start!=null) { // What's the max length of a diagonal crossing the entire screen? double maxdiag = this.MaxDiagonal; // What's the bearing from the start to the end of the parallel? double bearing = Geom.BearingInRadians(start, end); // Project to a point before the start end of the parallel, as // well as a point after the end. IPosition before = Geom.Polar(start, bearing+Constants.PI, maxdiag); IPosition after = Geom.Polar(end, bearing, maxdiag); LineSegmentGeometry.Render(before, start, view, dottedStyle); LineSegmentGeometry.Render(start, end, view, style); LineSegmentGeometry.Render(end, after, view, dottedStyle); } } // Draw terminal positions (if defined). if (m_Term1!=null) style.Render(view, m_Term1); if (m_Term2!=null) style.Render(view, m_Term2); // The terminal lines. if (m_TermLine1!=null) m_TermLine1.Render(view, style); if (m_TermLine2!=null) m_TermLine2.Render(view, style); // Do the active dialog last so their stuff draws on top. if (m_ParDial!=null) m_ParDial.Draw(); if (m_TermDial1!=null) m_TermDial1.Draw(); if (m_TermDial2!=null) m_TermDial2.Draw(); }