AIMS/DrawGraph/AreaManage/PhysioDataManage.cs
2023-07-05 11:57:59 +08:00

1039 lines
44 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
using DevComponents.DotNetBar;
using System.Xml.Linq;
using System.Runtime.InteropServices;
namespace DrawGraph
{
[Serializable, JsonObject(MemberSerialization.OptOut)]
public class PhysioDataManage : AreaManageBase
{
/// <summary>
/// 监测文本的对象
/// </summary>
TextPackObj janCePack = null;
/// <summary>
/// 图表的对象
/// </summary>
ChartPackObj chartPack = null;
/// <summary>
/// 动态填写对象
/// </summary>
AbleEditPackObj phListPack = null;
/// <summary>
/// 当前选中的生命体征对象 未改变前
/// </summary>
private PhysioData CurPhysioData = null;
/// <summary>
/// 悬浮选中的生命体征
/// </summary>
private PhysioData selPhysioData = null;
/// <summary>
/// 当前手术对象
/// </summary>
private OperationRecord myOpeRecord = null;
/// <summary>
/// 单例悬浮显示 公用
/// </summary>
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;
//动态生命体征填写对象
phListPack = template.GetPackObjectOTag<AbleEditPackObj>("MonitorManage_AbleEditPackObj_20_OperationRecord_SpareSeven");
//自己要用的手术对象
myOpeRecord = OpeRecord as OperationRecord;
}
/// <summary>
/// 初始画的前置方法
/// </summary>
public override void PrepositiveMethod()
{
//在这里可以初始化时间軕
List<PackObjBase> AxisList = PackManage.ListPob.Where<PackObjBase>(s => s is XhAxisPackObj || s is Xd2AxisPackObj).ToList<PackObjBase>();
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;
}
}
}
/// <summary>
/// 初始画的后置方法
/// </summary>
public override void FollowUpMethod()
{
init();
initLegend(ZedControl.GraphPane);
initChart(ZedControl.GraphPane);
}
public override void clearSelectCouve_Click()
{
if (myOpeRecord.SelPhysioConfig != null && myOpeRecord.SelPhysioConfig.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 (myOpeRecord.SelPhysioConfig.ShowText == true)
{
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
{
PhysioData pd = myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp);
if (pd != null)
myOpeRecord.SelPhysioConfig.delAddObj(pd);
}
}
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
{
PhysioData pd = myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp);
if (pd != null && pd.Value == myOpeRecord.SelPhysioConfig.HighLimit)
myOpeRecord.SelPhysioConfig.delAddObj(pd);
}
myOpeRecord.SelPhysioConfig.DelItems(myOpeRecord.PageBegin, myOpeRecord.lastPageBegin);
myOpeRecord.SelPhysioConfig.clearAddObj(ZedControl);
ZedControl.Refresh();
}
}
}
#endregion
#region
/// <summary>
/// 鼠标点击画板
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
{
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);
ClickPhysioDataConfig(e, appTemp);
}
//如果点击在麻醉单子范围内
else if (pane != null)
{
if (myOpeRecord.SelPhysioConfig != null && myOpeRecord.SelPhysioConfig.IsClick)
{
bool isHave = false;
PhysioData pdTemp = rePD(sender, e);
if (pdTemp == null) return;
foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
{
if (pdTemp.isEquert(myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp)) && myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp).Value != Double.MaxValue)
{
isHave = true;
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
{
CurPhysioData = myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp);
AnesOpeStatue = DoAnesOpeStatus.MOVEPD;
break;
}
}
}
if (!isHave)
{
AnesOpeStatue = DoAnesOpeStatus.ADDPD;
DateTime insTime = GetRecordTime(pdTemp.RecordTime);
myOpeRecord.SelPhysioConfig.AddMultipleItem(pdTemp, insTime, collectInterval);
}
}
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);
}
//if (e.Button == System.Windows.Forms.MouseButtons.Left && e.Clicks == 1)
//{
// if ((AnesOpeStatue == DoAnesOpeStatus.VIEW || AnesOpeStatue == DoAnesOpeStatus.SelectArea) && myOpeRecord.SelPhysioConfig == null)
// {
// List<PhysioData> pdTemps = rePDs(sender as ZedGraphControl, e);
// if (pdTemps != null)
// {
// foreach (var pdTemp in pdTemps)
// {
// PhysioData pdTrue = GetPDOfPhysioParams(pdTemp);
// if (pdTrue != null)
// {
// ClickPhysioDataConfig(e, pdTrue.config);
// return;
// }
// }
// }
// }
//}
}
}
else
{
if (myOpeRecord.SelPhysioConfig != null)
{
myOpeRecord.SelPhysioConfig.IsClick = false;
myOpeRecord.SelPhysioConfig.onClick(e);
myOpeRecord.SelPhysioConfig = null;
//ZedControl.AxisChange();
ZedControl.Refresh();
}
}
}
}
private void ClickPhysioDataConfig(MouseEventArgs e, PhysioDataConfig appTemp)
{
if (appTemp != null)
{
if (myOpeRecord.SelPhysioConfig == null)
{
appTemp.IsClick = true;
myOpeRecord.SelPhysioConfig = appTemp;
myOpeRecord.SelPhysioConfig.PatientId = myOpeRecord.Id.Value;
myOpeRecord.SelPhysioConfig.onClick(e);
}
else
{
if (myOpeRecord.SelPhysioConfig.Name == appTemp.Name)
{
myOpeRecord.SelPhysioConfig.IsClick = false;
myOpeRecord.SelPhysioConfig.onClick(e);
myOpeRecord.SelPhysioConfig = null;
}
else
{
myOpeRecord.SelPhysioConfig.IsClick = false;
myOpeRecord.SelPhysioConfig.onClick(e);
appTemp.IsClick = true;
myOpeRecord.SelPhysioConfig = appTemp;
myOpeRecord.SelPhysioConfig.PatientId = myOpeRecord.Id.Value;
myOpeRecord.SelPhysioConfig.onClick(e);
}
}
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<PhysioData> 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.config.Name;
if (pdTrue.config.Unit != null && pdTrue.config.Unit != "") Name += "(" + pdTrue.config.Unit + ")";
string value = pdTrue.config.Name == "体温" ? ((float)pdTrue.Value).ToString() : Math.Round(pdNew[0].Value, 0).ToString();
viewStr = Name + ":" + value + "\n时间:" + pdTrue.RecordTime.ToShortTimeString();
break;
}
}
if (viewStr == "" && pdNew.Count > 0)
{
viewStr = "值:" + Math.Round(pdNew[0].Value, 0).ToString() + "\n时间:" + pdNew[0].RecordTime.ToShortTimeString();
}
}
aSyncTip.ViewStr = viewStr;
aSyncTip.Show(x, (y + yP));
ZedControl.Refresh();
}
//考虑客户端拖拽数据库处理不及时 可以采用批量缓存新增修改的数据点集中处理
if (AnesOpeStatue == DoAnesOpeStatus.MOVEPD || AnesOpeStatue == DoAnesOpeStatus.ADDPD)
{
if (myOpeRecord.SelPhysioConfig != null)
{
PhysioData pdTemp = rePD(sender, e);
if (pdTemp == null) return;
DateTime insTime = GetRecordTime(pdTemp.RecordTime);
CurPhysioData = pdTemp;
CurPhysioData.RecordTime = insTime;
myOpeRecord.SelPhysioConfig.ModifyAddItem(CurPhysioData, CurPhysioData);
ZedControl.Refresh();
}
}
else
{
if (AnesOpeStatue == 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();
}
}
}
}
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 (myOpeRecord.SelPhysioConfig != null && myOpeRecord.SelPhysioConfig.IsClick == true)
{
PhysioData pdTemp = rePD(sender, e);
if (pdTemp == null) return;
if (AnesOpeStatue == DoAnesOpeStatus.MOVEPD)
{
if (CurPhysioData.isEquert(pdTemp))
{
PhysioData newPd = myOpeRecord.SelPhysioConfig.MoveItem(pdTemp);
if (newPd != null)//&& CurPhysioData.Value != newPd.Value
{
myOpeRecord.SelPhysioConfig.ModifyItem(CurPhysioData, newPd);
}
}
CurPhysioData = null;
}
AnesOpeStatue = DoAnesOpeStatus.VIEW;
//ZedControl.AxisChange();
ZedControl.Refresh();
}
else
{
if (AnesOpeStatue == DoAnesOpeStatus.SelectArea)
{
AnesOpeStatue = DoAnesOpeStatus.VIEW;
DeletePhysios();
}
}
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) && myOpeRecord.SelPhysioConfig == null)
{
List<PhysioData> pdTemps = rePDs(sender as ZedGraphControl, e);
if (pdTemps != null)
{
foreach (var pdTemp in pdTemps)
{
PhysioData pdTrue = GetPDOfPhysioParams(pdTemp);
if (pdTrue != null)
{
pdTrue.config.DelItem(pdTrue);
}
//if (myOpeRecord.SelPhysioConfig != null)
// ClickPhysioDataConfig(e, pdTrue.config);
}
}
}
}
}
public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
if (myOpeRecord != null)
{
if (AnesOpeStatue == DoAnesOpeStatus.VIEW)
{
DeletePhysios();
}
}
}
}
public void DeletePhysios()
{
if (myOpeRecord.SAreaObj.Selected)
{
double startValue = myOpeRecord.SAreaObj.EndPds[0].Value;
double endValue = myOpeRecord.SAreaObj.StartPDs[0].Value;
double startValue2 = myOpeRecord.SAreaObj.EndPds[1].Value;
double endValue2 = myOpeRecord.SAreaObj.StartPDs[1].Value;
List<int> pdTemps = SelectPhysioDataByID(myOpeRecord.Id.Value,
myOpeRecord.SAreaObj.StartPD.RecordTime,
myOpeRecord.SAreaObj.EndPd.RecordTime,
startValue, endValue);
List<int> pdTemps2 = SelectPhysioDataByID(myOpeRecord.Id.Value,
myOpeRecord.SAreaObj.StartPD.RecordTime,
myOpeRecord.SAreaObj.EndPd.RecordTime,
startValue2, endValue2);
List<PhysioDataConfig> selparameters = new List<PhysioDataConfig>();
foreach (PhysioDataConfig addPP in myOpeRecord.PhysioConfigList)
{
bool istrue = false;
foreach (int item in pdTemps)
{
if (item == addPP.Id && addPP.YAisx == 0)
{
istrue = true;
break;
}
}
foreach (int item in pdTemps2)
{
if (item == addPP.Id && addPP.YAisx == 1)
{
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,
startValue2, endValue2);
frm.selparameters = selparameters;
frm.FormClosed += (a, b) =>
{
if (frm.isDelete == true)
{
myOpeRecord.SAreaObj.Clear();
template.Bind("MonitorManage");
ZedControl.Refresh();
}
else
{
myOpeRecord.SAreaObj.Clear();
}
};
frm.ShowDialog();
}
}
#endregion
#region
public override void initChart()
{
initChart(ZedControl.GraphPane);
}
public override void Bind()
{
try
{
init();
InitPhysioDataConfigList(myOpeRecord.PhysioConfigList);
//悬浮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();
myOpeRecord.SelPhysioConfig = null;
CurPhysioData = null;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region
/// <summary>
/// 定义图注释位置
/// </summary>
/// <param name="myPane"></param>
private void initLegend(GraphPane myPane)
{
Legend legend = myPane.Legend;
legend.IsVisible = true;
legend.Position = LegendPos.Float;//定位图标位置
legend.Location = new Location(janCePack.RealX, janCePack.RealEndY, CoordType.PaneFraction);
legend.Border.Width = 0;
legend.Border.IsVisible = false; //不显示图标外边框
legend.Gap = 2.0f;
legend.IsHStack = false;
legend.FontSpec.Size = 7f;
legend.FontSpec.Fill.IsVisible = false;
}
/// <summary>
/// 将坐标数值对加到相应的曲线上从而初始化曲线Chart
/// </summary>
/// <param name="addPhysioList"></param>
private void InitPhysioDataConfigList(List<PhysioDataConfig> addPhysioList)
{
try
{
if (janCePack == null) return;
int YRows = 0;
addPhysioList.Clear();
myOpeRecord.phListPack = phListPack;
ZedControl.GraphPane.CurveList.Clear();
//监测区域里的第1根竖线显示数值时用
LinesPackObj pack = template.GetPackObjectOTag<LinesPackObj>("MonitorManage_LinesPackObj_9");
int RowsCount = 0;
if (pack != null)
RowsCount = Convert.ToInt32(pack.XPageSpan / pack.XMajorGridStep);
//加载生命体征图标
IList<PhysioDataConfig> dt = PhysioDataConfig.GetLifeList();
int rowNum = 1;
for (int i = 0; i < dt.Count; i++)
{
PhysioDataConfig pp = dt[i];
pp.ConfigType = "生命体征";
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);
pp.IsValid = true;
if (pp.IsDefalultShow == false || (pp.ShowImg == false && pp.ShowText == false))
{
pp.IsValid = false;
}
if (myOpeRecord.RecoverId == 2)
{
pp.IsValid = true;
pp.ShowText = false;
pp.ShowImg = true;
}
pp.ClearTagstr(ZedControl);
pp.phListPack = phListPack;
//如果模板管理不为空
if (pack != null && rowNum <= RowsCount && pp.ShowText == true)
{
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
if (RowsCount != 1)
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname, 5.5f);
pp.YLocation = y + 0.002;
YRows++;
rowNum++;
}
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.initCurve();
pp_Click(pp, null);
}
}
if (pack != null)
{
myOpeRecord.PhysioAnesConfigList.Clear();
IList<PhysioDataConfig> dt2 = PhysioDataConfig.GetAnesList();
for (int i = 0; i < dt2.Count; i++)
{
PhysioDataConfig pp = dt2[i];
pp.ConfigType = "麻醉体征";
pp.ClearTagstr(ZedControl);
pp.phListPack = phListPack;
pp.IsValid = true;
if (pp.IsDefalultShow == false) pp.IsValid = false;
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.PageBegin,
myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
pp.ClearTagstr(ZedControl);
if (rowNum <= RowsCount && pp.IsDefalultShow == true)
{
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname + pp.Id, 5.5f);
pp.YLocation = y + 0.002;
YRows++;
rowNum++;
}
myOpeRecord.PhysioAnesConfigList.Add(pp);
}
}
if (myOpeRecord.RecoverId == 1)
{
//加载事件图标
IList<PhysioDataConfig> dtevent = PhysioDataConfig.GetEventList();
for (int i = 0; i < dtevent.Count; i++)
{
PhysioDataConfig pp = dtevent[i];
pp.ConfigType = "事件";
pp.ConveColor = System.Drawing.Color.White;
if (pp.IsDefalultShow == true)
{
pp.IsValid = true;
pp.phListPack = phListPack;
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.PageBegin,
myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
pp.initCurve();
}
}
}
}
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 YRows = 0;
//监测区域里的第1根竖线显示数值时用
LinesPackObj pack = template.GetPackObjectOTag<LinesPackObj>("MonitorManage_LinesPackObj_9");
int RowsCount = Convert.ToInt32(pack.XPageSpan / pack.XMajorGridStep);
int rowNum = 1;
foreach (var pp in myOpeRecord.PhysioConfigList)
{
pp.ConfigType = "生命体征";
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);
pp.IsValid = true;
if (pp.IsDefalultShow == false || (pp.ShowImg == false && pp.ShowText == false))
{
pp.IsValid = false;
}
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.PageBegin,
myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
pp.ClearTagstr(ZedControl);
//如果模板管理不为空
if (pack != null && rowNum < 5 && pp.ShowText == true)
{
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname, 5.5f);
pp.YLocation = y + 0.002;
YRows++;
rowNum++;
}
//重新设置曲线属性
pp.reSetCurve();
break;
}
if (pack != null)
{
foreach (var pp in myOpeRecord.PhysioConfigList)
{
pp.ConfigType = "麻醉体征";
pp.IsValid = true;
if (pp.IsDefalultShow == false) pp.IsValid = false;
pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.PageBegin,
myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
pp.ClearTagstr(ZedControl);
if (pp.ShowText == true && rowNum < 5 && pp.IsDefalultShow == true)
{
double y = pack.RealY + getYPositionByListIndex(YRows, pack.RealY, pack.RealEndY, RowsCount);
ZUtil.DrawText(pp.Name, pack.RealX, y, ZedControl, "PP" + pp.Enname + pp.Id, 5.5f);
pp.YLocation = y + 0.002;
YRows++;
rowNum++;
}
}
}
//加载事件图标
//IList<PhysioDataConfig> dtevent = PhysioDataConfig.GetEventList();
//for (int i = 0; i < dtevent.Count; i++)
//{
// PhysioDataConfig pp = dtevent[i];
// pp.ConfigType = "事件";
// pp.ConveColor = System.Drawing.Color.White;
// pp.IsValid = true;
// pp.ClearTagstr(ZedControl);
// pp.phListPack = phListPack;
// pp.setAnasArr(ZedControl, chartPack.RealX, chartPack.RealEndX, myOpeRecord.PageBegin,
// myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
// pp.initCurve();
//}
if (phListPack != null)
{
Panel pan3 = phListPack.CControl as Panel;
if (pan3 != null)
{
pan3.Controls.Clear();
}
}
}
#endregion
#region Chart区域的位置
/// <summary>
/// 设置采集Chart区域的位置
/// </summary>
/// <param name="myPane"></param>
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
/// <summary>
/// 响应可编辑区域的点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public override void editAr_Click(object sender, EventArgs e)
{
}
#endregion
#region
/// <summary>
/// 从所有曲线里得到相应的点
/// </summary>
/// <param name="pdTemp">要查找的物理点</param>
private PhysioData GetPDOfPhysioParams(PhysioData pdTemp)
{
selPhysioData = null;
foreach (PhysioDataConfig ppter in myOpeRecord.PhysioConfigList)
{
if (pdTemp.config.YAisx != ppter.YAisx) continue;
foreach (PointPair pp in ppter.APhysioParams)
{
selPhysioData = ppter.PointPairToPhysioData(pp);
if (pdTemp.isEquertTrue(selPhysioData, collectInterval.ToString()))
{
selPhysioData.config = ppter;
selPhysioData.PatientId = myOpeRecord.Id.Value;
selPhysioData.PhysioDataConfigId = ppter.Id;
return selPhysioData;
}
}
}
return null;
}
/// <summary>
/// 得到生命特征泛型集合
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <returns></returns>
private List<PhysioData> rePDs(ZedGraphControl sender, MouseEventArgs e)
{
List<PhysioData> pdNews = new List<PhysioData>();
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);
PhysioDataConfig physioParam = null;
if (myOpeRecord.SelPhysioConfig == null)
physioParam = myOpeRecord.PhysioConfigList[1];
else
physioParam = myOpeRecord.SelPhysioConfig;
double value = Math.Round(y[physioParam.YAisx], 0);
pdNews.Add(PhysioDataConfig.newPhysioData(physioParam, myOpeRecord.Id.Value, xd.DateTime, value));
if (y[1].ToString() != "")
{
value = Math.Round(y[1], 0);
pdNews.Add(PhysioDataConfig.newPhysioData(myOpeRecord.PhysioConfigList.Where(a => a.Name == "体温").ToList()[0], myOpeRecord.Id.Value, xd.DateTime, value));
}
//if (y[0].ToString() != "")
//{
// value = Math.Round(y[physioParam.YAisx], 1);
// pdNews.Add(PhysioDataConfig.newPhysioData(myOpeRecord.PhysioConfigList.Where(a => a.Name == "体温").ToList()[0], myOpeRecord.Id.Value, xd.DateTime, value));
//}
}
return pdNews;
}
catch (Exception)
{
return pdNews;
}
}
/// <summary>
/// 得到单生命特征对象
/// </summary>
/// <param name="sender"></param>
/// <param name="e">点击鼠标事件的参数</param>
/// <returns></returns>
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);
PhysioDataConfig physioParam = null;
if (myOpeRecord.SelPhysioConfig == null)
{
physioParam = myOpeRecord.PhysioConfigList[1];
}
else
{
physioParam = myOpeRecord.SelPhysioConfig;
}
double value = physioParam.YAisx == 1 ? Math.Round(y[physioParam.YAisx], 1) : Math.Round(y[physioParam.YAisx], 0);
PhysioData pdNew = PhysioDataConfig.newPhysioData(physioParam, myOpeRecord.Id.Value, xd.DateTime, value);
return pdNew;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// 返回控件的点击的Legend的图例文本
/// </summary>
/// <param name="zgc"></param>
/// <param name="mousePt"></param>
/// <returns></returns>
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.PhysioConfigList)
{
if (myPane.CurveList[ipt].Tag.ToString().IndexOf(Temp.Name) >= 0)
{
appTemp = Temp;
}
}
}
return appTemp;
}
/// <summary>
/// 点击时是否在图例范围内
/// </summary>
/// <param name="zgc"></param>
/// <param name="mousePt"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 根据顶部加药序号确定数值生命体征的纵向位置以1为单位
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
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<int> SelectPhysioDataByID(int operationId, DateTime startTime, DateTime endTime, double startValue, double endValue)
{
List<int> PhysioDatas = new List<int>();
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)
{
double value = -1;
if (double.TryParse(dr["Value"].ToString(), out value))
{
if (value >= startValue && value <= endValue)
{
int PhysioDataConfigId = int.Parse(dr["PhysioDataConfigId"].ToString());
if (!PhysioDatas.Contains(PhysioDataConfigId))
PhysioDatas.Add(PhysioDataConfigId);
}
}
}
return PhysioDatas;
}
public DateTime GetRecordTime(DateTime pdTemp, int collectInterval = 5)
{
DateTime result = Convert.ToDateTime(pdTemp.ToString("yyyy-MM-dd HH:mm:00.000"));
//小于入室时间默认不画
for (int i = 0; i < (480 / 5); i++)
{//InRoomTime.Value
DateTime tempTime = myOpeRecord.PageBegin.AddMinutes(i * 5);
if (tempTime >= result && result < tempTime.AddMinutes(5))
{
result = tempTime;
break;
}
}
//if (result < myOpeRecord.InRoomTime.Value)
//{
// result = myOpeRecord.InRoomTime.Value;
//}
return result;
}
}
}