[optimize][serie] optimize index of serieData

This commit is contained in:
monitor1394
2022-08-08 07:43:19 +08:00
parent e7f19e72a5
commit 19914586ae
7 changed files with 64 additions and 7 deletions

View File

@@ -57,6 +57,7 @@
## master ## master
* (2022.08.08) 优化`Serie`的数据项索引维护,增加检测和修复功能
* (2022.07.29) 修复在某些`Unity`版本导入后图表创建异常的问题 * (2022.07.29) 修复在某些`Unity`版本导入后图表创建异常的问题
* (2022.07.29) 增加`Axis``Time`时间轴时,支持次刻度和次分割线 * (2022.07.29) 增加`Axis``Time`时间轴时,支持次刻度和次分割线
* (2022.07.28) 优化`Radar`雷达图效果 * (2022.07.28) 优化`Radar`雷达图效果

View File

@@ -72,6 +72,7 @@ namespace XCharts.Editor
{ {
while (listSize > m_Datas.arraySize) m_Datas.arraySize++; while (listSize > m_Datas.arraySize) m_Datas.arraySize++;
while (listSize < m_Datas.arraySize) m_Datas.arraySize--; while (listSize < m_Datas.arraySize) m_Datas.arraySize--;
serie.ResetDataIndex();
} }
if (listSize > 30) // && !XCSettings.editorShowAllListData) if (listSize > 30) // && !XCSettings.editorShowAllListData)
{ {
@@ -114,7 +115,9 @@ namespace XCharts.Editor
m_DataElementFoldout[index] = false; m_DataElementFoldout[index] = false;
} }
var fieldCount = dimension + (showName ? 1 : 0); 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) delegate(Rect drawRect)
{ {
//drawRect.width -= 2f; //drawRect.width -= 2f;
@@ -124,7 +127,7 @@ namespace XCharts.Editor
var lastWid = drawRect.width; var lastWid = drawRect.width;
var lastFieldWid = EditorGUIUtility.fieldWidth; var lastFieldWid = EditorGUIUtility.fieldWidth;
var lastLabelWid = EditorGUIUtility.labelWidth; var lastLabelWid = EditorGUIUtility.labelWidth;
var serieData = m_Datas.GetArrayElementAtIndex(index); //var serieData = m_Datas.GetArrayElementAtIndex(index);
var sereName = serieData.FindPropertyRelative("m_Name"); var sereName = serieData.FindPropertyRelative("m_Name");
var data = serieData.FindPropertyRelative("m_Data"); var data = serieData.FindPropertyRelative("m_Data");
#if UNITY_2019_3_OR_NEWER #if UNITY_2019_3_OR_NEWER
@@ -190,7 +193,7 @@ namespace XCharts.Editor
EditorGUI.indentLevel++; EditorGUI.indentLevel++;
var serieData = m_Datas.GetArrayElementAtIndex(index); var serieData = m_Datas.GetArrayElementAtIndex(index);
PropertyField(serieData.FindPropertyRelative("m_Name")); PropertyField(serieData.FindPropertyRelative("m_Name"));
PropertyField(serieData.FindPropertyRelative("m_State")); //PropertyField(serieData.FindPropertyRelative("m_State"));
if (serie.GetType().IsDefined(typeof(SerieDataExtraFieldAttribute), false)) if (serie.GetType().IsDefined(typeof(SerieDataExtraFieldAttribute), false))
{ {
var attribute = serie.GetType().GetAttribute<SerieDataExtraFieldAttribute>(); var attribute = serie.GetType().GetAttribute<SerieDataExtraFieldAttribute>();

View File

@@ -162,6 +162,13 @@ namespace XCharts.Editor
RefreshEditors(); RefreshEditors();
} }
})); }));
editor.menus.Add(new HeaderMenuInfo("Reset Data Index", () =>
{
if (chart.ResetDataIndex(id))
{
RefreshEditors();
}
}));
foreach (var type in GetCovertToSerie(editor.serie.GetType())) foreach (var type in GetCovertToSerie(editor.serie.GetType()))
{ {
editor.menus.Add(new HeaderMenuInfo("Covert to " + type.Name, () => editor.menus.Add(new HeaderMenuInfo("Covert to " + type.Name, () =>

View File

@@ -1,3 +1,4 @@
using System.Collections.Generic;
using System.Text; using System.Text;
using UnityEngine; 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) private static void CheckSerie(BaseChart chart, StringBuilder sb)
{ {
var allDataIsEmpty = true; var allDataIsEmpty = true;
var allDataIsZero = true; var allDataIsZero = true;
var allSerieIsHide = true; var allSerieIsHide = true;
var set = new HashSet<int>();
foreach (var serie in chart.series) foreach (var serie in chart.series)
{ {
if (serie.show) allSerieIsHide = false; if (serie.show) allSerieIsHide = false;
if (serie.dataCount > 0) if (serie.dataCount > 0)
{ {
allDataIsEmpty = false; allDataIsEmpty = false;
var dataIndexError = 0;
set.Clear();
for (int i = 0; i < serie.dataCount; i++) for (int i = 0; i < serie.dataCount; i++)
{ {
var serieData = serie.GetSerieData(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++) for (int j = 1; j < serieData.data.Count; j++)
{ {
if (serieData.GetData(j) != 0) 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); 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 else
{ {

View File

@@ -61,6 +61,18 @@ namespace XCharts.Runtime
return true; return true;
} }
/// <summary>
/// 重置serie的数据项索引。避免数据项索引异常。
/// </summary>
/// <param name="serieIndex"></param>
public bool ResetDataIndex(int serieIndex)
{
var serie = GetSerie(serieIndex);
if (serie != null)
return serie.ResetDataIndex();
return false;
}
public bool CanAddSerie<T>() where T : Serie public bool CanAddSerie<T>() where T : Serie
{ {
return CanAddSerie(typeof(T)); return CanAddSerie(typeof(T));

View File

@@ -57,6 +57,7 @@ namespace XCharts.Runtime
m_LastCheckContextFlag = needCheck; m_LastCheckContextFlag = needCheck;
var themeSymbolSize = chart.theme.serie.lineSymbolSize; var themeSymbolSize = chart.theme.serie.lineSymbolSize;
var needInteract = false; var needInteract = false;
serie.ResetDataIndex();
if (m_LegendEnter) if (m_LegendEnter)
{ {
serie.context.pointerEnter = true; serie.context.pointerEnter = true;
@@ -112,7 +113,9 @@ namespace XCharts.Runtime
} }
} }
if (lastIndex != serie.context.pointerItemDataIndex) if (lastIndex != serie.context.pointerItemDataIndex)
{
needInteract = true; needInteract = true;
}
} }
if (needInteract) if (needInteract)
{ {

View File

@@ -1159,6 +1159,23 @@ namespace XCharts.Runtime
serieData.interact.Reset(); serieData.interact.Reset();
} }
/// <summary>
/// 重置数据项索引。避免部分数据项的索引异常。
/// </summary>
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;
}
/// <summary> /// <summary>
/// 清空所有数据 /// 清空所有数据
/// </summary> /// </summary>