using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Configuration;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net;
using System.Net.Sockets;
//using GenerateReport;
namespace AiControlRequest
{
///
/// Ai控制过程结果
///
public class AiControl
{
#region 检测项目枚举参数
///
/// 检测分类参数
///
public enum catagoryParam //钢种
{
///
/// 灰铸铁
///
GrayCastIron = 14, //灰铸铁
///
/// 球墨铸铁
///
NodularCastIron = 15, //球墨铸铁
///
/// 轴承钢
///
BearingSteel = 16, //轴承钢
///
/// 亚共析带状
///
HypoeutectoidStrip = 17, //亚共析带状
///
/// 组织识别
///
OrganizationIdentification = 0, //组织识别
///
/// 魏氏
///
Westergren = 18, //魏氏
///
/// 夹杂物
///
Inclusion = 18, //夹杂物
///
/// 晶粒度
///
GrainSize = 18, //晶粒度
}
///
/// 检测项目参数
///
public enum itemParam //项目
{
///
/// 石墨形状
///
GraphiteShape = 1,
///
/// 石墨长度
///
GraphiteLength = 2,
///
/// 珠光体数量
///
PearliteNumber = 3,
///
/// 磷共晶数量
///
SteaditeNumber = 5,
///
/// 共晶团分类检测
///
EutecticClusterItemize = 10,
///
/// 球化率
///
Nodularity = 1,
///
/// 球墨大小
///
SpheroidalGraphiteSize = 2,
///
/// 铁素体数量
///
FerriteNumber = 4,
///
/// 球化退火
///
Spheroidizing = 1,
///
/// 碳化物网状
///
CarbideNetwork = 2,
///
/// 碳化物带状
///
CarbideBanding = 4,
///
/// 亚共析钢带状-A
///
HypoeutectoidStripA = 11,
///
/// 亚共析钢带状-B
///
HypoeutectoidStripB = 12,
///
/// 亚共析钢带状-C
///
HypoeutectoidStripC = 13,
///
/// 亚共析钢带状-D
///
HypoeutectoidStripD = 14,
///
/// 亚共析钢带状-E
///
HypoeutectoidStripE = 15,
///
/// 魏氏-A
///
WestergrenA = 3,
///
/// 魏氏-B
///
WestergrenB = 3,
///
/// 夹杂物
///
Inclusion = 1,
///
/// 晶粒度-定级
///
GrainSizeGrading = 2,
///
/// 晶粒度-分类检测
///
GrainSizeItemize = 10,
///
/// 组织识别
///
OrganizationIdentification = 0
}
///
/// 评级参数
///
public enum jsonParam //评级json参数
{
///
/// 无参数
///
Null = 0,
///
/// 魏氏-A
///
WestergrenA = 1,
///
/// 魏氏-B
///
WestergrenB = 2,
///
/// 夹杂物ABC
///
InclusionABC = 3,
///
/// 夹杂物DDS
///
InclusionDDS = 4,
///
/// 夹杂物ALL
///
InclusionALL = 5,
///
/// 轴承钢-碳化物带状垂直
///
CarbideBandingVertical = 6,
///
/// 组织识别-碳素钢珠光体定量
///
CarbonSteelPearliteNumber = 7,
///
/// 组织识别-α铁素体含量
///
AlphafFerriteContent = 8,
///
/// 组织识别-δ铁素体含量
///
DeltafFerriteContent = 9,
///
/// 组织识别-A+F双相含量
///
AFBiphasicContent = 10
}
///
/// 评级参数对应的字符串
///
private List jsonList = new List()
{
@"",
@"{'YBG-W': {'w_cls':'wa'}}",
@"{'YBG-W': {'w_cls':'wb'}}",
@"{'YGB-JZW': {'output_cls_names': ['a','b','c']}}",
@"{'YGB-JZW': {'output_cls_names': ['d','ds']}}",
@"{'YGB-JZW': {'output_cls_names': ['a','b','c','d','ds']}}",
@"{'ZCG_GTG-DZ': {'direction':'v'}}",
@"{'draw_color_zz':['p']}",
@"{'draw_color_zz':['alphaf']}",
@"{'draw_color_zz':['deltaf']}",
@"{'draw_color_zz':['a'],'zzsb_names':['a','f']}"
};
#endregion
#region 参数定义
//读取程序所在目录
private string path = System.AppDomain.CurrentDomain.BaseDirectory;
//配置文件参数
private ExeConfigurationFileMap map = new ExeConfigurationFileMap();
private Configuration cfg;
//定义一个文件夹路径
private String _gradePath;
///
/// 必须在评级结束时才可以更改目录
///
public String GradePaht
{
get { return _gradePath; }
set
{
if (_isStart == false)
{
_gradePath = value;
}
}
}
//定义一个列表,存放一些列表的集合
private List> _nameList = new List>();
//定义一个批次返回处理完成的文件列表
private List _batchList = new List();
//定义一个存储文件全路径的集合
private List _tempList = new List();
//定义一个锁,判断请求是否有返回
private Boolean _postLock = false;
//操作之间的互斥锁
private Boolean _mutexLock = false;
//定义一个发送请求的最小数
private int _countList = 100;
//定义执行该操作的开始标志
private Boolean _isStart;
private Boolean _isEnd;
private Boolean _isFirst;
//定义本机评级开关
private Boolean _localLock = false;
//定义是远程还是本机
private Boolean _isLocalHost;
//请求的URL
private String _url = "";
private const String Post = "Post";
private const String Content_Type = "Content-Type:application/json";
//本地评级参数
PythonExecutor pythonExecutor = null;
private SynchronizationContext synchronizationContext = null;
Label lblret = new Label();
private int test_index = 0;//当前完成评级的图片数量
private int test_count = 0;//当前评级的总张数
//评级检测参数-分类、项目、参数
private String _catagory;
private String _item;
private String _param;
//报告参数
//WordReport wordReport = null;
//评级结果文件名
String resultName = "";
//是否单机测试
Boolean _isDebug = false;
//放大倍数
private int _zoom_key = 1;
//分辨率
private double _um_per_pix = 0;
//批次序号
int batch_index = 0;
#endregion
#region 事件
//委托事件-批次结束
public delegate void CompleteBatch(List batchfilenames);
public event CompleteBatch CompleteBatchEvent;
//委托事件-全部结束
public delegate void CompleteAll(String resultfilename);
public event CompleteAll CompleteAllEvent;
#endregion
#region 初始化参数
///
/// 构造函数
///
/// 评级图片的路径
public AiControl(String gradepath)
{
LogHelper.info("初始化20210520");
//识别图片目录
_gradePath = gradepath;
LogHelper.info("获取路径");
if (!System.IO.Directory.Exists(_gradePath))
{
LogHelper.info("目录不存在");
throw (new Exception("目录文件不存在!"));
}
LogHelper.info("初始化评级参数");
//初始化评级参数
Init();
}
///
/// 初始化参数
///
private void Init()
{
_postLock = false; //远程锁
_mutexLock = false; //互斥锁
_isStart = false; //未开始评级
_isEnd = true; //评级没有结束
_isFirst = false;
//线程间同步上下文
lblret.Text = "";
//this.synchronizationContext = SynchronizationContext.Current;
//pythonExecutor = new PythonExecutor(SynchronizationContext.Current);
//pythonExecutor.ReceivedControlData += ReceivedControlData;
LogHelper.info("读取配置文件");
ReadAISetting();
}
///
/// 读配置文件参数
///
private void ReadAISetting()
{
try
{
//读取配置文件参数
map.ExeConfigFilename = Path.Combine(path, "AISetting.config");
cfg = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
//服务器URL
_url = cfg.AppSettings.Settings["ServerURL"].Value;
//远程或本地
_isLocalHost = Convert.ToBoolean(cfg.AppSettings.Settings["IsLocalHost"].Value);
//评级文件最小数
_countList = Convert.ToInt32(cfg.AppSettings.Settings["CountList"].Value);
//读结果文件名
resultName = cfg.AppSettings.Settings["ResultName"].Value;
//调试状态
_isDebug = Convert.ToBoolean(cfg.AppSettings.Settings["Debug"].Value);
}
catch
{
throw (new Exception("读取配置文件出错!"));
}
}
#endregion
#region 检测远程端口是否打开
public Boolean Test_Port()
{
int s1 = this._url.IndexOf("//") + 2;
int s2 = this._url.IndexOf(":");
s2 = this._url.IndexOf(":", s2 + 1);
int s3 = this._url.IndexOf("/", s2 + 1);
string ipd = this._url.Substring(s1, s2 - s1);
string port = this._url.Substring(s2 + 1, s3 - s2 - 1);
IPAddress ip = IPAddress.Parse(ipd);
IPEndPoint point = new IPEndPoint(ip, int.Parse(port));
try
{
TcpClient tcp = new TcpClient();
tcp.Connect(point);
tcp.Close();
tcp = null;
}
catch
{
return false;
}
return true;
}
#endregion
#region 参数设置
///
/// 服务器URL设置(包括IP:端口和服务地址)
///
/// 服务器URL设置(包括IP:端口和服务地址)
public void SetServerURL(String url)
{
if (_isStart == false)
{
this._url = url;
cfg.AppSettings.Settings["ServerURL"].Value = url;
cfg.Save();
LogHelper.info(url);
}
}
///
/// 评级文件的最小总数
///
/// 评级文件的最小总数
public void SetCountList(int countList)
{
if (_isStart == false)
{
if (countList < 0)
{
return;
}
this._countList = countList;
cfg.AppSettings.Settings["CountList"].Value = countList.ToString();
cfg.Save();
LogHelper.info("文件最小总数设置=" + countList.ToString());
}
}
///
/// 远程或本地评级
///
/// True:本地;False:远程
private void SetIsLocalHost(Boolean isLocalhost)
{
this._isLocalHost = isLocalhost;
cfg.AppSettings.Settings["IsLocalHost"].Value = this._isLocalHost.ToString();
cfg.Save();
}
#endregion
#region 评级开始和结束处理函数
///
/// 开始评级且设置评级参数
///
/// 分类
/// 项目
/// 评级参数
/// 评级开始设置是否成功
public Boolean StartAndSetGradeParam(catagoryParam catagory, itemParam item, jsonParam param, int zoom_key, double um_per_pix)
{
if (_isEnd == false || this._postLock == true)
{
return false;
}
try
{
this._zoom_key = zoom_key;
this._um_per_pix = um_per_pix;
this._catagory = ((int)catagory).ToString();
String ctgy = catagoryParam.GetName(typeof(catagoryParam), catagory);
//根据分类查找模板文件
//try
//{
// switch (ctgy)
// {
// case "GrayCastIron":
// wordReport = new WordReport(path + "\\Template\\灰铸铁.docx");
// break;
// case "NodularCastIron":
// wordReport = new WordReport(path + "\\Template\\球墨铸铁.docx");
// break;
// case "BearingSteel":
// wordReport = new WordReport(path + "\\Template\\轴承钢.docx");
// break;
// case "HypoeutectoidStrip":
// wordReport = new WordReport(path + "\\Template\\亚共析带状.docx");
// break;
// case "Westergren":
// wordReport = new WordReport(path + "\\Template\\魏氏.docx");
// break;
// case "Inclusion":
// wordReport = new WordReport(path + "\\Template\\夹杂物.docx");
// break;
// case "GrainSize":
// wordReport = new WordReport(path + "\\Template\\晶粒度.docx");
// break;
// default:
// wordReport = new WordReport(path + "\\Template\\灰铸铁.docx");
// break;
// }
//}
//catch(Exception e)
//{
// throw (new Exception(e.ToString()));
//}
LogHelper.info("zoom_key=" + zoom_key.ToString());
LogHelper.info("um_per_pix=" + um_per_pix.ToString());
LogHelper.info("Server URL=" + this._url);
LogHelper.info("CountList =" + this._countList.ToString());
LogHelper.info("开始评级");
batch_index = 0;
this._item = ((int)item).ToString();
//wordReport = new WordReport(path + "\\Template\\夹杂物.docx");
this._param = jsonList[(int)param];
_isStart = true;
_isEnd = false;
_isFirst = true;
return true;
}
catch
{
return false;
}
}
public Boolean StartAndSetGradeParam(int zoom_key, double um_per_pix)
{
if (_isEnd == false || this._postLock == true)
{
return false;
}
try
{
LogHelper.info("zoom_key=" + zoom_key.ToString());
LogHelper.info("um_per_pix=" + um_per_pix.ToString());
LogHelper.info("开始评级");
batch_index = 0;
this._zoom_key = zoom_key;
this._um_per_pix = um_per_pix;
this._catagory = "18";
this._item = "1";
this._param = jsonList[5];
_isStart = true;
_isEnd = false;
_isFirst = true;
return true;
}
catch
{
return false;
}
}
///
/// 结束本次评级
///
public void EndGrade()
{
if (!this._isStart)
{
return;
}
this._isEnd = true;
LogHelper.info("执行结束本次评级");
//判断是否还有文件,如果还有则进行评级
if (_nameList.Count == 1 && _nameList[0].Count > 0 && _postLock == false)
{
//互斥锁检测
while (_mutexLock) { }
//上锁
_mutexLock = true;
//发送请求
Thread th = new Thread(SendPost);
th.Start();
}
else if (_postLock == false)
{
//如果结束时所有文件都评完级,则发一个空的图片数据和结束参数
JObject json = new JObject();
JObject json1 = new JObject();
JObject json2 = new JObject();
json1.Add("end", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
json1.Add("catagory", this._catagory);
json1.Add("items", this._item);
json1.Add("path", this._gradePath.Replace("\\", "/"));
if (this._catagory == "0")
{
json1.Add("func", "zzsb");
}
else
{
json1.Add("func", "bzpj");
}
json1.Add("images", "");
json.Add("json1", json1);
if (this._param != "")
{
json2 = JObject.Parse(this._param);
}
json2.Add("zoom_key", this._zoom_key);
json2.Add("um_per_pix", this._um_per_pix);
json.Add("json2", json2);
String param = json.ToString();
LogHelper.info(param);
if (!this._isDebug)
{
//发送请求
String res = RequestString(param);
}
//完成后且记录条数为0则发送完成事件
try
{
this._isStart = false;
CompleteAllEvent(AnalysisAIFile());
LogHelper.info("评级全部结束");
}
catch (Exception e)
{
CompleteAllEvent("");
LogHelper.info("ERR:" + e.ToString());
}
}
}
#endregion
#region 返回图像检测结果
///
/// 获取图像检测结果
///
/// 检测图像的全路径和文件名
/// 检测结果
public String GetImageTestResult(String filename)
{
string ret = "";
if (this._isDebug)
{
return "{\"fun\":\"test\",\"return\":\"test_result\"}";
}
if (File.Exists(filename))
{
String aifilename = Path.Combine(Path.GetDirectoryName(filename), "AI", Path.GetFileNameWithoutExtension(filename) + ".ai");
if (File.Exists(aifilename))
{
using (System.IO.StreamReader _file = System.IO.File.OpenText(aifilename))
{
using (JsonTextReader reader = new JsonTextReader(_file))
{
try
{
JObject o = (JObject)JToken.ReadFrom(reader);
JObject content = JObject.Parse(o["content"].ToString());
ret = content["title"].ToString();
}
catch (Exception e)
{
throw (new Exception("AI文件错误!"));
}
reader.Close();
_file.Close();
_file.Dispose();
}
}
}
}
LogHelper.info("返回" + filename + "的结果:" + ret);
return ret;
}
#endregion
#region 返回检测过程图像
///
/// 返回检测过程图像
///
/// 检测图像的全路径和文件名
/// 过程图像的路径和文件名
public String GetImageProcess(String filename)
{
string ret = "";
if (this._isDebug)
{
return "{\"fun\":\"test\",\"return\":\"fullfilename\"}";
}
if (File.Exists(filename))
{
String aifilename = Path.Combine(Path.GetDirectoryName(filename), "AI", Path.GetFileName(filename));
if (File.Exists(aifilename))
{
ret = aifilename;
}
}
LogHelper.info("返回" + filename + "的过程图像:" + ret);
return ret;
}
#endregion
#region 插入单个文件
///
/// 插入单个文件路径
///
/// 文件路径字符串
/// 0:满足条件发送请求;1:记录不够;2:请求正在执行;3:本地请求正在执行;255:没有开始工作
public int PostFileName(String filename)
{
//如果没有开始过程则不与理会
if (!this._isStart)
{
return 255;
}
//如果文件路径为空
if (filename == "")
{
return 254;
}
//向最后的文件列表添加数据
if (_nameList.Count == 0 || _nameList[_nameList.Count - 1].Count == this._countList)
{
List fileList = new List();
_nameList.Add(fileList);
}
_nameList[_nameList.Count - 1].Add(filename);
LogHelper.info("插入单个文件" + filename);
//请求锁
if (_postLock)
{
return 2;
}
//文件数量不满足
else if (_nameList[0].Count < _countList)
{
return 1;
}
//如果请求锁打开且文件列表第一个集合满足记录条数则发送请求
else
{
//请求锁应该在这里上
_postLock = true;
//互斥锁检测
while (_mutexLock) { }
//上锁
_mutexLock = true;
//发送请求
Thread th = new Thread(SendPost);
th.Start();
}
return 0;
}
#endregion
#region 发送Post线程
///
/// 线程-发送请求
///
private void SendPost()
{
//发送请求锁
_postLock = true;
//解锁
_mutexLock = false;
//清空数据
_batchList.Clear();
//取发送请求参数
string images = "";
for (int i = 0; i < _nameList[0].Count; i++)
{
images += _nameList[0][i] + ";";
_batchList.Add(_nameList[0][i]);
}
images = images.Substring(0, images.Length - 1);
JObject json = new JObject();
JObject json1 = new JObject();
JObject json2 = new JObject();
if (_isFirst)
{
json1.Add("start", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
_isFirst = false;
}
if (_isEnd == true && _nameList.Count == 1)
{
json1.Add("end", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
json1.Add("catagory", this._catagory);
json1.Add("items", this._item);
json1.Add("path", this._gradePath.Replace("\\", "/"));
if (this._catagory == "0")
{
json1.Add("func", "zzsb");
}
else
{
json1.Add("func", "bzpj");
}
json1.Add("images", images);
json.Add("json1", json1);
if (this._param != "")
{
json2 = JObject.Parse(this._param);
}
json2.Add("zoom_key", this._zoom_key);
json2.Add("um_per_pix", this._um_per_pix);
json.Add("json2", json2);
String param = json.ToString();
//发送完请求后删除文件
_nameList.RemoveAt(0);
LogHelper.info(param);
if (!this._isDebug)
{
//发送请求
String res = RequestString(param);
}
//批次完成事件
try
{
CompleteBatchEvent(_batchList);
batch_index++;
LogHelper.info("batchListCount=" + _batchList.Count.ToString());
LogHelper.info("批次结束,序号-" + batch_index.ToString());
}
catch (Exception e)
{
LogHelper.info("ERR:" + e.ToString());
}
//再判断是否满足条件
if (_nameList.Count > 0 && _nameList[0].Count == _countList)
{
//上锁
_mutexLock = true;
//请求锁
_postLock = true;
//发送请求
Thread th = new Thread(SendPost);
th.Start();
}
else if (_nameList.Count == 1 && _nameList[0].Count > 0 && _isEnd)
{
//上锁
_mutexLock = true;
//请求锁
_postLock = true;
//发送请求
Thread th = new Thread(SendPost);
th.Start();
}
else if (_isEnd == true && _nameList.Count == 0)
{
//完成后且记录条数为0则发送完成事件
try
{
this._isStart = false;
CompleteAllEvent(AnalysisAIFile());
LogHelper.info("全部评级结束");
}
catch (Exception e)
{
CompleteAllEvent("");
LogHelper.info("ERR:" + e.ToString());
}
}
//请求返回后解锁
_postLock = false;
}
#endregion
#region Post返回结果处理
///
/// 向WebServer请求数据及返回结果
///
/// 请求数据的JSON
/// 返回结果的JSON
private String RequestString(String postString)
{
try
{
String res = HttpRequestHelper.DoRequest(this._url, Post, Content_Type, postString);
return res;
}
catch
{
return "Error";
}
}
#endregion
#region 生成报告
///
/// 生成报告
///
/// 生成报告的文件
/// 从界面传的json参数
///
private Boolean GetWordReport(String wordPath, String project_json)
{
return true;
//JObject jo = new JObject();
//if (_isDebug)
//{
// jo.Add("Project", "这是一个测试报告");
// return wordReport.GenerateWordReport(wordPath, jo.ToString());
//}
//else
//{
// try
// {
// jo = JObject.Parse(project_json);
// jo.Add("REPORT_NO", DateTime.Now.ToString("yyyyMMddHHmmssfff"));
// jo.Add("REPORT_DATE", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
// //查找result文件
// String aiFile = @"D:/aitest".Replace('/', '\\') + "\\AI\\result.ai";
// if (File.Exists(aiFile))
// {
// using (System.IO.StreamReader _file = System.IO.File.OpenText(aiFile))
// {
// using (JsonTextReader reader = new JsonTextReader(_file))
// {
// JObject o = (JObject)JToken.ReadFrom(reader);
// jo.Add("REPORT_RESULT", o["result"].ToString());
// string[] results = o["result"].ToString().Split(';');
// jo.Add("REPORT_IMAGE", results.Length.ToString());
// JArray jarr = new JArray();
// for (int i = 0; i < results.Length; i++)
// {
// jo.Add("REPORT_RESULT" + i.ToString(), results[i]);
// jarr = JArray.Parse(o[results[i]].ToString());
// for (int j = 0; j < jarr.Count; j++)
// {
// jarr[j] = o["path"].ToString().Replace('/', '\\') + "\\" + jarr[j];
// }
// jo.Add("REPORT_PIC" + i.ToString(), jarr);
// }
// }
// }
// }
// return wordReport.GenerateWordReport(wordPath, jo.ToString());
// }
// catch
// {
// throw (new Exception("参数不是标准的JSON数据!"));
// }
//}
}
#endregion
#region 结束评级后处理文件
///
/// 结束评级后处理文件
///
/// AI结果文件
/// 结果文件内容
private String AnalysisAIFile()
{
String ret = "";
try
{
String aiFile = Path.Combine(this._gradePath, "AI") + "\\" + resultName;
if (File.Exists(aiFile))
{
using (System.IO.StreamReader _file = System.IO.File.OpenText(aiFile))
{
using (JsonTextReader reader = new JsonTextReader(_file))
{
try
{
Dictionary> gradeA = new Dictionary>();
Dictionary> gradeAe = new Dictionary>();
Dictionary> gradeAs = new Dictionary>();
Dictionary> gradeB = new Dictionary>();
Dictionary> gradeBe = new Dictionary>();
Dictionary> gradeBs = new Dictionary>();
Dictionary> gradeC = new Dictionary>();
Dictionary> gradeCe = new Dictionary>();
Dictionary> gradeCs = new Dictionary>();
Dictionary> gradeD = new Dictionary>();
Dictionary> gradeDe = new Dictionary>();
Dictionary> gradeDs = new Dictionary>();
JObject o = (JObject)JToken.ReadFrom(reader);
JObject arrList = JObject.Parse(o["file_results"].ToString());
foreach (var item in arrList)
{
string temp = item.Value.ToString();
string[] v = temp.Split('+');
for (int j = 0; j < v.Length; j++)
{
//包含A的
if (v[j].IndexOf("A") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0)
{
if (gradeA.ContainsKey(v[j]))
{
gradeA[v[j]].Add(item.Key);
}
else
{
gradeA.Add(v[j], new List());
gradeA[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0)
{
if (gradeAe.ContainsKey(v[j]))
{
gradeAe[v[j]].Add(item.Key);
}
else
{
gradeAe.Add(v[j], new List());
gradeAe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("s") > -1)
{
if (gradeAs.ContainsKey(v[j]))
{
gradeAs[v[j]].Add(item.Key);
}
else
{
gradeAs.Add(v[j], new List());
gradeAs[v[j]].Add(item.Key);
}
}
}
//包含B的
if (v[j].IndexOf("B") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0)
{
if (gradeB.ContainsKey(v[j]))
{
gradeB[v[j]].Add(item.Key);
}
else
{
gradeB.Add(v[j], new List());
gradeB[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0)
{
if (gradeBe.ContainsKey(v[j]))
{
gradeBe[v[j]].Add(item.Key);
}
else
{
gradeBe.Add(v[j], new List());
gradeBe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("s") > -1)
{
if (gradeBs.ContainsKey(v[j]))
{
gradeBs[v[j]].Add(item.Key);
}
else
{
gradeBs.Add(v[j], new List());
gradeBs[v[j]].Add(item.Key);
}
}
}
//包含C的
if (v[j].IndexOf("C") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("s") < 0)
{
if (gradeC.ContainsKey(v[j]))
{
gradeC[v[j]].Add(item.Key);
}
else
{
gradeC.Add(v[j], new List());
gradeC[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("s") < 0)
{
if (gradeCe.ContainsKey(v[j]))
{
gradeCe[v[j]].Add(item.Key);
}
else
{
gradeCe.Add(v[j], new List());
gradeCe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("s") > -1)
{
if (gradeCs.ContainsKey(v[j]))
{
gradeCs[v[j]].Add(item.Key);
}
else
{
gradeCs.Add(v[j], new List());
gradeCs[v[j]].Add(item.Key);
}
}
}
//包含D的
if (v[j].IndexOf("D") > -1)
{
if (v[j].IndexOf("e") < 0 && v[j].IndexOf("S") < 0)
{
if (gradeD.ContainsKey(v[j]))
{
gradeD[v[j]].Add(item.Key);
}
else
{
gradeD.Add(v[j], new List());
gradeD[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("e") > -1 && v[j].IndexOf("S") < 0)
{
if (gradeDe.ContainsKey(v[j]))
{
gradeDe[v[j]].Add(item.Key);
}
else
{
gradeDe.Add(v[j], new List());
gradeDe[v[j]].Add(item.Key);
}
}
else if (v[j].IndexOf("S") > -1)
{
if (gradeDs.ContainsKey(v[j]))
{
gradeDs[v[j]].Add(item.Key);
}
else
{
gradeDs.Add(v[j], new List());
gradeDs[v[j]].Add(item.Key);
}
}
}
}
}
//结果JSON
JObject res = new JObject();
res.Add("path", o["path"]);
//结果显示
String result = "";
//排序,S的都输出,所以无需排序(DS除外)
if (gradeA.Count > 0)
{
string maxStr = "";
foreach (string key in gradeA.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeA[maxStr].Count; i++)
{
jarr.Add(gradeA[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeAe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeAe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeAe[maxStr].Count; i++)
{
jarr.Add(gradeAe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeB.Count > 0)
{
string maxStr = "";
foreach (string key in gradeB.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeB[maxStr].Count; i++)
{
jarr.Add(gradeB[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeBe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeBe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeBe[maxStr].Count; i++)
{
jarr.Add(gradeBe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeC.Count > 0)
{
string maxStr = "";
foreach (string key in gradeC.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeC[maxStr].Count; i++)
{
jarr.Add(gradeC[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeCe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeCe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeCe[maxStr].Count; i++)
{
jarr.Add(gradeCe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeD.Count > 0)
{
string maxStr = "";
foreach (string key in gradeD.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeD[maxStr].Count; i++)
{
jarr.Add(gradeD[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeDe.Count > 0)
{
string maxStr = "";
foreach (string key in gradeDe.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeDe[maxStr].Count; i++)
{
jarr.Add(gradeDe[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeDs.Count > 0)
{
string maxStr = "";
foreach (string key in gradeDs.Keys)
{
if (maxStr == "")
{
maxStr = key;
}
else
{
if (string.Compare(maxStr, key, true) < 0)
{
maxStr = key;
}
}
}
JArray jarr = new JArray();
for (int i = 0; i < gradeDs[maxStr].Count; i++)
{
jarr.Add(gradeDs[maxStr][i]);
}
if (res.ContainsKey(maxStr))
{
}
else
{
result += maxStr + ";";
res.Add(maxStr, jarr);
}
}
if (gradeAs.Count > 0)
{
foreach (string key in gradeAs.Keys)
{
result += key + ";";
JArray jarr = new JArray();
for (int i = 0; i < gradeAs[key].Count; i++)
{
jarr.Add(gradeAs[key][i]);
}
if (res.ContainsKey(key))
{
continue;
}
else
{
res.Add(key, jarr);
}
}
}
if (gradeBs.Count > 0)
{
foreach (string key in gradeBs.Keys)
{
result += key + ";";
JArray jarr = new JArray();
for (int i = 0; i < gradeBs[key].Count; i++)
{
jarr.Add(gradeBs[key][i]);
}
if (res.ContainsKey(key))
{
continue;
}
else
{
res.Add(key, jarr);
}
}
}
if (gradeCs.Count > 0)
{
foreach (string key in gradeCs.Keys)
{
result += key + ";";
JArray jarr = new JArray();
for (int i = 0; i < gradeCs[key].Count; i++)
{
jarr.Add(gradeCs[key][i]);
}
if (res.ContainsKey(key))
{
continue;
}
else
{
res.Add(key, jarr);
}
}
}
if (result.Length == 0)
{
ret = "not result!";
return ret;
}
res.Add("result", result.Substring(0, result.Length - 1));
ret = res.ToString();
using (System.IO.StreamWriter file = new System.IO.StreamWriter(Path.Combine(this._gradePath, "AI") + "\\result.ai", false, Encoding.Default))
{
file.WriteLine(ret);// 直接追加文件末尾,换行
file.Close();
}
}
catch (Exception e)
{
throw (new Exception("AI文件错误!"));
}
reader.Close();
_file.Close();
_file.Dispose();
}
}
}
}
catch { }
return ret;
}
#endregion
}
}