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 { /// /// 监测文本的对象 /// TextPackObj janCePack = null; /// /// 图表的对象 /// ChartPackObj chartPack = null; /// /// 动态填写对象 /// AbleEditPackObj phListPack = null; /// /// 当前选中的生命体征对象 未改变前 /// private PhysioData CurPhysioData = null; /// /// 悬浮选中的生命体征 /// private PhysioData selPhysioData = null; /// /// 当前手术对象 /// 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; //动态生命体征填写对象 phListPack = template.GetPackObjectOTag("MonitorManage_AbleEditPackObj_20_OperationRecord_SpareSeven"); //自己要用的手术对象 myOpeRecord = OpeRecord as OperationRecord; } /// /// 初始画的前置方法 /// 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 (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 重写的事件 /// /// 鼠标点击画板 /// /// /// 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 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 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 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 pdTemps = SelectPhysioDataByID(myOpeRecord.Id.Value, myOpeRecord.SAreaObj.StartPD.RecordTime, myOpeRecord.SAreaObj.EndPd.RecordTime, startValue, endValue); List pdTemps2 = SelectPhysioDataByID(myOpeRecord.Id.Value, myOpeRecord.SAreaObj.StartPD.RecordTime, myOpeRecord.SAreaObj.EndPd.RecordTime, startValue2, endValue2); List selparameters = new List(); 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 初始化标题,图注和图表 /// /// 定义图注释位置 /// /// 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; } /// /// 将坐标数值对加到相应的曲线上,从而初始化曲线Chart /// /// private void InitPhysioDataConfigList(List addPhysioList) { try { if (janCePack == null) return; int YRows = 0; addPhysioList.Clear(); myOpeRecord.phListPack = phListPack; 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.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 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); } } //加载事件图标 IList 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("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 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区域的位置 /// /// 设置采集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.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; } /// /// 得到生命特征泛型集合 /// /// /// /// 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); 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; } } /// /// 得到单生命特征对象 /// /// /// 点击鼠标事件的参数 /// 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; } } /// /// 返回控件的点击的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.PhysioConfigList) { 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) { 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; } } }