| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625 | using CefSharp;using CefSharp.WinForms;using Newtonsoft.Json;using OTSIncAReportApp.DataOperation.DataAccess;using System;using System.Collections.Generic;using System.Data;using System.IO;using System.Runtime.Serialization;using System.Windows.Forms;namespace OTSIncAReportApp.Control_ECharts{    /// <summary>    /// 三元相图EChart版    /// </summary>    public partial class EChart_Trianglediagram : UserControl    {        #region 变量定义        public List<string> m_list_string_sizelevel; //图例中:颗粒粒级字符列表        public List<string> m_old_list_string_sizelevel;//图例中,颗粒粒级字符列表,未处理格式的,从底层拿出来的原始格式        public List<string> m_list_string_samplename;//图例中:样品名字符列表        public string Template { get; set; }        public int condition = -1;        /// <summary>        /// 全局函数,与json数据对应的类结构        /// </summary>        List<TriangleJsonClass> m_list_trianglejsonclass = null;        string url = "Resources/HTML/charts.html";        frmReportApp m_ReportApp;        #endregion        #region 构造函数及窗体加载        /// <summary>        /// 三角图,构造函数        /// </summary>        /// <param name="in_sec">传入,委托类对象</param>        /// <param name="in_Cotsreportprojfilemgrclr">传入,项目管理类对象</param>        public EChart_Trianglediagram(frmReportApp ReportApp)        {            m_list_trianglejsonclass = new List<TriangleJsonClass>();            m_list_string_sizelevel = new List<string>();            m_list_string_samplename = new List<string>();            m_old_list_string_sizelevel = new List<string>();            m_ReportApp = ReportApp;            InitializeComponent();        }        /// <summary>        /// 三角图,构造函数        /// </summary>        /// <param name="in_sec">传入,委托类对象</param>        /// <param name="in_Cotsreportprojfilemgrclr">传入,项目管理类对象</param>        public EChart_Trianglediagram(frmReportApp ReportApp, string Templates)        {            m_list_trianglejsonclass = new List<TriangleJsonClass>();            m_list_string_sizelevel = new List<string>();            m_list_string_samplename = new List<string>();            m_old_list_string_sizelevel = new List<string>();            Template = Templates;            m_ReportApp = ReportApp;            InitializeComponent();        }        private void EChart_Trianglediagram_Load(object sender, EventArgs e)        {            string template = Template;            if (template == "")            { //三元相图模板                template = m_ReportApp.SourceGridData.SampleDataList[m_ReportApp.m_DataMgrFun.GetSampleIndexByPropItemName(m_ReportApp.SourceGridData.SampleDataList, OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.TRIO_CHART_TYPE)].itemVal.ToString();            }            //获取粒级表            string pathtpf = Application.StartupPath + "\\Config\\ProData\\DefaultTriTemplateFile.tpf";            List<string> nameList = new List<string>();            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 = m_ReportApp.SourceGridData.SampleDataList[m_ReportApp.m_DataMgrFun.GetSampleIndexByPropItemName(m_ReportApp.SourceGridData.SampleDataList, OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE)].itemVal.ToString();            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++)                {                    DataOperation.Model.ResultFile resultFile = m_ReportApp.resultFilesList.Find(s => s.FileName == sou.Split('+')[i]);                    if (resultFile == null)                    {                        continue;                    }                    TriangleJsonClass cl = GettriangleJsonClass(resultFile.FilePath, resultFile.FileName, nameList, TemplateName);                    m_list_trianglejsonclass.Add(cl);                }            }            else            {                if (!m_ReportApp.more)                {                    m_ReportApp.trans = false;                }                else                {                    m_ReportApp.trans = true;                }                m_ReportApp.more = false;                DataOperation.Model.ResultFile resultFile = m_ReportApp.resultFilesList[m_ReportApp.WorkingResult];                TriangleJsonClass cl = GettriangleJsonClass(resultFile.FilePath, resultFile.FileName, nameList, TemplateName);                m_list_trianglejsonclass.Add(cl);            }            //使用EChart进行显示            if (m_list_trianglejsonclass.Count > 1)            {                List<Chartdate> list = new List<Chartdate>();                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 = "Resources/HTML/chartsMore.html";                m_ReportApp.data = JsonConvert.SerializeObject(list);            }            else            {                //拼写Json数据                Chartdate list_json_str = SpellTriangleJson(m_list_trianglejsonclass[0]);                url = "Resources/HTML/charts.html";                m_ReportApp.data = JsonConvert.SerializeObject(list_json_str);            }            InitBrowser();        }        private TriangleJsonClass GettriangleJsonClass(string path, string name, List<string> nameList, string templatename)        {            TriangleJsonClass triangleJsonClass = new TriangleJsonClass();            m_list_string_samplename.Add(name);            List<string> list_string_sort = new List<string>();            List<double[]> list_point_sort = new List<double[]>();            DataTable particles = GetParticles(path, nameList);            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<string> nameList)        {            ParticleData particledata = new ParticleData(filepath);            //设置标签名称            List<string> listName = new List<string>();            //获取粒级表            string pathe = m_ReportApp.m_RptConfigFile.FileFolderSize + m_ReportApp.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.SourceGridData.SampleDataList[m_ReportApp.m_DataMgrFun.GetSampleIndexByPropItemName(m_ReportApp.SourceGridData.SampleDataList, OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.DATA_SOURCE_TYPE)].comboDownList.IndexOf(m_ReportApp.SourceGridData.SampleDataList[1].itemVal.ToString());            string filedAndParticl = "";            if (sel == 1)            {                List<OTSIncAReportApp.DataOperation.Model.Particle> selectParticles = m_ReportApp.SelectedParticles;                foreach (var item in selectParticles)                {                    filedAndParticl = filedAndParticl + "," + (item.FieldId.ToString() + "-" + item.ParticleId.ToString());                }                if (filedAndParticl != "")                {                    filedAndParticl = filedAndParticl + ",";                }            }            string po = "";            string con = "";            int row = m_ReportApp.SourceGridData.SampleDataList.Count;            if (condition != -1)            {                List<string> li = new List<string>() { "DMAX", "DMIN", "Area", "FERET" };                con = li[condition];            }            else            {                if (row < 4)                {                    con = "DMAX";                }                else                {                    con = m_ReportApp.SourceGridData.SampleDataList[m_ReportApp.m_DataMgrFun.GetSampleIndexByPropItemName(m_ReportApp.SourceGridData.SampleDataList, OTSSampleReportInfo.OTS_REPORT_PROP_GRID_ITEMS.SIZE_CAL_METHOD_TYPE)].itemVal.ToString();                }            }            switch (con)            {                case "DMAX":                    po = "DMAX";                    break;                case "DMIN":                    po = "DMIN";                    break;                case "Area":                    po = "Area";                    break;                case "FERET":                    po = "DFERET";                    break;            }            DataTable dtp = particledata.GetParticleHaveXray(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");            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];                    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<string> template, string element)        {            List<string> name = new List<string>()    { "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<double> value = new List<double>()    { 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<string> ListPartSize { get; set; }            public List<List<double[]>> 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;        }        /// <summary>        /// 加载浏览器        /// </summary>        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;            }        }        /// <summary>        /// 页面加载结束后事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        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 自定义方法        /// <summary>        /// 拼写json数据        /// </summary>        /// <returns></returns>        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<string> str_listpartsize = new List<string>();            List<List<double[]>> str_listpoint = new List<List<double[]>>();            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<double[]> point = new List<double[]>();                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;            }        }        [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<string> ListPartSize { set; get; }            [DataMember]            public List<double[]> ListPointF { set; get; }        }        #endregion    }}
 |