/// <summary> /// Draws the Vertical 3D Plank /// </summary> /// <param name="plankDepth">PlankDepth</param> /// <param name="plankThickness">PlankThickness</param> private void DrawVerticalPlank(Double plankDepth, Double plankThickness, AxisRepresentations axisChanged, Boolean isPartialUpdate) { if (isPartialUpdate && axisChanged == AxisRepresentations.AxisX) { ColumnChart.Update3DPlank(plankThickness, ScrollableLength - plankDepth, plankDepth, _verticalPlank); return; } if (_verticalPlank != null && _verticalPlank.Visual != null && _verticalPlank.Visual.Parent != null) { Panel parent = _verticalPlank.Visual.Parent as Canvas; parent.Children.Remove(_verticalPlank.Visual); } RectangularChartShapeParams columnParams = new RectangularChartShapeParams(); Brush frontBrush, topBrush, rightBrush; List<Color> colors = new List<Color>(); colors.Add(Color.FromArgb(255, 134, 134, 134)); // #FF868686 colors.Add(Color.FromArgb(255, 210, 210, 210)); // #FFD2D2D2 colors.Add(Color.FromArgb(255, 255, 255, 255)); // #FFFFFFFF colors.Add(Color.FromArgb(255, 223, 223, 223)); // #FFDFDFDF frontBrush = Graphics.CreateLinearGradientBrush(0, new Point(1.1, 0.49), new Point(-0.15, 0.49), colors, new List<double>() { 0, 0.844, 1, 0.442 }); colors = new List<Color>(); colors.Add(Color.FromArgb(255, 232, 232, 232)); // #FFE8E8E8 colors.Add(Color.FromArgb(255, 142, 135, 135)); // #FF8E8787 rightBrush = Graphics.CreateLinearGradientBrush(0, new Point(0, 0.5), new Point(1, 0.5), colors, new List<double>() { 1, 0 }); colors = new List<Color>(); colors.Add(Color.FromArgb(255, 232, 232, 232)); // #FFE8E8E8 colors.Add(Color.FromArgb(255, 142, 135, 135)); // #FF8E8787 topBrush = Graphics.CreateLinearGradientBrush(0, new Point(0.084, 0.441), new Point(1.916, 0.443), colors, new List<double>() { 0, 1 }); _verticalPlank = ColumnChart.Get3DPlank(plankThickness, ScrollableLength - plankDepth, plankDepth, frontBrush, topBrush, rightBrush); Panel plank = _verticalPlank.Visual as Panel; plank.SetValue(Canvas.TopProperty, plankDepth); plank.SetValue(Canvas.ZIndexProperty, -1); PlottingCanvas.Children.Add(plank); }
internal static void DrawStackedBarsAtXValue(RenderAs chartType, Double xValue, PlotGroup plotGroup, Canvas columnCanvas, Canvas labelCanvas, Double drawingIndex, Double heightPerBar, Double maxBarHeight, Double limitingYValue, Double depth3d, Boolean animationEnabled) { RectangularChartShapeParams barParams = new RectangularChartShapeParams(); barParams.ShadowOffset = 5; barParams.Depth = depth3d; barParams.IsStacked = true; Boolean isTopOFStack; DataPoint dataPointAtTopOfStack = null; Int32 positiveIndex = 1, negativeIndex = 1; Double top = Graphics.ValueToPixelPosition(columnCanvas.Height, 0, (Double)plotGroup.AxisX.InternalAxisMinimum, (Double)plotGroup.AxisX.InternalAxisMaximum, xValue) + drawingIndex * heightPerBar - (maxBarHeight / 2); Double left = Graphics.ValueToPixelPosition(0, columnCanvas.Width, (Double)plotGroup.AxisY.InternalAxisMinimum, (Double)plotGroup.AxisY.InternalAxisMaximum, limitingYValue); Double columnHeight = CalculateHeightOfEachColumn(ref top, heightPerBar, columnCanvas.Height); Double right=0; Double prevSum = 0; Double animationBeginTime = 0.4; Double animationTime = 1.0 / plotGroup.XWiseStackedDataList[xValue].Positive.Count; if (plotGroup.XWiseStackedDataList[xValue].Positive.Count > 0) dataPointAtTopOfStack = plotGroup.XWiseStackedDataList[xValue].Positive.Last(); Double absoluteSum = Double.NaN; if (chartType == RenderAs.StackedBar100) absoluteSum = plotGroup.XWiseStackedDataList[xValue].AbsoluteYValueSum; // Plot positive values foreach (DataPoint dataPoint in plotGroup.XWiseStackedDataList[xValue].Positive) { dataPoint.Parent.Faces = new Faces { Visual = columnCanvas, LabelCanvas = labelCanvas }; if (!(Boolean)dataPoint.Enabled || Double.IsNaN(dataPoint.InternalYValue)) { ColumnChart.CleanUpMarkerAndLabel(dataPoint, labelCanvas); continue; } isTopOFStack = (dataPoint == dataPointAtTopOfStack); CreateStackedBarVisual(dataPoint.Parent.RenderAs, dataPoint.InternalYValue >= 0, columnCanvas, labelCanvas, dataPoint, top, ref left, ref right, columnHeight, ref prevSum, absoluteSum, depth3d, animationEnabled, animationBeginTime, isTopOFStack, positiveIndex, plotGroup.XWiseStackedDataList[xValue].Positive.ToList()); animationBeginTime += animationTime; positiveIndex++; } prevSum = 0; right = Graphics.ValueToPixelPosition(0, columnCanvas.Width, (Double)plotGroup.AxisY.InternalAxisMinimum, (Double)plotGroup.AxisY.InternalAxisMaximum, limitingYValue); dataPointAtTopOfStack = null; if (plotGroup.XWiseStackedDataList[xValue].Negative.Count > 0) { dataPointAtTopOfStack = plotGroup.XWiseStackedDataList[xValue].Negative.Last(); animationTime = 1.0 / plotGroup.XWiseStackedDataList[xValue].Negative.Count; animationBeginTime = 0.4; } // Plot negative values foreach (DataPoint dataPoint in plotGroup.XWiseStackedDataList[xValue].Negative) { dataPoint.Parent.Faces = new Faces { Visual = columnCanvas, LabelCanvas = labelCanvas }; if (!(Boolean)dataPoint.Enabled || Double.IsNaN(dataPoint.InternalYValue)) continue; isTopOFStack = (dataPoint == dataPointAtTopOfStack); CreateStackedBarVisual(dataPoint.Parent.RenderAs, dataPoint.InternalYValue >= 0, columnCanvas, labelCanvas, dataPoint, top, ref left, ref right, columnHeight, ref prevSum, absoluteSum, depth3d, animationEnabled, animationBeginTime, isTopOFStack, negativeIndex, plotGroup.XWiseStackedDataList[xValue].Negative.ToList()); animationBeginTime += animationTime; negativeIndex--; } }
//--------------del /// <summary> /// Create 2D bar for a DataPoint /// </summary> /// <param name="barParams">Bar parameters</param> /// <returns>Faces for bar</returns> internal static Faces Get2DBar(RectangularChartShapeParams barParams) { Faces faces = new Faces(); Grid barVisual = new Grid(); barVisual.Width = barParams.Size.Width; barVisual.Height = barParams.Size.Height; Brush background = (barParams.Lighting ? Graphics.GetLightingEnabledBrush(barParams.BackgroundBrush, "Linear", null) : barParams.BackgroundBrush); Rectangle barBase = ExtendedGraphics.Get2DRectangle(barParams.TagReference, barParams.Size.Width, barParams.Size.Height, barParams.BorderThickness, barParams.BorderStyle, barParams.BorderBrush, background, barParams.XRadius, barParams.YRadius); (barBase.Tag as ElementData).VisualElementName = "ColumnBase"; //faces.Parts.Add(barBase.Children[0] as FrameworkElement); //faces.BorderElements.Add(barBase.Children[0] as Path); faces.Parts.Add(barBase); faces.BorderElements.Add(barBase); barVisual.Children.Add(barBase); if (barParams.Size.Height > 7 && barParams.Size.Width > 14 && barParams.Bevel) { Canvas bevelCanvas = ExtendedGraphics.Get2DRectangleBevel(barParams.TagReference, barParams.Size.Width - barParams.BorderThickness - barParams.BorderThickness, barParams.Size.Height - barParams.BorderThickness - barParams.BorderThickness, 6, 6, Graphics.GetBevelTopBrush(barParams.BackgroundBrush), Graphics.GetBevelSideBrush((barParams.Lighting ? -70 : 0), barParams.BackgroundBrush), Graphics.GetBevelSideBrush((barParams.Lighting ? -110 : 180), barParams.BackgroundBrush), null); foreach (FrameworkElement fe in bevelCanvas.Children) faces.Parts.Add(fe); bevelCanvas.SetValue(Canvas.LeftProperty, barParams.BorderThickness); bevelCanvas.SetValue(Canvas.TopProperty, barParams.BorderThickness); barVisual.Children.Add(bevelCanvas); } else { faces.Parts.Add(null); faces.Parts.Add(null); faces.Parts.Add(null); faces.Parts.Add(null); } if (barParams.Lighting && barParams.Bevel) { Canvas gradienceCanvas = ExtendedGraphics.Get2DRectangleGradiance(barParams.Size.Width, barParams.Size.Height, Graphics.GetLeftGradianceBrush(63), Graphics.GetLeftGradianceBrush(63), Orientation.Horizontal); foreach (FrameworkElement fe in gradienceCanvas.Children) faces.Parts.Add(fe); barVisual.Children.Add(gradienceCanvas); } else { faces.Parts.Add(null); faces.Parts.Add(null); } if (barParams.Shadow) { Double shadowVerticalOffsetGap = 1; Double shadowVerticalOffset = barParams.ShadowOffset - shadowVerticalOffsetGap; Double shadowHeight = barParams.Size.Height; CornerRadius xRadius = barParams.XRadius; CornerRadius yRadius = barParams.YRadius; if (barParams.IsStacked) { if (barParams.IsPositive) { if (barParams.IsTopOfStack) { shadowHeight = barParams.Size.Height - barParams.ShadowOffset; shadowVerticalOffset = barParams.ShadowOffset - shadowVerticalOffsetGap - shadowVerticalOffsetGap; xRadius = new CornerRadius(xRadius.TopLeft, xRadius.TopRight, xRadius.BottomRight, xRadius.BottomLeft); yRadius = new CornerRadius(yRadius.TopLeft, yRadius.TopRight, 0, 0); } else { shadowHeight = barParams.Size.Height + 6; shadowVerticalOffset = -2; xRadius = new CornerRadius(xRadius.TopLeft, xRadius.TopRight, xRadius.BottomRight, xRadius.BottomLeft); yRadius = new CornerRadius(0, 0, 0, 0); } } else { if (barParams.IsTopOfStack) { shadowHeight = barParams.Size.Height - barParams.ShadowOffset; xRadius = new CornerRadius(xRadius.TopLeft, xRadius.TopRight, xRadius.BottomRight, xRadius.BottomLeft); yRadius = new CornerRadius(yRadius.TopLeft, yRadius.TopRight, 0, 0); } else { shadowHeight = barParams.Size.Height + barParams.ShadowOffset + 2; shadowVerticalOffset = -2; xRadius = new CornerRadius(xRadius.TopLeft, xRadius.TopRight, xRadius.BottomRight, xRadius.BottomLeft); yRadius = new CornerRadius(0, 0, 0, 0); } } } Grid shadowGrid = ExtendedGraphics.Get2DRectangleShadow(barParams.TagReference, barParams.Size.Width, shadowHeight, xRadius, yRadius, barParams.IsStacked ? 3 : 5); TranslateTransform tt = new TranslateTransform() { X = barParams.ShadowOffset, Y = shadowVerticalOffset }; shadowGrid.Opacity = 0.7; shadowGrid.SetValue(Canvas.ZIndexProperty, -1); shadowGrid.RenderTransform = tt; barVisual.Children.Add(shadowGrid); } faces.VisualComponents.Add(barVisual); faces.Visual = barVisual; return faces; }
/// <summary> /// Set column parameters /// </summary> /// <param name="columnParams">Column parameters</param> /// <param name="chart">Chart reference</param> /// <param name="dataPoint">DataPoint</param> /// <param name="IsPositive">Whether the DataPoint YValue is positive or negative</param> internal static void SetColumnParms(ref RectangularChartShapeParams columnParams, ref Chart chart, DataPoint dataPoint, Boolean isPositive) { columnParams.Bevel = dataPoint.Parent.Bevel; columnParams.Lighting = (Boolean)dataPoint.LightingEnabled; columnParams.Shadow = (Boolean)dataPoint.ShadowEnabled; columnParams.BorderBrush = dataPoint.BorderColor; columnParams.BorderThickness = ((Thickness)dataPoint.BorderThickness).Left; columnParams.BorderStyle = ExtendedGraphics.GetDashArray((BorderStyles)dataPoint.BorderStyle); columnParams.IsPositive = isPositive; columnParams.BackgroundBrush = dataPoint.Color; columnParams.IsMarkerEnabled = (Boolean)dataPoint.MarkerEnabled; columnParams.MarkerType = (MarkerTypes)dataPoint.MarkerType; columnParams.MarkerColor = dataPoint.MarkerColor; columnParams.MarkerBorderColor = dataPoint.MarkerBorderColor; columnParams.MarkerBorderThickness = (Thickness)dataPoint.MarkerBorderThickness; columnParams.MarkerScale = (Double)dataPoint.MarkerScale; columnParams.MarkerSize = (Double)dataPoint.MarkerSize; columnParams.IsLabelEnabled = (Boolean)dataPoint.LabelEnabled; columnParams.LabelStyle = (LabelStyles)dataPoint.LabelStyle; columnParams.LabelText = dataPoint.TextParser(dataPoint.LabelText); columnParams.LabelBackground = dataPoint.LabelBackground; columnParams.LabelFontColor = dataPoint.LabelFontColor; columnParams.LabelFontSize = (Double)dataPoint.LabelFontSize; columnParams.LabelFontFamily = dataPoint.LabelFontFamily; columnParams.LabelFontStyle = (FontStyle)dataPoint.LabelFontStyle; columnParams.LabelFontWeight = (FontWeight)dataPoint.LabelFontWeight; columnParams.TagReference = dataPoint; }
/// <summary> /// Create 3D bar for a DataPoint /// </summary> /// <param name="barParams">Bar parameters</param> /// <returns>Faces for bar</returns> internal static Faces Get3DBar(RectangularChartShapeParams barParams) { Faces faces = new Faces(); Canvas barVisual = new Canvas(); barVisual.Width = barParams.Size.Width; barVisual.Height = barParams.Size.Height; Brush frontBrush = barParams.Lighting ? Graphics.GetFrontFaceBrush(barParams.BackgroundBrush) : barParams.BackgroundBrush; Brush topBrush = barParams.Lighting ? Graphics.GetTopFaceBrush(barParams.BackgroundBrush) : barParams.BackgroundBrush; Brush rightBrush = barParams.Lighting ? Graphics.GetRightFaceBrush(barParams.BackgroundBrush) : barParams.BackgroundBrush; Rectangle front = ExtendedGraphics.Get2DRectangle(barParams.TagReference, barParams.Size.Width, barParams.Size.Height, barParams.BorderThickness, barParams.BorderStyle, barParams.BorderBrush, frontBrush, new CornerRadius(0), new CornerRadius(0)); faces.Parts.Add(front); faces.BorderElements.Add(front); Rectangle top = ExtendedGraphics.Get2DRectangle(barParams.TagReference, barParams.Size.Width, barParams.Depth, barParams.BorderThickness, barParams.BorderStyle, barParams.BorderBrush, topBrush, new CornerRadius(0), new CornerRadius(0)); faces.Parts.Add(top); faces.BorderElements.Add(top); top.RenderTransformOrigin = new Point(0, 1); SkewTransform skewTransTop = new SkewTransform(); skewTransTop.AngleX = -45; top.RenderTransform = skewTransTop; Rectangle right = ExtendedGraphics.Get2DRectangle(barParams.TagReference, barParams.Depth, barParams.Size.Height, barParams.BorderThickness, barParams.BorderStyle, barParams.BorderBrush, rightBrush, new CornerRadius(0), new CornerRadius(0)); faces.Parts.Add(right); faces.BorderElements.Add(right); right.RenderTransformOrigin = new Point(0, 0); SkewTransform skewTransRight = new SkewTransform(); skewTransRight.AngleY = -45; right.RenderTransform = skewTransRight; barVisual.Children.Add(front); barVisual.Children.Add(top); barVisual.Children.Add(right); top.SetValue(Canvas.TopProperty, -barParams.Depth); right.SetValue(Canvas.LeftProperty, barParams.Size.Width); faces.Visual = barVisual; faces.VisualComponents.Add(front); faces.VisualComponents.Add(top); faces.VisualComponents.Add(right); return faces; }