/// <summary> /// Calcuates the tick position. /// </summary> /// <param name="ticksPosition">The Tick Position</param> /// <param name="tickSize">The Tick Size</param> /// <param name="width">The Weight</param> /// <param name="height">The Height</param> /// <param name="x1">The x 1 value</param> /// <param name="y1">The y 1 value</param> /// <param name="x2">The x 2 value</param> /// <param name="y2">The y 2 value</param> private void CalculatePosition( AxisElementPosition ticksPosition, double tickSize, double width, double height, ref double x1, ref double y1, ref double x2, ref double y2) { Orientation orientaion = Axis.Orientation; bool isOpposed = Axis.OpposedPosition; double strokeHalfFactor = MainAxisLine.StrokeThickness / 2; bool isTickInside = ticksPosition == AxisElementPosition.Inside; // Positioning ticksize according to the axis stroke thickness size. if (orientaion == Orientation.Horizontal) { y1 = isOpposed ? !isTickInside ? MainAxisLine.Y1 - strokeHalfFactor : MainAxisLine.Y1 + strokeHalfFactor : isTickInside ? MainAxisLine.Y1 - strokeHalfFactor : MainAxisLine.Y1 + strokeHalfFactor; y2 = isOpposed ? !isTickInside ? y1 - tickSize : y1 + tickSize : isTickInside ? y1 - tickSize : y1 + tickSize; } else { x1 = isOpposed ? !isTickInside ? MainAxisLine.X1 + strokeHalfFactor : MainAxisLine.X1 - strokeHalfFactor : isTickInside ? MainAxisLine.X1 + strokeHalfFactor : MainAxisLine.X1 - strokeHalfFactor; x2 = isOpposed ? !isTickInside ? x1 + tickSize : x1 - tickSize : isTickInside ? x1 + tickSize : x1 - tickSize; } }
public static void SetPosition(UIElement element, AxisElementPosition value) { if (element == null) { throw new ArgumentNullException("element"); } element.SetValue(XYAxisElementsPanel.PositionProperty, (object)value); }
/// <summary> /// Renders the tick lines. /// </summary> /// <param name="finalSize">The Final Size</param> /// <param name="linesRecycler">The Line Recycler</param> /// <param name="orientation">The Orientation</param> /// <param name="tickSize">The Tick Size</param> /// <param name="tickPosition">The Tick Postion</param> /// <param name="Values">The Values</param> private void RenderTicks( Size finalSize, UIElementsRecycler <Line> linesRecycler, Orientation orientation, double tickSize, AxisElementPosition tickPosition, double[] Values) { int labelsCount = Values.Length; int linesCount = linesRecycler.Count; double width = finalSize.Width; double height = finalSize.Height; for (int i = 0; i < labelsCount; i++) { if (i < linesCount) { double x1 = 0, y1 = 0, x2 = 0, y2 = 0; Line line = linesRecycler[i]; double value = this.Axis.ValueToCoefficientCalc(Values[i]); value = double.IsNaN(value) ? 0 : value; if (orientation == Orientation.Horizontal) { x1 = x2 = Axis.ActualPlotOffset + Math.Round((this.Axis.RenderedRect.Width * value)); } else { y1 = y2 = (Axis.ActualPlotOffset + Math.Round(this.Axis.RenderedRect.Height * (1 - value)) + 0.5); } CalculatePosition(tickPosition, tickSize, width, height, ref x1, ref y1, ref x2, ref y2); line.X1 = x1; line.X2 = x2; line.Y1 = y1; line.Y2 = y2; } } }
/// <summary> /// Calculates the 3D position for the ticklines. /// </summary> /// <param name="ticksPosition">The Tick Position</param> /// <param name="tickSize">The Tick Size</param> /// <param name="x1">The X 1 Value</param> /// <param name="y1">The Y 1 Value</param> /// <param name="x2">The X 2 Value</param> /// <param name="y2">The Y 2 Value</param> /// <param name="actualRotationAngle">The Actual Rotation Angle</param> private void CalculatePosition3D(AxisElementPosition ticksPosition, double tickSize, ref double x1, ref double y1, ref double x2, ref double y2, double actualRotationAngle) { var orientation = Axis.Orientation; var isOpposed = Axis.OpposedPosition; if (orientation == Orientation.Horizontal) { isOpposed = isOpposed || Axis.Area.Axes.Where(x => (x is ChartAxisBase3D) && x.Orientation == Orientation.Horizontal && x.OpposedPosition).Any(); switch (ticksPosition) { case AxisElementPosition.Inside: y1 = isOpposed ? MainAxisLine.StrokeThickness : 0; y2 = isOpposed ? y1 + tickSize : tickSize; break; case AxisElementPosition.Outside: y1 = isOpposed ? 0 : MainAxisLine.StrokeThickness; y2 = isOpposed ? tickSize : y1 + tickSize; break; } var screenPositionTop = axis.ArrangeRect.Top + Top; var screenPositionLeft = axis.ArrangeRect.Left; y1 += screenPositionTop; y2 += screenPositionTop; if (!(this.Axis as ChartAxisBase3D).IsZAxis) { x1 += screenPositionLeft; x2 += screenPositionLeft; } } else { var axis3D = Axis as ChartAxisBase3D; isOpposed = (isOpposed || ((Axis.ShowAxisNextToOrigin && ((actualRotationAngle >= 180 && actualRotationAngle < 360))) || (!Axis.ShowAxisNextToOrigin && ((axis3D.AxisPosition3D == AxisPosition3D.DepthBackRight) || ((axis3D.AxisPosition3D == AxisPosition3D.DepthFrontRight) || (axis3D.AxisPosition3D == AxisPosition3D.BackRight) || (axis3D.AxisPosition3D == AxisPosition3D.DepthFrontLeft) || (axis3D.AxisPosition3D == AxisPosition3D.FrontRight)))))); switch (ticksPosition) { case AxisElementPosition.Inside: x1 = isOpposed ? 0 : MainAxisLine.StrokeThickness; x2 = isOpposed ? tickSize : x1 + tickSize; break; case AxisElementPosition.Outside: x1 = isOpposed ? MainAxisLine.StrokeThickness : 0; x2 = isOpposed ? x1 + tickSize : tickSize; break; } double screenPositionLeft = 0d; switch (axis3D.AxisPosition3D) { case AxisPosition3D.DepthBackRight: case AxisPosition3D.DepthFrontLeft: screenPositionLeft = axis3D.AxisDepth + Left; break; case AxisPosition3D.DepthFrontRight: case AxisPosition3D.DepthBackLeft: screenPositionLeft = (axis3D.AxisDepth - Left); x1 = -x1; x2 = -x2; break; default: screenPositionLeft = axis.ArrangeRect.Left + Left; break; } x1 += screenPositionLeft; x2 += screenPositionLeft; var screenPositionTop = axis.ArrangeRect.Top; y1 += screenPositionTop; y2 += screenPositionTop; } }
/// <summary> /// Renders the 3D tick lines. /// </summary> /// <param name="linesRecycler">The Line Recycler</param> /// <param name="orientation">The Orientation</param> /// <param name="tickSize">The Tick Size</param> /// <param name="tickPosition">The Tick Position</param> /// <param name="values">The Values</param> private void RenderTicks3D( UIElementsRecycler <Line> linesRecycler, Orientation orientation, double tickSize, AxisElementPosition tickPosition, IList <double> values) { var area3D = Axis.Area as SfChart3D; var actualRotationAngle = area3D.ActualRotationAngle; var labelsCount = values.Count; var linesCount = linesRecycler.Count; for (var i = 0; i < labelsCount; i++) { if (i >= linesCount) { continue; } double x1 = 0, y1 = 0, x2 = 0, y2 = 0; var line = linesRecycler[i]; var value = Axis.ValueToCoefficientCalc(values[i]); value = double.IsNaN(value) ? 0 : value; if (orientation == Orientation.Horizontal) { var tempaxis = axis as ChartAxisBase3D; if (tempaxis.IsManhattanAxis && (axis.RegisteredSeries[i] as ChartSeries3D).Segments != null && (axis.RegisteredSeries[i] as ChartSeries3D).Segments.Count > 0) { var segment = (axis.RegisteredSeries[i] as ChartSeries3D).Segments[0] as ChartSegment3D; x1 = x2 = segment.startDepth + (segment.endDepth - segment.startDepth) / 2; } else { x1 = x2 = Math.Round(Axis.ActualPlotOffset + (Axis.RenderedRect.Width * value)); } } else { y1 = y2 = Math.Round(Axis.ActualPlotOffset + (Axis.RenderedRect.Height * (1 - value))); } CalculatePosition3D(tickPosition, tickSize, ref x1, ref y1, ref x2, ref y2, actualRotationAngle); var verticalAxis = area3D.InternalSecondaryAxis.Orientation == Orientation.Vertical ? area3D.InternalSecondaryAxis : area3D.InternalPrimaryAxis; if ((axis as ChartAxisBase3D).IsZAxis) { // Adding one to prevent the tick hidding. var leftPosition = !verticalAxis.OpposedPosition && actualRotationAngle >= 0 && actualRotationAngle < 180 ? axis.ArrangeRect.Left + 1 : axis.ArrangeRect.Left; ((SfChart3D)Axis.Area).Graphics3D.AddVisual(Polygon3D.CreateLine(line, leftPosition, y1, leftPosition, y2, x1, x1, false)); } else { double depth = 0d; var axis3D = this.axis as ChartAxisBase3D; Line3D line3D = null; if (orientation == Orientation.Vertical) { if (axis.ShowAxisNextToOrigin) { if (actualRotationAngle >= 90 && actualRotationAngle < 270) { depth = (axis.Area as SfChart3D).ActualDepth; } line3D = Polygon3D.CreateLine(line, x1, y1, x2, y2, depth, depth, true); } else { if (axis3D.AxisPosition3D == AxisPosition3D.DepthBackRight || axis3D.AxisPosition3D == AxisPosition3D.DepthBackLeft || axis3D.AxisPosition3D == AxisPosition3D.DepthFrontRight || axis3D.AxisPosition3D == AxisPosition3D.DepthFrontLeft) { line3D = Polygon3D.CreateLine(line, axis.ArrangeRect.Left, y1, axis.ArrangeRect.Left, y2, x1, x2, false); } else { depth = axis3D.AxisDepth; line3D = Polygon3D.CreateLine(line, x1, y1, x2, y2, depth, depth, true); } } } else { depth = axis3D.AxisDepth; line3D = Polygon3D.CreateLine(line, x1, y1, x2, y2, depth, depth, true); } ((SfChart3D)Axis.Area).Graphics3D.AddVisual(line3D); } } }
public static void SetPosition(UIElement element, AxisElementPosition value) { if (element == null) throw new ArgumentNullException("element"); element.SetValue(XYAxisElementsPanel.PositionProperty, (object)value); }