902 lines
44 KiB
C#
902 lines
44 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using System.Drawing;
|
|||
|
using System.Data;
|
|||
|
using System.Windows.Forms;
|
|||
|
using System.IO;
|
|||
|
|
|||
|
|
|||
|
namespace _1200Gxml心电图绘制
|
|||
|
{
|
|||
|
public class EcgDataDraw_New
|
|||
|
{
|
|||
|
int Amplitude = 10;//振幅
|
|||
|
int PaperSpeed = 25;
|
|||
|
double AmplificationFactor = 140.00;
|
|||
|
//int AmplificationFactor = 60;
|
|||
|
int SamplingRate = 300;
|
|||
|
int LeadCount = 12;
|
|||
|
int byteLength = 2;
|
|||
|
int Dpi = 96;
|
|||
|
double LenthPerInch = 25.4;
|
|||
|
int BaseLine = 0;
|
|||
|
int LeadHeight = 0;
|
|||
|
Pen Ecg_Pen;
|
|||
|
Graphics Ecg_Graphics;
|
|||
|
Bitmap Ecg_Canvas;
|
|||
|
public List<int> LeadInfo = new List<int>();
|
|||
|
Dictionary<int, List<double>> EcgDataList;
|
|||
|
int FreePixs = 0;
|
|||
|
Point FirstPosition = new Point(0, 0);
|
|||
|
Point SecondPosition = new Point(0, 0);
|
|||
|
Dictionary<string, Point> FirstPointArray = new Dictionary<string, Point>();
|
|||
|
|
|||
|
//存放心电数据的字典 按照 每导联顺序进行存储
|
|||
|
Dictionary<int, List<float>> EcgData_Dic = new Dictionary<int, List<float>>();
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="pb"></param>
|
|||
|
/// <param name="Leads"></param>
|
|||
|
/// <param name="EcgTable"></param>
|
|||
|
/// <param name="NewDpi"></param>
|
|||
|
public void InitEcgParameter(Bitmap btmp, int leadCount, Dictionary<int, List<float>> EcgTable, int NewDpi, List<int> leadinfo)
|
|||
|
{
|
|||
|
//string[] WavePara = File.ReadAllText(Application.StartupPath + @"\WavePara.txt").Trim().Split(',');
|
|||
|
//SamplingRate = int.Parse(WavePara[0].Trim());
|
|||
|
//AmplificationFactor = double.Parse(WavePara[1].Trim());
|
|||
|
|
|||
|
|
|||
|
SamplingRate =300;
|
|||
|
AmplificationFactor = 10;
|
|||
|
|
|||
|
Ecg_Canvas = btmp;
|
|||
|
Ecg_Graphics = Graphics.FromImage(Ecg_Canvas);
|
|||
|
Ecg_Graphics.Clear(Color.White);//填充指定颜色
|
|||
|
|
|||
|
LeadCount = leadCount;
|
|||
|
LeadInfo = leadinfo;
|
|||
|
BaseLine = (btmp.Height / LeadInfo.Count) / 2;
|
|||
|
|
|||
|
LeadHeight = (btmp.Height / (LeadInfo.Count/2));
|
|||
|
Dpi = NewDpi;
|
|||
|
EcgData_Dic = EcgTable;
|
|||
|
Ecg_Pen = new Pen(Color.Gray, float.Parse("0.5"));
|
|||
|
FreePixs = int.Parse(Math.Round((double.Parse(Dpi.ToString()) / LenthPerInch) * 5).ToString());
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 把识别的R波位置标示出来
|
|||
|
/// </summary>
|
|||
|
/// <param name="rPosList"></param>
|
|||
|
public void drawRWavePos(List<int> rPosList)
|
|||
|
{
|
|||
|
Ecg_Pen = new Pen(Color.Green, float.Parse("1"));
|
|||
|
double IntervalPixCountPerPoint = double.Parse("0.102");
|
|||
|
for (int i = 0; i < rPosList.Count; i++)
|
|||
|
{
|
|||
|
double x = double.Parse(rPosList[i].ToString()) * IntervalPixCountPerPoint * 3.3;
|
|||
|
int nextX = (int.Parse(Math.Round(x).ToString()));
|
|||
|
Point pt1 = new Point(nextX,0); Point pt2 = new Point(nextX, 1024);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, pt1, pt2);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电波形
|
|||
|
/// </summary>
|
|||
|
public void Draw_EcgWave()
|
|||
|
{
|
|||
|
Ecg_Pen = new Pen(Color.Black, float.Parse("1"));
|
|||
|
//double IntervalPixCountPerPoint = (double.Parse(PaperSpeed.ToString()) / double.Parse(SamplingRate.ToString())) * (double.Parse(Dpi.ToString()) / LenthPerInch);
|
|||
|
//double IntervalPixCountPerPoint = double.Parse("0.095");
|
|||
|
|
|||
|
//double IntervalPixCountPerPoint = double.Parse("0.134");
|
|||
|
double IntervalPixCountPerPoint = double.Parse("0.102");
|
|||
|
//double IntervalPixCountPerPoint = double.Parse("0.126");
|
|||
|
for (int i = 0; i < LeadInfo.Count; i++)
|
|||
|
{
|
|||
|
int LeadIndex = LeadInfo[i];//取导联下标 0 1 2 3 ...11
|
|||
|
if (i < 6)
|
|||
|
{
|
|||
|
BaseLine = (Ecg_Canvas.Height / (LeadInfo.Count / 2)) / 2 + (i * LeadHeight);
|
|||
|
FirstPosition.Y = BaseLine;
|
|||
|
FirstPosition.X = FreePixs;
|
|||
|
SecondPosition.Y = BaseLine;
|
|||
|
SecondPosition.X = FreePixs;
|
|||
|
Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BaseLine = (Ecg_Canvas.Height / (LeadInfo.Count / 2)) / 2 + ((i - 6) * LeadHeight);
|
|||
|
FirstPosition.Y = BaseLine;
|
|||
|
FirstPosition.X = FreePixs + Ecg_Canvas.Width / 2;
|
|||
|
SecondPosition.Y = BaseLine;
|
|||
|
SecondPosition.X = FreePixs + Ecg_Canvas.Width / 2;
|
|||
|
Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
}
|
|||
|
if (EcgData_Dic.Count > 0)
|
|||
|
for (int b = 0; b < EcgData_Dic[LeadIndex].Count; b++)
|
|||
|
{
|
|||
|
if (i < 6)
|
|||
|
{
|
|||
|
if (FirstPosition.X > Ecg_Canvas.Width / 2 - 5)
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (FirstPosition.X > Ecg_Canvas.Width)
|
|||
|
break;
|
|||
|
}
|
|||
|
//double c = double.Parse(EcgData_Dic[LeadIndex][b].ToString());
|
|||
|
//double d = double.Parse((double.Parse(Dpi.ToString()) / double.Parse("96")).ToString());
|
|||
|
//SecondPosition.Y = BaseLine - (int)(c * d);
|
|||
|
float y_values = 0;
|
|||
|
try
|
|||
|
{
|
|||
|
//y_values = EcgData_Dic[LeadIndex][b] * (float)(96 / 25.4)*10;
|
|||
|
y_values = EcgData_Dic[LeadIndex][b] * (float)(96 / 25.4) * (float)0.041;
|
|||
|
}
|
|||
|
catch { }
|
|||
|
SecondPosition.Y = BaseLine - (Int32)y_values;//后一点Y轴位置
|
|||
|
|
|||
|
double x = double.Parse(b.ToString()) * IntervalPixCountPerPoint*3.3;
|
|||
|
int nextX = (int.Parse(Math.Round(x).ToString()));
|
|||
|
if (Math.Abs(FirstPosition.X - SecondPosition.X) < 5)
|
|||
|
{
|
|||
|
if (i < 6)
|
|||
|
{
|
|||
|
SecondPosition.X = nextX + FreePixs;
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
FirstPosition = SecondPosition;
|
|||
|
|
|||
|
//Ecg_Graphics.DrawLine(new Pen(Color.Green, float.Parse("1")), FirstPosition.X, BaseLine+150, SecondPosition.X, BaseLine + 150);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SecondPosition.X = Ecg_Canvas.Width / 2 + FreePixs + nextX;
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
FirstPosition = SecondPosition;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
FirstPosition = SecondPosition;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电波形
|
|||
|
/// </summary>
|
|||
|
public void Draw_EcgWave(int Draw_InitHeight,int BottomHeight)
|
|||
|
{
|
|||
|
FirstPointArray.Clear();
|
|||
|
Draw_InitHeight = Draw_InitHeight * FreePixs;
|
|||
|
BottomHeight = BottomHeight * FreePixs;
|
|||
|
Ecg_Pen = new Pen(Color.Black, float.Parse("2"));
|
|||
|
//double IntervalPixCountPerPoint = (double.Parse(PaperSpeed.ToString()) / double.Parse(SamplingRate.ToString())) * (double.Parse(Dpi.ToString()) / LenthPerInch);
|
|||
|
|
|||
|
//double IntervalPixCountPerPoint = double.Parse("0.134");
|
|||
|
double IntervalPixCountPerPoint = double.Parse("0.296");
|
|||
|
for (int i = 0; i < LeadInfo.Count; i++)
|
|||
|
{
|
|||
|
int LeadIndex = LeadInfo[i];//取导联下标 0 1 2 3 ...11
|
|||
|
if (i < 6)
|
|||
|
{
|
|||
|
//BaseLine = (Ecg_Canvas.Height / (LeadInfo.Count / 2)) / 2 + (i * LeadHeight);
|
|||
|
BaseLine = ((Ecg_Canvas.Height - Draw_InitHeight - BottomHeight) / (LeadInfo.Count / 2)) / 2 + (i * ((Ecg_Canvas.Height - Draw_InitHeight - BottomHeight) / (LeadInfo.Count / 2))) + Draw_InitHeight;
|
|||
|
FirstPosition.Y = BaseLine;
|
|||
|
FirstPosition.X = FreePixs;
|
|||
|
SecondPosition.Y = BaseLine;
|
|||
|
SecondPosition.X = FreePixs;
|
|||
|
Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
BaseLine = ((Ecg_Canvas.Height - Draw_InitHeight - BottomHeight) / (LeadInfo.Count / 2)) / 2 + ((i - 6) * ((Ecg_Canvas.Height - Draw_InitHeight - BottomHeight) / (LeadInfo.Count / 2))) + Draw_InitHeight;
|
|||
|
FirstPosition.Y = BaseLine;
|
|||
|
FirstPosition.X = FreePixs + Ecg_Canvas.Width / 2;
|
|||
|
SecondPosition.Y = BaseLine;
|
|||
|
SecondPosition.X = FreePixs + Ecg_Canvas.Width / 2;
|
|||
|
Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
}
|
|||
|
for (int b = 0; b < EcgData_Dic[LeadIndex].Count; b+=3)
|
|||
|
{
|
|||
|
if (i < 6)
|
|||
|
{
|
|||
|
if (FirstPosition.X > Ecg_Canvas.Width / 2 - 5)
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (FirstPosition.X > Ecg_Canvas.Width)
|
|||
|
break;
|
|||
|
}
|
|||
|
//double c = double.Parse(EcgData_Dic[LeadIndex][b].ToString());
|
|||
|
//double d = double.Parse((double.Parse(Dpi.ToString()) / double.Parse("96")).ToString());
|
|||
|
//SecondPosition.Y = BaseLine - (int)(c * d);
|
|||
|
float y_values = 0;
|
|||
|
try
|
|||
|
{
|
|||
|
//y_values = EcgData_Dic[LeadIndex][b] * (float)(300 / 25.4)*10;
|
|||
|
y_values = EcgData_Dic[LeadIndex][b] * (float)(300 / 25.4) * (float)9.5;
|
|||
|
}
|
|||
|
catch { }
|
|||
|
SecondPosition.Y = BaseLine - (Int32)y_values;//后一点Y轴位置
|
|||
|
|
|||
|
double x = double.Parse(b.ToString()) * IntervalPixCountPerPoint;
|
|||
|
int nextX = (int.Parse(Math.Round(x).ToString()));
|
|||
|
if (Math.Abs(FirstPosition.X - SecondPosition.X) < 5)
|
|||
|
{
|
|||
|
if (i < 6)
|
|||
|
{
|
|||
|
SecondPosition.X = nextX + FreePixs;
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
FirstPosition = SecondPosition;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
SecondPosition.X = Ecg_Canvas.Width / 2 + FreePixs + nextX;
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
FirstPosition = SecondPosition;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
FirstPosition = SecondPosition;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电报告的报告头
|
|||
|
/// </summary>
|
|||
|
public void Draw_ReportHeadInfo(string ReportHeadTile, string SectionName,string IdStr)
|
|||
|
{
|
|||
|
Pen pen_1 = new Pen(Color.Black, float.Parse("4"));
|
|||
|
|
|||
|
Font font1 = new Font("隶书", 20);
|
|||
|
Brush brush = Brushes.Black;
|
|||
|
|
|||
|
PointF point2 = new PointF(Ecg_Canvas.Width/2-300, FreePixs/2);
|
|||
|
Ecg_Graphics.DrawString(ReportHeadTile, font1, brush, point2);
|
|||
|
|
|||
|
Font font = new Font("宋体", 10);
|
|||
|
//PointF point = new PointF(10, FreePixs * 3-20);
|
|||
|
//Ecg_Graphics.DrawString("科室:" + SectionName, font, brush, point);
|
|||
|
|
|||
|
PointF pointId = new PointF(Ecg_Canvas.Width - 3400, FreePixs * 4-20);
|
|||
|
Ecg_Graphics.DrawString("ID:" + IdStr, font, brush, pointId);
|
|||
|
|
|||
|
//PointF point1 = new PointF(Ecg_Canvas.Width-1200, FreePixs * 3-20);
|
|||
|
//Ecg_Graphics.DrawString("报告日期:" + ReportDate, font, brush, point1);
|
|||
|
|
|||
|
// Ecg_Graphics.DrawLine(pen_1, 0, FreePixs * 4-60, Ecg_Canvas.Width, FreePixs * 4-60);
|
|||
|
}
|
|||
|
///// <summary>
|
|||
|
///// 绘制患者的心电识别的参数
|
|||
|
///// </summary>
|
|||
|
//public void Draw_EcgInfo(string[] Diag_Info_List)
|
|||
|
//{
|
|||
|
// Pen pen_1 = new Pen(Color.Black, float.Parse("4"));
|
|||
|
// Font font1 = new Font("宋体", 10);
|
|||
|
// Brush brush = Brushes.Black;
|
|||
|
|
|||
|
// PointF point = new PointF(10, FreePixs * 4+10);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[0], font1, brush, point);//姓名
|
|||
|
// PointF point_1 = new PointF(10, FreePixs * 5 + 25);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[1], font1, brush, point_1);//性别
|
|||
|
// PointF point_2 = new PointF(10, FreePixs * 6 + 35);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[2], font1, brush, point_2);//年龄
|
|||
|
|
|||
|
// PointF point_3 = new PointF(600, FreePixs * 4 + 10);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[3], font1, brush, point_3);//P
|
|||
|
// PointF point_4 = new PointF(600, FreePixs * 5 + 25);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[4], font1, brush, point_4);//P-R
|
|||
|
// PointF point_5 = new PointF(600, FreePixs * 6 + 35);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[5], font1, brush, point_5);//QRS
|
|||
|
|
|||
|
// PointF point_6 = new PointF(1200, FreePixs * 4 + 10);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[6], font1, brush, point_6);//QT/QTC
|
|||
|
// PointF point_7 = new PointF(1200, FreePixs * 5 + 25);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[7], font1, brush, point_7);//QRS电轴
|
|||
|
// PointF point_8 = new PointF(1200, FreePixs * 6 + 35);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[8], font1, brush, point_8);//RV5/SV1
|
|||
|
|
|||
|
// PointF point_9 = new PointF(1800, FreePixs * 4 + 10);
|
|||
|
// Ecg_Graphics.DrawString(Diag_Info_List[9], font1, brush, point_9);//心率
|
|||
|
|
|||
|
|
|||
|
// Ecg_Graphics.DrawLine(pen_1, 0, FreePixs * 8, Ecg_Canvas.Width, FreePixs * 8);
|
|||
|
//}
|
|||
|
/// <summary>
|
|||
|
/// 绘制患者的心电识别的参数
|
|||
|
/// </summary>
|
|||
|
public void Draw_EcgInfo(string[] Diag_Info_List)
|
|||
|
{
|
|||
|
Pen pen_1 = new Pen(Color.Black, float.Parse("4"));
|
|||
|
Font font1 = new Font("宋体", 10);
|
|||
|
Brush brush = Brushes.Black;
|
|||
|
|
|||
|
PointF point = new PointF(600, FreePixs * 4-20);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[0], font1, brush, point);//姓名
|
|||
|
|
|||
|
PointF point_1 = new PointF(1200, FreePixs * 4 -20);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[1], font1, brush, point_1);//性别
|
|||
|
|
|||
|
PointF point_2 = new PointF(1800, FreePixs * 4-20);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[2], font1, brush, point_2);//年龄
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//PointF point_4 = new PointF(600, FreePixs * 5 + 25);
|
|||
|
//Ecg_Graphics.DrawString(Diag_Info_List[3], font1, brush, point_4);//P
|
|||
|
|
|||
|
PointF point_5 = new PointF(10, FreePixs * 5 + 5);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[4], font1, brush, point_5);//P-R
|
|||
|
|
|||
|
PointF point_6 = new PointF(600, FreePixs * 5 + 5);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[5], font1, brush, point_6);//QRS
|
|||
|
|
|||
|
PointF point_3 = new PointF(1200, FreePixs * 5 + 5);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[9], font1, brush, point_3);//心率
|
|||
|
|
|||
|
|
|||
|
PointF point_7 = new PointF(10, FreePixs * 6 + 35);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[6], font1, brush, point_7);//QT/QTC
|
|||
|
|
|||
|
PointF point_8 = new PointF(600, FreePixs * 6 + 35);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[7], font1, brush, point_8);//QRS电轴
|
|||
|
|
|||
|
PointF point_9 = new PointF(1200, FreePixs * 6 + 35);
|
|||
|
Ecg_Graphics.DrawString(Diag_Info_List[8], font1, brush, point_9);//RV5/SV1
|
|||
|
|
|||
|
|
|||
|
Ecg_Graphics.DrawLine(pen_1, 0, FreePixs * 8, Ecg_Canvas.Width, FreePixs * 8);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制医生的诊断结果
|
|||
|
/// </summary>
|
|||
|
public void Draw_DiagInfo(string DiagInfoContent,string ReportDoctorName,string ReportDate,string Filter,string collectTime,string dept)
|
|||
|
{
|
|||
|
string[] diagresultecontent = new string[DiagInfoContent.Length/48+1];
|
|||
|
for (int a = 0; a < DiagInfoContent.Length / 48 + 1;a++ )
|
|||
|
{
|
|||
|
if (a < DiagInfoContent.Length / 48)
|
|||
|
diagresultecontent[a] = DiagInfoContent.Substring(a * 48, 48);
|
|||
|
else
|
|||
|
diagresultecontent[a] = DiagInfoContent.Substring(a * 48, DiagInfoContent.Length - a * 48);
|
|||
|
}
|
|||
|
Pen pen_1 = new Pen(Color.Black, float.Parse("4"));
|
|||
|
Font font1 = new Font("宋体", 12);
|
|||
|
Brush brush = Brushes.Black;
|
|||
|
Ecg_Graphics.DrawLine(pen_1, 0, Ecg_Canvas.Height - FreePixs * 6, Ecg_Canvas.Width, Ecg_Canvas.Height - FreePixs * 6);
|
|||
|
|
|||
|
PointF point1 = new PointF(10, Ecg_Canvas.Height - FreePixs * 6 + 10);
|
|||
|
Ecg_Graphics.DrawString("诊断提示:", font1, brush, point1);//诊断结果
|
|||
|
for (int i = 0; i < diagresultecontent.Length; i++)
|
|||
|
{
|
|||
|
PointF point5 = new PointF(230, Ecg_Canvas.Height - FreePixs * (6-i) + 10);
|
|||
|
Ecg_Graphics.DrawString(diagresultecontent[i].Trim(), font1, brush, point5);//诊断结果
|
|||
|
}
|
|||
|
|
|||
|
PointF pointb = new PointF(Ecg_Canvas.Width - 1800, Ecg_Canvas.Height - FreePixs * 2);
|
|||
|
Ecg_Graphics.DrawString("科室:" + dept, font1, brush, pointb);//报告医生
|
|||
|
|
|||
|
PointF point2 = new PointF(Ecg_Canvas.Width - 1200, Ecg_Canvas.Height - FreePixs * 2);
|
|||
|
Ecg_Graphics.DrawString("报告医生:" + ReportDoctorName, font1, brush, point2);//报告医生
|
|||
|
|
|||
|
PointF point9 = new PointF(Ecg_Canvas.Width - 600, Ecg_Canvas.Height - FreePixs * 2);
|
|||
|
Ecg_Graphics.DrawString("报告日期:" + ReportDate, font1, brush, point9);//报告医生
|
|||
|
|
|||
|
PointF point10 = new PointF(1800, FreePixs * 6 + 35);
|
|||
|
Ecg_Graphics.DrawString("25mm/s 10mm/mV " + Filter, font1, brush, point10);//振幅 走纸速度 滤波
|
|||
|
PointF point11 = new PointF(Ecg_Canvas.Width - 600, Ecg_Canvas.Height - FreePixs * 7 - 5);
|
|||
|
Ecg_Graphics.DrawString(collectTime, font1, brush, point11);//波形的起始时间点
|
|||
|
|
|||
|
Ecg_Graphics.DrawLine(pen_1, 0, Ecg_Canvas.Height - FreePixs, Ecg_Canvas.Width, Ecg_Canvas.Height - FreePixs);
|
|||
|
}
|
|||
|
///// <summary>
|
|||
|
///// 绘制心电波形
|
|||
|
///// </summary>
|
|||
|
//public void Draw_EcgWave()
|
|||
|
//{
|
|||
|
// Ecg_Pen = new Pen(Color.Black, float.Parse("0.5"));
|
|||
|
// for (int i = 0; i < LeadInfo.Count; i++)
|
|||
|
// {
|
|||
|
// int LeadIndex = LeadInfo[i];//取导联下标 0 1 2 3 ...11
|
|||
|
// BaseLine = (Ecg_Canvas.Height / LeadInfo.Count) / 2 + (i * LeadHeight);
|
|||
|
// FirstPosition.Y = BaseLine;
|
|||
|
// FirstPosition.X = FreePixs;
|
|||
|
// SecondPosition.Y = BaseLine;
|
|||
|
// SecondPosition.X = FreePixs;
|
|||
|
// Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
// FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
// for (int b = 0; b < EcgDataList[LeadIndex].Count; b++)
|
|||
|
// {
|
|||
|
// if (FirstPosition.X > Ecg_Canvas.Width)
|
|||
|
// break;
|
|||
|
// if (EcgDataList[LeadIndex][b] > 0)
|
|||
|
// SecondPosition.Y = Math.Abs(BaseLine - EcgDataList[LeadIndex][b]);
|
|||
|
// if (EcgDataList[LeadIndex][b] < 0)
|
|||
|
// SecondPosition.Y = BaseLine + Math.Abs(EcgDataList[LeadIndex][b]);
|
|||
|
// double x = double.Parse(b.ToString()) * (double.Parse(Dpi.ToString()) / double.Parse(SamplingRate.ToString()));//获得点的X轴位置
|
|||
|
// int nextX = (int.Parse(Math.Round(x).ToString()));
|
|||
|
// if (Math.Abs(FirstPosition.X - SecondPosition.X) < 5)
|
|||
|
// {
|
|||
|
// SecondPosition.X = nextX + FreePixs;
|
|||
|
// Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
// FirstPosition = SecondPosition;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// FirstPosition = SecondPosition;
|
|||
|
// }
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
///// <summary>
|
|||
|
///// 绘制心电图的背景网格
|
|||
|
///// </summary>
|
|||
|
//public void Draw_EcgBackGroundGrid()
|
|||
|
//{
|
|||
|
// Ecg_Pen = new Pen(Color.LightCoral, float.Parse("0.1"));
|
|||
|
// bool shuxianFlag = false;
|
|||
|
// double PointCountPerMM = Math.Abs(double.Parse(Dpi.ToString()) / LenthPerInch);
|
|||
|
// int x = 0;
|
|||
|
// int y = 0;
|
|||
|
// for (int p = 0; p < Ecg_Canvas.Height / PointCountPerMM; p++)
|
|||
|
// {
|
|||
|
// for (int R = 0; R < Ecg_Canvas.Width / PointCountPerMM; R++)
|
|||
|
// {
|
|||
|
// if (x % 5 == 0 && !shuxianFlag)
|
|||
|
// {
|
|||
|
// Ecg_Graphics.DrawLine(Ecg_Pen, x, 0, x, Ecg_Canvas.Height);
|
|||
|
// }
|
|||
|
// x += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
// if (x < Ecg_Canvas.Width && y < Ecg_Canvas.Height)
|
|||
|
// {
|
|||
|
// Ecg_Canvas.SetPixel(x, y, Color.LightCoral);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// x = 0;
|
|||
|
// break;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// shuxianFlag = true;
|
|||
|
// if (y % 5 == 0)
|
|||
|
// {
|
|||
|
// Ecg_Graphics.DrawLine(Ecg_Pen, 0, y, Ecg_Canvas.Width, y);
|
|||
|
// }
|
|||
|
// y += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
|
|||
|
// if (y > Ecg_Canvas.Height)
|
|||
|
// {
|
|||
|
// break;
|
|||
|
// }
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电图的背景网格
|
|||
|
/// </summary>
|
|||
|
public void Draw_EcgBackGroundGrid()
|
|||
|
{
|
|||
|
Ecg_Pen = new Pen(Color.LightCoral, float.Parse("0.1"));
|
|||
|
//Ecg_Pen = new Pen(Color.Black, float.Parse("0.1"));
|
|||
|
bool shuxianFlag = false;
|
|||
|
double PointCountPerMM = Math.Abs(double.Parse(Dpi.ToString()) / LenthPerInch);
|
|||
|
int x = 0;
|
|||
|
int y = 0;
|
|||
|
for (int p = 0; p < Ecg_Canvas.Height / PointCountPerMM; p++)
|
|||
|
{
|
|||
|
for (int R = 0; R < Ecg_Canvas.Width / PointCountPerMM; R++)
|
|||
|
{
|
|||
|
if (x % 5 == 0 && !shuxianFlag)
|
|||
|
{
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, x, 0, x, Ecg_Canvas.Height);
|
|||
|
}
|
|||
|
x += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
if (x < Ecg_Canvas.Width && y < Ecg_Canvas.Height)
|
|||
|
{
|
|||
|
Ecg_Canvas.SetPixel(x, y, Color.Black);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
x = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
shuxianFlag = true;
|
|||
|
if (y % 5 == 0)
|
|||
|
{
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, 0, y, Ecg_Canvas.Width, y);
|
|||
|
}
|
|||
|
y += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
|
|||
|
if (y > Ecg_Canvas.Height)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电图的背景网格
|
|||
|
/// </summary>
|
|||
|
public void Draw_EcgBackGroundGrid(int height1,int height2,int PenWidth)
|
|||
|
{
|
|||
|
if (PenWidth == 0)
|
|||
|
Ecg_Pen = new Pen(Color.LightCoral, float.Parse("0.1"));
|
|||
|
else
|
|||
|
Ecg_Pen = new Pen(Color.Black, float.Parse("1"));
|
|||
|
//Ecg_Pen = new Pen(Color.Black, PenWidth);
|
|||
|
bool shuxianFlag = false;
|
|||
|
double PointCountPerMM = Math.Abs(double.Parse(Dpi.ToString()) / LenthPerInch);
|
|||
|
height1 = height1 * (int)PointCountPerMM;
|
|||
|
height2 = height2 * (int)PointCountPerMM;
|
|||
|
int x = 0;
|
|||
|
int y = 0;
|
|||
|
for (int p = 0; p < Ecg_Canvas.Height / PointCountPerMM; p++)
|
|||
|
{
|
|||
|
for (int R = 0; R < Ecg_Canvas.Width / PointCountPerMM; R++)
|
|||
|
{
|
|||
|
if (x % 5 == 0 && !shuxianFlag)
|
|||
|
{
|
|||
|
//Ecg_Graphics.DrawLine(Ecg_Pen, x, 0, x, Ecg_Canvas.Height);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, x, height1, x, height2);
|
|||
|
}
|
|||
|
x += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
if (x < Ecg_Canvas.Width && y < Ecg_Canvas.Height)
|
|||
|
{
|
|||
|
if (y >= height1 && y <= height2)
|
|||
|
Ecg_Canvas.SetPixel(x, y, Color.Black);
|
|||
|
//Ecg_Canvas.SetPixel(x, y, Color.LightCoral);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
x = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
shuxianFlag = true;
|
|||
|
if (y % 5 == 0)
|
|||
|
{
|
|||
|
if (y >= height1 && y <= height2)
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, 0, y, Ecg_Canvas.Width, y);
|
|||
|
}
|
|||
|
y += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
|
|||
|
if (y > Ecg_Canvas.Height)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电图的大网格 5mm大网格
|
|||
|
/// </summary>
|
|||
|
public void Draw_BigGrid()
|
|||
|
{
|
|||
|
Ecg_Pen = new Pen(Color.LightCoral, float.Parse("0.1"));
|
|||
|
bool shuxianFlag = false;
|
|||
|
double PointCountPerMM = Math.Abs(double.Parse(Dpi.ToString()) / LenthPerInch);
|
|||
|
int x = 0;
|
|||
|
int y = 0;
|
|||
|
for (int p = 0; p < Ecg_Canvas.Height / PointCountPerMM; p++)
|
|||
|
{
|
|||
|
for (int R = 0; R < Ecg_Canvas.Width / PointCountPerMM; R++)
|
|||
|
{
|
|||
|
if (x % 5 == 0 && !shuxianFlag)
|
|||
|
{
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, x, 0, x, Ecg_Canvas.Height);
|
|||
|
}
|
|||
|
x += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
if (x < Ecg_Canvas.Width && y < Ecg_Canvas.Height)
|
|||
|
{
|
|||
|
//Ecg_Canvas.SetPixel(x, y, Color.LightCoral);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
x = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
shuxianFlag = true;
|
|||
|
if (y % 5 == 0)
|
|||
|
{
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, 0, y, Ecg_Canvas.Width, y);
|
|||
|
}
|
|||
|
y += int.Parse(Math.Round(double.Parse(PointCountPerMM.ToString("0.0"))).ToString());
|
|||
|
|
|||
|
if (y > Ecg_Canvas.Height)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电图的定标电压和导联名称
|
|||
|
/// </summary>
|
|||
|
public void Draw_CalibrationVoltage_And_LeadName()
|
|||
|
{
|
|||
|
Ecg_Pen = new Pen(Color.Black, float.Parse("1.5"));
|
|||
|
string[] LeadNameArray = new string[12] { "I", "II", "III", "aVR", "aVL", "aVF", "V1", "V2", "V3", "V4", "V5", "V6" };
|
|||
|
for (int d = 0; d < LeadInfo.Count; d++)
|
|||
|
{
|
|||
|
if (d < 6)
|
|||
|
{
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, 0, FirstPointArray[LeadInfo[d].ToString()].Y, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y - Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) * 2).ToString()));
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y - Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) * 2).ToString()), Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()) * 2, FirstPointArray[LeadInfo[d].ToString()].Y - Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) * 2).ToString()));
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()) * 2, FirstPointArray[LeadInfo[d].ToString()].Y - Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) * 2).ToString()), Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()) * 2, FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()) * 2, FirstPointArray[LeadInfo[d].ToString()].Y, Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()) * 3, FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
string str = LeadNameArray[LeadInfo[d]];
|
|||
|
Font font = new Font("宋体", 11);
|
|||
|
Brush brush = Brushes.Black;
|
|||
|
if (d < FirstPointArray.Count)
|
|||
|
{
|
|||
|
PointF point = new PointF(0, FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
Ecg_Graphics.DrawString(str, font, brush, point);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Ecg_Canvas.Width / 2, FirstPointArray[LeadInfo[d].ToString()].Y, Ecg_Canvas.Width / 2+Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Ecg_Canvas.Width / 2 + Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y, Ecg_Canvas.Width / 2 + Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y - 2 * FreePixs);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Ecg_Canvas.Width / 2 + Int16.Parse(Math.Round(double.Parse(FreePixs.ToString()) / 3).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y - 2 * FreePixs, Ecg_Canvas.Width / 2 + Int16.Parse(Math.Round((double.Parse(FreePixs.ToString()) / 3)*2).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y - 2 * FreePixs);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Ecg_Canvas.Width / 2 + Int16.Parse(Math.Round((double.Parse(FreePixs.ToString()) / 3) * 2).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y - 2 * FreePixs, Ecg_Canvas.Width / 2 + Int16.Parse(Math.Round((double.Parse(FreePixs.ToString()) / 3) * 2).ToString()), FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
Ecg_Graphics.DrawLine(Ecg_Pen, Ecg_Canvas.Width / 2 + (FreePixs / 3) * 2, FirstPointArray[LeadInfo[d].ToString()].Y, Ecg_Canvas.Width / 2 + FreePixs, FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
string str = LeadNameArray[LeadInfo[d]];
|
|||
|
Font font = new Font("宋体", 11);
|
|||
|
Brush brush = Brushes.Black;
|
|||
|
if (d < FirstPointArray.Count)
|
|||
|
{
|
|||
|
PointF point = new PointF(Ecg_Canvas.Width / 2, FirstPointArray[LeadInfo[d].ToString()].Y);
|
|||
|
Ecg_Graphics.DrawString(str, font, brush, point);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 获得心电数据
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public Dictionary<int, List<double>> GetEcgData(DataTable EcgDataTable)
|
|||
|
{
|
|||
|
string[] WavePara = File.ReadAllText(Application.StartupPath + @"\WavePara.txt").Trim().Split(',');
|
|||
|
SamplingRate = int.Parse(WavePara[0].Trim());
|
|||
|
AmplificationFactor = double.Parse(WavePara[1].Trim());
|
|||
|
|
|||
|
Dictionary<int, List<double>> get_EcgDataList = new Dictionary<int, List<double>>();
|
|||
|
for (int y = 0; y < EcgDataTable.Rows.Count; y++)
|
|||
|
{
|
|||
|
byte[] ecgdata = (byte[])EcgDataTable.Rows[y]["pureData"];
|
|||
|
Int16[,] ecg = new Int16[LeadCount, ecgdata.Length / (LeadCount * byteLength)];
|
|||
|
Int16[,] EcgPixData = new Int16[LeadCount, ecgdata.Length / (LeadCount * byteLength)];
|
|||
|
int index = 0;
|
|||
|
for (int q = 0; q < LeadCount; q++)
|
|||
|
{
|
|||
|
for (int i = 0; i < SamplingRate*5; i++)
|
|||
|
{
|
|||
|
byte a = ecgdata[index];
|
|||
|
index++;
|
|||
|
byte b = ecgdata[index];
|
|||
|
index++;
|
|||
|
ecg[q, i] = (Int16)(a + (b << 8));
|
|||
|
string sss = ((double.Parse(ecg[q, i].ToString()) / AmplificationFactor) * 10.0).ToString();
|
|||
|
double cc = double.Parse(sss) * double.Parse(Dpi.ToString()) / double.Parse(LenthPerInch.ToString());
|
|||
|
if (get_EcgDataList.ContainsKey(q))
|
|||
|
get_EcgDataList[q].Add(cc);
|
|||
|
//get_EcgDataList[q].Add(short.Parse(cc.ToString()));
|
|||
|
else
|
|||
|
{
|
|||
|
|
|||
|
short f = (short)cc;
|
|||
|
List<double> ecg_List = new List<double>();
|
|||
|
ecg_List.Add((double)f);
|
|||
|
//ecg_List.Add(short.Parse(cc.ToString()));
|
|||
|
get_EcgDataList.Add(q, ecg_List);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return get_EcgDataList;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 获得心电数据
|
|||
|
/// </summary>
|
|||
|
/// <returns></returns>
|
|||
|
public Dictionary<int, List<float>> GetEcgData(DataTable EcgDataTable,bool ReturnFloat)
|
|||
|
{
|
|||
|
string[] WavePara = File.ReadAllText(Application.StartupPath + @"\WavePara.txt").Trim().Split(',');
|
|||
|
SamplingRate = int.Parse(WavePara[0].Trim());
|
|||
|
AmplificationFactor = double.Parse(WavePara[1].Trim());
|
|||
|
|
|||
|
Dictionary<int, List<float>> get_EcgDataList = new Dictionary<int, List<float>>();
|
|||
|
for (int y = 0; y < EcgDataTable.Rows.Count; y++)
|
|||
|
{
|
|||
|
byte[] ecgdata = (byte[])EcgDataTable.Rows[y]["pureData"];
|
|||
|
Int16[,] ecg = new Int16[LeadCount, ecgdata.Length / (LeadCount * byteLength)];
|
|||
|
Int16[,] EcgPixData = new Int16[LeadCount, ecgdata.Length / (LeadCount * byteLength)];
|
|||
|
int index = 0;
|
|||
|
for (int q = 0; q < LeadCount; q++)
|
|||
|
{
|
|||
|
for (int i = 0; i < SamplingRate*5; i++)
|
|||
|
{
|
|||
|
byte a = ecgdata[index];
|
|||
|
index++;
|
|||
|
byte b = ecgdata[index];
|
|||
|
index++;
|
|||
|
ecg[q, i] = (Int16)(a + (b << 8));
|
|||
|
double sss = double.Parse(ecg[q, i].ToString()) / AmplificationFactor;
|
|||
|
float resulte_cc = (float)sss;
|
|||
|
//double cc = double.Parse(sss) * double.Parse(Dpi.ToString()) / double.Parse(LenthPerInch.ToString());
|
|||
|
if (get_EcgDataList.ContainsKey(q))
|
|||
|
get_EcgDataList[q].Add(resulte_cc);
|
|||
|
//get_EcgDataList[q].Add(short.Parse(cc.ToString()));
|
|||
|
else
|
|||
|
{
|
|||
|
List<float> ecg_List = new List<float>();
|
|||
|
ecg_List.Add(resulte_cc);
|
|||
|
get_EcgDataList.Add(q, ecg_List);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return get_EcgDataList;
|
|||
|
}
|
|||
|
///// <summary>
|
|||
|
///// 波形放大或缩小
|
|||
|
///// </summary>
|
|||
|
//public void AmplifyOrLessen(int OptionParameter)
|
|||
|
//{
|
|||
|
|
|||
|
// // double a = Math.Abs(double.Parse(Dpi.ToString()) / LenthPerInch) * OptionParameter;
|
|||
|
// // int WaveAmplify = (int)a;
|
|||
|
// Ecg_Pen = new Pen(Color.Black, float.Parse("0.5"));
|
|||
|
// for (int i = 0; i < LeadInfo.Count; i++)
|
|||
|
// {
|
|||
|
// int LeadIndex = LeadInfo[i];//取导联下标 0 1 2 3 ...11
|
|||
|
// BaseLine = (Ecg_Canvas.Height / LeadInfo.Count) / 2 + (i * LeadHeight);
|
|||
|
// FirstPosition.Y = BaseLine;
|
|||
|
// FirstPosition.X = FreePixs;
|
|||
|
// SecondPosition.Y = BaseLine;
|
|||
|
// SecondPosition.X = FreePixs;
|
|||
|
|
|||
|
// Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
// FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
// for (int b = 0; b < EcgDataList[LeadIndex].Count; b++)
|
|||
|
// {
|
|||
|
// if (FirstPosition.X > Ecg_Canvas.Width)
|
|||
|
// break;
|
|||
|
// if (EcgDataList[LeadIndex][b] > 0)
|
|||
|
// SecondPosition.Y = Math.Abs(BaseLine - EcgDataList[LeadIndex][b]) + OptionParameter;
|
|||
|
// if (EcgDataList[LeadIndex][b] < 0)
|
|||
|
// SecondPosition.Y = BaseLine + Math.Abs(EcgDataList[LeadIndex][b]) + OptionParameter;
|
|||
|
// double x = double.Parse(b.ToString()) * (double.Parse(Dpi.ToString()) / double.Parse(SamplingRate.ToString())) * (PaperSpeed * OptionParameter)/Amplitude;//获得点的X轴位置
|
|||
|
// int nextX = (int.Parse(Math.Round(x).ToString()));
|
|||
|
// if (Math.Abs(FirstPosition.X - SecondPosition.X) < 5)
|
|||
|
// {
|
|||
|
// SecondPosition.X = nextX + FreePixs;
|
|||
|
// Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
// FirstPosition = SecondPosition;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// FirstPosition = SecondPosition;
|
|||
|
// }
|
|||
|
// }
|
|||
|
//}
|
|||
|
|
|||
|
//**************************动态播放十二导联波形************************************************************************************
|
|||
|
/// <summary>
|
|||
|
/// 绘制屏幕墙窗体背景
|
|||
|
/// </summary>
|
|||
|
/// <param name="Graphics"></param>
|
|||
|
public void DrawBackGround(Graphics Graphics)
|
|||
|
{
|
|||
|
Graphics.FillRectangle(Brushes.White, Graphics.ClipBounds);
|
|||
|
}
|
|||
|
public void DrawStandardGrid(PictureBox EV, Graphics Graphics)
|
|||
|
{
|
|||
|
int GridSize = int.Parse((Math.Round(double.Parse("96") * double.Parse("5") / double.Parse("25.4"))).ToString());
|
|||
|
Pen GridColor = new Pen(Color.LightCoral, float.Parse("0.1"));
|
|||
|
//绘制网格大格竖线
|
|||
|
for (int i = 0; i < EV.Width; i += GridSize)
|
|||
|
{
|
|||
|
Graphics.DrawLine(GridColor, i, 0, i, EV.Height);
|
|||
|
}
|
|||
|
//绘制网格大格横线
|
|||
|
for (int i = 0; i < EV.Height; i += GridSize)
|
|||
|
{
|
|||
|
Graphics.DrawLine(GridColor, 0, i, EV.Width, i);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DateTime CurrentDateTime;
|
|||
|
string V_WardshipId = string.Empty;
|
|||
|
int Ecg_Index = 0;//数据队列中的游标
|
|||
|
double PixCountPerPoint;//求出 心电 相邻两点之间的 像素点个数
|
|||
|
/// <summary>
|
|||
|
/// 绘制心电波形
|
|||
|
/// </summary>
|
|||
|
//public void Play_EcgWave(PictureEdit pictureEdit3, Graphics Graphics_1, string WardshipId, DateTime CurrDatetime)
|
|||
|
//{
|
|||
|
// PixCountPerPoint = double.Parse("0.3");
|
|||
|
// V_WardshipId = WardshipId;
|
|||
|
// if (CurrDatetime != null)
|
|||
|
// CurrentDateTime = CurrDatetime;
|
|||
|
// Ecg_Pen = new Pen(Color.Black, float.Parse("0.5"));//心电波形颜色
|
|||
|
// FirstPointArray.Clear();
|
|||
|
// LeadHeight = pictureEdit3.Height / LeadInfo.Count;
|
|||
|
// FreePixs = int.Parse(Math.Round((double.Parse(Dpi.ToString()) / LenthPerInch) * 5).ToString());
|
|||
|
// for (int i = 0; i < LeadInfo.Count; i++)
|
|||
|
// {
|
|||
|
// int LeadIndex = LeadInfo[i];//取导联下标 0 1 2 3 ...11
|
|||
|
// BaseLine = (pictureEdit3.Height / LeadInfo.Count) / 2 + (i * LeadHeight);
|
|||
|
// FirstPosition.Y = BaseLine;
|
|||
|
// FirstPosition.X = FreePixs;
|
|||
|
// SecondPosition.Y = BaseLine;
|
|||
|
// SecondPosition.X = FreePixs;
|
|||
|
|
|||
|
// Point FP = new Point(FirstPosition.X + FreePixs, FirstPosition.Y);
|
|||
|
// FirstPointArray.Add(LeadIndex.ToString(), FP);
|
|||
|
// int ScreenPointCount = (int)(double.Parse(pictureEdit3.Width.ToString()) / PixCountPerPoint);
|
|||
|
// for (int b = Ecg_Index; b < Ecg_Index + ScreenPointCount; b++)
|
|||
|
// {
|
|||
|
// if (EcgDataList == null)
|
|||
|
// LoadEcgData_BaseDatabase(WardshipId);//加载心电数据队列
|
|||
|
// else
|
|||
|
// if (EcgDataList[LeadIndex].Count <= 0 || b + 500 >= EcgDataList[LeadIndex].Count)
|
|||
|
// LoadEcgData_BaseDatabase(WardshipId);//加载心电数据队列
|
|||
|
|
|||
|
|
|||
|
// if (b + 1 >= EcgDataList[LeadIndex].Count)
|
|||
|
// {
|
|||
|
// Graphics_1.DrawLine(new Pen(Brushes.Black), 0, pictureEdit3.Height / 2, pictureEdit3.Width, pictureEdit3.Height / 2);
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// if (FirstPosition.X > pictureEdit3.Width)
|
|||
|
// break;
|
|||
|
// if (EcgDataList[LeadIndex][b] > 0)
|
|||
|
// SecondPosition.Y = Math.Abs(BaseLine - EcgDataList[LeadIndex][b]);
|
|||
|
// if (EcgDataList[LeadIndex][b] < 0)
|
|||
|
// SecondPosition.Y = BaseLine + Math.Abs(EcgDataList[LeadIndex][b]);
|
|||
|
// double x = double.Parse(b.ToString()) * (double.Parse(Dpi.ToString()) / double.Parse(SamplingRate.ToString()));//获得点的X轴位置
|
|||
|
// int nextX = (int.Parse(Math.Round(x).ToString()));
|
|||
|
// if (Math.Abs(FirstPosition.X - SecondPosition.X) < 5)
|
|||
|
// {
|
|||
|
// SecondPosition.X = nextX + FreePixs;
|
|||
|
// //Ecg_Graphics.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
// Graphics_1.DrawLine(Ecg_Pen, FirstPosition, SecondPosition);
|
|||
|
// FirstPosition = SecondPosition;
|
|||
|
// }
|
|||
|
// else
|
|||
|
// FirstPosition = SecondPosition;
|
|||
|
// }
|
|||
|
// }
|
|||
|
// }
|
|||
|
// Ecg_Index += 14;
|
|||
|
//}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
}
|