AIMS/DrawGraph/AreaManage/IconManage.cs
2023-07-21 16:07:26 +08:00

445 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 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 System.Windows.Forms.Design;
namespace DrawGraph
{
public class IconManage : AreaManageBase
{
public RectangleFramePackObj IconPpack;
public LinePackObj H5pack;
public TextPackObj Extend2;
/// <summary>
/// 当前手术对象
/// </summary>
private OperationRecord myOpeRecord = null;
public IconManage() { }
public IconManage(object _operationRecor, ZedGraphControl _zedControl, TemplateManage _template, string _name) : base(_operationRecor, _zedControl, _template, _name)
{
init();
}
public void init()
{
//自己要用的手术对象
myOpeRecord = OpeRecord as OperationRecord;
}
/// <summary>
/// 初始画的后置方法
/// </summary>
public override void FollowUpMethod()
{
H5pack = template.GetPackObjectOTag<LinePackObj>("IconManage_LinePackObj_5");
if (H5pack != null)
{
eventstartX = H5pack.RealX;
eventy = H5pack.RealY;
eventendy = H5pack.RealEndY;
}
IconPpack = template.GetPackObjectOTag<RectangleFramePackObj>("IconManage_RectangleFramePackObj_2");
if (IconPpack != null)
{
eventy = IconPpack.RealY;
eventendy = IconPpack.RealEndY;
eventendX = IconPpack.RealEndX + 0.02;
}
LinePackObj line = template.GetPackObjectOTag<LinePackObj>("IconManage_LinePackObj_6");
if (line != null)
{
eventstartX = line.RealX;
eventendX = line.RealEndX + 0.02;
}
}
#region
/// <summary>
/// 鼠标点击画板
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public override void MouseDown(ZedGraphControl sender, MouseEventArgs e)
{
//if (e.Button == System.Windows.Forms.MouseButtons.Left)
//{
// MessageBox.Show(this.GetType().Name + "is Click Left Button");
//}
}
public override void MouseMove(ZedGraphControl sender, MouseEventArgs e)
{
}
public override void MouseUp(ZedGraphControl sender, MouseEventArgs e)
{
}
public override void MouseDoubleClick(ZedGraphControl sender, MouseEventArgs e)
{
}
public override void KeyUp(ZedGraphControl sender, KeyEventArgs e)
{
}
#endregion
public override void Bind()
{
init();
DrawEvent();
}
/// <summary>
/// 画事件
/// </summary>
private void DrawEvent()
{
if (myOpeRecord.FactEventsList.Count > 0)
{
foreach (FactEvents temp in myOpeRecord.FactEventsList)
{
temp.clearAddObj(ZedControl);
}
reDrawEvent();
}
}
double eventy;
double eventendy;
double eventendX;
double eventstartX;
/// <summary>
/// 重新画事件文本
/// </summary>
private void reDrawEvent()
{
//画在第几行
int rowIndex = 0;
DateTime? drawDatetime = null;
FactEvents drawEvent = null;
string LastNumber = "";
double span = getYPositionByListIndex(1, eventy, eventendy, 2);
List<string> eventListstr = new List<string>();
eventListstr.Add("【事件】");
myOpeRecord.FactEventsList.Sort(new FactEventsComparer());
//循环加药集体
for (int i = 0; i < myOpeRecord.FactEventsList.Count; i++)
{
FactEvents temp = myOpeRecord.FactEventsList[i];
//判断该事件是否存在当前时间段
if (IfInTimeExist(temp.EventBeginTime.Value, temp.EventEndTime.Value) == false) continue;
if (temp.EventBeginTime.Value.ToShortTimeString() == temp.EventEndTime.Value.ToShortTimeString())
{
eventListstr.Add(string.Format("{0}{1} {2} {3}{4}", getNumber(i), temp.EventBeginTime.Value.ToShortTimeString(), temp.EventName, "", temp.Remark == null ? "" : temp.Remark.ToString()));
}
else
{
eventListstr.Add(string.Format("{0}{1}->{2} {3} {4}{5}", getNumber(i), temp.EventBeginTime.Value.ToShortTimeString(), temp.EventEndTime.Value.ToShortTimeString(), temp.EventName, "", temp.Remark == null ? "" : temp.Remark.ToString()));
}
temp.setAnasArr(ZedControl, eventstartX, eventendX, myOpeRecord.PageBegin, myOpeRecord.PageBegin.AddMinutes(EVERY_PAGE_TIME_SPAN));
try
{
string EventName = temp.EventName;
if (EventName == "喉罩") EventName = "插管";
DataRow[] dr = myOpeRecord.PhysioParamList.Select("Name ='" + EventName + "' ", "");
if (dr.Length > 0)
{
temp.clearDNAndDT(ZedControl);
string tagName = dr[0]["imgPath"].ToString();
temp.drawIMG(ZedControl, tagName, eventy, 0.013);
}
else
{
int DValue = 0;
string drawNumber = "";
if (drawDatetime != null && temp.EventBeginTime > drawDatetime.Value.AddMinutes(-1) && temp.EventBeginTime < drawDatetime.Value.AddMinutes(10) && LastNumber != "" && drawEvent != null)
{
drawEvent.clearDNAndDT(ZedControl);
drawEvent = temp;
drawNumber = LastNumber + "-" + getNumber(i);
DValue = (int)(((TimeSpan)(temp.EventBeginTime - drawDatetime.Value)).TotalMinutes / 2);
}
else
{
LastNumber = getNumber(i);
drawNumber = LastNumber;
drawEvent = temp;
drawDatetime = temp.EventBeginTime.Value;
}
//画图上的序号
temp.drawNumber(ZedControl, drawNumber, eventy + span - 0.001, DValue, Color.DarkBlue);
}
rowIndex++;
}
catch (Exception exp)
{
PublicMethod.WriteLog(exp, "");
}
}
myOpeRecord.EventListstr = eventListstr;
TextPackObj packObj2 = template.GetPackObjectOTag<TextPackObj>("IconManage_TextPackObj_14_OperationRecord_AnalgesiaRecord_Extend2");
if (packObj2 != null)
{
List<string> AfterDrugsListstr = new List<string>();
myOpeRecord.ClearIconstr(ZedControl);
myOpeRecord.FactDrugList.Sort(new FactDrugComparer());
foreach (var item in myOpeRecord.FactDrugList)
{
ListAddDrugs(AfterDrugsListstr, item);
}
if (AfterDrugsListstr.Count > 0)
{
SetRemarkInfo(AfterDrugsListstr, packObj2, 15, 6.5f, 40, "IconDrugRemarkRow");
//packObj2.PackText = "";
//foreach (var item in AfterDrugsListstr)
//{
// packObj2.PackText += item ;//+ "\n"
//}
//packObj2.PackValue = packObj2.PackText;
//packObj2.Draw();
}
}
TextPackObj packObj = template.GetPackObjectOTag<TextPackObj>("IconManage_TextPackObj_40_OperationRecord_AnalgesiaRecord_Extend3");
if (packObj != null && eventListstr.Count > 1)
{
List<string> Eventststr = new List<string>();
foreach (var item in eventListstr)
{
if (item != "【事件】")
Eventststr.Add(((item.Substring(1, item.Length - 1))));
}
myOpeRecord.FactEventsList.Sort(new FactEventsComparer());
if (Eventststr.Count > 0)
{
SetRemarkInfo(Eventststr, packObj, 15, 7f, 38, "IconeventRemarkRow");
}
//packObj.PackText = "";
//foreach (var item in eventListstr)
//{
// if (item != "【事件】")
// packObj.PackText += ((item.Substring(1, item.Length - 1)) + "\n");
//}
//packObj.PackValue = packObj.PackText;
//packObj.Draw();
}
}
private void SetRemarkInfo(List<string> PunctureAndIntubatios, TextPackObj remarkPpack, int remarkRowscount, float fontsize, int fontlength, string TagName)
{
int remarkRow = 0;
int AllRemarkRow = 0;
double lastIndex = remarkPpack.RealEndY;
double x = remarkPpack.RealX;
double y = remarkPpack.RealY + getYPositionByListIndex(remarkRow, remarkPpack.RealY, lastIndex, remarkRowscount);
if (PunctureAndIntubatios != null)
{
foreach (string item in PunctureAndIntubatios)
{
List<string> PunStr = stringformat(item, fontlength);
for (int m = 0; m < PunStr.Count; m++)
{
if (PunStr[m] == null) continue;
y = remarkPpack.RealY + getYPositionByListIndex(remarkRow, remarkPpack.RealY, lastIndex, remarkRowscount);
if (PunStr[m] == null || PunStr[m].Trim() == "") break;
ZUtil.DrawText(PunStr[m], x, y, ZedControl, fontsize, TagName + AllRemarkRow);
remarkRow++;
AllRemarkRow++;
}
}
}
}
private static void ListAddDrugs(List<string> DrugListstr, FactDrug temp)
{
string dose = "";
if (temp.Density != 0)
{
dose += ((double)temp.Density).ToString();
if (temp.DensityUnit != null)
{
dose += temp.DensityUnit;
}
}
if (dose.Trim() != "") dose += " ";
if (temp.Velocity != "")
{
dose += temp.Velocity;
if (temp.VelocityUnit != null)
{
dose += temp.VelocityUnit;
}
}
if (dose.Trim() != "") dose += " ";
if (temp.Dosage != 0)
{
dose += ((double)temp.Dosage).ToString();
if (temp.DosageUnit != null)
{
dose += temp.DosageUnit;
}
}
DrugListstr.Add(string.Format("{0}{1} {2} {3}{4}{5}", "", (temp.DrugBeginTime == temp.DrugEndTime) ? temp.DrugBeginTime.ToShortTimeString() : temp.DrugBeginTime.ToShortTimeString() + "->" + temp.DrugEndTime.ToShortTimeString(), temp.DrugName.Trim(), dose, "", temp.DrugChannel == null ? "" : " " + temp.DrugChannel.ToString()));
//DrugListstr.Append(" ");
}
#region
/// <summary>
/// 格式化字符串长度
/// </summary>
/// <param name="str">输入的字符串</param>
/// <param name="n">截取的长度</param>
/// <returns>被截取完的字符串</returns>
public static List<string> stringformat(string str, int n)
{
///
///格式化字符串长度,超出部分显示省略号,区分汉字跟字母。汉字2个字节字母数字一个字节
///
List<string> strList = new List<string>();
string temp = string.Empty;
if (System.Text.Encoding.Default.GetByteCount(str) <= n)//如果长度比需要的长度n小,返回原字符串
{
strList.Add(str);
}
else
{
int t = 0;
char[] q = str.ToCharArray();
for (int i = 0; i <= q.Length; i++)
{
if (t > n)
{
strList.Add(temp);
temp = "";
t = 0;
}
if (i == q.Length)// - 1
{
strList.Add(temp);
break;
}
//判断是否汉字:
if ((int)q[i] >= 0x4E00 && (int)q[i] <= 0x9FA5)
{
temp += q[i];
t += 2;
}
//判断半角如下:
else if (q[i].ToString().Length == Encoding.Default.GetByteCount(q[i].ToString()))
{
temp += q[i];
t++;
}
//判断全角如下:
else if (2 * q[i].ToString().Length == Encoding.Default.GetByteCount(q[i].ToString()))
{
temp += q[i];
t += 2;
}
else
{
temp += q[i];
t++;
}
}
}
return strList;
}
#endregion
private bool IfInTimeExist(DateTime Begin, DateTime End)
{
DateTime lastime = myOpeRecord.lastPageBegin.AddSeconds(59);
bool b = false;
if (End == null)
{
if (Begin > myOpeRecord.PageBegin && Begin < lastime)
{
b = true;
}
}
else
{
if (Begin >= myOpeRecord.PageBegin && Begin <= lastime)
{
b = true;
}
else if (End >= myOpeRecord.PageBegin && End <= lastime)
{
b = true;
}
else if (Begin < myOpeRecord.PageBegin && End > lastime)
{
b = true;
}
}
return b;
}
private DateTime GetInsertTime(DateTime pdTemp, bool IsInRToomTime = false)
{
DateTime insTime = pdTemp.Date.AddHours(pdTemp.Hour).AddMinutes(pdTemp.Minute);
if (collectInterval == 5)
{
int minute = pdTemp.Minute % 5;//计算5的整数分钟
if (minute >= 3)
insTime = insTime.AddMinutes(5 - minute);
else if (minute != 0 && IsInRToomTime == true)
insTime = insTime.AddMinutes(5 - minute);
else
insTime = insTime.AddMinutes(0 - minute);
}
else if (collectInterval == 10)
{
double minute = pdTemp.Minute % 10;//计算5的整数分钟
if (minute >= 5)
insTime = insTime.AddMinutes(10 - minute);
else
insTime = insTime.AddMinutes(0 - minute);
}
return insTime;
}
/// <summary>
/// 根据顶部加药序号确定数值生命体征的纵向位置以1为单位
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
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;
}
public static string getNumber(int number)
{
try
{
string str = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮";
if (number >= 15)
str = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿";
str = str.Substring(number, 1);
return str;
}
catch (Exception)
{
return number.ToString() + ":";
}
}
}
}