using UnityEngine; using UnityEditor; using System.Collections.Generic; using System; namespace XCharts { [System.Serializable] public class Series : JsonDataSupport { [SerializeField] protected List m_Series; public List series { get { return m_Series; } } public int Count { get { return m_Series.Count; } } public static Series defaultSeries { get { var series = new Series { m_Series = new List() }; return series; } } public void ClearData() { foreach(var serie in m_Series) { serie.ClearData(); } } public float GetData(int serieIndex,int dataIndex) { if(serieIndex >= 0 && serieIndex < Count) { return m_Series[serieIndex].GetData(dataIndex); } else { return 0; } } public void AddData(string legend, float value, int maxDataNumber = 0) { for (int i = 0; i < m_Series.Count; i++) { if (m_Series[i].name.Equals(legend)) { m_Series[i].AddData(value, maxDataNumber); break; } } } public void AddData(int legend, float value, int maxDataNumber = 0) { if (legend >= 0 && legend < Count) { m_Series[legend].AddData(value, maxDataNumber); } } public void UpdateData(string legend, float value, int dataIndex = 0) { for (int i = 0; i < m_Series.Count; i++) { if (m_Series[i].name.Equals(legend)) { m_Series[i].UpdateData(dataIndex, value); break; } } } public void UpdateData(int legendIndex, float value, int dataIndex = 0) { for (int i = 0; i < m_Series.Count; i++) { if (i == legendIndex) { m_Series[i].UpdateData(dataIndex, value); break; } } } public float GetMaxValue(Legend legend) { float max = int.MinValue; if (IsStack()) { var stackSeries = GetStackSeries(); foreach (var ss in stackSeries) { var seriesTotalValue = new Dictionary(); for (int i = 0; i < ss.Value.Count; i++) { var serie = ss.Value[i]; for (int j = 0; j < serie.data.Count; j++) { if (!seriesTotalValue.ContainsKey(j)) seriesTotalValue[j] = 0; seriesTotalValue[j] = seriesTotalValue[j] + serie.data[j]; } } float tmax = 0; foreach (var tt in seriesTotalValue) { if (tt.Value > tmax) tmax = tt.Value; } if (tmax > max) max = tmax; } } else { for (int i = 0; i < m_Series.Count; i++) { if (legend.IsShowSeries(i) && m_Series[i].Max > max) max = m_Series[i].Max; } } if (max == int.MinValue) return 100; if (max < 1 && max > -1) return max; int bigger = (int)Mathf.Abs(max); int n = 1; while (bigger / (Mathf.Pow(10, n)) > 10) { n++; } float mm = bigger < 10 ? bigger : ((bigger - bigger % (Mathf.Pow(10, n))) + Mathf.Pow(10, n)); if (max < 0) return -mm; else return mm; } public float GetMaxValue(int index,int splitNumber = 0) { float max = int.MinValue; float min = int.MaxValue; for (int i = 0; i < m_Series.Count; i++) { if (m_Series[i].data[index] > max) { max = Mathf.Ceil(m_Series[i].data[index]); } if (m_Series[i].data[index] < min) { min = Mathf.Ceil(m_Series[i].data[index]); } } if (max < 1 && max > -1) return max; if (max < 0 && min < 0) max = min; int bigger = (int)Mathf.Abs(max); int n = 1; while (bigger / (Mathf.Pow(10, n)) > 10) { n++; } float mm = bigger < 10 ? bigger : ((bigger - bigger % (Mathf.Pow(10, n))) + Mathf.Pow(10, n)); if (max < 1 && max > -1) return max; else if (max < 0) return -mm; else return mm; } public bool IsStack() { HashSet sets = new HashSet(); foreach (var serie in m_Series) { if (string.IsNullOrEmpty(serie.stack)) continue; if (sets.Contains(serie.stack)) return true; else { sets.Add(serie.stack); } } return false; } public Dictionary> GetStackSeries() { int count = 0; Dictionary sets = new Dictionary(); Dictionary> stackSeries = new Dictionary>(); foreach (var serie in m_Series) { if (string.IsNullOrEmpty(serie.stack)) { stackSeries[count] = new List(); stackSeries[count].Add(serie); count++; } else { if (!sets.ContainsKey(serie.stack)) { sets.Add(serie.stack, count); stackSeries[count] = new List(); stackSeries[count].Add(serie); count++; } else { int stackIndex = sets[serie.stack]; stackSeries[stackIndex].Add(serie); } } } return stackSeries; } public override void ParseJsonData(string jsonData) { //TODO: } } }