| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 | 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 bool s_LinksData;        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, bool linksData)        {            s_Chart = chart;            s_Serie = serie;            s_Axis = axis;            s_LinksData = linksData;            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;            if (s_LinksData) serie.ClearLinks();            else 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;            if (s_LinksData) serie.ClearLinks();            else 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;        }    }}
 |