Aimbot-ParallelEnv/Assets/XCharts/Editor/Windows/PraseExternalDataEditor.cs

238 lines
8.6 KiB
C#
Raw Normal View History

2022-10-25 19:07:39 +00:00
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using XCharts.Runtime;
namespace XCharts.Editor
{
public class PraseExternalDataEditor : UnityEditor.EditorWindow
{
private static BaseChart s_Chart;
private static Serie s_Serie;
private static Axis s_Axis;
private static PraseExternalDataEditor window;
private static string inputJsonText = "";
public static void ShowWindow()
{
window = GetWindow<PraseExternalDataEditor>();
window.titleContent = new GUIContent("PraseExternalData");
window.minSize = new Vector2(450, 550);
window.Focus();
window.Show();
}
public static void UpdateData(BaseChart chart, Serie serie, Axis axis)
{
s_Chart = chart;
s_Serie = serie;
s_Axis = axis;
inputJsonText = UnityEngine.GUIUtility.systemCopyBuffer;
}
void OnInspectorUpdate()
{
Repaint();
}
private void OnGUI()
{
if (s_Chart == null)
{
Close();
return;
}
EditorGUILayout.LabelField("Input external data (echarts data):");
inputJsonText = EditorGUILayout.TextArea(inputJsonText, GUILayout.Height(400));
if (GUILayout.Button("Add"))
{
if (s_Serie != null)
{
if (!ParseArrayData(s_Serie, inputJsonText))
{
if (ParseJsonData(s_Serie, inputJsonText))
inputJsonText = "";
}
else
{
inputJsonText = "";
}
}
else if (s_Axis != null)
{
if (!ParseArrayData(s_Axis, inputJsonText))
{
if (ParseJsonData(s_Axis, inputJsonText))
inputJsonText = "";
}
else
{
inputJsonText = "";
}
}
}
}
private static bool ParseArrayData(Axis axis, string arrayData)
{
arrayData = arrayData.Trim();
if (!arrayData.StartsWith("data: Array")) return false;
axis.data.Clear();
var list = arrayData.Split('\n');
for (int i = 1; i < list.Length; i++)
{
var temp = list[i].Split(':');
if (temp.Length == 2)
{
var category = temp[1].Replace("\"", "").Trim();
axis.data.Add(category);
}
}
axis.SetAllDirty();
return true;
}
private static bool ParseArrayData(Serie serie, string arrayData)
{
arrayData = arrayData.Trim();
if (!arrayData.StartsWith("data: Array")) return false;
serie.ClearData();
var list = arrayData.Split('\n');
for (int i = 1; i < list.Length; i++)
{
var temp = list[i].Split(':');
if (temp.Length == 2)
{
var strvalue = temp[1].Replace("\"", "").Trim();
var value = 0d;
var flag = double.TryParse(strvalue, out value);
if (flag)
{
serie.AddYData(value);
}
}
}
serie.SetAllDirty();
return true;
}
private static bool ParseJsonData(Axis axis, string jsonData)
{
if (!CheckJsonData(ref jsonData)) return false;
axis.data.Clear();
string[] datas = jsonData.Split(',');
for (int i = 0; i < datas.Length; i++)
{
var txt = datas[i].Trim().Replace("[", "").Replace("]", "");
var value = 0d;
if (!double.TryParse(txt, out value))
axis.data.Add(txt.Replace("\'", "").Replace("\"", ""));
}
axis.SetAllDirty();
return true;
}
/// <summary>
/// 从json中导入数据
/// </summary>
/// <param name="jsonData"></param>
private static bool ParseJsonData(Serie serie, string jsonData)
{
if (!CheckJsonData(ref jsonData)) return false;
serie.ClearData();
if (jsonData.IndexOf("],") > -1 || jsonData.IndexOf("] ,") > -1)
{
string[] datas = jsonData.Split(new string[] { "],", "] ," }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < datas.Length; i++)
{
var data = datas[i].Replace("[", "").Replace("]", "").Split(new char[] { '[', ',' }, StringSplitOptions.RemoveEmptyEntries);
var serieData = new SerieData();
double value = 0;
if (data.Length == 2 && !double.TryParse(data[0], out value))
{
double.TryParse(data[1], out value);
serieData.data = new List<double>() { i, value };
serieData.name = data[0].Replace("\"", "").Trim();
}
else
{
for (int j = 0; j < data.Length; j++)
{
var txt = data[j].Trim().Replace("]", "");
var flag = double.TryParse(txt, out value);
if (flag)
{
serieData.data.Add(value);
}
else serieData.name = txt.Replace("\"", "").Trim();
}
}
serie.AddSerieData(serieData);
}
}
else if (jsonData.IndexOf("value") > -1 && jsonData.IndexOf("name") > -1)
{
string[] datas = jsonData.Split(new string[] { "},", "} ,", "}" }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < datas.Length; i++)
{
var arr = datas[i].Replace("{", "").Split(',');
var serieData = new SerieData();
foreach (var a in arr)
{
if (a.StartsWith("value:"))
{
double value = double.Parse(a.Substring(6, a.Length - 6));
serieData.data = new List<double>() { i, value };
}
else if (a.StartsWith("name:"))
{
string name = a.Substring(6, a.Length - 6 - 1);
serieData.name = name;
}
else if (a.StartsWith("selected:"))
{
string selected = a.Substring(9, a.Length - 9);
serieData.selected = bool.Parse(selected);
}
}
serie.AddSerieData(serieData);
}
}
else
{
string[] datas = jsonData.Split(',');
for (int i = 0; i < datas.Length; i++)
{
double value;
var flag = double.TryParse(datas[i].Trim(), out value);
if (flag)
{
var serieData = new SerieData();
serieData.data = new List<double>() { i, value };
serie.AddSerieData(serieData);
}
}
}
serie.SetAllDirty();
return true;
}
private static bool CheckJsonData(ref string jsonData)
{
if (string.IsNullOrEmpty(jsonData)) return false;
jsonData = jsonData.Replace("\r\n", "");
jsonData = jsonData.Replace(" ", "");
jsonData = jsonData.Replace("\n", "");
int startIndex = jsonData.IndexOf("[");
int endIndex = jsonData.LastIndexOf("]");
if (startIndex == -1 || endIndex == -1)
{
Debug.LogError("json data need include in [ ]");
return false;
}
jsonData = jsonData.Substring(startIndex + 1, endIndex - startIndex - 1);
return true;
}
}
}