using _1200Gxml心电图绘制; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Configuration; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using 心电图绘制; namespace 心电图绘制 { internal class print { /// /// 报告样式类型 /// public int reportMode = 0; /// /// 报告样式类型名称 /// public string strreportMode = string.Empty; /// /// 走速 /// public int cBoxSpeed = 0; /// /// 振幅 /// public int cBoxAmplitude = 0; /// /// PDF文件名称 /// public string filename = string.Empty; /// /// 生成报告base64 /// public string imagebase = string.Empty; private string _printFilter = "0Hz"; private Bitmap _ecgBitMap; private static int _printDpi = 300;//打印DPI private const int Dpi = 96; //屏幕DIP private readonly string _isQiBo;//是否是起搏信号 private int _leadindexdata; private const string LeaderName15 = "5x3+1导报告模式"; private const string LeaderName18 = "18导报告模式"; private string _reportTitleContent = string.Empty; private string _idStr; private string collectTime;//心电数据采集时间 private const double Coefficient = 1.02; //放大缩小的系数 private List _longLeadInfo = new List(); //存储任意长两导联的导联下标 private readonly List _longLeadInfo3 = new List(); //存储任意长三导联的导联下标 public string LeaderType; //导联类别 private Dictionary> _ecgDataDicAfterFilter = new Dictionary>(); //滤波后的数据都存在这个字典中 private int _filterIndex; //滤波时 此标志 指示从数组中 哪一个位置开始滤波 private double _paperSpeed = 25.0; //走速 private string _ps = "25mm/s"; //打印时的走速 private double _amplitude = 10.0; //振幅 private string _amp = "10mm/mV"; //打印时的振幅 private double _calibrationVoltage = 2.0;//定标电压 float[] valueConvert(float[] valueArray) { float[] quotients = valueArray.Select(n => n / 500).ToArray(); return quotients; } /// /// 获得心电诊断快照数据 /// public void GetEcgViewDataImage(Image img, string addr, PatientInfo info, int type, string json) { _ecgDataDicAfterFilter.Clear(); // string ecgDataJsonStr = File.ReadAllText(Application.StartupPath + @"\60心拍心电图数据JSON.txt"); string ecgDataJsonStr = json; leadDataModel LDM = JsonConvert.DeserializeObject(ecgDataJsonStr); float[] LEAD_I = valueConvert(Array.ConvertAll(LDM.LEAD_I.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(0, LEAD_I.ToList()); float[] LEAD_II = valueConvert(Array.ConvertAll(LDM.LEAD_II.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(1, LEAD_II.ToList()); float[] LEAD_III = valueConvert(Array.ConvertAll(LDM.LEAD_III.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(2, LEAD_III.ToList()); float[] LEAD_AVR = valueConvert(Array.ConvertAll(LDM.LEAD_AVR.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(3, LEAD_AVR.ToList()); float[] LEAD_AVL = valueConvert(Array.ConvertAll(LDM.LEAD_AVL.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(4, LEAD_AVL.ToList()); float[] LEAD_AVF = valueConvert(Array.ConvertAll(LDM.LEAD_AVF.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(5, LEAD_AVF.ToList()); float[] LEAD_V1 = valueConvert(Array.ConvertAll(LDM.LEAD_V1.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(6, LEAD_V1.ToList()); float[] LEAD_V2 = valueConvert(Array.ConvertAll(LDM.LEAD_V2.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(7, LEAD_V2.ToList()); float[] LEAD_V3 = valueConvert(Array.ConvertAll(LDM.LEAD_V3.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(8, LEAD_V3.ToList()); float[] LEAD_V4 = valueConvert(Array.ConvertAll(LDM.LEAD_V4.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(9, LEAD_V4.ToList()); float[] LEAD_V5 = valueConvert(Array.ConvertAll(LDM.LEAD_V5.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(10, LEAD_V5.ToList()); float[] LEAD_V6 = valueConvert(Array.ConvertAll(LDM.LEAD_V6.Split(' '), float.Parse)); _ecgDataDicAfterFilter.Add(11, LEAD_V6.ToList()); if (!string.IsNullOrEmpty(info.orgname)) { _reportTitleContent = info.orgname; } else { _reportTitleContent = "心电图报告"; } _idStr = info.examid;//编号 collectTime = info.doctorDiagTime;//报告日期 //长两导的模式下 默认添加 第一导 和 第二导联 为 长显示两导联 _longLeadInfo.Add(0); _longLeadInfo.Add(1); //长三导的模式下 默认添加 第一导 和 第二导联和第三导联 为 长显示三导联 _longLeadInfo3.Add(0); _longLeadInfo3.Add(1); _longLeadInfo3.Add(2); var cpew = new CommonPrintEcgWave(); var filter = _printFilter; _ecgBitMap = new Bitmap(1090 * _printDpi / Dpi, 760 * _printDpi / Dpi); _ecgBitMap.SetResolution(_printDpi, _printDpi); cpew.InitEcgParameter(_ecgBitMap, _ecgDataDicAfterFilter, _isQiBo, _paperSpeed, _amplitude); //************************************************************************ var ecgInfoList = new string[14]; ecgInfoList[0] = "姓名:" + info.name;//姓名 ecgInfoList[1] = "性别:" + info.gender; ecgInfoList[2] = "年龄:" + info.age; ecgInfoList[3] = "RV5+SV1:" + info.rv5sv1plus + " mV"; ecgInfoList[4] = "PR间期:" + info.pr + " ms"; ecgInfoList[5] = "P/T/QRS°:" + info.pt + "°"; ecgInfoList[6] = "QT/QTC:" + info.qtqtc + " ms"; ecgInfoList[7] = "QRS时限:" + info.qrs + " ms"; ecgInfoList[8] = "RV5/SV1:" + info.rv5sv1 + " mV"; ecgInfoList[9] = "HR:" + info.hr + " bpm"; ecgInfoList[10] = "病室:" + info.ward; ecgInfoList[11] = "床号"; ecgInfoList[12] = "住院号:" + info.regid; ecgInfoList[13] = "P波时限:" + info.ptimelimit + " ms"; SetAandP(); //设置增益和走速 var diagContent = info.diagContent; var diagArray = diagContent.Split('\n'); diagContent = string.Empty; for (var i = 0; i < diagArray.Length; i++) diagContent += diagArray[i].Trim(); if (_ecgDataDicAfterFilter.Count > 0) _filterIndex = 0; else _filterIndex = 0; // _leadindexdata = hScrollBar_Lead.Value * _filterIndex; _leadindexdata = _filterIndex; if (strreportMode == LeaderName15) filter += " 十五加一长导模式"; if (strreportMode == LeaderName18) filter += " 十八导模式"; if (reportMode == 2) { cpew.PrintBackGroundGrid(16, 196); cpew.PrintLongReportHeadInfo(_reportTitleContent); cpew.PrintLongEcgInfo(ecgInfoList, _idStr); cpew.PrintLongDiagInfo(diagContent, info.doctorName, collectTime, filter, collectTime, "科室:" + info.DepartName, _amp, _ps, img, addr); } else { cpew.PrintBackGroundGrid(40, 196); //(197-42)*12=1860像素 cpew.PrintReportHeadInfo(_reportTitleContent, collectTime); cpew.PrintEcgInfo(ecgInfoList, _idStr); cpew.PrintDiagInfo(diagContent, info.doctorName, filter, collectTime, "科室:" + info.DepartName, _amp, _ps, img, addr); } //6x2 if (reportMode == 0) { cpew.PrintEcgWave(8, 1, _leadindexdata); cpew.PrintEcgLeadName(_calibrationVoltage * Coefficient); } //6x2+2 if (reportMode == 1) { cpew.PrintEcgWave(8, 1, _longLeadInfo, _leadindexdata, _leadindexdata); cpew.PrintEcgLeadName(_calibrationVoltage * Coefficient, _longLeadInfo); } //十二长导 if (reportMode == 2) { cpew.PrintLongEcgWave(5, 1, _leadindexdata); //cpew.PrintLongEcgWave(8, 1, _leadindexdata); cpew.PrintLongEcgLeadName(_calibrationVoltage * Coefficient); } //4*3 II长导模式 if (reportMode == 3) { cpew.PrintEcgWaveFourOne(8, 1, _leadindexdata, _leadindexdata); cpew.PrintLeadNameFourOne(_calibrationVoltage * Coefficient, _longLeadInfo); } //4*3+3 长导模式 if (reportMode == 4) { cpew.PrintEcgWaveFourThree(8, 1, _longLeadInfo3, _leadindexdata, _leadindexdata); cpew.PrintLeadNameFourThree(_calibrationVoltage * Coefficient, _longLeadInfo3); } //15x1+1导 if (strreportMode == LeaderName15) { cpew.PrintEcgWaveFifteen(8, 1, _leadindexdata); cpew.PrintLeadNameFifteen(_calibrationVoltage * Coefficient, LeaderType); } //十八导 if (strreportMode == LeaderName18) { cpew.PrintEcgWaveEighteen(8, 1, _leadindexdata); cpew.PrintLeadNameEighteen(_calibrationVoltage * Coefficient); } switch (type) { case 1://返回base64 imagebase = UniversalFun.ConvertToBase64String(_ecgBitMap, ImageFormat.Jpeg); break; case 2://生成pdf string path = string.IsNullOrEmpty(ConfigurationManager.AppSettings["path"]) ? Application.StartupPath : ConfigurationManager.AppSettings["path"]; UniversalFun.ConvertBitmapToPdf(_ecgBitMap, path + @"\" + info.examid + @"\" + info.examid + ".pdf"); filename = @"/" + info.examid + @"/" + info.examid + ".pdf"; // _ecgBitMap.Save("心电图报告.jpg", ImageFormat.Jpeg); break; default: break; } //_sourceCegBmp = _ecgBitMap; } /// /// 设置增益和走速和定标电压 /// private void SetAandP() { if (cBoxSpeed == 0) //走速 { _paperSpeed = 5; _ps = "5mm/s"; } if (cBoxSpeed == 1) { _paperSpeed = 10; _ps = "10mm/s"; } if (cBoxSpeed == 2) //走速 { _paperSpeed = 12.5; _ps = "12.5mm/s"; } if (cBoxSpeed == 3) { _paperSpeed = 25.0; _ps = "25mm/s"; } if (cBoxSpeed == 4) { _paperSpeed = 50.0; _ps = "50mm/s"; } if (cBoxAmplitude == 0) //振幅 { _amplitude = 2.5; _amp = "2.5mm/mV"; _calibrationVoltage = 0.5; } if (cBoxAmplitude == 1) { _amplitude = 5.0; _amp = "5mm/mV"; _calibrationVoltage = 1.0; } if (cBoxAmplitude == 2) { _amplitude = 10.0; _amp = "10mm/mV"; _calibrationVoltage = 2.0; } if (cBoxAmplitude == 3) { _amplitude = 20.0; _amp = "20mm/mV"; _calibrationVoltage = 4.0; } if (cBoxAmplitude == 4) { _amplitude = 40.0; _amp = "40mm/mV"; _calibrationVoltage = 8.0; } } } }