/// <summary> /// Render all the <see cref="CurveItem"/> objects in the list to the /// specified <see cref="Graphics"/> /// device by calling the <see cref="CurveItem.Draw"/> member function of /// each <see cref="CurveItem"/> object. /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see cref="GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="scaleFactor"> /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent <see cref="GraphPane"/> object using the /// <see cref="PaneBase.CalcScaleFactor"/> method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// </param> public void Draw(Graphics g, GraphPane pane, float scaleFactor) { // Configure the accumulator for stacked bars //Bar.ResetBarStack(); // Count the number of BarItems in the curvelist int pos = this.NumBars; // sorted overlay bars are a special case, since they are sorted independently at each // ordinal position. if (pane._barSettings.Type == BarType.SortedOverlay) { // First, create a new curveList with references (not clones) of the curves CurveList tempList = new CurveList(); foreach (CurveItem curve in this) { if (curve.IsBar) { tempList.Add((CurveItem)curve); } } // Loop through the bars, graphing each ordinal position separately for (int i = 0; i < this.maxPts; i++) { // At each ordinal position, sort the curves according to the value axis value tempList.Sort(pane._barSettings.Base == BarBase.X ? SortType.YValues : SortType.XValues, i); // plot the bars for the current ordinal position, in sorted order foreach (BarItem barItem in tempList) { barItem.Bar.DrawSingleBar(g, pane, barItem, ((BarItem)barItem).BaseAxis(pane), ((BarItem)barItem).ValueAxis(pane), 0, i, ((BarItem)barItem).GetBarWidth(pane), scaleFactor); } } } // Loop for each curve in reverse order to pick up the remaining curves // The reverse order is done so that curves that are later in the list are plotted behind // curves that are earlier in the list for (int i = this.Count - 1; i >= 0; i--) { CurveItem curve = this[i]; if (curve.IsBar) { pos--; } // Render the curve // if it's a sorted overlay bar type, it's already been done above if (!(curve.IsBar && pane._barSettings.Type == BarType.SortedOverlay)) { curve.Draw(g, pane, pos, scaleFactor); } } }
/// <summary> /// Render all the <see cref="CurveItem"/> objects in the list to the /// specified <see cref="Graphics"/> /// device by calling the <see cref="CurveItem.Draw"/> member function of /// each <see cref="CurveItem"/> object. /// </summary> /// <param name="g"> /// A graphic device object to be drawn into. This is normally e.Graphics from the /// PaintEventArgs argument to the Paint() method. /// </param> /// <param name="pane"> /// A reference to the <see cref="GraphPane"/> object that is the parent or /// owner of this object. /// </param> /// <param name="scaleFactor"> /// The scaling factor to be used for rendering objects. This is calculated and /// passed down by the parent <see cref="GraphPane"/> object using the /// <see cref="GraphPane.CalcScaleFactor"/> method, and is used to proportionally adjust /// font sizes, etc. according to the actual size of the graph. /// </param> public void Draw(Graphics g, GraphPane pane, double scaleFactor) { // Configure the accumulator for stacked bars //Bar.ResetBarStack(); // Count the number of BarItems in the curvelist int pos = this.NumBars; if (pane.BarType == BarType.SortedOverlay) { // First, create a new curveList with references (not clones) of the curves CurveList tempList = new CurveList(); foreach (CurveItem curve in this) { if (curve.IsBar) { tempList.Add((CurveItem)curve); } } for (int i = 0; i < this.maxPts; i++) { tempList.Sort(pane.BarBase == BarBase.X ? SortType.YValues : SortType.XValues, i); foreach (BarItem barItem in tempList) { barItem.Bar.DrawSingleBar(g, pane, barItem, ((BarItem)barItem).BaseAxis(pane), ((BarItem)barItem).ValueAxis(pane, barItem.IsY2Axis), 0, i, scaleFactor); } } } // Loop for each curve in reverse order to pick up the remaining bartypes for (int i = this.Count - 1; i >= 0; i--) { CurveItem curve = this[i]; if (curve.IsBar) { pos--; } // Render the curve // if it's a bar type or a sorted overlay or a percentstacked bar, it's already been done above if (!(pane.BarType == BarType.SortedOverlay) || !curve.IsBar) { curve.Draw(g, pane, pos, scaleFactor); } } }