Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

RadiusAxisHandler.cs 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEngine.UI;
  4. using XUGL;
  5. namespace XCharts.Runtime
  6. {
  7. [UnityEngine.Scripting.Preserve]
  8. internal sealed class RadiusAxisHandler : AxisHandler<RadiusAxis>
  9. {
  10. public override void InitComponent()
  11. {
  12. InitRadiusAxis(component);
  13. }
  14. public override void Update()
  15. {
  16. UpdateAxisMinMaxValue(component);
  17. UpdatePointerValue(component);
  18. }
  19. public override void DrawBase(VertexHelper vh)
  20. {
  21. DrawRadiusAxis(vh, component);
  22. }
  23. protected override void UpdatePointerValue(Axis axis)
  24. {
  25. if (axis == null)
  26. return;
  27. var polar = chart.GetChartComponent<PolarCoord>(axis.polarIndex);
  28. if (polar == null)
  29. return;
  30. if (!polar.context.isPointerEnter)
  31. {
  32. axis.context.pointerValue = double.NaN;
  33. return;
  34. }
  35. var angleAxis = ComponentHelper.GetAngleAxis(chart.components, polar.index);
  36. if (angleAxis == null)
  37. return;
  38. var dist = Vector3.Distance(chart.pointerPos, polar.context.center);
  39. axis.context.pointerValue = axis.context.minValue + (dist / polar.context.radius) * axis.context.minMaxRange;
  40. axis.context.pointerLabelPosition = GetLabelPosition(polar, axis, angleAxis.context.startAngle, dist);
  41. }
  42. private void UpdateAxisMinMaxValue(RadiusAxis axis, bool updateChart = true)
  43. {
  44. if (axis == null) return;
  45. if (axis.IsCategory() || !axis.show) return;
  46. double tempMinValue = 0;
  47. double tempMaxValue = 0;
  48. SeriesHelper.GetXMinMaxValue(chart, axis.polarIndex, true, axis.inverse, out tempMinValue,
  49. out tempMaxValue, true);
  50. AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
  51. if (tempMinValue != axis.context.minValue || tempMaxValue != axis.context.maxValue)
  52. {
  53. axis.UpdateMinMaxValue(tempMinValue, tempMaxValue);
  54. axis.context.offset = 0;
  55. axis.context.lastCheckInverse = axis.inverse;
  56. UpdateAxisTickValueList(axis);
  57. if (updateChart)
  58. {
  59. UpdateAxisLabelText(axis);
  60. chart.RefreshChart();
  61. }
  62. }
  63. }
  64. internal void UpdateAxisLabelText(RadiusAxis axis)
  65. {
  66. if (axis == null)
  67. return;
  68. var polar = chart.GetChartComponent<PolarCoord>(axis.polarIndex);
  69. if (axis.context.labelObjectList.Count <= 0)
  70. InitRadiusAxis(axis);
  71. else
  72. {
  73. axis.UpdateLabelText(polar.context.radius, null, false);
  74. }
  75. }
  76. private void InitRadiusAxis(RadiusAxis axis)
  77. {
  78. var polar = chart.GetChartComponent<PolarCoord>(axis.index);
  79. if (polar == null)
  80. return;
  81. var angleAxis = ComponentHelper.GetAngleAxis(chart.components, polar.index);
  82. if (angleAxis == null)
  83. return;
  84. PolarHelper.UpdatePolarCenter(polar, chart.chartPosition, chart.chartWidth, chart.chartHeight);
  85. axis.context.labelObjectList.Clear();
  86. var radius = polar.context.outsideRadius - polar.context.insideRadius;
  87. var objName = component.GetType().Name + axis.index;
  88. var axisObj = ChartHelper.AddObject(objName, chart.transform, chart.chartMinAnchor,
  89. chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);
  90. axisObj.transform.localPosition = Vector3.zero;
  91. axisObj.SetActive(axis.show && axis.axisLabel.show);
  92. axisObj.hideFlags = chart.chartHideFlags;
  93. ChartHelper.HideAllObject(axisObj);
  94. var textStyle = axis.axisLabel.textStyle;
  95. var splitNumber = AxisHelper.GetScaleNumber(axis, radius, null);
  96. var totalWidth = polar.context.insideRadius;
  97. var txtHig = textStyle.GetFontSize(chart.theme.axis) + 2;
  98. for (int i = 0; i < splitNumber; i++)
  99. {
  100. var labelWidth = AxisHelper.GetScaleWidth(axis, radius, i + 1, null);
  101. var inside = axis.axisLabel.inside;
  102. var isPercentStack = SeriesHelper.IsPercentStack<Bar>(chart.series);
  103. var labelName = AxisHelper.GetLabelName(axis, radius, i, axis.context.minValue, axis.context.maxValue,
  104. null, isPercentStack);
  105. var label = ChartHelper.AddAxisLabelObject(splitNumber, i, objName + i, axisObj.transform,
  106. new Vector2(labelWidth, txtHig), axis, chart.theme.axis, labelName, Color.clear);
  107. if (i == 0)
  108. axis.axisLabel.SetRelatedText(label.text, labelWidth);
  109. label.text.SetAlignment(textStyle.GetAlignment(TextAnchor.MiddleCenter));
  110. label.SetText(labelName);
  111. label.SetPosition(GetLabelPosition(polar, axis, angleAxis.context.startAngle, totalWidth));
  112. label.SetActive(true);
  113. label.SetTextActive(true);
  114. axis.context.labelObjectList.Add(label);
  115. totalWidth += labelWidth;
  116. }
  117. }
  118. private Vector3 GetLabelPosition(PolarCoord polar, Axis axis, float startAngle, float totalWidth)
  119. {
  120. var cenPos = polar.context.center;
  121. var dire = ChartHelper.GetDire(startAngle, true).normalized;
  122. var tickLength = axis.axisTick.GetLength(chart.theme.axis.tickLength);
  123. var tickVector = ChartHelper.GetVertialDire(dire) *
  124. (tickLength + axis.axisLabel.distance);
  125. if (axis.IsCategory())
  126. {
  127. totalWidth += polar.context.radius / axis.data.Count / 2;
  128. }
  129. return ChartHelper.GetPos(cenPos, totalWidth, startAngle, true) + tickVector;
  130. }
  131. private void DrawRadiusAxis(VertexHelper vh, RadiusAxis radiusAxis)
  132. {
  133. if (radiusAxis == null)
  134. return;
  135. var polar = chart.GetChartComponent<PolarCoord>(radiusAxis.polarIndex);
  136. if (polar == null)
  137. return;
  138. var angleAxis = ComponentHelper.GetAngleAxis(chart.components, polar.index);
  139. if (angleAxis == null)
  140. return;
  141. var startAngle = angleAxis.context.startAngle;
  142. var radius = polar.context.radius;
  143. var cenPos = polar.context.center;
  144. var size = AxisHelper.GetScaleNumber(radiusAxis, radius, null);
  145. var totalWidth = polar.context.insideRadius;
  146. var dire = ChartHelper.GetDire(startAngle, true).normalized;
  147. var tickWidth = radiusAxis.axisTick.GetWidth(chart.theme.axis.tickWidth);
  148. var tickLength = radiusAxis.axisTick.GetLength(chart.theme.axis.tickLength);
  149. var tickVetor = ChartHelper.GetVertialDire(dire) * tickLength;
  150. for (int i = 0; i < size; i++)
  151. {
  152. var scaleWidth = AxisHelper.GetScaleWidth(radiusAxis, radius, i + 1);
  153. var pos = ChartHelper.GetPos(cenPos, totalWidth + tickWidth, startAngle, true);
  154. if (radiusAxis.show && radiusAxis.splitLine.show)
  155. {
  156. if (CanDrawSplitLine(angleAxis, i, size) && radiusAxis.splitLine.NeedShow(i, size))
  157. {
  158. var outsideRaidus = totalWidth + radiusAxis.splitLine.GetWidth(chart.theme.axis.splitLineWidth) * 2;
  159. var splitLineColor = radiusAxis.splitLine.GetColor(chart.theme.axis.splitLineColor);
  160. UGL.DrawDoughnut(vh, cenPos, totalWidth, outsideRaidus, splitLineColor, Color.clear);
  161. }
  162. }
  163. if (radiusAxis.show && radiusAxis.axisTick.show)
  164. {
  165. if ((i == 0 && radiusAxis.axisTick.showStartTick) ||
  166. (i == size && radiusAxis.axisTick.showEndTick) ||
  167. (i > 0 && i < size))
  168. {
  169. UGL.DrawLine(vh, pos, pos + tickVetor, tickWidth, chart.theme.axis.lineColor);
  170. }
  171. }
  172. totalWidth += scaleWidth;
  173. }
  174. if (radiusAxis.show && radiusAxis.axisLine.show)
  175. {
  176. var lineStartPos = polar.context.center + dire * polar.context.insideRadius;
  177. var lineEndPos = polar.context.center + dire * (polar.context.outsideRadius + 2 * tickWidth);
  178. var lineWidth = radiusAxis.axisLine.GetWidth(chart.theme.axis.lineWidth);
  179. UGL.DrawLine(vh, lineStartPos, lineEndPos, lineWidth, chart.theme.axis.lineColor);
  180. }
  181. }
  182. private bool CanDrawSplitLine(AngleAxis angleAxis, int i, int size)
  183. {
  184. if (angleAxis.axisLine.show)
  185. {
  186. return i != size - 1 && i != 0;
  187. }
  188. else
  189. {
  190. return true;
  191. }
  192. }
  193. }
  194. }