Нема описа
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AngleAxisHandler.cs 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using XUGL;
  4. namespace XCharts.Runtime
  5. {
  6. [UnityEngine.Scripting.Preserve]
  7. internal sealed class AngleAxisHandler : AxisHandler<AngleAxis>
  8. {
  9. public override void InitComponent()
  10. {
  11. InitAngleAxis(component);
  12. }
  13. public override void Update()
  14. {
  15. component.context.startAngle = 90 - component.startAngle;
  16. UpdateAxisMinMaxValue(component);
  17. UpdatePointerValue(component);
  18. }
  19. public override void DrawBase(VertexHelper vh)
  20. {
  21. DrawAngleAxis(vh, component);
  22. }
  23. private void UpdateAxisMinMaxValue(AngleAxis axis, bool updateChart = true)
  24. {
  25. if (axis.IsCategory() || !axis.show) return;
  26. double tempMinValue = 0;
  27. double tempMaxValue = 0;
  28. SeriesHelper.GetYMinMaxValue(chart, axis.polarIndex, true, axis.inverse, out tempMinValue,
  29. out tempMaxValue, true);
  30. AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
  31. if (tempMinValue != axis.context.minValue || tempMaxValue != axis.context.maxValue)
  32. {
  33. axis.UpdateMinMaxValue(tempMinValue, tempMaxValue);
  34. axis.context.offset = 0;
  35. axis.context.lastCheckInverse = axis.inverse;
  36. UpdateAxisTickValueList(axis);
  37. if (updateChart)
  38. {
  39. UpdateAxisLabelText(axis);
  40. chart.RefreshChart();
  41. }
  42. }
  43. }
  44. internal void UpdateAxisLabelText(AngleAxis axis)
  45. {
  46. var runtimeWidth = 360;
  47. if (axis.context.labelObjectList.Count <= 0)
  48. InitAngleAxis(axis);
  49. else
  50. axis.UpdateLabelText(runtimeWidth, null, false);
  51. }
  52. private void InitAngleAxis(AngleAxis axis)
  53. {
  54. var polar = chart.GetChartComponent<PolarCoord>(axis.polarIndex);
  55. if (polar == null) return;
  56. PolarHelper.UpdatePolarCenter(polar, chart.chartPosition, chart.chartWidth, chart.chartHeight);
  57. var radius = polar.context.outsideRadius;
  58. axis.context.labelObjectList.Clear();
  59. axis.context.startAngle = 90 - axis.startAngle;
  60. string objName = component.GetType().Name + axis.index;
  61. var axisObj = ChartHelper.AddObject(objName, chart.transform, chart.chartMinAnchor,
  62. chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  63. axisObj.transform.localPosition = Vector3.zero;
  64. axisObj.SetActive(axis.show);
  65. axisObj.hideFlags = chart.chartHideFlags;
  66. ChartHelper.HideAllObject(axisObj);
  67. var splitNumber = AxisHelper.GetSplitNumber(axis, radius, null);
  68. var totalAngle = axis.context.startAngle;
  69. var total = 360;
  70. var cenPos = polar.context.center;
  71. var txtHig = axis.axisLabel.textStyle.GetFontSize(chart.theme.axis) + 2;
  72. var margin = axis.axisLabel.distance + axis.axisTick.GetLength(chart.theme.axis.tickLength);
  73. var isCategory = axis.IsCategory();
  74. var isPercentStack = SeriesHelper.IsPercentStack<Bar>(chart.series);
  75. for (int i = 0; i < splitNumber; i++)
  76. {
  77. float scaleAngle = AxisHelper.GetScaleWidth(axis, total, i + 1, null);
  78. bool inside = axis.axisLabel.inside;
  79. var labelName = AxisHelper.GetLabelName(axis, total, i, axis.context.minValue, axis.context.maxValue,
  80. null, isPercentStack);
  81. var label = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform,
  82. new Vector2(scaleAngle, txtHig), axis,
  83. chart.theme.axis, labelName, Color.clear);
  84. label.text.SetAlignment(axis.axisLabel.textStyle.GetAlignment(TextAnchor.MiddleCenter));
  85. var pos = ChartHelper.GetPos(cenPos, radius + margin,
  86. isCategory ? (totalAngle + scaleAngle / 2) : totalAngle, true);
  87. AxisHelper.AdjustCircleLabelPos(label, pos, cenPos, txtHig, Vector3.zero);
  88. if (i == 0) axis.axisLabel.SetRelatedText(label.text, scaleAngle);
  89. axis.context.labelObjectList.Add(label);
  90. totalAngle += scaleAngle;
  91. }
  92. }
  93. private void DrawAngleAxis(VertexHelper vh, AngleAxis angleAxis)
  94. {
  95. var polar = chart.GetChartComponent<PolarCoord>(angleAxis.polarIndex);
  96. var radius = polar.context.outsideRadius;
  97. var cenPos = polar.context.center;
  98. var total = 360;
  99. var size = AxisHelper.GetScaleNumber(angleAxis, total, null);
  100. var currAngle = angleAxis.context.startAngle;
  101. var tickWidth = angleAxis.axisTick.GetWidth(chart.theme.axis.tickWidth);
  102. var tickLength = angleAxis.axisTick.GetLength(chart.theme.axis.tickLength);
  103. var tickColor = angleAxis.axisTick.GetColor(chart.theme.axis.lineColor);
  104. var lineColor = angleAxis.axisLine.GetColor(chart.theme.axis.lineColor);
  105. var splitLineColor = angleAxis.splitLine.GetColor(chart.theme.axis.splitLineColor);
  106. for (int i = 1; i < size; i++)
  107. {
  108. var scaleWidth = AxisHelper.GetScaleWidth(angleAxis, total, i);
  109. var pos1 = ChartHelper.GetPos(cenPos, polar.context.insideRadius, currAngle, true);
  110. var pos2 = ChartHelper.GetPos(cenPos, polar.context.outsideRadius, currAngle, true);
  111. if (angleAxis.show && angleAxis.splitLine.show)
  112. {
  113. if (angleAxis.splitLine.NeedShow(i - 1, size - 1))
  114. {
  115. var lineWidth = angleAxis.splitLine.GetWidth(chart.theme.axis.splitLineWidth);
  116. UGL.DrawLine(vh, pos1, pos2, lineWidth, splitLineColor);
  117. }
  118. }
  119. if (angleAxis.show && angleAxis.axisTick.show)
  120. {
  121. if ((i == 1 && angleAxis.axisTick.showStartTick) ||
  122. (i == size - 1 && angleAxis.axisTick.showEndTick) ||
  123. (i > 1 && i < size - 1))
  124. {
  125. var tickY = radius + tickLength;
  126. var tickPos = ChartHelper.GetPos(cenPos, tickY, currAngle, true);
  127. UGL.DrawLine(vh, pos2, tickPos, tickWidth, tickColor);
  128. }
  129. }
  130. currAngle += scaleWidth;
  131. }
  132. if (angleAxis.show && angleAxis.axisLine.show)
  133. {
  134. var lineWidth = angleAxis.axisLine.GetWidth(chart.theme.axis.lineWidth);
  135. var outsideRaidus = radius + lineWidth * 2;
  136. UGL.DrawDoughnut(vh, cenPos, radius, outsideRaidus, lineColor, ColorUtil.clearColor32);
  137. if (polar.context.insideRadius > 0)
  138. {
  139. radius = polar.context.insideRadius;
  140. outsideRaidus = radius + lineWidth * 2;
  141. UGL.DrawDoughnut(vh, cenPos, radius, outsideRaidus, lineColor, ColorUtil.clearColor32);
  142. }
  143. }
  144. }
  145. protected override void UpdatePointerValue(Axis axis)
  146. {
  147. var polar = chart.GetChartComponent<PolarCoord>(axis.polarIndex);
  148. if (polar == null)
  149. return;
  150. if (!polar.context.isPointerEnter)
  151. {
  152. axis.context.pointerValue = double.PositiveInfinity;
  153. return;
  154. }
  155. var dir = (chart.pointerPos - new Vector2(polar.context.center.x, polar.context.center.y)).normalized;
  156. var angle = ChartHelper.GetAngle360(Vector2.up, dir);
  157. axis.context.pointerValue = (angle - component.context.startAngle + 360) % 360;
  158. axis.context.pointerLabelPosition = polar.context.center + new Vector3(dir.x, dir.y) * (polar.context.outsideRadius + 25);
  159. }
  160. }
  161. }