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);
                    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);
                            }
                        }
                    }
                }
                //如果点击在麻醉单子范围内
                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 (!isLegendArea(sender1, mousePt) && pane == null)
                {
                    if (myOpeRecord.SelPhysioConfig != null)
                    {
                        myOpeRecord.SelPhysioConfig.IsClick = false;
                        myOpeRecord.SelPhysioConfig.onClick(e);
                        myOpeRecord.SelPhysioConfig = null;
                    }
                }
            }
            //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.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.AxisChange();
                ZedControl.Refresh();
            }
            //考虑客户端拖拽数据库处理不及时 可以采用批量缓存新增修改的数据点集中处理
            if (AnesOpeStatue == DoAnesOpeStatus.MOVEPD || AnesOpeStatue == DoAnesOpeStatus.ADDPD)
            {
                if (myOpeRecord.SelPhysioConfig != null)
                {
                    PhysioData pdTemp = rePD(sender, e);
                    if (pdTemp == null) return;
                    bool isHave = false;
                    foreach (PointPair pp in myOpeRecord.SelPhysioConfig.APhysioParams)
                    {
                        if (pdTemp.isEquert(myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp)) && myOpeRecord.SelPhysioConfig.PointPairToPhysioData(pp).Value != Double.MaxValue)
                        {
                            isHave = true;
                        }
                    }
                    if (!isHave)
                    {
                        AnesOpeStatue = DoAnesOpeStatus.ADDPD;
                        DateTime insTime = GetRecordTime(pdTemp.RecordTime);
                        pdTemp.RecordTime = insTime;
                        myOpeRecord.SelPhysioConfig.AddPointItem(pdTemp);
                        //ZedControl.AxisChange();
                        ZedControl.Refresh();
                    }
                    else
                    {
                        PhysioData newPd = myOpeRecord.SelPhysioConfig.MoveItem(pdTemp);
                        if (newPd != null)//&& CurPhysioData.Value != newPd.Value
                        {
                            CurPhysioData = newPd;
                            myOpeRecord.SelPhysioConfig.ModifyItem(CurPhysioData, CurPhysioData);
                            //ZedControl.AxisChange();
                            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;
                }
            }
            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);
                            }
                        }
                    }
                }
            }
        }
        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.PhysioConfigList)
                            {
                                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();
                                    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 - 0.02, 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 < 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.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 < 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++;
                        }
                        myOpeRecord.PhysioAnesConfigList.Add(pp);
                    }
                }
            }
            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++;
                    }
                }
            }
            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;
        }
    }
}