223 lines
6.2 KiB
C#
223 lines
6.2 KiB
C#
|
|
#define Graph_And_Chart_PRO
|
||
|
|
using UnityEngine;
|
||
|
|
using System.Collections;
|
||
|
|
using System;
|
||
|
|
using ChartAndGraph;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Globalization;
|
||
|
|
#if UNITY_2018_1_OR_NEWER
|
||
|
|
using UnityEngine.Networking;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
public class PieDataFiller : MonoBehaviour
|
||
|
|
{
|
||
|
|
[Serializable]
|
||
|
|
public enum DataType
|
||
|
|
{
|
||
|
|
/// <summary>
|
||
|
|
/// Parent object is an array where each value matches a category that is already in the pie chart
|
||
|
|
/// </summary>
|
||
|
|
ValueArray,
|
||
|
|
/// <summary>
|
||
|
|
/// each category is an object containing a named object for each group. the pie chart is cleared and all categories are added
|
||
|
|
/// </summary>
|
||
|
|
ObjectForEachElement,
|
||
|
|
}
|
||
|
|
|
||
|
|
public enum DocumentFormat
|
||
|
|
{
|
||
|
|
XML,
|
||
|
|
JSON
|
||
|
|
}
|
||
|
|
|
||
|
|
public PieChart PieObject;
|
||
|
|
/// <summary>
|
||
|
|
/// assign a graph chart prefab that will be used to copy category data
|
||
|
|
/// </summary>
|
||
|
|
public PieChart CategoryPrefab;
|
||
|
|
|
||
|
|
public DocumentFormat Format;
|
||
|
|
public string RemoteUrl;
|
||
|
|
public bool FillOnStart;
|
||
|
|
|
||
|
|
public string ParentObject;
|
||
|
|
public DataType DataStructure;
|
||
|
|
|
||
|
|
private object[] mCategoryVisualStyle;
|
||
|
|
|
||
|
|
private ChartParser mParser;
|
||
|
|
|
||
|
|
static PieDataFiller()
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
private double ParseItem(string item, string format)
|
||
|
|
{
|
||
|
|
if (String.IsNullOrEmpty(format) || format.Equals("none", StringComparison.OrdinalIgnoreCase))
|
||
|
|
{
|
||
|
|
double outputValueDouble;
|
||
|
|
double.TryParse(string.Format(CultureInfo.InvariantCulture, "{0}", item), NumberStyles.Any, CultureInfo.InvariantCulture, out outputValueDouble);
|
||
|
|
return outputValueDouble;
|
||
|
|
}
|
||
|
|
return ChartDateUtility.DateToValue(DateTime.ParseExact(item, format, CultureInfo.InvariantCulture));
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
void LoadObjectforEachElement()
|
||
|
|
{
|
||
|
|
PieChart pie = PieObject.GetComponent<PieChart>();
|
||
|
|
var obj = mParser.GetObject(ParentObject);
|
||
|
|
|
||
|
|
pie.DataSource.Clear();
|
||
|
|
int i = 0;
|
||
|
|
foreach(var pair in mParser.GetAllChildObjects(obj))
|
||
|
|
{
|
||
|
|
int visualIndex = Math.Min(i, mCategoryVisualStyle.Length - 1);
|
||
|
|
object visualStyle = mCategoryVisualStyle[visualIndex];
|
||
|
|
pie.DataSource.AddCategory(pair.Key, null);
|
||
|
|
pie.DataSource.RestoreCategory(pair.Key, visualStyle);
|
||
|
|
double val = ParseItem(mParser.ObjectValue(pair.Value), null);
|
||
|
|
pie.DataSource.SetValue(pair.Key, val);
|
||
|
|
i++;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
void LoadValueArray()
|
||
|
|
{
|
||
|
|
PieChart pie = PieObject.GetComponent<PieChart>();
|
||
|
|
var obj = mParser.GetObject(ParentObject);
|
||
|
|
int size = mParser.GetArraySize(obj);
|
||
|
|
; for (int i = 0; i < size; i++)
|
||
|
|
{
|
||
|
|
|
||
|
|
double val = ParseItem(mParser.GetItem(obj, i), null);
|
||
|
|
string category = pie.DataSource.GetCategoryName(i);
|
||
|
|
pie.DataSource.SetValue(category, val);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void Start()
|
||
|
|
{
|
||
|
|
if (FillOnStart)
|
||
|
|
Fill();
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Fill()
|
||
|
|
{
|
||
|
|
Fill(null);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Fill(WWWForm postData)
|
||
|
|
{
|
||
|
|
StartCoroutine(GetData(postData));
|
||
|
|
}
|
||
|
|
|
||
|
|
void LoadCategoryVisualStyle(PieChart bar)
|
||
|
|
{
|
||
|
|
var prefab = CategoryPrefab;
|
||
|
|
if (prefab == null)
|
||
|
|
{
|
||
|
|
if (bar is CanvasPieChart)
|
||
|
|
prefab = ((GameObject)Resources.Load("Chart And Graph/DefualtPieCategoryStyle2D")).GetComponent<PieChart>();
|
||
|
|
else
|
||
|
|
prefab = ((GameObject)Resources.Load("Chart And Graph/DefualtPieCategoryStyle3D")).GetComponent<PieChart>(); // load default
|
||
|
|
}
|
||
|
|
if (prefab == null)
|
||
|
|
Debug.LogError("missing resources for graph and chart, please reimport the package");
|
||
|
|
else
|
||
|
|
mCategoryVisualStyle = prefab.DataSource.StoreAllCategoriesinOrder();
|
||
|
|
}
|
||
|
|
|
||
|
|
public void ApplyData(string text)
|
||
|
|
{
|
||
|
|
|
||
|
|
PieChart pie = PieObject.GetComponent<PieChart>();
|
||
|
|
|
||
|
|
if (Format == DocumentFormat.JSON)
|
||
|
|
mParser = new JsonParser(text);
|
||
|
|
else
|
||
|
|
mParser = new XMLParser(text);
|
||
|
|
|
||
|
|
LoadCategoryVisualStyle(pie);
|
||
|
|
if (mCategoryVisualStyle.Length == 0)
|
||
|
|
{
|
||
|
|
Debug.LogWarning("no visual styles defeind for BarDataFiller, aborting");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (DataStructure == DataType.ValueArray)
|
||
|
|
LoadValueArray();
|
||
|
|
else
|
||
|
|
LoadObjectforEachElement();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
#if UNITY_2018_1_OR_NEWER
|
||
|
|
UnityWebRequest CreateRequest(WWWForm postData)
|
||
|
|
{
|
||
|
|
if (postData == null)
|
||
|
|
return UnityWebRequest.Get(RemoteUrl);
|
||
|
|
return UnityWebRequest.Post(RemoteUrl, postData);
|
||
|
|
}
|
||
|
|
IEnumerator GetData(WWWForm postData)
|
||
|
|
{
|
||
|
|
using (UnityWebRequest webRequest = CreateRequest(postData))
|
||
|
|
{
|
||
|
|
yield return webRequest.SendWebRequest();
|
||
|
|
#if UNITY_2020_1_OR_NEWER
|
||
|
|
if (webRequest.result != UnityWebRequest.Result.Success)
|
||
|
|
#else
|
||
|
|
if (webRequest.isNetworkError)
|
||
|
|
#endif
|
||
|
|
Debug.LogError("Bar Data Filler : URL request failed ," + webRequest.error);
|
||
|
|
else
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
string text = webRequest.downloadHandler.text;
|
||
|
|
ApplyData(text);
|
||
|
|
}
|
||
|
|
catch (Exception e)
|
||
|
|
{
|
||
|
|
Debug.LogError("Bar Data Filler : Invalid document format, please check your settings , with exception " + e.ToString());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#else
|
||
|
|
IEnumerator GetData(WWWForm postData)
|
||
|
|
{
|
||
|
|
WWW request;
|
||
|
|
if (postData != null)
|
||
|
|
{
|
||
|
|
request = new WWW(RemoteUrl, postData);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
request = new WWW(RemoteUrl);
|
||
|
|
yield return request;
|
||
|
|
if (String.IsNullOrEmpty(request.error))
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
string text = request.text;
|
||
|
|
ApplyData(text);
|
||
|
|
}
|
||
|
|
catch (Exception e)
|
||
|
|
{
|
||
|
|
Debug.LogError("Pie Data Filler : Invalid document format, please check your settings , with exception " + e.ToString());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Debug.LogError("Pie Data Filler : URL request failed ," + request.error);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
void Update()
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|