using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace DrawGraph
{
public class EventObj
{
//事件对象向到麻醉单上的对象名前缀
public enum TextPrefix
{
///
/// 用量
///
DD,
///
/// 箭头
///
AR,
///
/// 事件对象名,如药名,液体名
///
DN,
///
/// 单位
///
DU,
///
/// 总剂量
///
DT,
///
/// 图片
///
IM,
///
/// 麻醉单曲线上的点
///
PI,
///
/// 可编辑区域
///
ED,
///
/// 长方形
///
BT,
}
///
/// 麻醉单窗体
///
public ZedGraphControl zgcAnas = null;
///
/// 中间麻醉图左边界
///
protected double leftColRatio;
///
/// 中间麻醉图右边界
///
protected double rightColRatio;
///
/// 麻醉单开始时间
///
protected DateTime pageBegin;
///
/// 麻醉单结束时间
///
protected DateTime pageEnd;
private DateTime begin;
private bool isSelected = false;
///
/// 是否被选中
///
[NoCreatControlAttributs]
public bool IsSelected
{
get { return isSelected; }
set { isSelected = value; }
}
///
/// 加对象的开始时间
///
[NoCreatControlAttributs]
public DateTime Begin
{
get { return begin; }
set { begin = value; }
}
private DateTime end;
///
/// 加对象的结束时间
///
[NoCreatControlAttributs]
public DateTime End
{
get { return end; }
set { end = value; }
}
///
/// 设置麻醉单的基本参数
///
/// 麻醉单
/// 麻醉单中部图的左边界
/// 麻醉单中部图的右边界
/// 页面的开始时间
/// 页面的结束时间
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 基类为子类提供的基本方法
///
/// 删除文本对象
///
/// 标记名
public void delAddObj(string tagName)
{
try
{
TextObj text = (TextObj)zgcAnas.MasterPane.GraphObjList[tagName];
if (text != null)
zgcAnas.MasterPane.GraphObjList.Remove(text);
}
catch (Exception)
{
}
}
///
/// 删除控件里对象
///
/// 标记名
protected void delLineObj(string tagName)
{
GraphObj text = zgcAnas.MasterPane.GraphObjList[tagName];
if (text != null) zgcAnas.MasterPane.GraphObjList.Remove(text);
}
///
/// 删除文本上的箭头
///
/// 标记名
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;
}
}
///
/// 删除图片
///
/// 标记名
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;
}
}
}
///
/// 根据所给时间值计算其中在ZedGraph图中x的CoordType.PaneFraction浮点坐标
///
/// 日期时间
/// x
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 ???
}
///
/// 根据所给时间值计算其中在ZedGraph图中x的CoordType.PaneFraction浮点坐标
///
/// 日期时间
/// x
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;
}
///
/// 画添加药品线,及加药量
///
/// 从哪行开始
/// 标记名称
/// 加事件开始时间
/// 加事件结束时间
/// 用量
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);
}
}
}
///
/// 画添加药品线,及加药量
///
/// 从哪行开始
/// 标记名称
/// 加事件开始时间
/// 加事件结束时间
/// 用量
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)
{
}
///
/// 画添加事件,底部加事件的序号
///
///
///
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
}
}