AIMS/DrawGraph/GUtil/EventObj.cs
leomon 96c82888bb 拖拽断点问题 氧饱和度超出范围问题
术前绑定影像结论 复制粘贴
术前访视单回写ASA分级
CORN术中获得性压力性损伤风险评估量表分数计算
参数控制麻醉记录单用药线粗细 左侧药品名称大小
手术医生字母排序
2023-05-02 12:05:22 +08:00

463 lines
17 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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