351 lines
14 KiB
C#

using CG.UTility;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*******************************************************************************
*Create By CG
*Function 部件拆解
*******************************************************************************/
namespace ZXK.GYJQR
{
public class DataBJCJHandler
{
//public static Dictionary<string,Sprite> _BJCZSpriteArray=new Dictionary<string, Sprite>();//节约每次加载时间,第一次加载后静态存储
/// <summary>
/// 考核分数管理
/// [步骤名字[步骤子类,得分]]
/// </summary>
private Dictionary<string, Dictionary<string, float>> _examScore = new Dictionary<string, Dictionary<string, float>>();
/// <summary>
/// 当前所在操作状态
/// 部件认知|一键拆解|一键拼装|顺序拆解|原理示意
/// </summary>
public BindableProperty<int> _CurState = new BindableProperty<int>()
{
Value = (int)EnumCtrl.BJCZState.None
};
/// <summary>
/// 当前正在介绍的模型
/// </summary>
public BindablePropertyRef<string> _ShowPartsName = new BindablePropertyRef<string>()
{
Value = ""
};
/// <summary>
/// 部件认知时当前正在选中的物体
/// </summary>
public BindablePropertyDic<string, BJCJ_INFO> _CurBJRZhandler = new BindablePropertyDic<string, BJCJ_INFO>();
/// <summary>
/// 一键拆解时当前正在拆解步骤
/// </summary>
public BindablePropertyDic<string, BJCJ_INFO> _CurYJCJhandler = new BindablePropertyDic<string, BJCJ_INFO>();
/// <summary>
/// 一键拼装时当前正在合成步骤
/// </summary>
private Dictionary<string, List<BJCJ_INFO>> _curYJCJCombinatehandler = new Dictionary<string, List<BJCJ_INFO>>();
public System.Action<BJCJ_INFO> OnYJCJCombinateChanged;
/// <summary>
/// 顺序拆解中当前正在拆解步骤
/// </summary>
public BindablePropertyDic<string, BJCJ_SXCJ> _CurDismountStephandler = new BindablePropertyDic<string, BJCJ_SXCJ>();
public BindablePropertyDic<string, BJCJ_INFO> _CurYLSYhandler = new BindablePropertyDic<string, BJCJ_INFO>();
private Dictionary<string, List<BJCJ_INFO>> _bjrzDataArray = new Dictionary<string, List<BJCJ_INFO>>();
/// <summary>
/// 部件认知数据集合
/// </summary>
public Dictionary<string, List<BJCJ_INFO>> _BJRZDataArray { get => _bjrzDataArray; }
private Dictionary<string, List<BJCJ_INFO>> _yjcjDataArray = new Dictionary<string, List<BJCJ_INFO>>();
/// <summary>
/// 一键拆解数据集合
/// </summary>
public Dictionary<string, List<BJCJ_INFO>> _YJCJDataArray { get => _yjcjDataArray; }
private Dictionary<string, List<BJCJ_SXCJ>> _sxcjDataArray = new Dictionary<string, List<BJCJ_SXCJ>>();
/// <summary>
/// 顺序拆解数据集合
/// </summary>
public Dictionary<string, List<BJCJ_SXCJ>> _SXCJDataArray { get => _sxcjDataArray; }
private Dictionary<string, List<BJCJ_INFO>> _ylsyDataArray = new Dictionary<string, List<BJCJ_INFO>>();
/// <summary>
/// 原理示意数据集合
/// </summary>
public Dictionary<string, List<BJCJ_INFO>> _YLSYDataArray { get => _ylsyDataArray; }
public DataBJCJHandler()
{
InitAppData();
}
public void InitAppData()
{
string bjrzInfoPath = Application.streamingAssetsPath + ConstCtrl.JSON_PATH + "BJCZ_BJRZ.txt";
//string bjrzDetail = TxtFileHandle.ReadAllTxt(bjrzInfoPath);
//_bjrzDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_INFO>>>(bjrzDetail);
TxtFileHandle.ReadAllTxt(bjrzInfoPath, (string vul) =>
{
_bjrzDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_INFO>>>(vul);
});
string yjcjInfoPath = Application.streamingAssetsPath + ConstCtrl.JSON_PATH + "BJCZ_YJCJ.txt";
//string yjcjDetail = TxtFileHandle.ReadAllTxt(yjcjInfoPath);
//_yjcjDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_INFO>>>(yjcjDetail);
TxtFileHandle.ReadAllTxt(yjcjInfoPath, (string vul) =>
{
_yjcjDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_INFO>>>(vul);
});
string ylsyInfoPath = Application.streamingAssetsPath + ConstCtrl.JSON_PATH + "BJCZ_YLSY.txt";
//string ylsyDetail = TxtFileHandle.ReadAllTxt(ylsyInfoPath);
//_ylsyDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_INFO>>>(ylsyDetail);
TxtFileHandle.ReadAllTxt(ylsyInfoPath, (string vul) =>
{
_ylsyDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_INFO>>>(vul);
});
string SXCJpath = Application.streamingAssetsPath + ConstCtrl.JSON_PATH + "BJCZ_SXCJ.txt";
//string SXCJdetail = TxtFileHandle.ReadAllTxt(SXCJpath);
//_sxcjDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_SXCJ>>>(SXCJdetail);
TxtFileHandle.ReadAllTxt(SXCJpath, (string vul) =>
{
_sxcjDataArray = JsonConvert.DeserializeObject<Dictionary<string, List<BJCJ_SXCJ>>>(vul);
//针对顺序拆解中的每个步骤开始播放动画时间动态赋值
foreach (var item in _sxcjDataArray)
{
for (int i = 0; i < item.Value.Count; i++)
{
item.Value[i].AnmStartTime = i * 2;
}
}
});
}
/// <summary>
/// 在部件认知中通过部件ID获取部件实体信息
/// </summary>
/// <param name="partID"></param>
/// <returns></returns>
public BJCJ_INFO GetBJRZInfoByID(string partID)
{
for (int i = 0; i < _BJRZDataArray[_ShowPartsName.Value].Count; i++)
{
if (_BJRZDataArray[_ShowPartsName.Value][i].id.ToString().Equals(partID))
{
return _BJRZDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 在部件认知中通过部件物体名字获取部件实体信息
/// </summary>
/// <param name="partName"></param>
/// <returns></returns>
public BJCJ_INFO GetBJRZInfoByPartName(string geoName)
{
for (int i = 0; i < _BJRZDataArray[_ShowPartsName.Value].Count; i++)
{
if (_BJRZDataArray[_ShowPartsName.Value][i].itemGeo.Equals(geoName))
{
return _BJRZDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 在一键拆解中通过部件ID获取部件实体信息
/// </summary>
/// <param name="partName"></param>
/// <returns></returns>
public BJCJ_INFO GetYJCJInfoByID(string partID)
{
for (int i = 0; i < _YJCJDataArray[_ShowPartsName.Value].Count; i++)
{
if (_YJCJDataArray[_ShowPartsName.Value][i].id.ToString().Equals(partID))
{
return _YJCJDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 在一键拆解中通过部件物体名字获取部件实体信息
/// </summary>
/// <param name="partName"></param>
/// <returns></returns>
public BJCJ_INFO GetYJCJInfoByPartName(string geoName)
{
for (int i = 0; i < _YJCJDataArray[_ShowPartsName.Value].Count; i++)
{
if (_YJCJDataArray[_ShowPartsName.Value][i].itemGeo.Equals(geoName))
{
return _YJCJDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 在一键拆解中获取拼合部件
/// </summary>
/// <returns></returns>
public Dictionary<string, List<BJCJ_INFO>> GetYJCJCombinate()
{
return _curYJCJCombinatehandler;
}
/// <summary>
/// 在一键拆解中填入一个已拼合部件
/// </summary>
public void AddYJCJCombinate(BJCJ_INFO partInfo)
{
foreach (var item in _YJCJDataArray)
{
if (item.Key.Equals(_ShowPartsName.Value))
{
if (_curYJCJCombinatehandler.ContainsKey(_ShowPartsName.Value))
{
if (_curYJCJCombinatehandler[_ShowPartsName.Value] != null && _curYJCJCombinatehandler[_ShowPartsName.Value].Count > 0 && !_curYJCJCombinatehandler[_ShowPartsName.Value].Contains(partInfo))
{
_curYJCJCombinatehandler[_ShowPartsName.Value].Add(partInfo);
}
else
{
List<BJCJ_INFO> partinfos = new List<BJCJ_INFO>();
partinfos.Add(partInfo);
_curYJCJCombinatehandler[_ShowPartsName.Value] = partinfos;
}
}
else
{//第一次查看此模块
List<BJCJ_INFO> partinfos = new List<BJCJ_INFO>();
partinfos.Add(partInfo);
_curYJCJCombinatehandler.Add(_ShowPartsName.Value, partinfos);
}
}
}
OnYJCJCombinateChanged?.Invoke(partInfo);
}
/// <summary>
/// 在一键拆解中清除拼合部件
/// </summary>
public void ClearYJCJCombinate()
{
_curYJCJCombinatehandler.Clear();
}
/// <summary>
/// 在原理示意中通过部件ID获取部件实体信息
/// </summary>
/// <param name="partName"></param>
/// <returns></returns>
public BJCJ_INFO GetYLSYInfoByID(string partID)
{
for (int i = 0; i < _YLSYDataArray[_ShowPartsName.Value].Count; i++)
{
if (_YLSYDataArray[_ShowPartsName.Value][i].id.ToString().Equals(partID))
{
return _YLSYDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 在顺序拆解中通过部件ID获取部件实体信息
/// </summary>
/// <param name="partName"></param>
/// <returns></returns>
public BJCJ_SXCJ GetSXCJInfoByID(string partID)
{
for (int i = 0; i < _SXCJDataArray[_ShowPartsName.Value].Count; i++)
{
if (_SXCJDataArray[_ShowPartsName.Value][i].id.ToString().Equals(partID))
{
return _SXCJDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 在顺序拆解中通过部件ID获取下一个部件实体信息
/// </summary>
/// <param name="partID"></param>
/// <returns></returns>
public BJCJ_SXCJ GetSXCJNextInfo(string partID)
{
for (int i = 0; i < _SXCJDataArray[_ShowPartsName.Value].Count; i++)
{
if (_SXCJDataArray[_ShowPartsName.Value][i].id.ToString().Equals(partID))
{
if (i < _SXCJDataArray[_ShowPartsName.Value].Count - 1)
return _SXCJDataArray[_ShowPartsName.Value][i + 1];
else
return _SXCJDataArray[_ShowPartsName.Value][i];
}
}
return null;
}
/// <summary>
/// 根据成绩单布局返回成绩
/// </summary>
/// <returns>[步骤名,子步骤名,总成绩,实际成绩]</returns>
public Queue<string[]> GetExamScore()
{
Queue<string[]> scoreFinish = new Queue<string[]>();
BJCJ_SXCJ curstep = null;
BJCJ_SXCJ nextstep = null;
float curStepChildTotalScore = 0;
float realityScore = 0;
for (int i = 0; i < _sxcjDataArray[ConstCtrl.BJCZ_MAINMODEL1_NAME].Count; i++)
{
curstep = _sxcjDataArray[ConstCtrl.BJCZ_MAINMODEL1_NAME][i];
if(i== _sxcjDataArray[ConstCtrl.BJCZ_MAINMODEL1_NAME].Count - 1)
{
nextstep = null;
}
else
{
nextstep = _sxcjDataArray[ConstCtrl.BJCZ_MAINMODEL1_NAME][i + 1];
}
curStepChildTotalScore += curstep.score;
if (nextstep==null||!nextstep.stepNameChild.Equals(curstep.stepNameChild))
{
realityScore = 0;
if (_examScore.ContainsKey(curstep.stepName)&& _examScore[curstep.stepName].ContainsKey(curstep.stepNameChild))
{
realityScore = _examScore[curstep.stepName][curstep.stepNameChild];
}
scoreFinish.Enqueue(new string[] { curstep.stepName, curstep.stepNameChild, curStepChildTotalScore.ToString(), realityScore.ToString() });
curStepChildTotalScore = 0;
}
}
return scoreFinish;
}
/// <summary>
/// 操作正确步骤后得分
/// </summary>
/// <param name="bigStepName">大步骤名字</param>
/// <param name="smallStepName">子步骤名字</param>
/// <param name="score">当前步骤可得分数</param>
/// <returns></returns>
public float AddScore(string bigStepName, string smallStepName, float score)
{
if (!_examScore.ContainsKey(bigStepName))
{
_examScore.Add(bigStepName, new Dictionary<string, float>());
}
if (!_examScore[bigStepName].ContainsKey(smallStepName))
{
_examScore[bigStepName].Add(smallStepName, 0);
}
_examScore[bigStepName][smallStepName] += score;
return _examScore[bigStepName][smallStepName];
}
}
}