463 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			463 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | ||
| using System.Collections.Generic;
 | ||
| using System.Text; 
 | ||
| using System.Windows.Forms;
 | ||
| using System.Drawing;
 | ||
| 
 | ||
| namespace DrawGraph
 | ||
| {
 | ||
|     public class EventObj
 | ||
|     {
 | ||
|         //事件对象向到麻醉单上的对象名前缀
 | ||
|         public enum TextPrefix
 | ||
|         {
 | ||
|             /// <summary>
 | ||
|             /// 用量
 | ||
|             /// </summary>
 | ||
|             DD,
 | ||
|             /// <summary>
 | ||
|             /// 箭头
 | ||
|             /// </summary>
 | ||
|             AR,
 | ||
|             /// <summary>
 | ||
|             /// 事件对象名,如药名,液体名
 | ||
|             /// </summary>
 | ||
|             DN,
 | ||
|             /// <summary>
 | ||
|             /// 单位
 | ||
|             /// </summary>
 | ||
|             DU,
 | ||
|             /// <summary>
 | ||
|             /// 总剂量
 | ||
|             /// </summary>
 | ||
|             DT,
 | ||
|             /// <summary>
 | ||
|             /// 图片
 | ||
|             /// </summary>
 | ||
|             IM,
 | ||
|             /// <summary>
 | ||
|             /// 麻醉单曲线上的点
 | ||
|             /// </summary>
 | ||
|             PI,
 | ||
|             /// <summary>
 | ||
|             /// 可编辑区域
 | ||
|             /// </summary>
 | ||
|             ED,
 | ||
|             /// <summary>
 | ||
|             /// 长方形
 | ||
|             /// </summary>
 | ||
|             BT,
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 麻醉单窗体
 | ||
|         /// </summary>
 | ||
|         public ZedGraphControl zgcAnas = null;
 | ||
|         /// <summary>
 | ||
|         /// 中间麻醉图左边界
 | ||
|         /// </summary>
 | ||
|         protected double leftColRatio;
 | ||
|         /// <summary>
 | ||
|         /// 中间麻醉图右边界
 | ||
|         /// </summary>
 | ||
|         protected double rightColRatio;
 | ||
|         /// <summary>
 | ||
|         /// 麻醉单开始时间
 | ||
|         /// </summary>
 | ||
|         protected DateTime pageBegin;
 | ||
|         /// <summary>
 | ||
|         /// 麻醉单结束时间
 | ||
|         /// </summary>
 | ||
|         protected DateTime pageEnd;
 | ||
|         private DateTime begin;
 | ||
| 
 | ||
|         private bool isSelected = false;
 | ||
|         /// <summary>
 | ||
|         /// 是否被选中
 | ||
|         /// </summary>
 | ||
|         [NoCreatControlAttributs]
 | ||
|         public bool IsSelected
 | ||
|         {
 | ||
|             get { return isSelected; }
 | ||
|             set { isSelected = value; }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 加对象的开始时间
 | ||
|         /// </summary>
 | ||
|         [NoCreatControlAttributs]
 | ||
|         public DateTime Begin
 | ||
|         {
 | ||
|             get { return begin; }
 | ||
|             set { begin = value; }
 | ||
|         }
 | ||
|         private DateTime end;
 | ||
|         /// <summary>
 | ||
|         /// 加对象的结束时间
 | ||
|         /// </summary>
 | ||
|         [NoCreatControlAttributs]
 | ||
|         public DateTime End
 | ||
|         {
 | ||
|             get { return end; }
 | ||
|             set { end = value; }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 设置麻醉单的基本参数
 | ||
|         /// </summary>
 | ||
|         /// <param name="zgc">麻醉单</param>
 | ||
|         /// <param name="leftRatio">麻醉单中部图的左边界</param>
 | ||
|         /// <param name="rightRatio">麻醉单中部图的右边界</param>
 | ||
|         /// <param name="pageBegin">页面的开始时间</param>
 | ||
|         /// <param name="pageEnd">页面的结束时间</param>
 | ||
|         public void setAnasArr(ZedGraphControl zgc, double leftRatio, double rightRatio, DateTime pageBegin, DateTime pageEnd)
 | ||
|         {
 | ||
|             this.zgcAnas = zgc;
 | ||
|             this.leftColRatio = leftRatio;
 | ||
|             this.rightColRatio = rightRatio;
 | ||
|             this.pageBegin = pageBegin;
 | ||
|             this.pageEnd = pageEnd;
 | ||
|         }
 | ||
| 
 | ||
|         #region 基类为子类提供的基本方法
 | ||
|         /// <summary>
 | ||
|         /// 删除文本对象
 | ||
|         /// </summary>
 | ||
|         /// <param name="tagName">标记名</param>
 | ||
|         public void delAddObj(string tagName)
 | ||
|         {
 | ||
|             try
 | ||
|             {
 | ||
|                 TextObj text = (TextObj)zgcAnas.MasterPane.GraphObjList[tagName];
 | ||
|                 if (text != null)
 | ||
|                     zgcAnas.MasterPane.GraphObjList.Remove(text);
 | ||
|             }
 | ||
|             catch (Exception)
 | ||
|             {
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 删除控件里对象
 | ||
|         /// </summary>
 | ||
|         /// <param name="tagName">标记名</param>
 | ||
|         protected void delLineObj(string tagName)
 | ||
|         {
 | ||
|             GraphObj text = zgcAnas.MasterPane.GraphObjList[tagName];
 | ||
|             if (text != null) zgcAnas.MasterPane.GraphObjList.Remove(text);
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 删除文本上的箭头
 | ||
|         /// </summary>
 | ||
|         /// <param name="tagName">标记名</param>
 | ||
|         protected void delAddArrows(string tagName)
 | ||
|         {
 | ||
|             try
 | ||
|             {
 | ||
|                 if (zgcAnas != null && zgcAnas.MasterPane != null)
 | ||
|                 {
 | ||
|                     ArrowObj arrow = (ArrowObj)zgcAnas.MasterPane.GraphObjList[tagName];
 | ||
|                     if (arrow != null) zgcAnas.MasterPane.GraphObjList.Remove(arrow);
 | ||
|                 }
 | ||
|             }
 | ||
|             catch (Exception  )
 | ||
|             {
 | ||
|                 throw;
 | ||
|             }
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 删除图片
 | ||
|         /// </summary>
 | ||
|         /// <param name="tagName">标记名</param>
 | ||
|         protected void delAddImg(string tagName)
 | ||
|         {
 | ||
|             GraphObj gos = zgcAnas.MasterPane.GraphObjList[tagName];
 | ||
|             if (gos != null)
 | ||
|             {
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(gos);
 | ||
|             }
 | ||
|         }
 | ||
|         protected void delADDCurve(string tagName)
 | ||
|         {
 | ||
|             if (zgcAnas.GraphPane.CurveList == null) return;
 | ||
|             foreach (LineItem li in zgcAnas.GraphPane.CurveList)
 | ||
|             {
 | ||
|                 if (tagName.Equals(li.Tag.ToString()))
 | ||
|                 {
 | ||
|                     li.Clear();
 | ||
|                     zgcAnas.GraphPane.CurveList.Remove(li);
 | ||
|                     break;
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         /// <summary>
 | ||
|         /// 根据所给时间值计算其中在ZedGraph图中x的CoordType.PaneFraction浮点坐标
 | ||
|         /// </summary>
 | ||
|         /// <param name="eDate">日期时间</param>
 | ||
|         /// <returns>x</returns>
 | ||
|         public double getXPositinByXDate(DateTime eDate)
 | ||
|         {
 | ||
|             double xMinPF = leftColRatio;//xMinPF = 0.15
 | ||
|             double xMaxPF = rightColRatio;//xMaxPF = 0.87
 | ||
|             double xMinDate = zgcAnas.GraphPane.X2Axis.Scale.Min;//xMinDate = 41132.75
 | ||
|             double xMaxDate = zgcAnas.GraphPane.X2Axis.Scale.Max;//xMaxDate = 41132.916666666511
 | ||
| 
 | ||
|             double eXDate = new XDate(eDate);//eXDate = 41132.760335647967
 | ||
|             float x = 0;
 | ||
| 
 | ||
|             x = (float)((((xMaxPF - xMinPF) * (eXDate - xMinDate)) / (xMaxDate - xMinDate)) + xMinPF);  //根据eXDate的值,确定该点在X坐标轴的位置(X坐标轴全长为(xMaxPF - xMinPF))
 | ||
|             return x;//x = 0.19465   0.72  		eXDate - xMinDate	0.010335647966712713;
 | ||
|             //xMaxDate - xMinDate	0.16666666651144624	;xMinPF = 0.15  ???
 | ||
|         }
 | ||
|          
 | ||
|         /// <summary>
 | ||
|         /// 根据所给时间值计算其中在ZedGraph图中x的CoordType.PaneFraction浮点坐标
 | ||
|         /// </summary>
 | ||
|         /// <param name="eDate">日期时间</param>
 | ||
|         /// <returns>x</returns>
 | ||
|         public double getYPositinByValue(double value, double ymax, double minnumber)
 | ||
|         {
 | ||
|             double yMinPF = zgcAnas.GraphPane.Chart.Rect.Top / zgcAnas.GraphPane.Rect.Height;//0.42799998814260976
 | ||
|             double yMaxPF = (zgcAnas.GraphPane.Chart.Rect.Top + zgcAnas.GraphPane.Chart.Rect.Height) / zgcAnas.GraphPane.Rect.Height;//0.72199998905471674
 | ||
|             double endvalue = (yMaxPF - yMinPF) / (ymax - minnumber) * (value - minnumber);
 | ||
|             return yMaxPF - endvalue - 0.001;
 | ||
|         }
 | ||
|          
 | ||
|         /// <summary>
 | ||
|         /// 画添加药品线,及加药量   
 | ||
|         /// </summary>
 | ||
|         /// <param name="y">从哪行开始</param>
 | ||
|         /// <param name="tagName">标记名称</param>
 | ||
|         /// <param name="eventBegin">加事件开始时间</param>
 | ||
|         /// <param name="eventEnd">加事件结束时间</param>
 | ||
|         /// <param name="Dose">用量</param>
 | ||
|         public void drawDoseObj(double y, string tagName, DateTime eventBegin, DateTime eventEnd, DateTime drugBegin, string Dose, float fontSize = 8.0f, bool isContinued = false)//
 | ||
|         {
 | ||
|             if (Dose.Length >= 9 && drugBegin != eventBegin) drugBegin = drugBegin.AddMinutes(-3);
 | ||
|             else if (Dose.Length >= 14 && drugBegin != eventBegin) drugBegin = drugBegin.AddMinutes(-6);
 | ||
|             //中间单次加药剂量信息
 | ||
|             double x1 = getXPositinByXDate(eventBegin);
 | ||
|             double x2 = getXPositinByXDate(eventEnd);
 | ||
|             double xAvg = getXPositinByXDate(drugBegin);
 | ||
|             double yAvg = y;
 | ||
|             DateTime ps = pageBegin;
 | ||
|             DateTime pe = pageEnd;//pageBegin.AddMinutes(frmAnasRecord.EVERY_PAGE_TIME_SPAN);
 | ||
|             DateTime ads = eventBegin;
 | ||
|             DateTime ade = eventEnd;
 | ||
|             double x3 = getXPositinByXDate(ps);//x3 = 0.15000000596046448
 | ||
|             double x4 = getXPositinByXDate(pe);//x4 = 0.87000000476837158
 | ||
|             if (drugBegin >= ps && drugBegin < pe)
 | ||
|             {
 | ||
|                 ZUtil.DrawDrugText(Dose, xAvg, yAvg, zgcAnas, TextPrefix.DD + tagName, Color.Black, fontSize - 1f);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 ZUtil.DrawText(Dose, xAvg, yAvg, zgcAnas, TextPrefix.DD + tagName, false);
 | ||
|             }
 | ||
|             //由于箭头可能会跨越页面,因此首先删除该箭头控件,再重新描绘。
 | ||
|             if (zgcAnas.MasterPane.GraphObjList[TextPrefix.AR + tagName] != null)
 | ||
|             {
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(zgcAnas.MasterPane.GraphObjList[TextPrefix.AR + tagName]);
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(zgcAnas.MasterPane.GraphObjList["A" + TextPrefix.AR + tagName]);
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(zgcAnas.MasterPane.GraphObjList["B" + TextPrefix.AR + tagName]);
 | ||
|             }
 | ||
|              
 | ||
|             double yAr = y + 0.005;
 | ||
| 
 | ||
|             //当加药开始时间和结束时间相等
 | ||
|             if (ade.Equals(ads))
 | ||
|             {
 | ||
|                 if (ads >= ps && ads < pe)
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x1, yAr, x2, yAr, zgcAnas, false, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(x1, yAr, x2, yAr, zgcAnas, TextPrefix.AR + tagName);
 | ||
|                 }
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 //判断箭头的长度                
 | ||
|                 if (ade <= ps || ads >= pe)  //在两尾
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(x1, yAr, x2, yAr, zgcAnas, TextPrefix.AR + tagName);
 | ||
|                 }
 | ||
|                 else if (ads < ps && ade > ps && ade < pe)  //左跨越
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x3, yAr, x2, yAr, zgcAnas, true, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else if (ads >= ps && ade <= pe)  //全部包含在其中
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x1, yAr, x2, yAr, zgcAnas, true, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else if (ads >= ps && ads < pe && ade > pe) //右跨越
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x1, yAr, x4, yAr, zgcAnas, false, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else  //包含整个页面
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x3, yAr, x4, yAr, zgcAnas, false, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         public void drawSapObj(double y, string tagName, DateTime eventBegin, DateTime eventEnd, DateTime drugBegin, string Dose, float fontSize = 8.0f, bool isContinued = false)//
 | ||
|         {
 | ||
|             //中间单次加药剂量信息
 | ||
|             double x1 = getXPositinByXDate(eventBegin);
 | ||
|             double x2 = getXPositinByXDate(eventEnd);
 | ||
|             double xAvg = getXPositinByXDate(drugBegin);
 | ||
|             double yAvg = y;
 | ||
|             DateTime ps = pageBegin;
 | ||
|             DateTime pe = pageEnd;//pageBegin.AddMinutes(frmAnasRecord.EVERY_PAGE_TIME_SPAN);
 | ||
|             DateTime ads = eventBegin;
 | ||
|             DateTime ade = eventEnd;
 | ||
|             double x3 = getXPositinByXDate(ps);//x3 = 0.15000000596046448
 | ||
|             double x4 = getXPositinByXDate(pe);//x4 = 0.87000000476837158
 | ||
|             if (drugBegin >= ps && drugBegin < pe)
 | ||
|             {
 | ||
|                 ZUtil.DrawDrugText(Dose, xAvg, yAvg, zgcAnas, TextPrefix.DD + tagName, Color.Black, fontSize - 1f);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 ZUtil.DrawText(Dose, xAvg, yAvg, zgcAnas, TextPrefix.DD + tagName, false);
 | ||
|             }
 | ||
|             //由于箭头可能会跨越页面,因此首先删除该箭头控件,再重新描绘。
 | ||
|             if (zgcAnas.MasterPane.GraphObjList[TextPrefix.AR + tagName] != null)
 | ||
|             {
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(zgcAnas.MasterPane.GraphObjList[TextPrefix.AR + tagName]);
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(zgcAnas.MasterPane.GraphObjList["A" + TextPrefix.AR + tagName]);
 | ||
|                 zgcAnas.MasterPane.GraphObjList.Remove(zgcAnas.MasterPane.GraphObjList["B" + TextPrefix.AR + tagName]);
 | ||
|             }
 | ||
| 
 | ||
|             //double yAr = y + 0.002;
 | ||
|             //double yAr = y + 0.009;
 | ||
|             double yAr = y + 0.005;
 | ||
| 
 | ||
|             //当加药开始时间和结束时间相等
 | ||
|             if (ade.Equals(ads))
 | ||
|             {
 | ||
|                 if (ads >= ps && ads < pe)
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x1, yAr, x2, yAr, zgcAnas, false, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(x1, yAr, x2, yAr, zgcAnas, TextPrefix.AR + tagName);
 | ||
|                 }
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 //判断箭头的长度                
 | ||
|                 if (ade <= ps || ads >= pe)  //在两尾
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(x1, yAr, x2, yAr, zgcAnas, TextPrefix.AR + tagName);
 | ||
|                 }
 | ||
|                 else if (ads < ps && ade > ps && ade < pe)  //左跨越
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x3, yAr, x2, yAr, zgcAnas, true, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else if (ads >= ps && ade <= pe)  //全部包含在其中
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x1, yAr, x2, yAr, zgcAnas, true, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else if (ads >= ps && ads < pe && ade > pe) //右跨越
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x1, yAr, x4, yAr, zgcAnas, false, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|                 else  //包含整个页面
 | ||
|                 {
 | ||
|                     ZUtil.DrawArrow(Color.Blue, fontSize, x3, yAr, x4, yAr, zgcAnas, false, TextPrefix.AR + tagName, isContinued);
 | ||
|                 }
 | ||
|             }
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 画添加药品线,及加药量   
 | ||
|         /// </summary>
 | ||
|         /// <param name="y">从哪行开始</param>
 | ||
|         /// <param name="tagName">标记名称</param>
 | ||
|         /// <param name="eventBegin">加事件开始时间</param>
 | ||
|         /// <param name="eventEnd">加事件结束时间</param>
 | ||
|         /// <param name="Dose">用量</param>
 | ||
|         public void drawBloodGasDoseObj(double y, string tagName, DateTime eventBegin, DateTime eventEnd, string Dose, float fontSize = 8.0f)
 | ||
|         {
 | ||
|             //中间单次加药剂量信息
 | ||
|             double x1 = getXPositinByXDate(eventBegin);
 | ||
|             double x2 = getXPositinByXDate(eventEnd);
 | ||
|             double xAvg = x1;
 | ||
|             double yAvg = y;
 | ||
|             DateTime ps = pageBegin;
 | ||
|             DateTime pe = pageEnd;//pageBegin.AddMinutes(frmAnasRecord.EVERY_PAGE_TIME_SPAN);
 | ||
|             DateTime ads = eventBegin;
 | ||
|             DateTime ade = eventEnd;
 | ||
|             double x3 = getXPositinByXDate(ps);//x3 = 0.15000000596046448
 | ||
|             double x4 = getXPositinByXDate(pe);//x4 = 0.87000000476837158
 | ||
|             if (ads >= ps && ads < pe)
 | ||
|             {
 | ||
|                 ZUtil.DrawText(Dose, xAvg, yAvg, zgcAnas, TextPrefix.DD + tagName, Color.Blue, fontSize - 1f);
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 ZUtil.DrawText(Dose, xAvg, yAvg, zgcAnas, TextPrefix.DD + tagName, false);
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
| 
 | ||
|         #region IAddEventObj 成员
 | ||
| 
 | ||
|         public virtual void drawText(double x, double y)
 | ||
|         {
 | ||
|         }
 | ||
|         public virtual void drawText(double x, double y, string totleDone, params string[] RoutesofUSEName)
 | ||
|         {
 | ||
|         }
 | ||
| 
 | ||
|         public virtual void clearAddObj(ZedGraphControl zgc)
 | ||
|         {
 | ||
|         }
 | ||
| 
 | ||
|         #endregion
 | ||
| 
 | ||
|         public virtual void drawSpicle(double x, double y, string content, ZedGraphControl zgc)
 | ||
|         {
 | ||
|         }
 | ||
|         /// <summary>
 | ||
|         /// 画添加事件,底部加事件的序号  
 | ||
|         /// </summary>
 | ||
|         /// <param name="DrugsRecord"></param>
 | ||
|         /// <param name="index"></param>
 | ||
|         public virtual void paintAdd(double y, int index)
 | ||
|         {
 | ||
|         }
 | ||
|         public virtual void clearDNAndDT(ZedGraphControl zgc) { }
 | ||
| 
 | ||
| 
 | ||
|         #region IComparable 成员
 | ||
| 
 | ||
|         public int CompareTo(object obj)
 | ||
|         {
 | ||
|             EventObj aeo = obj as EventObj;
 | ||
|             if (aeo == null)
 | ||
|             {
 | ||
|                 //throw new Exception("传入对象类型不正确");
 | ||
|                 return 0;
 | ||
|             }
 | ||
|             if (aeo.Begin > this.Begin)
 | ||
|             {
 | ||
|                 return -1;
 | ||
|             }
 | ||
|             else if (aeo.Begin < this.Begin)
 | ||
|             {
 | ||
|                 return 1;
 | ||
|             }
 | ||
|             else
 | ||
|             {
 | ||
|                 return 0;
 | ||
|             }
 | ||
|         }
 | ||
|         #endregion
 | ||
|     }
 | ||
| }
 |