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 } }