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
|
||
}
|
||
}
|