using HelperDB;
using Newtonsoft.Json;
using AIMSExtension;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DrawGraph
{
[Serializable, JsonObject(MemberSerialization.OptOut)]
public class PhysioDataManage : AreaManageBase
{
///
/// 监测文本的对象
///
TextPackObj janCePack = null;
///
/// 图表的对象
///
ChartPackObj chartPack = null;
///
/// 当前图例文本
///
//string curLegend = "";
///
/// 当前选中的,手术生理曲线
///
private PhysioDataConfig curPhysioParam = null;
///
/// 当前选中的生命体征对象 临时
///
private PhysioData curPhysioData = null;
///
/// 当前选中的生命体征对象 未改变前
///
private PhysioData oldCurPhysioData = null;
///
/// 悬浮选中的生命体征
///
private PhysioData selPhysioData = null;
///
/// 选中点点坐标是否处在可编辑状态
///
//private bool isEdit = false;
///
/// 当前手术对象
///
private OperationRecord myOpeRecord = null;
///
/// 单例悬浮显示 公用
///
private TipBox aSyncTip = null;
#region 初始化生命体征区域
public PhysioDataManage()
{
init();
}
public PhysioDataManage(object _operationRecor, DrawGraph.ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
{
init();
}
public void init()
{
//监测文本的对象
janCePack = GetPackObjectOTag("PhysioDataManage_TextPackObj_17") as TextPackObj;
//图表的对象
chartPack = GetPackObjectOTag("PhysioDataManage_ChartPackObj_6") as ChartPackObj;
//自己要用的手术对象
myOpeRecord = OpeRecord as OperationRecord;
//myOpeRecord.SAreaObj.maxnumber = ZedControl.GraphPane.YAxis.Scale.Max;
//myOpeRecord.SAreaObj.minnumber = ZedControl.GraphPane.YAxis.Scale.Min;
}
///
/// 初始画的前置方法
///
public override void PrepositiveMethod()
{
//在这里可以初始化时间軕
List AxisList = PackManage.ListPob.Where(s => s is XhAxisPackObj || s is Xd2AxisPackObj).ToList();
foreach (PackObjBase pack in AxisList)
{
AkxisPackObj axis = pack as AkxisPackObj;
if (axis != null)
{
DateTime dt = DateTime.Now.AddMinutes(-DateTime.Now.Minute).AddMinutes(15).AddSeconds(-DateTime.Now.Second).AddMilliseconds(-DateTime.Now.Millisecond);
axis.BeginTime = dt;
}
}
}
///
/// 初始画的后置方法
///
public override void FollowUpMethod()
{
init();
initLegend(ZedControl.GraphPane);
initChart(ZedControl.GraphPane);
}
public override void clearSelectCouve_Click()
{
if (curPhysioParam != null && curPhysioParam.IsClick == true)
{
System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show("你确定要删除当前曲线的所有生理数据吗?", "保存修改", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Information);
if (dr == System.Windows.Forms.DialogResult.Yes)
{
if (curPhysioParam.showStyle == "显示数值")
{
foreach (PointPair pp in curPhysioParam.APhysioParams)
{
PhysioData pd = curPhysioParam.PointPairToPhysioData(pp);
if (pd != null)
curPhysioParam.delAddObj(pd);
}
}
foreach (PointPair pp in curPhysioParam.APhysioParams)
{
PhysioData pd = curPhysioParam.PointPairToPhysioData(pp);
if (pd != null && pd.Value == curPhysioParam.HighLimit)
curPhysioParam.delAddObj(pd);
}
curPhysioParam.DelItems(myOpeRecord.pageBegin, myOpeRecord.lastPageBegin);
curPhysioParam.clearAddObj(ZedControl);
ZedControl.Refresh();
}
}
else
{
//PublicMethod.ShowMessage("删除曲线前请先选中曲线!");
}
}
#endregion
#region 重写的事件
///
/// 鼠标点击画板
///
///
///
public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
{
//if ((OpeRecord != null && status == DoOpeStatus.BEGINOPE) || IsReview)
if (myOpeRecord != null)
{
if (e.Button != System.Windows.Forms.MouseButtons.Left) return;
//清空选中框
myOpeRecord.SAreaObj.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
myOpeRecord.SAreaObj.Clear();
//触发可编辑区域的事件
double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(ZedControl.Height));
double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(ZedControl.Width));
ZedGraphControl sender1 = sender as ZedGraphControl;
PointF mousePt = new PointF(e.X, e.Y);
GraphPane pane = sender1.MasterPane.FindChartRect(mousePt);
//如果在图例范围内
if (isLegendArea(sender1, mousePt))
{
//取得点击位置图例的中文
PhysioDataConfig appTemp = reClickParamName(sender1, mousePt);
if (appTemp != null)
{
if (curPhysioParam == null)
{
appTemp.IsClick = true;
curPhysioParam = appTemp;
curPhysioParam.PatientId = myOpeRecord.Id.Value;
curPhysioParam.onClick(e);
}
else
{
if (curPhysioParam.Name == appTemp.Name)
{
curPhysioParam.IsClick = false;
curPhysioParam.onClick(e);
curPhysioParam = null;
}
else
{
curPhysioParam.IsClick = false;
curPhysioParam.onClick(e);
appTemp.IsClick = true;
curPhysioParam = appTemp;
curPhysioParam.PatientId = myOpeRecord.Id.Value;
curPhysioParam.onClick(e);
}
}
}
}
//如果点击在麻醉单子范围内
if (pane != null)
{
if (curPhysioParam != null && curPhysioParam.IsClick)
{
//如果曲线被选中则进行点的操作,反之选中所有点的集合在子范围内画选中框
bool isHave = false;
PhysioData pdTemp = rePD(sender, e);
if (pdTemp == null) return;
foreach (PointPair pp in curPhysioParam.APhysioParams)
{
curPhysioData = curPhysioParam.PointPairToPhysioData(pp);
if (pdTemp.isEquert(curPhysioParam.PointPairToPhysioData(pp)) && curPhysioParam.PointPairToPhysioData(pp).Value != Double.MaxValue)
{
isHave = true;
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
{
curPhysioParam.PointPairToPhysioData(pp).IsClick = true;
curPhysioParam.CurPDIndex = curPhysioParam.indexOf(curPhysioData);
oldCurPhysioData = curPhysioParam.PointPairToPhysioData(pp);
//curPhysioParam.delAddObj(oldCurPhysioData);
AnesOpeStatue = DoAnesOpeStatus.MOVEPD;
break;
}
}
}
if (!isHave)
{
AnesOpeStatue = DoAnesOpeStatus.ADDPD;
DateTime insTime = GetRecordTime(DateTime.Parse(pdTemp.RecordTime.ToString("yyyy-MM-dd HH:mm:00.000")));
curPhysioParam.AddMultipleItem(pdTemp, insTime, collectInterval);
AnesOpeStatue = DoAnesOpeStatus.VIEW;
//curPhysioParam.AddItem(pdTemp);
}
}//选中范围设置开始点
else
{
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
{
PhysioData pdTemp = rePD(sender, e);
if (pdTemp == null) return;
AnesOpeStatue = DoAnesOpeStatus.SelectArea;
myOpeRecord.SAreaObj.StartPD = pdTemp;
myOpeRecord.SAreaObj.StartPDs = rePDs(sender, e);
}
}
}
////获得指定Tag和指定类型的组件
//List packs = PackManage.ListPob.Where(s => s.PackTag == "Operation_AddListEvent" && s is LinesPackObj).ToList();
//foreach (PackObjBase pack in packs)
//{
// LinesPackObj linesPack = pack as LinesPackObj;
// if ((x > linesPack.RealX && x < linesPack.RealEndX) && (y > linesPack.RealY && y < linesPack.RealEndY))
// {
// string viewStr = string.Format("PhysioDataManage的MouseDown事件显示的内容:{0}组件,X={1}、Y={2}", pack.PackTag, linesPack.RealX, linesPack.RealY);
// MessageBox.Show(viewStr);
// }
//}
}
ZedControl.AxisChange();
ZedControl.Refresh();
}
public override void MouseMove(ZedGraphControl sender, MouseEventArgs e)
{
double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(sender.Width));
double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(sender.Height));
double yP = 18 / Convert.ToDouble(sender.Height);
string viewStr = "";
PointF mousePt = new PointF(e.X, e.Y);
GraphPane pane = sender.MasterPane.FindChartRect(mousePt);
if (pane != null && aSyncTip != null)
{
List pdNew = rePDs(sender, e);
if (pdNew != null && myOpeRecord != null)
{
PhysioData pdTrue = null;
foreach (var item in pdNew)
{
pdTrue = GetPDOfPhysioParams(item);
if (pdTrue != null)
{
string Name = pdTrue.ppter.Name;
if (pdTrue.ppter.Unit != null && pdTrue.ppter.Unit != "") Name += "(" + pdTrue.ppter.Unit + ")";
viewStr = Name + ":" + ((float)pdTrue.Value).ToString() + "\n时间:" + pdTrue.RecordTime.ToShortTimeString();
break;
}
}
if (viewStr == "" && pdNew.Count > 0)
{
viewStr = "值:" + Math.Round(pdNew[0].Value, 1).ToString() + "\n时间:" + pdNew[0].RecordTime.ToShortTimeString();
}
}
aSyncTip.ViewStr = viewStr;
aSyncTip.Show(x, (y + yP));
}
switch (AnesOpeStatue)
{
case DoAnesOpeStatus.MOVEPD:
if (curPhysioParam != null && curPhysioParam.CurPDIndex != -1)
{
try
{
PhysioData pdNew = rePD(sender, e);
if (pdNew == null) return;
int countSim = 0;
foreach (PointPair pp in curPhysioParam.APhysioParams)
{
PhysioData ppd = curPhysioParam.PointPairToPhysioData(pp);
if (pdNew.isEquert(ppd))
{
countSim++;
break;
}
}
if (countSim < 2)
{
curPhysioParam.onlyModItem(pdNew, oldCurPhysioData);
}
else
{
curPhysioParam.onlyModItem(oldCurPhysioData, oldCurPhysioData);
AnesOpeStatue = DoAnesOpeStatus.VIEW;
ZedControl.AxisChange();
ZedControl.Refresh();
return;
}
}
catch
{
return;
}
}
break;
case DoAnesOpeStatus.SelectArea:
try
{
PhysioData pdNew = rePD(sender, e);
if (pdNew == null) return;
if (AnesOpeStatue == DoAnesOpeStatus.SelectArea)
{
myOpeRecord.SAreaObj.EndPd = pdNew;
myOpeRecord.SAreaObj.EndPds = rePDs(sender, e);
myOpeRecord.SAreaObj.Draw();
}
}
catch { return; }
finally
{
ZedControl.AxisChange();
ZedControl.Refresh();
}
break;
case DoAnesOpeStatus.VIEW:
break;
}
ZedControl.AxisChange();
ZedControl.Refresh();
}
public override void MouseUp(ZedGraphControl sender, MouseEventArgs e)
{
if (OpeRecord == null) return;
double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(ZedControl.Height));
double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(ZedControl.Width));
if (curPhysioParam != null && curPhysioParam.IsClick == true)
{
try
{
PhysioData pdNew = rePD(sender, e);
if (pdNew == null) return;
if (AnesOpeStatue == DoAnesOpeStatus.MOVEPD)
{
curPhysioParam.ModItem(oldCurPhysioData, pdNew);
curPhysioData = null;
oldCurPhysioData = null;
curPhysioParam.CurPDIndex = -1;
}
}
catch
{
AnesOpeStatue = DoAnesOpeStatus.VIEW;
return;
}
AnesOpeStatue = DoAnesOpeStatus.VIEW;
ZedControl.AxisChange();
ZedControl.Refresh();
}
else
{
if (AnesOpeStatue == DoAnesOpeStatus.SelectArea)
{
AnesOpeStatue = DoAnesOpeStatus.VIEW;
}
}
return;
}
public override void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
{
if (myOpeRecord == null) return;//|| IsReadOnly == true
//只有鼠标左键双击才有效
if (e.Button == System.Windows.Forms.MouseButtons.Left && e.Clicks == 2)
{
if ((AnesOpeStatue == DoAnesOpeStatus.VIEW || AnesOpeStatue == DoAnesOpeStatus.SelectArea) && curPhysioParam == null)
{
List pdTemps = rePDs(sender as ZedGraphControl, e);
if (pdTemps != null)
{
foreach (var pdTemp in pdTemps)
{
PhysioData pdTrue = GetPDOfPhysioParams(pdTemp);
if (pdTrue != null)
{
pdTrue.ppter.DelItem(pdTrue);
}
}
}
}
//if (myOpeRecord != null && AnesOpeStatue == DoAnesOpeStatus.VIEW)
//{
// //触发可编辑区域的事件
// double y = Convert.ToDouble(Convert.ToDouble(e.Y) / Convert.ToDouble(zgcAnaesRecord.Height));
// double x = Convert.ToDouble(Convert.ToDouble(e.X) / Convert.ToDouble(zgcAnaesRecord.Width));
// foreach (AddEditArea area in myOpeRecord.AddEditAreaList)
// {
// if ((x > area.X && x < area.X1) && (y > area.Y && y < area.Y1))
// {
// if (area.isDoubleClick)
// {
// area.onClick(e);
// break;
// }
// }
// }
//}
}
}
public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
if (myOpeRecord != null)
{
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
{
if (myOpeRecord.SAreaObj.Selected)
{
double startValue = myOpeRecord.SAreaObj.EndPd.Value;
double endValue = myOpeRecord.SAreaObj.StartPD.Value;
foreach (var item in myOpeRecord.SAreaObj.EndPds)
{
if (item.Value < startValue)
{
startValue = item.Value;
}
}
foreach (var item in myOpeRecord.SAreaObj.StartPDs)
{
if (item.Value > endValue)
{
endValue = item.Value;
}
}
List pdTemps = SelectPhysioDataByID(myOpeRecord.Id.Value,
myOpeRecord.SAreaObj.StartPD.RecordTime,
myOpeRecord.SAreaObj.EndPd.RecordTime,
startValue, endValue);
List selparameters = new List();
foreach (PhysioDataConfig addPP in myOpeRecord.addPhysioList)
{
bool istrue = false;
foreach (int item in pdTemps)
{
if (item == addPP.Id)
{
istrue = true;
break;
}
}
if (istrue == true)
selparameters.Add(addPP);
}
if (selparameters.Count <= 0) return;
DeletePhysios frm = new DeletePhysios(myOpeRecord.Id.Value,
myOpeRecord.SAreaObj.StartPD.RecordTime,
myOpeRecord.SAreaObj.EndPd.RecordTime,
startValue, endValue);
frm.selparameters = selparameters;
frm.FormClosed += (a, b) =>
{
if (frm.isDelete == true)
{
myOpeRecord.SAreaObj.Clear();
if (myOpeRecord.addPhysioList != null)
{
foreach (PhysioDataConfig item in myOpeRecord.addPhysioList)
{
item.clearAddObj(ZedControl);
}
}
#region 画生理数据
DrawPhysioData();
#endregion
}
else
{
myOpeRecord.SAreaObj.Clear();
}
};
frm.ShowDialog();
}
}
}
}
}
#endregion 重写的事件结束
#region 绑定区域数据
public override void initChart()
{
initChart(ZedControl.GraphPane);
}
public override void Bind()
{
init();
//if (myOpeRecord.addPhysioList.Count == 0)
InitPhysioDataConfigList(myOpeRecord.addPhysioList);
//悬浮tip初始化
aSyncTip = TipBox.CreateInstance("async");
aSyncTip.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin, myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
myOpeRecord.SAreaObj.maxnumber = ZedControl.GraphPane.YAxis.Scale.Max;
myOpeRecord.SAreaObj.minnumber = ZedControl.GraphPane.YAxis.Scale.Min;
DrawPhysioData();
curPhysioParam = null;
curPhysioData = null;
oldCurPhysioData = null;
}
///
/// 画生理数据
///
private void DrawPhysioData()
{
DataTable dtPhysioData = getByOpeIDIsPhysioData(myOpeRecord.Id.Value);
if (dtPhysioData.Rows.Count <= 0)
{
foreach (PhysioDataConfig item in myOpeRecord.addPhysioList)
{
item.clearAddObj(ZedControl);
}
return;
}
if (dtPhysioData != null && dtPhysioData.Rows.Count > 0)
{
foreach (PhysioDataConfig addPP in myOpeRecord.addPhysioList)
{
addPP.clearAddObj(ZedControl);
if (addPP.IsDefalultShow == false) continue;
for (int i = 0; i < dtPhysioData.Rows.Count; i++)
{
if (dtPhysioData.Rows[i]["Name"].ToString().Equals(addPP.Name.ToString()))
{
PhysioData pdTemp = new PhysioData();
pdTemp.RecordTime = DateTime.Parse(dtPhysioData.Rows[i]["RecordTime"].ToString());
pdTemp.Value = Double.Parse(dtPhysioData.Rows[i]["Value"].ToString());
pdTemp.YAisx = addPP.YAisx;
pdTemp.PhysioDataConfigId = addPP.Id;
pdTemp.PatientId = myOpeRecord.Id.Value;
addPP.AddPoition(pdTemp);
}
}
}
}
}
#endregion
#region 初始化标题,图注和图表
///
/// 定义图注释位置
///
///
private void initLegend(GraphPane myPane)
{
Legend legend = myPane.Legend;
legend.IsVisible = true;
legend.Position = LegendPos.Float;//定位图标位置
legend.Location = new Location(janCePack.RealX, janCePack.RealEndY - 0.02, CoordType.PaneFraction);//只有当Legend的Position属性设置为Float,才可修改其位置 0.87 0.3
legend.Border.Width = 0;
legend.Border.IsVisible = false; //不显示图标外边框
legend.Gap = 2.0f;
legend.IsHStack = false;
legend.FontSpec.Size = 7f;
legend.FontSpec.Fill.IsVisible = false;
}
///
/// 将坐标数值对加到相应的曲线上,从而初始化曲线Chart
///
///
private void InitPhysioDataConfigList(List addPhysioList)
{
try
{
if (janCePack == null) return;
int showvalue = 0;
addPhysioList.Clear();
ZedControl.GraphPane.CurveList.Clear();
//监测区域里的第1根竖线,显示数值时用
LinesPackObj pack = template.GetPackObjectOTag("MonitorManage_LinesPackObj_9");
int RowsCount = 0;
if (pack != null)
RowsCount = Convert.ToInt32(pack.XPageSpan / pack.XMajorGridStep);
//加载生命体征图标
IList dt = PhysioDataConfig.GetAllList();
int rowNum = 1;
for (int i = 0; i < dt.Count; i++)
{
PhysioDataConfig pp = dt[i];
pp.Click += new PhysioDataConfig.ClickEventHandler(pp_Click);
string[] str = pp.Color.Split('.');
int A = int.Parse(str[0].ToString());
int R = int.Parse(str[1].ToString());
int G = int.Parse(str[2].ToString());
int B = int.Parse(str[3].ToString());
pp.ConveColor = System.Drawing.Color.FromArgb(A, R, G, B);
if (pp.IsDefalultShow == false || (pp.ShowImg == false && pp.ShowText == false))
{
pp.showStyle = "不显示";
pp.IsValid = false;
}
else
{
if (pp.ShowImg == true)
{
pp.showStyle = "显示曲线";
pp.IsValid = true;
}
if (pp.ShowText == true)
{
pp.showStyle = "显示数值";
pp.IsValid = true;
}
}
pp.ClearTagstr(ZedControl);
//如果模板管理不为空
if (pack != null)// && pack1 == null
{
if (pp.showStyle.Equals("显示数值"))
{
double y = pack.RealY + getYPositionByListIndex(showvalue, pack.RealY, pack.RealEndY, RowsCount);
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname, 5.5f);
pp.showValue = y + 0.002;
showvalue++;
}
}
else
{
pp.showStyle = "显示曲线";
}
DateTime DateTimeNow = DateTime.Now;
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
bool isHave = false;
foreach (PhysioDataConfig appTemp in addPhysioList)
{
if (appTemp.Name.Equals(pp.Name))
{
isHave = true;
}
}
if (!isHave)
{
addPhysioList.Add(pp);
pp.draw();
pp_Click(pp, null);
}
rowNum++;
}
}
catch (Exception ex)
{
//异常处理保存
throw ex;
}
}
public void pp_Click(object sender, EventArgs e)
{
PhysioDataConfig app = (PhysioDataConfig)sender;
if (app.IsClick)
{
app.curve.Label.FontSpec = new FontSpec("微软雅黑", 5.9f, Color.Red, true, false, true);
app.curve.Label.FontSpec.Border.IsVisible = false;
app.curve.Label.FontSpec.Fill.IsVisible = false;
}
else
{
app.curve.Label.FontSpec = new FontSpec("微软雅黑", 5.8f, Color.Black, false, false, false);
app.curve.Label.FontSpec.Border.IsVisible = false;
app.curve.Label.FontSpec.Fill.IsVisible = false;
}
}
public override void frmInstance_ConfigParam()
{
//既然是全局变量,并且在初始化的时候已经定义过了,为什么在此还要重新定义呢?
//原因:正是因为xmlOpe是全局变量,因此,在整个窗体生命周期都没有发生改变。
//即在该段时间内驻留内存,及时其他窗体将其信息改变,其操作的XML内容仍然不变。
//解决办法:重新定义,使XML操作对象发生变化。
int showvalue = 0;
//监测区域里的第1根竖线,显示数值时用
LinesPackObj pack = template.GetPackObjectOTag("MonitorManage_LinesPackObj_9");
int RowsCount = Convert.ToInt32(pack.XPageSpan / pack.XMajorGridStep);
foreach (var pp in myOpeRecord.addPhysioList)
{
string[] str = pp.Color.Split('.');
int A = int.Parse(str[0].ToString());
int R = int.Parse(str[1].ToString());
int G = int.Parse(str[2].ToString());
int B = int.Parse(str[3].ToString());
pp.ConveColor = System.Drawing.Color.FromArgb(A, R, G, B);
if (pp.IsDefalultShow == false || (pp.ShowImg == false && pp.ShowText == false))
{
pp.showStyle = "不显示";
pp.IsValid = false;
}
else
{
if (pp.ShowImg == true)
{
pp.showStyle = "显示曲线";
pp.IsValid = true;
}
if (pp.ShowText == true)
{
pp.showStyle = "显示数值";
pp.IsValid = true;
}
}
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.pageBegin,
myOpeRecord.pageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
pp.ClearTagstr(ZedControl);
if (pp.showStyle.Equals("显示数值"))
{
//如果模板管理不为空
if (pack != null)
{
double y = pack.RealY + getYPositionByListIndex(showvalue, pack.RealY, pack.RealEndY, RowsCount);
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname, 5.5f);
pp.showValue = y + 0.002;
showvalue++;
}
}
///重新设置曲线属性
pp.reSetCurve();
break;
}
}
#endregion
#region 设置采集Chart区域的位置
///
/// 设置采集Chart区域的位置
///
///
private void initChart(GraphPane myPane)
{
Chart chart = myPane.Chart;
chart.Fill = new Fill(System.Drawing.Color.White);
chart.Border.Width = 0.0f;
chart.IsRectAuto = true;
float cLeft = (float)(myPane.Rect.Width * chartPack.RealX);
float cTop = (float)(myPane.Rect.Height * (chartPack.RealY));
float cWidth = (float)(myPane.Rect.Width * (chartPack.RealEndX - chartPack.RealX));
float cHeight = (float)(myPane.Rect.Height * (chartPack.RealEndY - chartPack.RealY));
chart.Rect = new System.Drawing.RectangleF(cLeft, cTop, cWidth, cHeight); //设定中间的图像显示区域chart.Rect = {X = 120.0 Y = 304.5 Width = 576.0 Height = 375.55}
myPane.XAxis.MajorGrid.Color = System.Drawing.Color.Black; //大跨度网格颜色
}
#endregion
#region 点击编辑区域后的事件方法
///
/// 响应可编辑区域的点击事件
///
///
///
public override void editAr_Click(object sender, EventArgs e)
{
}
#endregion
#region 当前区域公用事件方法
///
/// 从所有曲线里得到相应的点
///
/// 要查找的物理点
private PhysioData GetPDOfPhysioParams(PhysioData pdTemp)
{
selPhysioData = null;
foreach (PhysioDataConfig ppter in myOpeRecord.addPhysioList)
{
if (pdTemp.YAisx != ppter.YAisx) continue;
foreach (PointPair pp in ppter.APhysioParams)
{
selPhysioData = ppter.PointPairToPhysioData(pp);
if (pdTemp.isEquertTrue(selPhysioData, collectInterval.ToString()))
{
selPhysioData.ppter = ppter;
selPhysioData.PatientId = myOpeRecord.Id.Value;
selPhysioData.PhysioDataConfigId = ppter.Id;
return selPhysioData;
}
}
}
return null;
}
///
/// 得到生命特征泛型集合
///
///
///
///
private List rePDs(ZedGraphControl sender, MouseEventArgs e)
{
List pdNews = new List();
try
{
double x, x2;
double[] y;
double[] y2;
PointF mousePt = new PointF(e.X, e.Y);
ZedGraphControl sender1 = sender as ZedGraphControl;
GraphPane pane = sender1.MasterPane.FindChartRect(mousePt);
if (pane != null)
{
pane.ReverseTransform(mousePt, out x, out x2, out y, out y2);
XDate xd = new XDate(x);
PhysioData pdNew = new PhysioData();
pdNew.RecordTime = xd.DateTime;
PhysioDataConfig physioParam = null;
if (curPhysioParam == null)
{
physioParam = myOpeRecord.addPhysioList[1];
}
else
{
physioParam = curPhysioParam;
}
pdNew.Value = Math.Round(y[physioParam.YAisx], 2);
pdNew.YAisx = physioParam.YAisx;
pdNew.PhysioDataConfigId = physioParam.Id;
pdNew.PatientId = myOpeRecord.Id.Value;
pdNew.IsClick = true;
pdNews.Add(pdNew);
if (y[1].ToString() != "")
{
PhysioData pdNewY2 = new PhysioData();
pdNewY2.RecordTime = xd.DateTime;
physioParam = myOpeRecord.addPhysioList.Where(a => a.Name == "氧饱和度").ToList()[0];
pdNewY2.Value = Math.Round(y[physioParam.YAisx], 2);
pdNewY2.YAisx = physioParam.YAisx;
pdNewY2.PhysioDataConfigId = physioParam.Id;
pdNewY2.PatientId = myOpeRecord.Id.Value;
pdNewY2.IsClick = true;
pdNews.Add(pdNewY2);
}
if (y[0].ToString() != "")
{
PhysioData pdNewY2 = new PhysioData();
pdNewY2.RecordTime = xd.DateTime;
physioParam = myOpeRecord.addPhysioList.Where(a => a.Name == "体温").ToList()[0];
pdNewY2.Value = Math.Round(y[physioParam.YAisx], 2);
pdNewY2.YAisx = physioParam.YAisx;
pdNewY2.PhysioDataConfigId = physioParam.Id;
pdNewY2.PatientId = myOpeRecord.Id.Value;
pdNewY2.IsClick = true;
pdNews.Add(pdNewY2);
}
}
return pdNews;
}
catch (Exception)
{
return pdNews;
}
}
///
/// 得到单生命特征对象
///
///
/// 点击鼠标事件的参数
///
private PhysioData rePD(ZedGraphControl sender, MouseEventArgs e)
{
try
{
if (ZedControl == null) return null;
double x, x2;
double[] y;
double[] y2;
PointF mousePt = new PointF(e.X, e.Y);
GraphPane pane = ZedControl.MasterPane.FindChartRect(mousePt);
if (pane == null) return null;
pane.ReverseTransform(mousePt, out x, out x2, out y, out y2);
XDate xd = new XDate(x);
PhysioData pdNew = new PhysioData();
pdNew.RecordTime = xd.DateTime;
PhysioDataConfig physioParam = null;
if (curPhysioParam == null)
{
physioParam = myOpeRecord.addPhysioList[1];
}
else
{
physioParam = curPhysioParam;
}
pdNew.Value = Math.Round(y[physioParam.YAisx], 2);
pdNew.PhysioDataConfigId = physioParam.Id;
pdNew.PatientId = myOpeRecord.Id.Value;
pdNew.IsClick = true;
return pdNew;
}
catch (Exception)
{
return null;
}
}
///
/// 返回控件的点击的Legend的图例文本
///
///
///
///
private PhysioDataConfig reClickParamName(ZedGraphControl zgc, PointF mousePt)
{
PhysioDataConfig appTemp = null;
Graphics g = zgc.CreateGraphics();
GraphPane myPane = new GraphPane();
object nearestObj;
int ipt;
zgc.MasterPane.FindNearestPaneObject(mousePt, g, out myPane, out nearestObj, out ipt);
if (nearestObj is Legend)
{
foreach (PhysioDataConfig Temp in myOpeRecord.addPhysioList)
{
if (myPane.CurveList[ipt].Tag.ToString().IndexOf(Temp.Name) >= 0)
{
appTemp = Temp;
}
}
}
return appTemp;
}
///
/// 点击时是否在图例范围内
///
///
///
///
private bool isLegendArea(ZedGraphControl zgc, PointF mousePt)
{
Graphics g = zgc.CreateGraphics();
GraphPane myPane = new GraphPane();
object nearestObj;
int ipt;
zgc.MasterPane.FindNearestPaneObject(mousePt, g, out myPane, out nearestObj, out ipt);
if (nearestObj is Legend)
{
return true;
}
return false;
}
///
/// 根据顶部加药序号,确定数值生命体征的纵向位置(以1为单位)
///
///
///
public double getYPositionByListIndex(double index, double yTop, double yBottom, int rowCount)
{
double heightT = ZedControl.Height * (yBottom - yTop);
double setpTemp = heightT / rowCount;
//求一格在实际高度中的百分比
double bfb = (setpTemp / heightT);
//两线之间度*百分比得到一格的百分比高度
double ygBFB = (yBottom - yTop) * bfb;
double y = ygBFB * index;
return y;
}
#endregion
public DataTable getByOpeIDIsPhysioData(int operationId)
{
string sqlStr = "SELECT [PhysioDataConfig].Name , PhysioData.RecordTime, PhysioData.[Value] FROM [dbo].[PhysioDataConfig] INNER JOIN PhysioData ON [PhysioDataConfig].Id = PhysioData.PhysioDataConfigId where PatientId = " + operationId + " order by PhysioDataConfigId,PhysioData.RecordTime ASC";
return DBHelper.GetDataTable(sqlStr);
}
public List SelectPhysioDataByID(int operationId, DateTime startTime, DateTime endTime, double startValue, double endValue)
{
List PhysioDatas = new List();
string sqlStr = "select * FROM PhysioData where PatientId = " + operationId + " and [RecordTime] >='" + startTime + "' and [RecordTime] <='" + endTime + "' and [Value] >='" + startValue + "' and [Value] <='" + endValue + "' ";
DataTable dt = DBHelper.GetDataTable(sqlStr);
foreach (DataRow dr in dt.Rows)
{
int PhysioDataConfigId = int.Parse(dr["PhysioDataConfigId"].ToString());
if (!PhysioDatas.Contains(PhysioDataConfigId))
PhysioDatas.Add(PhysioDataConfigId);
}
return PhysioDatas;
}
public static DateTime GetRecordTime(DateTime pdTemp, int collectInterval = 5)
{
DateTime result = Convert.ToDateTime(pdTemp.ToString("yyyy-MM-dd HH:mm:00.000"));
bool flag = collectInterval == 5;
if (flag)
{
double num = (double)(pdTemp.Minute % 5);
bool flag2 = num > 2.5;
if (flag2)
{
result = result.AddMinutes(5.0 - num);
}
else
{
result = result.AddMinutes(0.0 - num);
}
}
else
{
bool flag3 = collectInterval == 10;
if (flag3)
{
double num2 = (double)(pdTemp.Minute % 10);
bool flag4 = num2 > 5.0;
if (flag4)
{
result = result.AddMinutes(10.0 - num2);
}
else
{
result = result.AddMinutes(0.0 - num2);
}
}
}
return result;
}
}
}