Ei kuvausta
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.

ParallelCoordHandler.cs 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using XUGL;
  6. namespace XCharts.Runtime
  7. {
  8. [UnityEngine.Scripting.Preserve]
  9. internal sealed class ParallelCoordHandler : MainComponentHandler<ParallelCoord>
  10. {
  11. private Dictionary<int, double> m_SerieDimMin = new Dictionary<int, double>();
  12. private Dictionary<int, double> m_SerieDimMax = new Dictionary<int, double>();
  13. private double m_LastInterval;
  14. private int m_LastSplitNumber;
  15. public override void InitComponent()
  16. {
  17. var grid = component;
  18. grid.painter = chart.painter;
  19. grid.refreshComponent = delegate()
  20. {
  21. grid.UpdateRuntimeData(chart.chartX, chart.chartY, chart.chartWidth, chart.chartHeight);
  22. chart.OnCoordinateChanged();
  23. };
  24. grid.refreshComponent();
  25. }
  26. public override void CheckComponent(StringBuilder sb)
  27. {
  28. var grid = component;
  29. if (grid.left >= chart.chartWidth)
  30. sb.Append("warning:grid->left > chartWidth\n");
  31. if (grid.right >= chart.chartWidth)
  32. sb.Append("warning:grid->right > chartWidth\n");
  33. if (grid.top >= chart.chartHeight)
  34. sb.Append("warning:grid->top > chartHeight\n");
  35. if (grid.bottom >= chart.chartHeight)
  36. sb.Append("warning:grid->bottom > chartHeight\n");
  37. if (grid.left + grid.right >= chart.chartWidth)
  38. sb.Append("warning:grid.left + grid.right > chartWidth\n");
  39. if (grid.top + grid.bottom >= chart.chartHeight)
  40. sb.Append("warning:grid.top + grid.bottom > chartHeight\n");
  41. }
  42. public override void Update()
  43. {
  44. UpdatePointerEnter();
  45. UpdateParallelAxisMinMaxValue();
  46. }
  47. public override void DrawBase(VertexHelper vh)
  48. {
  49. if (!SeriesHelper.IsAnyClipSerie(chart.series))
  50. {
  51. DrawCoord(vh);
  52. }
  53. }
  54. public override void DrawUpper(VertexHelper vh)
  55. {
  56. if (SeriesHelper.IsAnyClipSerie(chart.series))
  57. {
  58. DrawCoord(vh);
  59. }
  60. }
  61. private void DrawCoord(VertexHelper vh)
  62. {
  63. var grid = component;
  64. if (grid.show && !ChartHelper.IsClearColor(grid.backgroundColor))
  65. {
  66. var p1 = new Vector2(grid.context.x, grid.context.y);
  67. var p2 = new Vector2(grid.context.x, grid.context.y + grid.context.height);
  68. var p3 = new Vector2(grid.context.x + grid.context.width, grid.context.y + grid.context.height);
  69. var p4 = new Vector2(grid.context.x + grid.context.width, grid.context.y);
  70. UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, grid.backgroundColor);
  71. }
  72. }
  73. private void UpdatePointerEnter()
  74. {
  75. if (chart.isPointerInChart)
  76. component.context.runtimeIsPointerEnter = component.Contains(chart.pointerPos);
  77. else
  78. component.context.runtimeIsPointerEnter = false;
  79. }
  80. private void UpdateParallelAxisMinMaxValue()
  81. {
  82. var list = chart.GetChartComponents<ParallelAxis>();
  83. if (list.Count != component.context.parallelAxes.Count)
  84. {
  85. component.context.parallelAxes.Clear();
  86. foreach (var com in chart.GetChartComponents<ParallelAxis>())
  87. {
  88. var axis = com as ParallelAxis;
  89. if (axis.parallelIndex == component.index)
  90. component.context.parallelAxes.Add(axis);
  91. }
  92. }
  93. m_SerieDimMin.Clear();
  94. m_SerieDimMax.Clear();
  95. foreach (var serie in chart.series)
  96. {
  97. if ((serie is Parallel) && serie.parallelIndex == component.index)
  98. {
  99. foreach (var serieData in serie.data)
  100. {
  101. for (int i = 0; i < serieData.data.Count; i++)
  102. {
  103. var value = serieData.data[i];
  104. if (!m_SerieDimMin.ContainsKey(i))
  105. m_SerieDimMin[i] = value;
  106. else if (m_SerieDimMin[i] > value)
  107. m_SerieDimMin[i] = value;
  108. if (!m_SerieDimMax.ContainsKey(i))
  109. m_SerieDimMax[i] = value;
  110. else if (m_SerieDimMax[i] < value)
  111. m_SerieDimMax[i] = value;
  112. }
  113. }
  114. }
  115. }
  116. for (int i = 0; i < component.context.parallelAxes.Count; i++)
  117. {
  118. var axis = component.context.parallelAxes[i];
  119. if (axis.IsCategory())
  120. {
  121. m_SerieDimMax[i] = axis.data.Count > 0 ? axis.data.Count - 1 : 0;
  122. m_SerieDimMin[i] = 0;
  123. }
  124. else if (axis.minMaxType == Axis.AxisMinMaxType.Custom)
  125. {
  126. m_SerieDimMin[i] = axis.min;
  127. m_SerieDimMax[i] = axis.max;
  128. }
  129. else if (m_SerieDimMax.ContainsKey(i))
  130. {
  131. var tempMinValue = m_SerieDimMin[i];
  132. var tempMaxValue = m_SerieDimMax[i];
  133. AxisHelper.AdjustMinMaxValue(axis, ref tempMinValue, ref tempMaxValue, true);
  134. m_SerieDimMin[i] = tempMinValue;
  135. m_SerieDimMax[i] = tempMaxValue;
  136. }
  137. }
  138. for (int i = 0; i < component.context.parallelAxes.Count; i++)
  139. {
  140. if (m_SerieDimMax.ContainsKey(i))
  141. {
  142. var axis = component.context.parallelAxes[i];
  143. var tempMinValue = m_SerieDimMin[i];
  144. var tempMaxValue = m_SerieDimMax[i];
  145. if (tempMinValue != axis.context.minValue ||
  146. tempMaxValue != axis.context.maxValue ||
  147. m_LastInterval != axis.interval ||
  148. m_LastSplitNumber != axis.splitNumber)
  149. {
  150. m_LastSplitNumber = axis.splitNumber;
  151. m_LastInterval = axis.interval;
  152. axis.UpdateMinMaxValue(tempMinValue, tempMaxValue);
  153. axis.context.offset = 0;
  154. axis.context.lastCheckInverse = axis.inverse;
  155. (axis.handler as ParallelAxisHander).UpdateAxisTickValueList(axis);
  156. (axis.handler as ParallelAxisHander).UpdateAxisLabelText(axis);
  157. chart.RefreshChart();
  158. }
  159. }
  160. }
  161. }
  162. }
  163. }