using CefSharp;
using CefSharp.WinForms;
using Newtonsoft.Json;
using OTSCommon.Model;
using OTSIncAReportApp.DataOperation.DataAccess;
using OTSIncAReportApp.OTSDataMgrFunction;
using OTSIncAReportApp.OTSSampleReportInfo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace OTSIncAReportApp.Control_ECharts
{
///
/// 三元相图EChart版
///
public partial class EChart_Trianglediagram : UserControl
{
#region 变量定义
public List m_list_string_sizelevel; //图例中:颗粒粒级字符列表
public List m_old_list_string_sizelevel;//图例中,颗粒粒级字符列表,未处理格式的,从底层拿出来的原始格式
public List m_list_string_samplename;//图例中:样品名字符列表
public string Template { get; set; }
public int condition = -1;
///
/// 全局函数,与json数据对应的类结构
///
List m_list_trianglejsonclass = null;
string url = "CefSharp\\Resources/HTML/charts.html";
frmReportApp m_ReportApp;
frmReportConditionChoose m_condition;
ResultDataMgr m_DataMgr;
private bool ReportExporting = false;
public bool Report { set; get; }
///
/// 判断颗粒范围(true全部颗粒,false选择颗粒)
///
public bool ParticleRange { set; get; }
#endregion
#region 构造函数及窗体加载
///
/// 三角图,构造函数
///
/// 传入,委托类对象
/// 传入,项目管理类对象
public EChart_Trianglediagram(frmReportApp ReportApp)
{
m_list_trianglejsonclass = new List();
m_list_string_sizelevel = new List();
m_list_string_samplename = new List();
m_old_list_string_sizelevel = new List();
m_ReportApp = ReportApp;
m_condition = ReportApp.m_conditionChoose;
m_DataMgr = ReportApp.m_rstDataMgr;
InitializeComponent();
}
///
/// 三角图,构造函数
///
/// 传入,委托类对象
/// 传入,项目管理类对象
public EChart_Trianglediagram(frmReportApp ReportApp, string Templates)
{
m_list_trianglejsonclass = new List();
m_list_string_sizelevel = new List();
m_list_string_samplename = new List();
m_old_list_string_sizelevel = new List();
Template = Templates;
m_ReportApp = ReportApp;
m_condition = ReportApp.m_conditionChoose;
m_DataMgr = ReportApp.m_rstDataMgr;
ReportExporting = true;
InitializeComponent();
}
private void EChart_Trianglediagram_Load(object sender, EventArgs e)
{
string template = Template;
if (template == "")
{ //三元相图模板
template = m_condition.m_conditionData.GetPropItemDisplayValueByPropItemName(OTS_REPORT_PROP_GRID_ITEMS.TRIO_CHART_TYPE).ToString();
}
//获取粒级表
string pathtpf = Application.StartupPath + "\\Config\\ProData\\DefaultTriTemplateFile.tpf";
List nameList = new List();
DataSet ds = XMLoperate.GetXmlData(pathtpf, "XMLData");
DataTable dt = ds.Tables["Member"];
string TemplateName = "";
//遍历第一层节点
foreach (DataRow element in dt.Rows)
{
TemplateName = element["TemplateName"].ToString();
if (TemplateName == template)
{
string Element = element["Element"].ToString();
nameList.Add(Element.Split('.')[0]);
nameList.Add(Element.Split('.')[1]);
nameList.Add(Element.Split('.')[2]);
break;
}
}
//将所有的测量结果名添加到list中
m_list_string_samplename.Clear();
string sou = "";
int sel = 0;
if (Report)
{
sou = m_DataMgr.ResultFilesList[m_DataMgr.getSelectedIndex()].anotherFileName.ToString();
if(ParticleRange)
{
sel = 0;
}
else
{
sel = 1;
}
}
else
{
sou = m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemDisplayVal.ToString();
//判断颗粒范围(全部颗粒或者选择颗粒)
sel = m_ReportApp.m_conditionChoose.m_conditionData.GetComboDownListIndexByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE);
}
Report = false;
if (sou.Contains("+"))
{
if (m_ReportApp.more)
{
m_ReportApp.trans = false;
}
else
{
m_ReportApp.trans = true;
}
for (int i = 0; i < sou.Split('+').Length; i++)
{
ResultFile resultFile = m_DataMgr.ResultFilesList.Find(s => s.anotherFileName == sou.Split('+')[i]);
if (resultFile == null)
{
continue;
}
TriangleJsonClass cl = GettriangleJsonClass(resultFile.FilePath, resultFile.anotherFileName, nameList, TemplateName,sel);
m_list_trianglejsonclass.Add(cl);
}
}
else
{
if (!m_ReportApp.more)
{
m_ReportApp.trans = false;
}
else
{
m_ReportApp.trans = true;
}
m_ReportApp.more = false;
ResultFile resultFile;
int index = (int)m_condition.m_CurrentConditions[OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE].itemVal;
if (ReportExporting)
{
resultFile = m_DataMgr.ResultFilesList[m_DataMgr.getSelectedIndex()];
}
else
{
//resultFile = m_DataMgr.ResultFilesList[m_DataMgr.GetWorkingResult()];
resultFile = m_DataMgr.ResultFilesList[index];
}
ReportExporting = false;
TriangleJsonClass cl = GettriangleJsonClass(resultFile.FilePath, resultFile.anotherFileName, nameList, TemplateName,sel);
m_list_trianglejsonclass.Add(cl);
}
//使用EChart进行显示
if (m_list_trianglejsonclass.Count > 1)
{
List list = new List();
for (int i = 0; i < m_list_trianglejsonclass.Count; i++)
{
//拼写Json数据
Chartdate list_json_str = SpellTriangleJson(m_list_trianglejsonclass[i]);
list.Add(list_json_str);
}
url = "CefSharp\\Resources/HTML/chartsMore.html";
m_ReportApp.data = JsonConvert.SerializeObject(list);
}
else
{
//拼写Json数据
Chartdate list_json_str = SpellTriangleJson(m_list_trianglejsonclass[0]);
url = "CefSharp\\Resources/HTML/charts.html";
m_ReportApp.data = JsonConvert.SerializeObject(list_json_str);
}
InitBrowser();
}
private TriangleJsonClass GettriangleJsonClass(string path, string name, List nameList, string templatename,int sel)
{
TriangleJsonClass triangleJsonClass = new TriangleJsonClass();
m_list_string_samplename.Add(name);
List list_string_sort = new List();
List list_point_sort = new List();
DataTable particles = GetParticles(path, nameList,sel);
foreach (DataRow item in particles.Rows)
{
if (item["particleLocation"].ToString() == "0,0,0")
{
continue;
}
list_string_sort.Add(item["sizeLevel"].ToString());
double top = Convert.ToDouble(item["top"]);
double left = Convert.ToDouble(item["left"]);
double right = Convert.ToDouble(item["right"]);
//x=right+top/2,y=(√3/2)*top
double Y = 0.866 * top * 100;
double X = (right + top / 2) * 100;
double[] point = { Math.Round(X, 2), Math.Round(Y) };
list_point_sort.Add(point);
}
triangleJsonClass = new TriangleJsonClass()
{
Samplename = name,
TopName = templatename.Split('.')[0],
LeftName = templatename.Split('.')[1],
RightName = templatename.Split('.')[2],
ListPartSize = list_string_sort,
ListPointF = list_point_sort
};
return triangleJsonClass;
}
//获取颗粒信息
private DataTable GetParticles(string filepath, List nameList,int sel)
{
ParticleData particledata = new ParticleData(filepath);
//设置标签名称
List listName = new List();
//获取粒级表
string pathe = m_DataMgr.m_RptConfigFile.PartSizeFileFolder + m_DataMgr.m_RptConfigFile.PartSizeFile;
DataSet ds = XMLoperate.GetXml(pathe);
string sizestr = ds.Tables[0].Rows[0]["Sizes"].ToString();
for (int i = 0; i < sizestr.Split(',').Length - 1; i++)
{
if (sizestr.Split(',')[i].Length > 0)
{
double d1 = Convert.ToDouble(sizestr.Split(',')[i]);
double d2 = Convert.ToDouble(sizestr.Split(',')[i + 1]);
listName.Add(d1.ToString() + "~" + d2.ToString());
}
}
double d = Convert.ToDouble(sizestr.Split(',')[sizestr.Split(',').Length - 1]);
listName.Add(d.ToString() + "~MAX");
//int sel = m_ReportApp.m_conditionChoose.m_SourceGridData.GetComboDownListIndexByItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE);
//int sel = m_condition.SourceGridData.ConditionItemList[m_ReportApp.m_DataMgrFun.GetPropIndexByPropItemName(m_ReportApp.SourceGridData.ConditionItemList, OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE)].comboDownList.IndexOf(m_ReportApp.SourceGridData.ConditionItemList[1].itemVal.ToString());
//int sel = m_condition.m_SourceGridData.GetPropIndexByPropItemName(OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE);
string filedAndParticl = "";
if (sel == 1)
{
List selectParticles = m_ReportApp.GetSelectedParticles();
foreach (var item in selectParticles)
{
filedAndParticl = filedAndParticl + "," + (item.FieldId.ToString() + "-" + item.ParticleId.ToString());
}
if (filedAndParticl != "")
{
filedAndParticl = filedAndParticl + ",";
}
}
string po = "";
string con = "";
int row = m_condition.m_conditionData.ConditionItemList.Count;
if (condition != -1)
{
List li = new List() { "DMAX", "DMIN", "Area", "FERET" };
con = li[condition];
}
else
{
if (row < 4)
{
con = "DMAX";
}
else
{
con = m_condition.m_conditionData.GetPropItemDisplayValueByPropItemName( OTS_REPORT_PROP_GRID_ITEMS.SIZE_CAL_METHOD_TYPE).ToString();
}
}
switch (con)
{
case "DMAX":
po = "DMAX";
break;
case "DMIN":
po = "DMIN";
break;
case "ECD":
po = "Area";
break;
case "FERET":
po = "DFERET";
break;
}
//particledata.GetParticleAllHaveXray("");
//DataTable dtp = particledata.GetParticleHaveXray(filedAndParticl);//旧
DataTable dtp = particledata.GetParticleAllHaveXray(filedAndParticl);//新
//创建一个临时表
DataTable ret_dt = new DataTable();
//然后额外存放三列,用于存放拆分后三个顶点的值
ret_dt.Columns.Add("sizeLevel");
ret_dt.Columns.Add("particleLocation");
ret_dt.Columns.Add("top");
ret_dt.Columns.Add("left");
ret_dt.Columns.Add("right");
ret_dt.Columns.Add("Color_position");
for (int k = 0; k < listName.Count; k++)
{
string str = listName[k];
string d1 = str.Split('~')[0];
string d2 = str.Split('~')[1];
if (d2 == "MAX")
{
d2 = "999";
}
DataRow[] datas = dtp.Select(getWhere(d2, d1, po));
foreach (var item in datas)
{
DataRow dr = ret_dt.NewRow();
dr["sizeLevel"] = str;
string element = item["Element"].ToString();
string strRet = getStrRet(nameList, element);
dr["particleLocation"] = strRet;
dr["top"] = strRet.Split(',')[0];
dr["left"] = strRet.Split(',')[1];
dr["right"] = strRet.Split(',')[2];
dr["Color_position"] = k.ToString();
ret_dt.Rows.Add(dr);
}
}
return ret_dt;
}
private string getWhere(string max, string min, string col)
{
return col + ">=" + min + " and " + col + "<=" + max;
}
private string getStrRet(List template, string element)
{
List name = new List()
{ "h","he",
"li","be","b","c","n","o","f","ne",
"na","mg","al","si","p","s","cl","ar",
"k","ca","sc","ti","v","cr","mn","fe","co","ni","cu","zn","ga","ge","as","se","br","kr",
"rb","sr","y","zr","nb","mo","tc","ru","rh","pd","ag","cd","in","sn","sb","te","i","xe",
"cs","ba","la",
"ce","pr","nd","pm","sm","eu","gd","tb","dy","ho","er","tm","yb","lu",
"hf","ta","w","re","os","ir","pt","au","hg","tl","pb","bi","po","at","rn",
"fr","ra","ac",
"th","pa","u","np","pu","am","cm","bk","cf","es","fm","md","no","lr"
};
List value = new List()
{ 1.008,4.003,
6.941,9.012,10.811,12.011,14.007,15.999,18.998,20.180,
22.990,24.305,26.982,28.086,30.974,32.066,35.453,39.948,
39.098,40.08,44.956,47.88,50.942,51.996,54.938,55.847,58.933,58.70,63.546,65.39,69.72,72.61,74.922,78.96,79.904,83.80,
85.468,87.62,88.906,91.22,92.906,95.94,98.00,101.07,102.906,106.42,107.868,112.41,114.82,118.71,121.76,127.60,126.905,131.29,
132.905,137.33,138.906,
140.12,140.908,144.24,145.0,150.36,151.97,157.25,158.925,162.50,64.93,167.26,168.934,173.04,174.967,
178.49,180.948,183.85,186.207,190.20,192.22,195.08,196.967,200.59,204.38,207.2,208.980,209.00,210.00,222.00,
223.00,226.025,227.028,
232.038,231.036,238.029,237.048,244.00,243.00,247.00,247.00,251.00,252.00,257.00,258.00,259.00,260.00
};
double d_ASum = 0;
double d_BSum = 0;
double d_CSum = 0;
string aElements = template[0];
string bElements = template[1];
string cElements = template[2];
foreach (var item in element.Split(';'))
{
if (item.Contains(aElements + "-"))
{
if (aElements != "")
{
d_ASum = Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(aElements.ToLower())];
}
}
for (int i = 0; i < bElements.Split(',').Length; i++)
{
string e = bElements.Split(',')[i];
if (item.Contains(e + "-"))
{
d_BSum = d_BSum + Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(e.ToLower())];
}
}
if (item.Contains(cElements + "-"))
{
if (cElements != "")
d_CSum = Convert.ToDouble(item.Split('-')[1]) / value[name.IndexOf(cElements.ToLower())];
}
}
double allNums = d_ASum + d_BSum + d_CSum;
string strRet = "";
if ((allNums) == 0)
{
strRet = "0,0,0";
}
else
{
double aPercent = 0, bPercent = 0, cPercent = 0;
if (d_ASum != 0)
{
aPercent = d_ASum / allNums;
}
if (d_BSum != 0)
{
bPercent = d_BSum / allNums;
}
if (d_CSum != 0)
{
cPercent = d_CSum / allNums;
}
strRet = aPercent.ToString() + "," + bPercent.ToString() + "," + cPercent.ToString();
}
return strRet;
}
class Chartdate
{
public string Samplename { get; set; }
public string LeftName { get; set; }
public string RightName { get; set; }
public string TopName { get; set; }
public List ListPartSize { get; set; }
public List> ListPoint { get; set; }
}
#endregion
#region echarts
//定义图片
//JsEvent js;
//定义图片base64
public string pic { get; set; }
//定义图形类型
public string type { get; set; }
//获取图片
private void button1_Click(object sender, EventArgs e)
{
//string str = GetPic();
//pic = str;
}
///
/// 加载浏览器
///
public void InitBrowser()
{
//加载网页
if (m_ReportApp.browser_trio == null || m_ReportApp.trans)
{
// 获取生成路径下网页文件的绝对路径
string fileName = Path.Combine(Directory.GetCurrentDirectory(), url);
//加载网页
m_ReportApp.browser_trio = new ChromiumWebBrowser(fileName);
//禁止网页
m_ReportApp.browser_trio.MenuHandler = new MenuHandler();
m_ReportApp.browser_trio.Dock = DockStyle.Fill;
//添加网页到当前自定义控件
this.Controls.Add(m_ReportApp.browser_trio);
m_ReportApp.js.MessageText = "";
//供页面调用以传递数据
m_ReportApp.browser_trio.RegisterJsObject("jsObj", m_ReportApp.js, false);
//升级cef版本后新方法
//CefSharpSettings.LegacyJavascriptBindingEnabled = true;
//CefSharpSettings.WcfEnabled = true;
//m_ReportApp.browser_trio.JavascriptObjectRepository.Register("jsObj", m_ReportApp.js, isAsync: false, options: BindingOptions.DefaultBinder);
//网页加载结束后调用事件
m_ReportApp.browser_trio.FrameLoadEnd += WebBrowser_FrameLoadEnd;
}
else
{
m_ReportApp.browser_trio.ResetText();
m_ReportApp.browser_trio.Reload();
m_ReportApp.browser_trio.Refresh();
//供页面调用以传递数据
this.Controls.Add(m_ReportApp.browser_trio);
}
if (m_ReportApp.timerKG)
{
timer1.Enabled = true;
}
}
///
/// 页面加载结束后事件
///
///
///
private void WebBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
if (e.Frame.IsMain)
{
//为页面图形提供数据参数
string str = m_ReportApp.data;
//执行网页脚本事件
m_ReportApp.browser_trio.ExecuteScriptAsync("showchart('" + str + "','','triangle')");
}
}
//public string GetPic()
//{
// return js.MessageText;
//}
//禁止网页操作,右键点击等
class MenuHandler : CefSharp.IContextMenuHandler
{
void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
{
model.Clear();
}
bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
{
//throw new NotImplementedException();
return false;
}
void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
{
//throw new NotImplementedException();
}
bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
{
return false;
}
}
class JsEvent
{
public string MessageText { set; get; }
public void ShowTest()
{
MessageBox.Show(MessageText);
}
}
#endregion
#region 自定义方法
///
/// 拼写json数据
///
///
private Chartdate SpellTriangleJson(TriangleJsonClass in_trianglejsonclass)
{
Chartdate chart = new Chartdate();
chart.LeftName = in_trianglejsonclass.LeftName;
chart.RightName = in_trianglejsonclass.RightName;
chart.TopName = in_trianglejsonclass.TopName;
chart.Samplename = in_trianglejsonclass.Samplename;
List str_listpartsize = new List();
List> str_listpoint = new List>();
for (int i = 0; i < in_trianglejsonclass.ListPartSize.Count; i++)
{
//如果未包含该粒级
if (!str_listpartsize.Contains(in_trianglejsonclass.ListPartSize[i]))
{
//第一步先添加该粒级
str_listpartsize.Add(in_trianglejsonclass.ListPartSize[i]);
}
}
//第二步再添加所有该粒级对应的坐标,到一个分组中
for (int i = 0; i < str_listpartsize.Count; i++)
{
List point = new List();
for (int k = 0; k < in_trianglejsonclass.ListPointF.Count; k++)
{
if (str_listpartsize[i] == in_trianglejsonclass.ListPartSize[k])
{
point.Add(in_trianglejsonclass.ListPointF[k]);
}
}
str_listpoint.Add(point);
}
chart.ListPartSize = str_listpartsize;
chart.ListPoint = str_listpoint;
return chart;
}
#endregion
#region EChart导出图像委托调用部份
public delegate void MyDelgate(string va);
public event MyDelgate butclic;
private void timer1_Tick(object sender, EventArgs e)
{
if (butclic == null)
return;
if (m_ReportApp.js == null)
return;
if (m_ReportApp.js.MessageText == null)
return;
if (m_ReportApp.js.MessageText != "")
{
butclic(m_ReportApp.js.MessageText);
timer1.Enabled = false;
m_ReportApp.timerKG = false;
m_ReportApp.js.MessageText = "";
}
}
[DataContract]
public class TriangleJsonClass
{
[DataMember]
public string Samplename { set; get; }
[DataMember]
public string TopName { set; get; }
[DataMember]
public string LeftName { set; get; }
[DataMember]
public string RightName { set; get; }
[DataMember]
public List ListPartSize { set; get; }
[DataMember]
public List ListPointF { set; get; }
}
#endregion
}
}