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