/******************************************/ /* */ /* Copyright (c) 2018 monitor1394 */ /* https://github.com/monitor1394 */ /* */ /******************************************/ using UnityEngine; using System.Collections.Generic; using System; namespace XCharts { /// /// the list of series. /// 系列列表。每个系列通过 type 决定自己的图表类型。 /// [System.Serializable] public class Series : MainComponent { [SerializeField] protected List m_Series; [NonSerialized] private bool m_LabelDirty; [Obsolete("Use Series.list instead.", true)] public List series { get { return m_Series; } } /// /// the list of serie /// 系列列表。 /// public List list { get { return m_Series; } } /// /// the size of serie list. /// 系列个数。 /// public int Count { get { return m_Series.Count; } } public bool labelDirty { get { return m_LabelDirty; } set { m_LabelDirty = value; } } public static Series defaultSeries { get { var series = new Series { m_Series = new List(){new Serie(){ show = true, name = "serie1", index = 0 }} }; return series; } } public override bool vertsDirty { get { if (m_VertsDirty) return true; foreach (var serie in m_Series) { if (serie.vertsDirty) return true; } return false; } } public void SetLabelDirty() { m_LabelDirty = true; } internal override void ClearVerticesDirty() { base.ClearVerticesDirty(); foreach (var serie in m_Series) { serie.ClearVerticesDirty(); } } internal void ClearLabelDirty() { m_LabelDirty = false; foreach (var serie in m_Series) { serie.label.ClearVerticesDirty(); } } public override void SetAllDirty() { base.SetAllDirty(); SetLabelDirty(); } public override void ClearDirty() { base.ClearDirty(); ClearLabelDirty(); SeriesHelper.ClearNameDirty(this); } /// /// 清空所有系列的数据 /// public void ClearData() { AnimationFadeIn(); foreach (var serie in m_Series) { serie.ClearData(); } } /// /// 获得指定序列指定索引的数据值 /// /// /// /// public float GetData(int serieIndex, int dataIndex) { if (serieIndex >= 0 && serieIndex < Count) { return m_Series[serieIndex].GetYData(dataIndex); } else { return 0; } } public float GetCurrData(int serieIndex, int dataIndex) { if (serieIndex >= 0 && serieIndex < Count) { return m_Series[serieIndex].GetYCurrData(dataIndex); } else { return 0; } } /// /// 获得指定系列名的第一个系列 /// /// /// public Serie GetSerie(string name) { for (int i = 0; i < m_Series.Count; i++) { bool match = false; if (string.IsNullOrEmpty(name)) { if (string.IsNullOrEmpty(m_Series[i].name)) match = true; } else if (name.Equals(m_Series[i].name)) { match = true; } if (match) { m_Series[i].index = i; return m_Series[i]; } } return null; } /// /// 获得指定系列名的所有系列 /// /// /// public List GetSeries(string name) { var list = new List(); if (name == null) return list; foreach (var serie in m_Series) { if (name.Equals(serie.name)) list.Add(serie); } return list; } /// /// 获得指定索引的系列 /// /// /// public Serie GetSerie(int index) { if (index >= 0 && index < m_Series.Count) { return m_Series[index]; } return null; } /// /// 是否包含指定名字的系列 /// /// /// public bool Contains(string name) { for (int i = 0; i < m_Series.Count; i++) { if (name.Equals(m_Series[i].name)) { return true; } } return false; } /// /// Remove serie from series. /// 移除指定名字的系列。 /// /// the name of serie public void Remove(string serieName) { var serie = GetSerie(serieName); if (serie != null) { m_Series.Remove(serie); } } /// /// Remove all serie from series. /// 移除所有系列。 /// public void RemoveAll() { AnimationFadeIn(); m_Series.Clear(); } /// /// 添加一个系列到列表中。 /// /// /// /// /// public Serie AddSerie(SerieType type, string serieName, bool show = true) { var serie = new Serie(); serie.type = type; serie.show = show; serie.name = serieName; serie.index = m_Series.Count; if (type == SerieType.Scatter) { serie.symbol.type = SerieSymbolType.Circle; serie.symbol.size = 20f; serie.symbol.selectedSize = 30f; } else if (type == SerieType.Line) { serie.symbol.type = SerieSymbolType.EmptyCircle; serie.symbol.size = 2.5f; serie.symbol.selectedSize = 5f; } else { serie.symbol.type = SerieSymbolType.None; } serie.animation.Restart(); m_Series.Add(serie); SetVerticesDirty(); return serie; } /// /// 添加一个数据到指定系列的维度Y数据中 /// /// /// /// /// 添加成功返回SerieData,否则返回null public SerieData AddData(string serieName, float value, string dataName = null) { var serie = GetSerie(serieName); if (serie != null) { return serie.AddYData(value, dataName); } return null; } /// /// 添加一个数据到指定系列的维度Y中 /// /// /// /// /// 添加成功返回SerieData,否则返回null public SerieData AddData(int index, float value, string dataName = null) { var serie = GetSerie(index); if (serie != null) { return serie.AddYData(value, dataName); } return null; } /// /// 添加一组数据到指定的系列中 /// /// /// /// /// 添加成功返回SerieData,否则返回null public SerieData AddData(string serieName, List multidimensionalData, string dataName = null) { var serie = GetSerie(serieName); if (serie != null) { return serie.AddData(multidimensionalData, dataName); } return null; } /// /// 添加一组数据到指定的系列中 /// /// /// /// /// 添加成功返回SerieData,否则返回null public SerieData AddData(int serieIndex, List multidimensionalData, string dataName = null) { var serie = GetSerie(serieIndex); if (serie != null) { return serie.AddData(multidimensionalData, dataName); } return null; } /// /// 添加(x,y)数据到指定的系列中 /// /// /// /// /// /// 添加成功返回SerieData,否则返回null public SerieData AddXYData(string serieName, float xValue, float yValue, string dataName = null) { var serie = GetSerie(serieName); if (serie != null) { return serie.AddXYData(xValue, yValue, dataName); } return null; } /// /// 添加(x,y)数据到指定的系列中 /// /// /// /// /// /// 添加成功返回SerieData,否则返回null public SerieData AddXYData(int index, float xValue, float yValue, string dataName = null) { var serie = GetSerie(index); if (serie != null) { return serie.AddXYData(xValue, yValue, dataName); } return null; } /// /// 更新指定系列的维度Y数据 /// /// /// /// public bool UpdateData(string serieName, int dataIndex, float value) { var serie = GetSerie(serieName); if (serie != null) { return serie.UpdateYData(dataIndex, value); } return false; } /// /// 更新指定系列的数据项名称 /// /// /// /// public bool UpdateDataName(string serieName, int dataIndex, string dataName) { var serie = GetSerie(serieName); if (serie != null) { return serie.UpdateDataName(dataIndex, dataName); } return false; } /// /// 更新指定系列的数据项名称 /// /// /// /// public bool UpdateDataName(int serieIndex, int dataIndex, string dataName) { var serie = GetSerie(serieIndex); if (serie != null) { return serie.UpdateDataName(dataIndex, dataName); } return false; } /// /// 更新指定系列的维度Y数据项的值 /// /// /// /// public bool UpdateData(int serieIndex, int dataIndex, float value) { var serie = GetSerie(serieIndex); if (serie != null) { return serie.UpdateYData(dataIndex, value); } return false; } public bool UpdateData(string serieName, int dataIndex, List values) { var serie = GetSerie(serieName); if (serie != null) { return serie.UpdateData(dataIndex, values); } return false; } public bool UpdateData(int serieIndex, int dataIndex, List values) { var serie = GetSerie(serieIndex); if (serie != null) { return serie.UpdateData(dataIndex, values); } return false; } /// /// 更新指定系列指定数据项指定维度的数据值 /// /// 系列 /// 数据项 /// 数据维数,从0开始 /// 值 public bool UpdateData(int serieIndex, int dataIndex, int dimension, float value) { var serie = GetSerie(serieIndex); if (serie != null) { return serie.UpdateData(dataIndex, dimension, value); } return false; } /// /// 更新指定系列指定数据项指定维度的数据值 /// /// /// /// 数据维数,从0开始 /// public bool UpdateData(string serieName, int dataIndex, int dimension, float value) { var serie = GetSerie(serieName); if (serie != null) { return serie.UpdateData(dataIndex, dimension, value); } return false; } /// /// 更新指定系列的维度X和维度Y数据 /// /// /// /// /// public bool UpdateXYData(string serieName, int dataIndex, float xValue, float yValue) { var serie = GetSerie(serieName); if (serie != null) { return serie.UpdateXYData(dataIndex, xValue, yValue); } return false; } /// /// 更新指定系列的维度X和维度Y数据 /// /// /// /// /// public bool UpdateXYData(int serieIndex, int dataIndex, float xValue, float yValue) { var serie = GetSerie(serieIndex); if (serie != null) { return serie.UpdateXYData(dataIndex, xValue, yValue); } return false; } /// /// dataZoom由变化是更新系列的缓存数据 /// /// internal void UpdateFilterData(DataZoom dataZoom) { if (dataZoom != null && dataZoom.enable) { for (int i = 0; i < m_Series.Count; i++) { m_Series[i].UpdateFilterData(dataZoom); } } } /// /// 指定系列是否显示 /// /// /// public bool IsActive(string name) { var serie = GetSerie(name); return serie == null ? false : serie.show; } /// /// 指定系列是否显示 /// /// /// public bool IsActive(int index) { var serie = GetSerie(index); return serie == null ? false : serie.show; } /// /// 设置指定系列是否显示 /// /// /// public void SetActive(string name, bool active) { var serie = GetSerie(name); if (serie != null) { serie.show = active; } } /// /// 设置指定系列是否显示 /// /// /// public void SetActive(int index, bool active) { var serie = GetSerie(index); if (serie != null) { serie.show = active; serie.animation.Reset(); if (active) serie.animation.FadeIn(); } } /// /// 指定系列是否处于高亮选中状态 /// /// /// public bool IsHighlight(int serieIndex) { var serie = GetSerie(serieIndex); if (serie != null) return serie.highlighted; else return false; } /// /// 设置获得标志图形大小的回调 /// /// /// public void SetSerieSymbolSizeCallback(SymbolSizeCallback size, SymbolSizeCallback selectedSize) { foreach (var serie in m_Series) { serie.symbol.sizeCallback = size; serie.symbol.selectedSizeCallback = selectedSize; } } /// /// 启用或取消初始动画 /// public void AnimationEnable(bool flag) { foreach (var serie in m_Series) { serie.animation.enable = flag; } } /// /// 渐入动画 /// public void AnimationFadeIn() { foreach (var serie in m_Series) { if (serie.animation.enable) { serie.animation.FadeIn(); } } } /// /// 渐出动画 /// public void AnimationFadeOut() { foreach (var serie in m_Series) { if (serie.animation.enable) serie.animation.FadeOut(); } } /// /// 暂停动画 /// public void AnimationPause() { foreach (var serie in m_Series) { if (serie.animation.enable) serie.animation.Pause(); } } /// /// 继续动画 /// public void AnimationResume() { foreach (var serie in m_Series) { if (serie.animation.enable) serie.animation.Resume(); } } /// /// 重置动画 /// public void AnimationReset() { foreach (var serie in m_Series) { if (serie.animation.enable) serie.animation.Reset(); } } /// /// 从json中解析数据 /// /// public override void ParseJsonData(string jsonData) { //TODO: } } }