diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d1898a7..432b1b45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ ## master +* (2022.08.08) 优化`Serie`的数据项索引维护,增加检测和修复功能 * (2022.07.29) 修复在某些`Unity`版本导入后图表创建异常的问题 * (2022.07.29) 增加`Axis`为`Time`时间轴时,支持次刻度和次分割线 * (2022.07.28) 优化`Radar`雷达图效果 diff --git a/Editor/Series/SerieEditor.cs b/Editor/Series/SerieEditor.cs index 1d07a793..33f62f68 100644 --- a/Editor/Series/SerieEditor.cs +++ b/Editor/Series/SerieEditor.cs @@ -72,6 +72,7 @@ namespace XCharts.Editor { while (listSize > m_Datas.arraySize) m_Datas.arraySize++; while (listSize < m_Datas.arraySize) m_Datas.arraySize--; + serie.ResetDataIndex(); } if (listSize > 30) // && !XCSettings.editorShowAllListData) { @@ -114,7 +115,9 @@ namespace XCharts.Editor m_DataElementFoldout[index] = false; } var fieldCount = dimension + (showName ? 1 : 0); - m_DataElementFoldout[index] = ChartEditorHelper.DrawHeader("SerieData " + index, flag, false, null, + var serieData = m_Datas.GetArrayElementAtIndex(index); + var dataIndex = serieData.FindPropertyRelative("m_Index").intValue; + m_DataElementFoldout[index] = ChartEditorHelper.DrawHeader("SerieData " + dataIndex, flag, false, null, delegate(Rect drawRect) { //drawRect.width -= 2f; @@ -124,7 +127,7 @@ namespace XCharts.Editor var lastWid = drawRect.width; var lastFieldWid = EditorGUIUtility.fieldWidth; var lastLabelWid = EditorGUIUtility.labelWidth; - var serieData = m_Datas.GetArrayElementAtIndex(index); + //var serieData = m_Datas.GetArrayElementAtIndex(index); var sereName = serieData.FindPropertyRelative("m_Name"); var data = serieData.FindPropertyRelative("m_Data"); #if UNITY_2019_3_OR_NEWER @@ -190,7 +193,7 @@ namespace XCharts.Editor EditorGUI.indentLevel++; var serieData = m_Datas.GetArrayElementAtIndex(index); PropertyField(serieData.FindPropertyRelative("m_Name")); - PropertyField(serieData.FindPropertyRelative("m_State")); + //PropertyField(serieData.FindPropertyRelative("m_State")); if (serie.GetType().IsDefined(typeof(SerieDataExtraFieldAttribute), false)) { var attribute = serie.GetType().GetAttribute(); diff --git a/Editor/Series/SerieListEditor.cs b/Editor/Series/SerieListEditor.cs index 280ee259..02e39e86 100644 --- a/Editor/Series/SerieListEditor.cs +++ b/Editor/Series/SerieListEditor.cs @@ -162,6 +162,13 @@ namespace XCharts.Editor RefreshEditors(); } })); + editor.menus.Add(new HeaderMenuInfo("Reset Data Index", () => + { + if (chart.ResetDataIndex(id)) + { + RefreshEditors(); + } + })); foreach (var type in GetCovertToSerie(editor.serie.GetType())) { editor.menus.Add(new HeaderMenuInfo("Covert to " + type.Name, () => diff --git a/Runtime/Helper/CheckHelper.cs b/Runtime/Helper/CheckHelper.cs index 8ccd886a..f070e5e6 100644 --- a/Runtime/Helper/CheckHelper.cs +++ b/Runtime/Helper/CheckHelper.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Text; using UnityEngine; @@ -67,26 +68,35 @@ namespace XCharts.Runtime // } } - private static void CheckLegend(BaseChart chart, StringBuilder sb) - { } + private static void CheckLegend(BaseChart chart, StringBuilder sb) { } - private static void CheckGrid(BaseChart chart, StringBuilder sb) - { } + private static void CheckGrid(BaseChart chart, StringBuilder sb) { } private static void CheckSerie(BaseChart chart, StringBuilder sb) { var allDataIsEmpty = true; var allDataIsZero = true; var allSerieIsHide = true; + var set = new HashSet(); foreach (var serie in chart.series) { if (serie.show) allSerieIsHide = false; if (serie.dataCount > 0) { allDataIsEmpty = false; + var dataIndexError = 0; + set.Clear(); for (int i = 0; i < serie.dataCount; i++) { var serieData = serie.GetSerieData(i); + if (set.Contains(serieData.index)) + { + dataIndexError++; + } + else + { + set.Add(serieData.index); + } for (int j = 1; j < serieData.data.Count; j++) { if (serieData.GetData(j) != 0) @@ -101,6 +111,10 @@ namespace XCharts.Runtime { sb.AppendFormat("warning:serie {0} serieData.data.count[{1}] not match showDataDimension[{2}]\n", serie.index, dataCount, serie.showDataDimension); } + if (dataIndexError > 0) + { + sb.AppendFormat("error: data index error, count={0}/{1}\n", dataIndexError, serie.dataCount); + } } else { diff --git a/Runtime/Internal/BaseChart.Serie.cs b/Runtime/Internal/BaseChart.Serie.cs index 8d8c0a5e..0acbc8e5 100644 --- a/Runtime/Internal/BaseChart.Serie.cs +++ b/Runtime/Internal/BaseChart.Serie.cs @@ -61,6 +61,18 @@ namespace XCharts.Runtime return true; } + /// + /// 重置serie的数据项索引。避免数据项索引异常。 + /// + /// + public bool ResetDataIndex(int serieIndex) + { + var serie = GetSerie(serieIndex); + if (serie != null) + return serie.ResetDataIndex(); + return false; + } + public bool CanAddSerie() where T : Serie { return CanAddSerie(typeof(T)); diff --git a/Runtime/Serie/Line/LineHandler.GridCoord.cs b/Runtime/Serie/Line/LineHandler.GridCoord.cs index a3f5c193..c2dfb891 100644 --- a/Runtime/Serie/Line/LineHandler.GridCoord.cs +++ b/Runtime/Serie/Line/LineHandler.GridCoord.cs @@ -57,6 +57,7 @@ namespace XCharts.Runtime m_LastCheckContextFlag = needCheck; var themeSymbolSize = chart.theme.serie.lineSymbolSize; var needInteract = false; + serie.ResetDataIndex(); if (m_LegendEnter) { serie.context.pointerEnter = true; @@ -112,7 +113,9 @@ namespace XCharts.Runtime } } if (lastIndex != serie.context.pointerItemDataIndex) + { needInteract = true; + } } if (needInteract) { diff --git a/Runtime/Serie/Serie.cs b/Runtime/Serie/Serie.cs index 06f485e9..151e9fb9 100644 --- a/Runtime/Serie/Serie.cs +++ b/Runtime/Serie/Serie.cs @@ -1159,6 +1159,23 @@ namespace XCharts.Runtime serieData.interact.Reset(); } + /// + /// 重置数据项索引。避免部分数据项的索引异常。 + /// + public bool ResetDataIndex() + { + var flag = false; + for (int i = 0; i < m_Data.Count; i++) + { + if (m_Data[i].index != i) + { + m_Data[i].index = i; + flag = true; + } + } + return flag; + } + /// /// 清空所有数据 ///