//using LitJson; using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System; using System.Linq; using System.Reflection; using RuralPower; using Newtonsoft.Json; using Newtonsoft.Json.Linq; public class DataHandler : MonoBehaviour { private static DataHandler instance; private string path; public static DataHandler Instance => instance; //private CenterManage[] CenterManages; public List devicesBases = new List(); public Dictionary Settings = new Dictionary(); private void Awake() { instance = this; } void Start() { devicesBases = FindObjectsOfType().ToList(); if (ScenesRecorder.instance == null) Init(); else InitData(ScenesRecorder.AttributeDatas); } public void Init() { var ipSettingsPath = Path.Combine(Application.streamingAssetsPath, "Settings/IPSettings.txt"); using (StreamReader reader = new StreamReader(ipSettingsPath)) { var _info = new List(); while (!reader.EndOfStream) { _info.Add(reader.ReadLine()); } _info.ForEach(x => { var line = x.Split('='); if (line.Length == 2 && !Settings.ContainsKey(line[0])) { Settings.Add(line[0].Trim(), line[1].Trim()); } }); } string _ip = Settings["IP"]; bool.TryParse(Settings["UseLocalData"], out bool _UseLocalData); if (_UseLocalData) { Debug.Log("Load local data!"); var resData = Resources.Load("Data/730Data"); InitData(resData.ToString()); } else { Debug.Log("Load online data!"); RuralPowerAPI rpa = new RuralPowerAPI(); var result = rpa.GetExam(_ip,ScenesRecorder.user.user_id,MyManage.instance.startMode.teachplanId.ToString(),Application.streamingAssetsPath+ "/zy"); InitData(result); } } public void InitData(string result) { JObject jo = JObject.Parse(result); var data = JsonConvert.DeserializeObject>(jo["data"]["SceneData"].ToString()); for (int i = 0; i < data.Count; i++) { var _dev = devicesBases.Find(x => x.DeviceId.Equals(data[i].RootDeviceId)); if (_dev != null) { initCou++; switch (data[i].Type) { case "断路器": var breakerDevice = devicesBases.Find(x => x.DeviceId.Equals(data[i].Screen.DeviceId)); if (breakerDevice != null) InvokeMethod(breakerDevice, data[i].FaultDesc, data[i]); break; case "配电箱": InvokeMethod(_dev, data[i].FaultDesc, data[i]); break; case "杆塔": InvokeMethod(_dev, data[i].FaultDesc, data[i]); break; case "线档": InvokeMethod(_dev, data[i].FaultDesc, data[i]); break; default: break; } } } Debug.Log("数据总量_" + data.Count); Debug.Log("所有数据初始化初步完成_" + initcount + "_" + initCou); } public void InitData(List data) { for (int i = 0; i < data.Count; i++) { var _dev = devicesBases.Find(x => x.DeviceId.Equals(data[i].RootDeviceId)); if (_dev != null) { initCou++; switch (data[i].Type) { case "断路器": var breakerDevice = devicesBases.Find(x => x.DeviceId.Equals(data[i].Screen.DeviceId)); if (breakerDevice != null) InvokeMethod(breakerDevice, data[i].FaultDesc, data[i]); break; case "配电箱": InvokeMethod(_dev, data[i].FaultDesc, data[i]); break; case "杆塔": InvokeMethod(_dev, data[i].FaultDesc, data[i]); break; case "线档": InvokeMethod(_dev, data[i].FaultDesc, data[i]); break; default: break; } } } Debug.Log("数据总量_" + data.Count); Debug.Log("所有数据初始化初步完成_" + initcount + "_" + initCou); } /// /// 更新参数 /// /// 标签 /// 类 /// 参数名称 /// 参数值 public void UpdateProperty(object obj, string propertyname, object value) { var t = obj.GetType(); var properties = t.GetProperties(); foreach (var property in properties) { if (!property.IsDefined(typeof(T), false)) continue; if (property.Name.Equals(propertyname)) property.SetValue(obj, value); } } public int initCou = 0; public int initcount = 0; /// /// 执行故障设置 /// /// 标签 /// 类 /// 缺陷名称 /// 参数 public void InvokeMethod(object obj, string _defect, params object[] parameters) { var t = obj.GetType(); var methods = t.GetMethods(); foreach (var method in methods) { if (!method.IsDefined(typeof(T), false)) continue; var _defectattr = method.GetCustomAttribute(typeof(T)); if (_defectattr == null) { return; } var defectName = _defectattr.GetType().GetProperty("DefectName").GetValue(_defectattr) as string; if (_defect.Equals(defectName)) { method.Invoke(obj, parameters); initcount++; } } } }