很久以前到沈阳实习的时候还一个个问度娘C#画图。画了电路图绘制软件的毕业设计、雪花屏保等等。搞LIS软件后绘制各种仪器图。对C#画笔、画字符串、画线、画圆等等耳熟能详。然而却碰到一个问题,我们的仪器大部分是盒子用数据库M连接的,如果盒子仪器需要出图怎么办?很长一段时间我也没有办法,知道我用M调C#的webservice之后。就如同打开一个大门一样,我可以把所有M实现不了的都通过webservice调用C#的实现类实现功能。基于此真的实现了贝克曼DXH800,电泳V8,电泳EPLAY,迈瑞5800等仪器的出图,表示发现新大陆很嗨皮。如以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
namespace LIS.Mach.ImageDeal
{
///<summary NoteObject="Class">
/// [功能描述:M调用绘图测试] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2018年03月22日] <para/>
///<说明>
/// [说明:[功能描述:M调用绘图测试,配合M处理仪器绘图]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
/// M端触发代码,其他的和监听程序一样
/// s retObj=##Class().%New()
/// s ret=("1","绘图数据","仪器","处理M","传输次数","其他参数",",")
/// s ret=$$DealImage^MI.MIF000(epis,"整个BC3000的数据,绘图自己提取绘图数据",mi,"和监听一样的有保存图片的M类","-1","",".ImageDealBC3000Plus,")
///</修改记录>
///</summary>
public class ImageDealBC3000Plus : BaseDeal, IDrawImage
{
/// <summary>
/// 绘图方法
/// </summary>
/// <param name="epis">流水号</param>
/// <param name="result">结果</param>
/// <param name="machID">仪器ID</param>
/// <param name="dealProcess">处理M</param>
/// <param name="index">-1认为传到最后</param>
/// <param name="otherPara">其他参数</param>
/// <param name="dealClass">C#处理类格式:类全名,不带后缀的动态库名</param>
/// <returns>是否成功</returns>
public bool DrawImage(string epis, string result, string machID, string dealProcess, string index, string otherPara, string dealClass)
{
if (result.Length > 2304)
{
string imgStr = result.Substring(result.Length - 2304, 2304);
//每个图256*3表示 依次是WBC RBC PLT
for (int i = 0; i < 3; i++)
{
string oneImgStr = imgStr.Substring(i*768,768);
float maxVal = 0;
float [] points = new float[256];
for (int j = 0; j < 256; j++)
{
string onePoint = oneImgStr.Substring(j*3,3);
float curVal = Convert.ToInt32(onePoint);
if(maxVal<curVal)
{
maxVal=curVal;
}
points[j]=curVal;
}
//图片类别
string imgClass = "";
if (i == 0)
{
imgClass = "WBC";
}
else if (i == 1)
{
imgClass = "RBC";
}
else if (i == 2)
{
imgClass = "PLT";
}
Dictionary<int, string> xshow = new Dictionary<int, string>();
if (imgClass == "RBC")
{
xshow.Add(10, "0");
xshow.Add(60, "50");
xshow.Add(110, "100");
xshow.Add(160, "150");
xshow.Add(210, "200");
xshow.Add(260, "250");
xshow.Add(310, "fL");
}
if (imgClass == "PLT")
{
xshow.Add(10, "0");
xshow.Add(50, "5");
xshow.Add(100, "10");
xshow.Add(150, "15");
xshow.Add(200, "20");
xshow.Add(250, "25");
xshow.Add(300, "fL");
}
//按十进制结果画图
Histogram histogram = new Histogram("", imgClass, 256, maxVal, "0", 329, 128, xshow);
histogram.Values = points;
Bitmap img = histogram.CreateImage();
//判断C盘trak是否存在
string tmpPath = @"c:\trak\tmpMach";
if (!Directory.Exists("C:\\trak"))
{
Directory.CreateDirectory("C:\\trak"); //新建文件夹
if (!Directory.Exists(tmpPath))
{
Directory.CreateDirectory(tmpPath); //新建文件夹
}
}
//先删除临时目录里面的所有文件
DeleteFolder(tmpPath);
img.Save(tmpPath + "\\" + imgClass + epis + ".bmp");
img.Dispose();
string ftpPath = "";
FtpService ftp = GetFtpHelper(machID, dealProcess, out ftpPath);
//上传图片
ftp.Upload(tmpPath + "\\" + imgClass + epis + ".bmp");
//保存图片
SaveImg(machID, epis, imgClass, ftpPath.Split('^')[3] + imgClass + epis + ".bmp", dealProcess);
File.Delete(tmpPath + "\\" + imgClass + epis + ".bmp");
}
}
return true;
}
/// 清空指定的文件夹,但不删除文件夹
/// </summary>
/// <param name="dir"></param>
public static void DeleteFolder(string dir)
{
foreach (string d in Directory.GetFileSystemEntries(dir))
{
if (File.Exists(d))
{
FileInfo fi = new FileInfo(d);
if ((DateTime.Now - fi.CreationTime).Minutes > 10)
{
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
{
fi.Attributes = FileAttributes.Normal;
}
File.Delete(d);//直接删除其中的文件
}
}
else
{
DirectoryInfo d1 = new DirectoryInfo(d);
if (d1.GetFiles().Length != 0)
{
DeleteFolder(d1.FullName);递归删除子文件夹
}
Directory.Delete(d);
}
}
}
}
}
然而还是有新的问题出现,新的问题就是C#的编译语言,画图调试要不停改代码、编译、替换到网站、传数据测试。这是一个很费时的事,而且C#各种没设置对象到实例等报错必须看日志猜测,效率极其低下,基本也就我在使用。最近突然灵光一闪,我可以借用代理模式把我们打印的画笔元数据定义的实现代理出去,和打印一样约定画笔的元数据,别的语言把画图数据传给C#,C#按数据执行画文本、画条码、画线等等。基于这个原理我就能实现M语言的图片类。
结构图
C#元素执行类(按元素数据执行画笔)
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Drawing.Printing;
using System.Drawing;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Net;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Drawing.Drawing2D;
namespace LIS.Mach.ImageDeal
{
/// <summary>
/// 报告处理类,处理报告打印逻辑
/// </summary>
public partial class DrawElementBase
{
/// <summary>
/// 缩放倍数
/// </summary>
int dpi = 1;
/// <summary>
/// 名称表
/// </summary>
private static DataTable namesTable;
/// <summary>
/// 存打印的起始点
/// </summary>
List<Point> pintPoints = new List<Point>();
/// <summary>
/// 行索引
/// </summary>
int iRow;
/// <summary>
/// 行索引
/// </summary>
int endRow;
/// <summary>
/// 无参构造函数
/// </summary>
public DrawElementBase()
{
}
/// <summary>
/// 绘图服务
/// </summary>
/// <param name="drawDT">绘图数据表</param>
/// <returns>图片</returns>
public Bitmap DrawService(DataTable drawDT)
{
if (drawDT != null && drawDT.Rows.Count > 0)
{
namesTable = drawDT;
iRow = 1;
endRow = namesTable.Rows.Count;
//第一个元素指定图片信息
DataRow imgInfoRow = namesTable.Rows[0];
//PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle
//打印类型
string PrintType = imgInfoRow["PrintType"].ToString();
if (PrintType == "ImageInfo")
{
int PrintWidth = Convert.ToInt32(imgInfoRow["PrintWidth"]);
int PrintHeight = Convert.ToInt32(imgInfoRow["PrintHeight"]);
string PrintColor = imgInfoRow["PrintColor"].ToString();
Color bkColor = Color.White;
if (PrintColor != "")
{
bkColor = System.Drawing.ColorTranslator.FromHtml(PrintColor);
}
Bitmap img = new Bitmap(PrintWidth, PrintHeight);
Graphics g = Graphics.FromImage(img);
g.Clear(bkColor);
//+抗锯齿
g.SmoothingMode = SmoothingMode.AntiAlias;
//调用绘图
PrintDraw(g, null, false);
return img;
}
else
{
return null;
}
}
else
{
return null;
}
}
/// <summary>
/// 打印绘制
/// </summary>
/// <param name="pg">绘图句柄</param>
/// <param name="pe">打印参数</param>
/// <param name="e">是否自动换页</param>
bool PrintDraw(Graphics pg, PrintPageEventArgs pe,bool isAutoChangePage)
{
try
{
//奇偶页打印
if (pintPoints.Count > 0)
{
iRow = pintPoints[0].X;
endRow = pintPoints[0].Y;
pintPoints.RemoveAt(0);
}
//循环绘制每行数据
for (int i = iRow; i < endRow; i++)
{
//取出当前行数据
DataRow dr = namesTable.Rows[i];
//PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment
//打印类型
string PrintType = dr["PrintType"].ToString();
//换页
if (isAutoChangePage==false&&PrintType == "PAGE")
{
iRow = i + 1;
if (pe == null)
{
return true;
}
pe.HasMorePages = true;
return true;
}
//打印X
float PrintX = Convert.ToSingle(dr["PrintX"].ToString());
//打印Y
float PrintY = Convert.ToSingle(dr["PrintY"].ToString());
//打印字体
string PrintFont = dr["PrintFont"].ToString();
//字体大小
float PrintFontSize = 9;
//指定了字体大小使用指定的字体大小
if (!String.IsNullOrEmpty(dr["PrintFontSize"].ToString()))
{
PrintFontSize = Convert.ToSingle(dr["PrintFontSize"].ToString());
}
//字体样式
string PrintFontStyle = dr["PrintFontStyle"].ToString();
//打印宽度
float PrintWidth = Convert.ToSingle(dr["PrintWidth"].ToString());
//打印高度
float PrintHeight = Convert.ToSingle(dr["PrintHeight"].ToString());
//打印文本
string PrintText = dr["PrintText"].ToString();
//数据字段
string DataField = dr["DataField"].ToString();
//打印标识
string PrintFlag = dr["PrintFlag"].ToString();
//打印停靠
string PrintAlignment = dr["PrintAlignment"].ToString();
//打印图片文件
string PrintImageFile = dr["PrintImageFile"].ToString();
//打印颜色
string PrintColor = "";
//设置了颜色就使用设置的颜色
if (!String.IsNullOrEmpty(dr["PrintColor"].ToString()))
{
PrintColor = dr["PrintColor"].ToString();
}
//标识打印
bool bPrint = true;
//空标签不打印
if (String.IsNullOrEmpty(PrintText) && (PrintType == "Label"))
{
bPrint = false;
}
//空数据不打印
if (String.IsNullOrEmpty(PrintText) && (PrintType == "Data"))
{
bPrint = false;
}
//空结果不打印
if (String.IsNullOrEmpty(PrintText) && (PrintType == "Result"))
{
bPrint = false;
}
//最小化不打印
if (String.IsNullOrEmpty(PrintText) && (PrintType == "Microbe"))
{
bPrint = false;
}
//如果需要打印
if (bPrint)
{
//不允许文字画出界限
using (StringFormat drawFormat = new StringFormat(StringFormatFlags.NoClip))
{
//如果垂直显示,有数据兼容
if (dr.Table.Columns.Contains("IsVShow") && dr["IsVShow"].ToString() == "1")
{
drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;
}
//设置文字停靠
switch (PrintAlignment)
{
case "Center":
PrintX = PrintX + PrintWidth / 2;
drawFormat.Alignment = StringAlignment.Center;
break;
case "Right":
PrintX = PrintX + PrintWidth;
drawFormat.Alignment = StringAlignment.Far;
break;
case "Justified":
//自适应的就不管了
break;
default:
//否则默认停靠
drawFormat.Alignment = StringAlignment.Near;
break;
}
//文本扩大倍数
double fontSizeDpi = 1;
//解析得到字体
Font mFont = ResolveFontData(PrintFont, (float)(PrintFontSize * fontSizeDpi), PrintFontStyle);
//解析颜色得到画刷
Brush mBrush = ResolveColorData(PrintColor);
bool pure = false;
//条码类型
string BarType = "";
if (PrintFlag.ToUpper().Contains("BARCODEN"))
{
PrintFlag = "BarCodeN";
if (PrintFlag.ToUpper() == "BARCODENA")
{
BarType = "A";
}
else if (PrintFlag.ToUpper() == "BARCODENB")
{
BarType = "B";
}
else if (PrintFlag.ToUpper() == "BARCODENC")
{
BarType = "C";
}
}
else if (PrintFlag.ToUpper().Contains("BARCODE"))
{
PrintFlag = "BarCode";
if (PrintFlag.ToUpper() == "BARCODEA")
{
BarType = "A";
}
else if (PrintFlag.ToUpper() == "BARCODEB")
{
BarType = "B";
}
else if (PrintFlag.ToUpper() == "BARCODEC")
{
BarType = "C";
}
}
string rotate = "";
//如果是数据类型,且打印标识是条码,设置打印类型为条码
if ((PrintType == "Data") && (PrintFlag.ToUpper() == "BARCODE"))
{
PrintType = "BarCode";
}
//如果是数据类型,且打印标识是条码,设置打印类型为条码
if ((PrintType == "Data") && (PrintFlag.ToUpper() == "BARCODEN"))
{
PrintType = "BarCodeN";
}
//旋转角度
string Angle = "";
//有数据兼容
if (dr.Table.Columns.Contains("Angle"))
{
Angle = dr["Angle"].ToString();
}
//旋转角度
int angle = 0;
if (Angle != "")
{
angle = Convert.ToInt32(Angle);
}
if (angle != 0)
{
// 绘图平面以图片的中心点旋转
pg.TranslateTransform(PrintX, PrintY);//通过使此 pDC 的变换矩阵左乘指定的平移来更改坐标系统的原点
PrintX = 0;
PrintY = 0;
//将指定旋转应用于此 pDC的变换矩阵
pg.RotateTransform(angle);
}
if (PrintType=="Label" || PrintType == "Data")
{
if (PrintFlag == "CheckBox")
{
PrintType = "CheckBox";
}
else if (PrintFlag == "Radio")
{
PrintType = "Radio";
}
}
//按照类型来绘制信息
switch (PrintType)
{
//标签
case "Label":
//包含大小控制命令
if (PrintText.Contains("$SIZE$"))
{
DrawSizeStr(PrintText, pg, mFont, mBrush, PrintX, PrintY, dpi, drawFormat);
continue;
}
#region 幂打印处理
//幂打印处理
if (PrintText.Contains("^"))
{
string[] powerArr = PrintText.Split('^');
if (powerArr.Length == 2)
{
if (StrIsInt(powerArr[1]) == true)
{
SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
//解析得到字体
Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY-2) * dpi, drawFormat);
continue;
}
}
}
else if (PrintText.Contains("~"))
{
string[] powerArr = PrintText.Split('~');
if (powerArr.Length == 2)
{
if (StrIsInt(powerArr[1]) == true)
{
SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
//解析得到字体
Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY - 2) * dpi, drawFormat);
continue;
}
}
}
#endregion
pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
break;
//数据
case "Data":
//包含大小控制命令
if (PrintText.Contains("$SIZE$"))
{
DrawSizeStr(PrintText, pg, mFont, mBrush, PrintX, PrintY, dpi, drawFormat);
continue;
}
#region 幂打印处理
//幂打印处理
if (PrintText.Contains("^"))
{
string[] powerArr = PrintText.Split('^');
if (powerArr.Length == 2)
{
if (StrIsInt(powerArr[1]) == true)
{
SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
//解析得到字体
Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY - 2) * dpi, drawFormat);
continue;
}
}
}
else if (PrintText.Contains("~"))
{
string[] powerArr = PrintText.Split('~');
if (powerArr.Length == 2)
{
if (StrIsInt(powerArr[1]) == true)
{
SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
pg.DrawString(powerArr[0]+"^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
//解析得到字体
Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX-2) * dpi, (PrintY-2) * dpi, drawFormat);
continue;
}
}
}
#endregion
pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
break;
//复选框
case "CheckBox":
//直接从地址加载图片
Image imgck=null;
if (PrintText == "是")
{
imgck = Properties.Resources.checkboxtrue;
}
else
{
imgck = Properties.Resources.checkboxflse;
}
//下载后画图
if (imgck != null)
{
pg.DrawImage(imgck, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
}
imgck.Dispose();
imgck = null;
break;
//单选选框
case "Radio":
//直接从地址加载图片
Image imgrd = null;
if (PrintText == "是")
{
imgrd = Properties.Resources.radiotrue;
}
else
{
imgrd = Properties.Resources.radiofalse;
}
//下载后画图
if (imgrd != null)
{
pg.DrawImage(imgrd, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
}
imgrd.Dispose();
imgrd = null;
break;
//结果
case "Result":
//包含大小控制命令
if (PrintText.Contains("$SIZE$"))
{
DrawSizeStr(PrintText, pg, mFont, mBrush, PrintX, PrintY, dpi, drawFormat);
continue;
}
#region 幂打印处理
//幂打印处理
if (PrintText.Contains("^"))
{
string[] powerArr = PrintText.Split('^');
if (powerArr.Length == 2)
{
if (StrIsInt(powerArr[1]) == true)
{
SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
//解析得到字体
Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX - 2) * dpi, (PrintY - 2) * dpi, drawFormat);
continue;
}
}
}
else if (PrintText.Contains("~"))
{
string[] powerArr = PrintText.Split('~');
if (powerArr.Length == 2)
{
if (StrIsInt(powerArr[1]) == true)
{
SizeF sizeMi = pg.MeasureString(powerArr[0] + "^", mFont);
pg.DrawString(powerArr[0] + "^", mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
//解析得到字体
Font mFontMi = new Font(mFont.Name, mFont.Size - 2, mFont.Style);
pg.DrawString(powerArr[1], mFontMi, mBrush, sizeMi.Width + (PrintX - 2) * dpi, (PrintY - 2) * dpi, drawFormat);
continue;
}
}
}
#endregion
pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
break;
//微生物
case "Microbe":
pg.DrawString(PrintText, mFont, mBrush, PrintX * dpi, PrintY * dpi, drawFormat);
break;
//线
case "ILine":
float penwidth = PrintHeight;
float xpianyi = 0;
float ypianyi = 0;
//竖线,
if (PrintWidth < PrintHeight)
{
penwidth = PrintWidth;
xpianyi = 0;
ypianyi = PrintHeight;
}
//横向
else
{
xpianyi = PrintWidth;
ypianyi = 0;
}
Color lineColor = Color.Black;
if (PrintColor != "")
{
lineColor = System.Drawing.ColorTranslator.FromHtml(PrintColor);
}
Pen pen = new Pen(lineColor, penwidth * dpi);
//打印标识
if (PrintFlag == "0")
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
}
else if (PrintFlag == "1")
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
if (dpi > 4)
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
pen.DashPattern = new float[] { 30, 20 };
}
}
else if (PrintFlag == "2")
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
}
else if (PrintFlag == "3")
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
}
else if (PrintFlag == "4")
{
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
}
pg.DrawLine(pen, PrintX * dpi, PrintY * dpi, PrintX * dpi + xpianyi * dpi, PrintY * dpi + ypianyi * dpi);
break;
//线
case "ILineN":
float size = 2;
//设置了颜色就使用设置的颜色
if (!String.IsNullOrEmpty(dr["PrintLength"].ToString()))
{
size = Convert.ToSingle(dr["PrintLength"]);
}
Color lineColorN = Color.Black;
if (PrintColor != "")
{
lineColorN = System.Drawing.ColorTranslator.FromHtml(PrintColor);
}
Pen penN = new Pen(lineColorN, size * dpi);
//打印标识
if (PrintFlag == "0")
{
penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
}
else if (PrintFlag == "1")
{
penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
if (dpi > 4)
{
penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
penN.DashPattern = new float[] { 30, 20 };
}
}
else if (PrintFlag == "2")
{
penN.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
}
else if (PrintFlag == "3")
{
penN.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
}
else if (PrintFlag == "4")
{
penN.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
}
pg.DrawLine(penN, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
break;
//条码
case "BarCode":
try
{
printBarcode(pg, PrintX.ToString(), PrintY.ToString(), PrintWidth.ToString(), PrintHeight.ToString(), pure, BarType, rotate, PrintText, true, mFont);
}
catch (Exception ex)
{
WriteLog(String.Format("{0}->{1}", DateTime.Now, ex.Message + " 调用堆栈:" + ex.StackTrace));
}
break;
//条码
case "BarCodeN":
try
{
//是否画文本
bool isDrawText = false;
//是否打印文本
if (dr.Table.Columns.Contains("PrintImageFile"))
{
if (PrintImageFile.ToLower() == "true")
{
isDrawText = true;
}
}
printBarcode(pg, PrintX.ToString(), PrintY.ToString(), PrintWidth.ToString(), PrintHeight.ToString(), pure, BarType, rotate, PrintText, isDrawText, mFont);
}
catch (Exception ex)
{
WriteLog(String.Format("{0}->{1}", DateTime.Now, ex.Message + " 调用堆栈:" + ex.StackTrace));
}
break;
//点
case "Point":
if (PrintFlag == "o")
{
pg.FillEllipse(mBrush, (int)(PrintX - PrintWidth * 3.0 / 2), (int)(PrintY - PrintHeight * 3.0 / 2 + 2), PrintWidth * 3, PrintHeight * 3);
}
else if (PrintFlag == "[]")
{
pg.FillRectangle(mBrush, (int)(PrintX - PrintWidth * 3.0 / 2), (int)(PrintY - PrintHeight * 3.0 / 2 + 2), PrintWidth * 3, PrintHeight * 3);
}
else if (PrintFlag == "<>")
{
Point[] points = new Point[4];
points[0] = new Point((int)(PrintX - PrintWidth * 3.0 / 2), (int)(PrintY));
points[1] = new Point((int)(PrintX), (int)(PrintY + PrintHeight * 3.0 / 2));
points[2] = new Point((int)(PrintX + PrintWidth * 3.0 / 2), (int)(PrintY));
points[3] = new Point((int)(PrintX), (int)(PrintY - PrintHeight * 3.0 / 2));
pg.FillPolygon(mBrush, points);
}
else
{
pg.FillEllipse(mBrush, (int)(PrintX - PrintWidth * 3.0 / 2) * dpi, (int)(PrintY - PrintHeight * 3.0 / 2 + 2) * dpi, PrintWidth * 3 * dpi, PrintHeight * 3 * dpi);
}
break;
//多边形
case "Poly":
string[] strArr = PrintText.Split('^');
if (strArr != null && strArr.Length > 2)
{
Point[] polyPoints = new Point[strArr.Length];
int polyPIndex = 0;
foreach (var s in strArr)
{
if (s.Split('@').Length > 1)
{
polyPoints[polyPIndex] = new Point(Convert.ToInt32(Convert.ToDouble(s.Split('@')[0])) * dpi, Convert.ToInt32(Convert.ToDouble(s.Split('@')[1])) * dpi);
}
else
{
polyPoints[polyPIndex] = new Point(0, 0);
}
polyPIndex++;
}
pg.FillPolygon(mBrush, polyPoints);
}
break;
//图片
case "Graph":
try
{
//属性不为空才进行画图
if (!String.IsNullOrEmpty(DataField))
{
WriteLog("打印绘图:"+DataField);
//打印标识未D认为是签名
if (PrintFlag == "D")
{
WriteLog("PrintFlag为D:打印图形,DataField应该是Base64串");
///Base64String 图形
string graphString = DataField.Replace("data:image/png;base64,", "");
Image img = null;
//图片串处理成图片
if (!String.IsNullOrEmpty(graphString))
{
img = Base64StringToImage(graphString);
}
if (img != null)
{
WriteLog("执行绘图");
Image imgTMP = new Bitmap(img.Width, img.Height);
Graphics g = Graphics.FromImage(imgTMP);
g.DrawImage(img, 0, 0, img.Width, img.Height);
pg.DrawImage(imgTMP, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
imgTMP.Dispose();
img.Dispose();
}
else
{
WriteLog("还原图片不成功");
}
img = null;
}
else
{
WriteLog("从FTP下载图片");
//直接从地址加载图片
Image img = Image.FromStream(StreamInfo(DataField));
WriteLog("PrintFlag设置:R来反转图片背景");
//图片颜色反转
if (PrintFlag== "R")
{
WriteLog("进行图片反转");
Bitmap imgTMP = new Bitmap(img.Width, img.Height);
Graphics g = Graphics.FromImage(imgTMP);
g.DrawImage(img, 0, 0, img.Width, img.Height);
img = GraphUtil.GrayReverse(imgTMP);
}
//下载后画图
if (img != null)
{
WriteLog("执行绘图");
pg.DrawImage(img, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
img.Dispose();
}
else
{
WriteLog("FTP流解析图片失败");
}
img = null;
}
}
else
{
//文件打印,直接从文件中加载图片
if (!String.IsNullOrEmpty(PrintImageFile))
{
PrintImageFile = PrintImageFile.Replace("#", "\\");
//文件存在就绘制
if (File.Exists(@PrintImageFile))
{
Image img = Image.FromFile(PrintImageFile);
if (img != null)
{
pg.DrawImage(img, PrintX * dpi, PrintY * dpi, PrintWidth * dpi, PrintHeight * dpi);
}
img.Dispose();
img = null;
}
}
}
}
catch (Exception ex)
{
WriteLog(String.Format("{0}->{1}", DateTime.Now, ex.Message + " 调用堆栈:" + ex.StackTrace));
}
break;
}
if (angle != 0)
{
//重置绘图平面的所有变换
pg.ResetTransform();
}
}
if (isAutoChangePage == false)
{
if (pe != null)
{
if (pintPoints.Count > 0)
{
pe.HasMorePages = true;
}
else
{
//绘制完成后,关闭多页打印功能
pe.HasMorePages = false;
}
}
}
}
}
}
catch (Exception ep)
{
WriteLog(String.Format("{0}->{1}", DateTime.Now, ep.Message + " 调用堆栈:" + ep.StackTrace));
}
return false;
}
/// <summary>
/// 处理大小控制串
/// </summary>
/// <param name="text">文本</param>
/// <param name="pg">画笔</param>
/// <param name="font">字体</param>
/// <param name="brush">画刷</param>
/// <param name="x">x</param>
/// <param name="y">y</param>
/// <param name="dpi">缩进率</param>
/// <param name="format">格式</param>
private void DrawSizeStr(string text,Graphics pg,Font font,Brush brush,float x,float y,int dpi,StringFormat format)
{
string[] strArr = text.Replace("$SIZE$", (char)2 + "").Split((char)2);
float xnum = 0;
for(int i=0;i<strArr[0].Length;i++)
{
string c=strArr[0].Substring(i,1);
int size = 5;
int yNum = 0;
if (strArr[1].Length > i)
{
size = Convert.ToInt32(strArr[1].Substring(i,1));
yNum = size - 5;
if (yNum > 0)
{
yNum += 1;
}
else if (yNum < 0)
{
yNum -= 1;
}
}
//解析得到字体
Font mFontMi = new Font(font.Name, font.Size - Math.Abs(5 - size)-3, font.Style);
Font mFontDraw = new Font(font.Name, font.Size - Math.Abs(5 - size), font.Style);
SizeF sizeMi = pg.MeasureString(c, mFontMi);
pg.DrawString(c, mFontDraw, brush, xnum + (x) * dpi, (y - yNum) * dpi, format);
xnum += sizeMi.Width;
}
}
/// <summary>
/// 是否是整数
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public bool StrIsInt(string value)
{
return Regex.IsMatch(value, @"^[+-]?\d*$");
}
/// <summary>
/// 解析颜色设置
/// </summary>
/// <param name="sColor">颜色参数</param>
/// <returns></returns>
private static System.Drawing.Brush ResolveColorData(string sColor)
{
try
{
System.Drawing.Brush returnColor = Brushes.Black;
if (sColor.Length > 0)
{
returnColor = new SolidBrush(System.Drawing.ColorTranslator.FromHtml(sColor));
}
return returnColor;
}
catch (Exception)
{
return Brushes.Black;
}
}
/// <summary>
/// 解析字体设置
/// </summary>
/// <param name="fntName">字体名称</param>
/// <param name="fntSize">字体大小</param>
/// <param name="fntStyle">样式</param>
/// <returns>字体</returns>
private static Font ResolveFontData(string fntName, float fntSize, string fntStyle)
{
try
{
Font ReturnFont;
if (fntName == "") { fntName = "宋体"; }
if (fntSize <= 0) { fntSize = 10; }
switch (fntStyle)
{
case "Bold Italic":
ReturnFont = new Font(fntName, fntSize, FontStyle.Bold | FontStyle.Italic);
break;
case "Bold, Italic":
ReturnFont = new Font(fntName, fntSize, FontStyle.Bold | FontStyle.Italic);
break;
case "Bold":
ReturnFont = new Font(fntName, fntSize, FontStyle.Bold);
break;
case "Italic":
ReturnFont = new Font(fntName, fntSize, FontStyle.Italic);
break;
case "normal":
ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
break;
case "bold":
ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
break;
case "bolder":
ReturnFont = new Font(fntName, fntSize, FontStyle.Bold);
break;
case "lighter":
ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
break;
default:
ReturnFont = new Font(fntName, fntSize, FontStyle.Regular);
break;
}
return ReturnFont;
}
catch (Exception)
{
return new System.Drawing.Font("Arial", 8, FontStyle.Regular);
}
}
/// <summary>
/// 打印条码
/// </summary>
/// <param name="g">绘图句柄</param>
/// <param name="x">x</param>
/// <param name="y">y</param>
/// <param name="width">宽度</param>
/// <param name="height">高度</param>
/// <param name="PureBarcode">只条码</param>
/// <param name="BarType">条码类别</param>
/// <param name="rotate">旋转角度</param>
/// <param name="barCode">数据</param>
/// <param name="isvShow">文本是否垂直显示</param>
public void printBarcode(Graphics g, string x, string y, string width, string height, bool PureBarcode, string BarType, string rotate, string barCode, bool isDrawText, Font mFont)
{
DrawCode128 code = null;
if (BarType != "")
{
if (BarType.ToUpper() == "A")
{
code = new DrawCode128(barCode, EncCode128.TYPES.A);
}
else if (BarType.ToUpper() == "B")
{
code = new DrawCode128(barCode, EncCode128.TYPES.B);
}
else if (BarType.ToUpper() == "C")
{
code = new DrawCode128(barCode, EncCode128.TYPES.C);
}
else
{
code = new DrawCode128(barCode, EncCode128.TYPES.DYNAMIC);
}
}
else
{
code = new DrawCode128(barCode);
}
Bitmap map = code.BMPCode128(isDrawText);
if (rotate != "")
{
map.RotateFlip((RotateFlipType)Enum.Parse(typeof(RotateFlipType), rotate));
}
//条码宽度
int barWidth = Convert.ToInt32(width);
//设置宽度大于条码宽度,使用条码宽度
//if (barWidth > )
//{
//barWidth = ;
//}
//设置的很小取条码宽度,保证扫描精度
if (barWidth <= 10)
{
barWidth = map.Width;
}
g.DrawImage(map, Convert.ToInt32(x) * dpi, Convert.ToInt32(y) * dpi, barWidth * dpi, Convert.ToInt32(height) * dpi);
if (isDrawText)
{
//画条码文字
Brush bush = new SolidBrush(Color.Black);
Font fontNew = new Font(mFont.Name, mFont.Size-2, mFont.Style);
Point p = new Point(Convert.ToInt32(x) * dpi, Convert.ToInt32(y) * dpi + Convert.ToInt32(height) * dpi);
g.DrawString(barCode, fontNew, bush, p);
}
}
/// <summary>
/// 写日志
/// </summary>
/// <param name="log"></param>
private static void WriteLog(string log)
{
LIS.Core.Util.LogUtils.WriteDebugLog(log);
}
/// <summary>
/// 图片转为base64编码的文本
/// </summary>
/// <param name="bmp">图片</param>
/// <returns></returns>
private static string ImgToBase64String(Bitmap bmp)
{
string strbaser64 = "";
try
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
strbaser64 = Convert.ToBase64String(arr);
}
catch (Exception ex)
{
WriteLog("图片转换Base64String 转换失败\n异常:" + ex.Message + " 调用堆栈:" + ex.StackTrace);
}
return strbaser64;
}
/// <summary>
/// base64编码的文本转为图片
/// </summary>
/// <param name="inputStr">输入串</param>
/// <returns>结果</returns>
private static Image Base64StringToImage(string inputStr)
{
Bitmap bmp = null;
try
{
byte[] arr = Convert.FromBase64String(inputStr);
MemoryStream ms = new MemoryStream(arr);
bmp = new Bitmap(ms);
ms.Dispose();
ms.Close();
}
catch (Exception ex)
{
WriteLog("Base64String到图片转换失败\n异常:" + ex.Message + " 调用堆栈:" + ex.StackTrace);
}
return bmp;
}
/// <summary>
/// 比特转图片
/// </summary>
/// <param name="imgByte">图片比特</param>
/// <returns>图片</returns>
private static Image ByteArrayToImage(byte[] imgByte)
{
Image img = null;
try
{
MemoryStream ms = new MemoryStream(imgByte);
img = Image.FromStream(ms);
ms.Close();
}
catch
{
img = null;
}
return img;
}
/// <summary>
/// 获得ftp流
/// </summary>
/// <param name="ftpUrlfileName">ftp文件名</param>
/// <returns></returns>
public Stream StreamInfo(string ftpUrlfileName)
{
try
{
FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpUrlfileName));
reqFtp.UseBinary = true;
FtpWebResponse respFtp = (FtpWebResponse)reqFtp.GetResponse();
Stream stream = respFtp.GetResponseStream();
return stream;
}
catch (Exception ex)
{
WriteLog(String.Format("从ftp加载图片错误{0}->{1}", DateTime.Now, ex.Message + " 调用堆栈:" + ex.StackTrace));
throw;
}
}
}
}
C#实现的调用通道实现(M通过webservice调入该对象)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LIS.BLL.ImageCore;
using System.Drawing;
using System.Data;
using System.IO;
using System.Drawing.Drawing2D;
using Newtonsoft.Json;
using System.Net;
namespace LIS.Mach.ImageDeal
{
///<summary NoteObject="Class">
/// [功能描述:检验绘图处理基础,按约定的元素据进行绘图] <para/>
/// [创建者:zlz] <para/>
/// [创建时间:2019年10月12日] <para/>
///<说明>
/// [说明:[功能描述:检验绘图处理基础,按约定的元素据进行绘图]<para/>
///</说明>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
///</修改记录>
///<修改记录>
/// [修改时间:本次修改时间]<para/>
/// [修改内容:本次修改内容]<para/>
/// M端触发代码,其他的和监听程序一样
/// s retObj=##Class().%New()
/// s ret=(epis,ystr,mi,"MI.MIFV8","-1","",".ImageDealV8,")
///</修改记录>
///</summary>
public class ImageDealBase : BaseDeal, IDealCharStream
{
/// <summary>
/// 索引
/// </summary>
private static int index = 0;
// <summary>
/// 处理字符流接口方法
/// </summary>
/// <param name="charStream">字符流,M传入类型%GlobalCharacterStream</param>
/// <param name="otherPara">其他参数</param>
/// <param name="dealProcess">处理M</param>
/// <param name="dealClass">C#处理类格式:类全名,不带后缀的动态库名</param>
/// <returns></returns>
public string DealStream(string charStream, string otherPara, string dealProcess, string dealClass)
{
string retStr = "";
//其他参数分割
string[] otherParaArr = otherPara.Split('#');
string retType = otherParaArr[0];
Image img = null;
//删除两天前老文件
GraphUtil.DeleteOldFile(@"C:\TRAK\TmpMach",2);
if (retType.Contains("-GETFTP"))
{
retType = retType.Split('-')[0];
Stream ftpStream = null;
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(charStream));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
ftpStream = response.GetResponseStream();
img = Image.FromStream(ftpStream);
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{
LIS.Core.Util.LogUtils.WriteExceptionLog("绘图基础下载ftp文件失败!", ex);
}
finally
{
if (ftpStream != null)
{
ftpStream.Dispose();
}
}
}
else if (retType.Contains("-BASE64GETIMAGE"))
{
retType = retType.Split('-')[0];
try
{
byte[] arr = Convert.FromBase64String(charStream);
MemoryStream ms = new MemoryStream(arr);
img = new Bitmap(ms);
ms.Dispose();
ms.Close();
Bitmap imgTMP = new Bitmap(img.Width, img.Height);
Graphics g = Graphics.FromImage(imgTMP);
g.DrawImage(img, 0, 0, img.Width, img.Height);
img.Dispose();
img = imgTMP;
}
catch (Exception ex)
{
LIS.Core.Util.LogUtils.WriteExceptionLog("绘图基础Base64String到图片转换失败\n异常:", ex);
}
}
//通过Base64串得到文件
else if (retType.Contains("-BASE64GETFILE"))
{
byte[] arr = Convert.FromBase64String(charStream);
//判断C盘trak是否存在
string tmpPath = @"C:\TRAK\TmpMach";
if (!Directory.Exists("C:\\TRAK"))
{
//新建文件夹
Directory.CreateDirectory("C:\\TRAK");
}
if (!Directory.Exists(tmpPath))
{
//新建文件夹
Directory.CreateDirectory(tmpPath);
}
string fileName = otherParaArr[1];
string ftpName = otherParaArr[2];
string localPath = tmpPath + "\\" + fileName;
File.WriteAllBytes(localPath, arr);
if (File.Exists(localPath))
{
string ftpPath = "";
FtpService ftp = GetFtpHelper(ftpName, dealProcess, out ftpPath);
//上传图片
ftp.Upload(localPath, fileName);
File.Delete(localPath);
retStr = ftpPath.Split('^')[3] + fileName;
}
return retStr;
}
//通过比特串得到文件
else if (retType.Contains("-BITGETFILE"))
{
byte[] arr = System.Text.Encoding.UTF8.GetBytes(charStream);
//判断C盘trak是否存在
string tmpPath = @"C:\TRAK\TmpMach";
if (!Directory.Exists("C:\\TRAK"))
{
//新建文件夹
Directory.CreateDirectory("C:\\TRAK");
}
if (!Directory.Exists(tmpPath))
{
//新建文件夹
Directory.CreateDirectory(tmpPath);
}
string fileName = otherParaArr[1];
string ftpName = otherParaArr[2];
string localPath = tmpPath + "\\" + fileName;
File.WriteAllBytes(localPath, arr);
if (File.Exists(localPath))
{
string ftpPath = "";
FtpService ftp = GetFtpHelper(ftpName, dealProcess, out ftpPath);
//上传图片
ftp.Upload(localPath, fileName);
File.Delete(localPath);
retStr = ftpPath.Split('^')[3] + fileName;
}
return retStr;
}
else
{
DataTable drawDT = null;
//按json数组数据画图
if (charStream.Length > 20 && charStream.Contains("["))
{
drawDT = JsonConvert.DeserializeObject<DataTable>(charStream);
}
else
{
//参数
LIS.Model.Bussiness.Parameters param = new LIS.Model.Bussiness.Parameters();
//调用类名
string ClassName = dealProcess;
//调用方法名
string FuncName = "QryDrawElement";
//按id取绘图数据
param.P0 = charStream;
//登录信息
string logInfo = "";
string errStr;
try
{
//调用方法
drawDT = LIS.DAL.DataAccess.WebManager.GetDataTable(ClassName, FuncName, param, logInfo, out errStr);
}
catch (Exception ex)
{
LIS.Core.Util.LogUtils.WriteExceptionLog("绘图基础查询绘图数据异常", ex);
}
}
DrawElementBase draw = new DrawElementBase();
img = draw.DrawService(drawDT);
}
//有图就上传ftp
if (img != null)
{
try
{
//判断C盘trak是否存在
string tmpPath = @"C:\TRAK\TmpMach";
if (!Directory.Exists("C:\\TRAK"))
{
//新建文件夹
Directory.CreateDirectory("C:\\TRAK");
}
if (!Directory.Exists(tmpPath))
{
//新建文件夹
Directory.CreateDirectory(tmpPath);
}
string fileName = otherParaArr[1];
string ftpName = otherParaArr[2];
//返回Base64位串
if (retType.ToUpper() == "BASE64")
{
retStr = ImgToBase64String(img);
}
else
{
if (!fileName.Contains(".bmp"))
{
fileName += ".bmp";
}
string localPath = tmpPath + "\\LIS" + index+"-"+fileName;
index++;
index = index % 9999;
img.Save(localPath);
if (File.Exists(localPath))
{
string ftpPath = "";
FtpService ftp = GetFtpHelper(ftpName, dealProcess, out ftpPath);
//上传图片
ftp.Upload(localPath, fileName);
File.Delete(localPath);
retStr = ftpPath.Split('^')[3] + fileName;
}
}
}
catch(Exception ex)
{
return "-1^" + ex.Message;
}
finally
{
img.Dispose();
}
}
return retStr;
}
/// <summary>
/// 图片转为base64编码的文本
/// </summary>
/// <param name="bmp">图片</param>
/// <returns></returns>
private static string ImgToBase64String(Image bmp)
{
string strbaser64 = "";
try
{
MemoryStream ms = new MemoryStream();
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
strbaser64 = Convert.ToBase64String(arr);
}
catch (Exception ex)
{
return "-1^" + ex.Message;
}
return strbaser64;
}
}
}
LIS绘图代理类
/// 名称: 检验图片类,做为检验绘图基础类(有问题反馈,不要私下调整)
/// 描述: 实现绘图支持,提供基础画笔代理
/// 代码示例
/// s imgObj=##Class().%New()
/// //画直方图逻辑
/// //s ret=("","","ZLZ",320,160,"12,13,3,22,60,60,80,12,12,13,14,15,16,17,18,19,20,20,21,22,22.1,22,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,23.6,23.7,23.8,23.9,24,24.1,24.2,24.3","PLT","直方图","5#5,10#10,15#15,20#20,24#pL","0#0,15#15,30#30,45#45,60#60,75#mol/L")
/// //画文本
/// s ret=(10,10,"测试文本")
/// s ret=(40,40,"画文本")
/// //选中的复选框
/// s ret=(60,60,"1")
/// //没选中的复选框
/// s ret=(90,60,"0")
/// //画线
/// s ret=(150,0,150,300,2)
/// s ret=(0,150,300,150,1,1,"red")
/// //画条码
/// s ret=(140,40,"1035891934")
/// //画点
/// s ret=(140,90,4,4)
/// s ret=(180,90,4,4,"[]","red")
/// //画多边形
/// s ret=("100@100^290@200^150@150","red")
/// //画指定ftp地址图片到图形上
/// s ret=(200,200,100,100,"ftp://lis:lis@127.0.0.1/MCImage/")
/// //保存图形
/// s ret=(300,300,"","","ZLZ","")
/// //s ret=(300,300,"BASE64","","ZLZ","")
/// //保存图片路径到仪器
/// s ret=(ret,16,"999","P")
/// //从FTP地址获取图片。如:西门子2120的图在ftp上获取
/// s ret=##Class().GetFTPImgMTHD("ftp://lis:lis@127.0.0.1/MCImage/","","","zlz")
/// //给传入的Base64串处理成图片到FTP。 如:买入BC5800
/// s ret=##Class().GetImgByBase64MTHD("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","","","zlz")
/// //Base64字符流的参数方法
/// s charStream=##class(%GlobalCharacterStream).%New()
/// d ("/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiub8XaxqWkxWQ0ufTVnuLiGBo7tWZgsk8UXmqqsC4UyAFcj76ncMbXAOkory+y+IOqXsFtCxgMlxd2jx3MMHk/uHfTiUaNnk+YrfMpIbjbxycjoF8VSRaZpX2S+0q9mu5ZreNtWum02aZ45PL2iIxMWkB+VgFX5uQoDAAA7CivP9L8SeKbbwDpuvXllY3zXMVvLO8moGIRRukS+adtvhVyXkcHIQBiGIwF0NM1bxZDq1pomo6dpVzN5TTXF3DqLkxxCQKpdRbgeYwJx91XMUhGwDAAOworzvxF4z8Q6Jq2j2txZaNb+bcEzqmozSKIvJmIMrfZf3Sbk3b/APpk38Kuy9xpsmpS27NqlpaW0+/Cpa3LTqVwOSzRoQc54x2HPPABcooooAKKKKACiiigAooooAKKKKAOD+LU81v4TtHglkiY6paqWRipwX5HFd5Xn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5/xVplxqkFisNlBcra3cV4odwsgljdTHtYghFzku4ywQMqqxcbegooA8zh8CT6bYackNrd3F9a3tnA8izRCFoI3si0+CQwGyyT5eWDs4G5dr1qWWg+IPN0sGKxtYbLxBf37PJM0jvBI0+zCKAAzCdur/AC4UkMSUHcUUAcXpNrr+l+HF8OXOhWmoxW6CwtpXnVLea2SCNd8+dzgufMG1Y2AI2nj5zc0vT9U8P3gWS2/tZLnyo5L9JsTx4GArLKxzCnzkEOX+flXcvI/UUUAef6v4Q8QXWq2M4vtKvVkuy9291prPhDazx7WHngNCDKyrGAMeZuYsd7P2GjWV5p2nJa3l/wDbWjwElKFW24HBJZi2DnBJLbdoYswLtoUUAFFFFABRRRQAUUUUAFFFFABRRRQB5/8AGD/kULP/ALCtp/6Mr0CvP/jB/wAihZ/9hW0/9GV6BQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXiHj5BP4g8QyrpcFxNaRXkwlj06xkceTaWLIZWnQlo1M0mdpL/MAOAAAD2+ivI/B+mtB4svdLtoZNGlCXSeethYR3aKi6fIoZoYzGRmaTjB4YZ5UYuWFpq/+jCHxVqqeIr27W21KJYbTy1MGPOmKeRlVMe0I5GWEtsG4K4APUKK83+JUN/ZeFNQhi8QarcTXOnzr9k22ojMccBMskhEBcKQMEqQN8qKCgYFek8KreTJLcXmtalczwu9tcWV0LfbDKrDJBjhjYgjDKTjcjq20ZGADpKKKKACiiigAooooAKKK5/x3/wAk88Tf9gq6/wDRTUAc/wDGD/kULP8A7Ctp/wCjK9Ar5g8Zf8kVtv8AsK6b/wCmiGu/l/5KH48/7Cvhv/0bFQB7BRXn/wDzO/8A3Nf/ALha5/xD/wAgPwn/ANlAf/0tuqAPYKK+QP8AmSP+5U/9zVdB4N/5Adz/ANk/1L/0tmoA+n6K8A8Jf8jP8Rf+xr03/wBOTVv3n/JetG/7Ct//AOmu0oA9gorwDxf/AMiR4+/7Zf8Ap6vqPh//AM0d/wC41/7NQB7/AEV8wJ/yHPiP/wBhW9/9ItUr3/wJ/wAk88M/9gq1/wDRS0AdBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXH6x8O9O1vU7q9ubyf/AEiXzjC9pZzoj+XHGSvnQOy5WJM89q7CigDi9O8BSaBerd6Lq0cTpbzRJFcabAIlaR4Sz7bdYcnbCF5J/hORghtT/hGZYf8ASrXWr5dW/jvZgj+eo+7HJGFVPLB7IEYZcqymRy3QVFc3MFnay3NzMkMESl5JJGwqKOSSewoA5zXPBVr4g0m9iurmeLUry0aCW7tp54kLGPaMxCTDRg5YRsSo3P3didTTfD+n6VcNcW32tp2TY0lxezTsy5BAJkdiQCDtB+7ufGN7Zzf+Fi+C/wDoadI/8C0/xq5ceK9HtxpJF2Jxq0whsvs6mTzT1LDH8IHJboKANqiiqGq61peh2y3Oq6hbWULNsWS4kCAt1wCe/BoAv0VzP/CxfBf/AENOkf8AgWn+Nauk69pGvRSS6TqVrfJEQrtbyhwpPTOOlAGjRRRQAVz/AI7/AOSeeJv+wVdf+imroKzPElnFqPhbV7Ge7S0hubKaGS5cDbCrIQXOSOADnqOnWgD5z8Zf8kVtv+wrpv8A6aIa7+X/AJKH48/7Cvhv/wBGxVi/Ejwva6Z8OtM0ZNWM73Wo2UsUi2rYKJax2uTgkAHaH5I67ecZrtX0fTm1vxVrY1K6YXd9pk0kCaZMzxm1kUgIAN0quUI3IMDnrg0AS/8AM7/9zX/7ha5/xD/yA/Cf/ZQH/wDS26rrvs+n/wDCTx3DX1wkkmo/2uEksJVQD7D9n8tpCNqtgGTBw2ONveqFxoem6zpOiIustbC08THU0FzZvDJLI00swg8uQqwOJfvYOQu7GDwAeA/8yR/3Kn/uaroPBv8AyA7n/sn+pf8ApbNXWt8KdPTS7vR28TTh7XRzYySf2RJhgL37UXT5sSEZCFUJIJHf5a1NC+HFhpmkQD/hJCyX+h3Ph+AyWDRMXmmll3FGbcGXLAoQD8pJI6UAc94S/wCRn+Iv/Y16b/6cmrfvP+S9aN/2Fb//ANNdpXQaT8Mv7L1TxHe/2v5v9s6rbals+zbfJ8m5M+zO87s5254x1welaE3gXzfHtn4n/tHH2a7nufs3kfe821ht9u7dxjyd2cc7scYyQDzDxf8A8iR4+/7Zf+nq+o+H/wDzR3/uNf8As1d/rHwy/tXQ9f03+1/K/tfb+8+zbvK23s9103jd/r9nUfdz3wDw/wDDL+wv+EO/4m/n/wDCN/bf+Xbb9o+0Z/2zs2598+1AHkCf8hz4j/8AYVvf/SLVK9/8Cf8AJPPDP/YKtf8A0UtcePg/i+8SXP8Abv8AyGrua52/ZP8AU+ZDdRbc7/mx9qznjOzHfI9A0LTP7E8PaZpPned9htIrbzdu3fsQLuxk4zjOMmgDQooooAKKKKACiiigAooooAKKKKACiiigAooooAK5n4i/8k38Sf8AYOm/9ANdNWL4w0y51nwbrOmWYU3N1ZyxRBjgFmUgc9qAKeqeN9N0LxA+mawsljEbU3MF5LjypwoJdAf7ygZweTn6Z5nwxcNqPiqy8U63BIt5rfmQaNauv/HpaIhcufR3ABOOeQOmava0+r+IrJLPV/hwby3SRZVSTU4MBlOQeD/+sEg8Gp4ovEOt+LtDvb3w9/ZVppnnuzveRy798ewKAn1zzQB29cz4k/5Gnwd/2EZv/SOeumrmvFlrqjXehalpen/b5NOvHlktxMsRZWglj4ZuOC4NAHS1yWhf8lG8Xf8AXOx/9Aej/hIvFn/QjTf+DSD/ABp3haz1c6/r2s6rpo077f8AZ0itzOsrARqwJJXjnd+lAHV0UUUAFRzrK1vIsDokxUhHdC6q2OCQCMj2yPqKkopNXVgPKPijpV5a+EdFea9hleG8tLefZblFlAkG0qC5KY5zy2c9q7CbwveXFtqkdzqFpdm9lVkS8sjNEEU8K8bSYbj+4YxkZ25JzjfGD/kULP8A7Ctp/wCjK9ApvUDnF8LuNTtrlrm2eGG2EDIbU+Y+EK7S4fHl8k7CpIJOGGaisPC99pmjm2ttThN5LeLdXFxPBLMr7duFUPMXHCIMs7dDxjAHUUU79f67gc5/wjEy63qOqRagIpp4WitQqSFYC20sxVpCpJZQTsEeec5OGFObwbqDpojQ+IZIZtOlDy5tllSdd25gPMLSKx4G7exx1yea6+il28geu4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVjXHi7w3aan/Ztzr2mw327aYJLpA4PYEE8H2pvjG6vrLwVrd1pu77bDYzPCV6qwQ8j3HUe4r4cZmdizEszHJJOSTQB9ffGD/kULP8A7Ctp/wCjK9ArwGG81C9/Z+8Oyagzs66rBHE79WjWYhfyAwPYCvfqACobu7t7G0kurqVYoIhud26KKmrnfHf/ACI2r/8AXA/zFTOXLFs2w1JVa0Kb2bS+9h/wnfhf/oN2v5n/AArX0/UrLVrQXVhcJcQElQ6dMjrXyvXvfwn/AORHj/6+JP51xYbFyqz5Wj6bOuH6GX4b21OTbulrbz8juKKKK7z5MKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAr3t4lhbNcypI0KcyNGu4oP7xA5IHtmltLy2v7ZLm0njnhcZWSNgwP4ip6828V+G9U8OXMviHwlNJApO+7s4xlD6sF6Eeo7dRWVScoLmSujuwWHpYmXspS5ZPZvZ+T7ep6TRXm3hz4t2F9st9biFlOePOTJiY+/df1HvXo0M0VxCk0EqSxOMq6MGVh6ginTqwqK8WTjMBicHPlrxt+T9GPrz+6+CvgW71U376QUZm3tBFMyRE/7oPA9hgV6BRWhxnnfxYt4bTwPp1tbRJDBFqdmkccahVRQ4AAA6AV6JXn/xg/5FCz/7Ctp/6Mr0CgAqpqWn2+rabPYXQYwTrscKcHH1q3RSaTVmVGThJSi7NHD/APCp/C//ADyuv+/5rp9D0Sy8PaaLCwVxAGLgO245PXmtGiojShB3irHVXzDFYiPJWqOS82FFFFaHGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHkfxE+Hezzdb0SH5OXubVB09XUenqPxrgdB8Vax4cm36ddssZOWhf5o2+q/wBRg19NV5H8RPh3s83W9Eh+Tl7m1QdPV1Hp6j8a83E4ZxftaR9rkmd060FgsdZp6Jv8n+jN3w38VdJ1XZBqgGnXR43McxMf97+H8fzrvlZXQOjBlYZBByCK+Ta6Dw9401rw04WzuS9tnLW03zRn6Dt+GKijj2tKh05jwnCd54N2fZ7fJ9Pnc9T+MH/IoWf/AGFbT/0ZXoFeJeMPHtj4s8J2lqsElvfpqNrI8R+ZSocZIb0HvivbeoyK9KFSM1eLufFYnCV8LP2deLi/627hRRRVnMFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHkfxE+Hezzdb0SH5OXubVB09XUenqPxryivrOvI/iJ8O9nm63okPycvc2qDp6uo9PUfjXmYvCfbh9x9zw/wAQXthcU/R/o/0Z5RXU+HPH2t+HCsUc32mzH/LtOSQB/snqv4ce1ctRXnQnKDvF2PscRhqWIh7OtFSXmfQ/hv4h6J4h2Q+b9jvW4+zzkDcf9lujfz9q6yvkyuy8N/EnW9B2QzP9vs148qdjuUf7LdR+OR7V6NHH9Kn3nxuY8JPWeDf/AG6/0f8An959A0Vzfh3xxoniRVS2uPJuiObab5X/AA7N+FdJXoxnGavF3Pja+Hq0JunVi4vzCiiiqMQooooAKKKKACiiigAooooAKKKKACiiigDO/tq1/wCeV/8A6zy/+QfP1/746f7XT3o/tq1/55X/APrPL/5B8/X/AL46f7XT3rRoqfeNb0v5X96/yM7+2rX/AJ5X/wDrPL/5B8/X/vjp/tdPej+2rX/nlf8A+s8v/kHz9f8Avjp/tdPetGij3gvS/lf3r/Izv7atf+eV/wD6zy/+QfP1/wC+On+1096P7atf+eV//rPL/wCQfP1/746f7XT3rRoo94L0v5X96/yM7+2rX/nlf/6zy/8AkHz9f++On+1096P7atf+eV//AKzy/wDkHz9f++On+10960aKPeC9L+V/ev8AIzv7atf+eV//AKzy/wDkHz9f++On+1096P7atf8Anlf/AOs8v/kHz9f++On+10960aKPeC9L+V/ev8jO/tq1/wCeV/8A6zy/+QfP1/746f7XT3o/tq1/55X/APrPL/5B8/X/AL46f7XT3rRoo94L0v5X96/yM7+2rX/nlf8A+s8v/kHz9f8Avjp/tdPej+2rX/nlf/6zy/8AkHz9f++On+10960aKPeC9L+V/ev8jO/tq1/55X/+s8v/AJB8/X/vjp/tdPej+2rX/nlf/wCs8v8A5B8/X/vjp/tdPetGij3gvS/lf3r/ACM7+2rX/nlf/wCs8v8A5B8/X/vjp/tdPej+2rX/AJ5X/wDrPL/5B8/X/vjp/tdPetGij3gvS/lf3r/I8O+JHh3TrV/7Z0tJ4EmuBDNBJayRL5h6FCygYJ4wO54rgJYpIJWiljaORThldcEfUV7h8YP+RQs/+wraf+jK7DU9D0vWYvL1GxguRjALp8y/Ruo/A1w1sCpvmi7H1WX8VSw8FSrRckut9fy1PlyivZtY+Dmnz7pNIvZLV+oimHmJ9Aeo/WvP9Y8AeI9F3NNYNPCv/La2/eL9cDkD6gVwVMNVp7o+sweeYHFaQnZ9no/+D8jmgSrBlJBByCO1d14b+KWsaPsg1DOo2g4/eN+9Uezd/wAc/UVwhBBwRgiis4VJ03eLsdmKwdDFw5K8VJf1s+h9HaT490DWUjFpPO074BtxbSNIv1Cg8e/T3rU/tq1/55X/APrPL/5B8/X/AL46f7XT3r5fjkkhkWSJ2SRTlWU4IPsa9D8N/FnUtO2W+sIb+3HHmjiVR9ejfjg+9ejSx99J6Hx2P4U9mufC3l5NpP5aanrv9tWv/PK//wBZ5f8AyD5+v/fHT/a6e9H9tWv/ADyv/wDWeX/yD5+v/fHT/a6e9R6J4k0nxDb+bpt2kpAy8Z4dPqp5/HpWrXem5K6Z8lUhGlJwqQaa6N/8Azv7atf+eV//AKzy/wDkHz9f++On+1096P7atf8Anlf/AOs8v/kHz9f++On+10960aKfvGd6X8r+9f5Gd/bVr/zyv/8AWeX/AMg+fr/3x0/2unvR/bVr/wA8r/8A1nl/8g+fr/3x0/2unvWjRR7wXpfyv71/kZ39tWv/ADyv/wDWeX/yD5+v/fHT/a6e9H9tWv8Azyv/APWeX/yD5+v/AHx0/wBrp71o0Ue8F6X8r+9f5Gd/bVr/AM8r/wD1nl/8g+fr/wB8dP8Aa6e9H9tWv/PK/wD9Z5f/ACD5+v8A3x0/2unvWjRR7wXpfyv71/kZ39tWv/PK/wD9Z5f/ACD5+v8A3x0/2unvT49WtpN22O8G1ip3WUy8j0yvI9xxV6ij3gbpdE/v/wCAFFFFUZBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAef/ABg/5FCz/wCwraf+jK9Arz/4wf8AIoWf/YVtP/RlegUAFFFFAGLrHhPQtdDG/wBOheQ/8tVGyT/voYJ/GuA1j4Nfek0bUfpDdD/2dR/T8a9ZorGph6dT4kelhM3xuE0pVHbs9V9z/Q+ZtY8J67oRY3+nTJGP+WqjfH/30MgfjWLX1mRkYPSuZ1jwB4c1rc01gsEzf8trb9231wOCfqDXDUy97wf3n1GE4wi9MVC3nH/J/wCZ8721zPZ3CXFtNJDMhyskbFWB9iK9J8N/F26ttlvr0Juoun2iIASD6jo36fjSax8HNQg3SaRex3SdRFMPLf6A9D+lcFqeh6po0vl6jYT2xzgF0+U/Ruh/A1zJV8O77fke3KWV5xDlbUn90l+v6H0ppOt6brlqLjTbyO4j77T8y+xB5H41fr5VsdQvNMulubG5lt5l6PG2D/8AXHtXp/hv4vsNlv4gg3Dp9rgXn/gSf1H5V3UcdCWk9GfLZjwrXo3nhnzx7df+D/Wh63RVXT9SstVtFurC6iuIW/jjbOPY+h9jVqu5NNXR8rKMotxkrNBRRRTJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8/wDjB/yKFn/2FbT/ANGV6BXn/wAYP+RQs/8AsK2n/oyvQKACiiigAooooAKKKKACmSxRzxNFLGskbDDK65B+op9FAJ21RxmsfDDw5qm54bdrCY/xWxwv/fJ4x9MV5/rHwk1yx3Pp8kOoRDoFPlyf98nj8jXudFc1TCUp9Leh7WE4gx+F0U+Zdpa/8H8T5hgudb8K6lujN1p10OqspXcPcHgj68V6Z4b+L0E2y31+DyH6faoQSh/3l6j8M/QV6VeWNpqEBgvbWG4iP8EqBh+tcPrHwk0O+3Pp8k2nynoFPmR/98nn8jXOsPWou9J3XY9eec5bmS5cdT5ZfzLX/g/KzO5tLy2v7ZLm0njnhcZWSNgwP4ip68SHhDxv4LuWutHka4izlvsrbg4/2oz1/AH610+gfFa0nlFn4gt2067B2mTafLz7g8r+OR71vDEq/LUXK/wPLxORy5XVwU1Vh5fEvVf16Ho1FMhmiuIUmglSWJxlXRgysPUEU+uo8Npp2YUUUUCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP/jB/wAihZ/9hW0/9GV6BXn/AMYP+RQs/wDsK2n/AKMr0CgAooooAKKKKACiivn2Jgr8qGBB4P0oA+gqK8ADYKfexzkAcfiaRcNKqFgoJxk9qYH0BRXgat9oMMEMS7efmzjk/XgVVmXD4BzSA+hqK+dj060itjOeRjvQB9FVn6noel6zF5eo2MFyMYBdPmX6N1H4GvCpbuRrdIXO5VPyj0qpkdCBQ0mrMqE5wlzQdn5HrsXga40OZp/C+sTWQJy1pcjzYH9sdR9eTW1aatfRARazp5tpBx9ogbzYG98/eT/gQA968JEp8sqM4PJXjrj/AOuaRIXlf5QST6VnGmo/DodVXGzrr9+uZ99n9/X53Po9WDKGUgqRkEHg0tfNm08cHr6dKqXkoilVTHM/y5ygyO9apXONn09RRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/wCMH/IoWf8A2FbT/wBGV6BXn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigAr5+VOehzX0DXgZ+VuBkE8nPSgBrAgGqzZDVbIBOAfmA/HH+RUDoGzg+4/xouAxHKsvOC3bPenSKcZccHv61HyHAMeQBkNnv6Ypzy7+uQQMZFADOc4/IUEYw3bOBgdf880h6HOCPQjrS7+2OmaQEUjbULFGfHOE69akS2V0lbeoIGQpzk/SojkHihJcEkOoyMDB5pgRsCrMDwfQ09JzGjqrlVcYbB6inzwu6mcqQjNgN2PTP86r7SAKALCTkNg45BHIzx6/yqjcNmXqelTHkdAQT3qCZVL8bTjg4HSgD6cooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/wCMH/IoWf8A2FbT/wBGV6BXn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigArwYKD3HUjFe814hG8f2RxtUSbgQe5/pj/GgCrHLGGDELNGSQQScehHFDLviZgygg8Z5pm1VwI1UJzkDjH+eaiYuEYxqJWH8BOM80WAjZCXxkc9icCmzwtbzSROQWQkHHIqTary4VQDnjPalkjKK5ZkID4XB5xQBW57nI9MUbQcZ7e9IxyPUH0NAOeM4oAI0MrKqkNvxtDcU+OIyxMy4ZEGTg9ulN4yOOT7UE9O2KABpCICuOBltq+tNbYBnaRgcnP9KXPpjilRN5PUgDkAUIGWtN0W51NZ3hX5YYy7nPQCsa6BWbHoOa04buax3JE7AHg89qzLp902SeSKBn01RRRQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8ihZ/8AYVtP/RlegV5/8YP+RQs/+wraf+jK9AoAKKKKACiiigArwNW3HHr1Fe+V8+Ru0b7hgc0AWZdkfyiRXcKCdoIyT9feqpJXr170jyfu8n73BH164pxAKFy4yDjbjk+9AEZwfm53DkH0OMUjdSc9OKbuyMHJzwe1E0+8LhFXaMfKOvufegBYzHvHmAkYOB057VCTzxRvXYzOcKOpJofo20hmXjGcc+lAD1BZcgdPWmE8YNO3D7pCnuDjkfjQqOyk7S2PTvQA0En60okYYI3KSPoR7U3Bx6H2FTLFvQtkAL78mgCs5LMeeSaqz/fB65FXCMEcdz0HSqs6jeoAwAvagD6booooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8ihZ/8AYVtP/RlegV5/8YP+RQs/+wraf+jK9AoAKKKKACiiigAr50Y/N/8AWr6Lr52RQznJwOpPpQAzccZwRmpJY2jRGOMOOMH3x/SmMDvIU4VeBkfrTdw2KCGGeAPfr+tMBQOM4zSyDe4UJgFcjHPTr/jTsqq5O4nGOOh/zxTY5fKBbIA5JJPTPvQBGoI4xn1qZlBjR2cAltpU9R0x+eafDGHkIJxnpnvUiwJsdmcbcAg9vakBWlRN+IyWXOASMVYtpJo4pFjLBHADAd+c4pI4N8uN2PfNTpuVNgZtmclefzouBVliZHIIqMAjAGQOgFXHtyGORjPJFN8nkkqdoBPA6UXAqbB24+gqpcx/vByRx2rYktih6fnVG5j/AHg+lFwPo2iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP/AIwf8ihZ/wDYVtP/AEZXoFef/GD/AJFCz/7Ctp/6Mr0CgAooooAKKKKACvnQEA4PIHUV9F185YAUKM4HqaYDm+cgn1zTehpVB/xyafsyT7EYoAnt7KaVkRnHznIZyFzyfwx05qF4ikjKD0PUVLEu6dFdgikgFqva5a2tjdmO1uftCbQd46dOcUMEjOVgrjk7iCQAKfxJ8jZwfSoBL6ULJznle3XrSAvSI8LDcNpb5sH0PSlWQEMGOVbggnt6VSabKhF7ds09FcqX2/KD1x3pNDLwIJ2oVIJwo9B6e9SxGNJSkqgqeGFUkZh82M+2OtSRvGciVwjbcqDyCfTP+elAGi8JuFllAyqDOBxwTgVlXCfvB8h6elSpcsgZVbgnJFVrmQmQY9KVho+g6KKKokKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8AIoWf/YVtP/RlegV5/wDGD/kULP8A7Ctp/wCjK9AoAKKKKACiiigAr5zCkfXvxX0ZXznLMUjTCryOaaEx/IAwfrT43VJVYoGwc1Q+1yZPC/lSvduoXCryfT2oQXL8ke/y+5IyvGDRMFEQU7jLzxxjAx/jWaL6VWDDbkEVJJcndny4+v8AdoC48qQaBkHntUYnbyidq5PPeoftT56L+VKw7l/eDEAsYV1zlic7vSpxcyLbiESgRhg5TPBOMcj6ZrJN3J0wuMelMN0/J2pk4yccmnYLmyJPmY+YTlQNh6DGeR+dQ+Z39eazBdOeCF4OelO+1ybRwv5UCNNGJfHrxTJmJYEE9KpRX0sUoZVj4wQCuRxRNfS7xwnT0oC5/9k=")
/// s ret=##Class().GetImgByBase64StreamMTHD(charStream,"","","zlz")
/// //通过base64串得到文件
/// s ret=##Class().GetFileByBase64StreamMTHD(charStream,"","zlz")
/// //通过比特串得到文件
/// s charStreamBit=##class(%GlobalCharacterStream).%New()
/// d ("")
/// s ret=##Class().GetFileByBitStreamMTHD(charStreamBit,"","zlz")
/// q ret
/// 编写者:zlz
/// 编写日期:20191012
///
Class wbsLisMsgAsyncHandler.LISMsg.DHCLISImage Extends %RegisteredObject
{
/// 图片句柄
Property ImgHander As %String;
/// 当前绘图索引
Property CurIndex As %Integer;
/// 当前天
Property CurDay As %Integer;
/// 画标签
/// x:x坐标(*必填)
/// y:y坐标(*必填)
/// drawStr:要绘制的文本(*必填)
/// font:字体
/// fontSize:字体大小
/// fontStyle:字体样式
/// alignment:字体靠齐方向 Center:居中 Right:靠右 Justified或者空:靠左
/// color:颜色,html颜色 red #ffffff这种
/// angle:旋转角度,角度数字
Method DrawLabel(x, y, drawStr, font, fontSize, fontStyle, alignment, color, angle)
{
s x=$g(x)
s y=$g(y)
s drawStr=$g(drawStr)
s font=$g(font)
s fontSize=$g(fontSize)
s fontStyle=$g(fontStyle)
s alignment=$g(alignment)
s color=$g(color)
s angle=$g(angle)
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="Label"
s PrintX=x
s PrintY=y
s PrintFont=font
s PrintFontSize=fontSize
s PrintFontStyle=fontStyle
s PrintText=drawStr
s PrintAlignment=alignment
s PrintColor=color
s Angle=angle
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
/// 画复选框
/// x:x坐标(*必填)
/// y:y坐标(*必填)
/// checked:是否选择 0:不选,1:选中
/// width:宽度
/// height:高度
Method DrawCheckBox(x, y, checked, width, height)
{
s x=$g(x)
s y=$g(y)
s checked=$g(checked)
s width=$g(width)
s height=$g(height)
i checked="1" s checked="是"
i checked="0" s checked=""
i '$l(width) s width=20
i '$l(height) s height=20
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="CheckBox"
s PrintX=x
s PrintY=y
s PrintText=checked
s PrintWidth=width
s PrintHeight=height
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
// 画单选框
// x:x坐标(*必填)
// y:y坐标(*必填)
// checked:是否选择 0:不选,1:选中
// width:宽度
// height:高度
Method DrawRadio(x, y, checked, width, height)
{
s x=$g(x)
s y=$g(y)
s checked=$g(checked)
s width=$g(width)
s height=$g(height)
i checked="1" s checked="是"
i checked="0" s checked=""
i '$l(width) s width=20
i '$l(height) s height=20
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="Radio"
s PrintX=x
s PrintY=y
s PrintText=checked
s PrintWidth=width
s PrintHeight=height
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
// 画线
// x:起点x坐标(*必填)
// y:起点y坐标(*必填)
// x1:终点x坐标(*必填)
// y1:终点y坐标(*必填)
// size:线宽度 默认1
// dashStyle:线样式,0、1、2、3、4
// color:颜色 html颜色 red #ffffff这种
Method DrawLine(x, y, x1, y1, size, dashStyle, color)
{
s x=$g(x)
s y=$g(y)
s x1=$g(x1)
s y1=$g(y1)
s size=$g(size)
s dashStyle=$g(dashStyle)
s color=$g(color)
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i $l(dashStyle),(dashStyle'=0),(dashStyle'=1),(dashStyle'=2),(dashStyle'=3),(dashStyle'=4) s dashStyle=""
i '$l(size) s size=1
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="ILineN"
s PrintX=x
s PrintY=y
s PrintWidth=x1
s PrintHeight=y1
s PrintLength=size
s PrintFlag=dashStyle
s PrintColor=color
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
// 画条码
// x:x坐标(*必填)
// y:y坐标(*必填)
// drawStr:要绘制的文本(*必填)
// isDrawText:是否绘制条码文本 0:不画条码文本 1:画条码文本
// width:宽度 小于10认为使用条码本身宽度不做缩放
// height:高度
// barType:条码码制,空默认,可为A、B、C
// font:字体
// fontSize:字体大小
// fontStyle:字体样式
// alignment:字体靠齐方向 Center:居中 Right:靠右 Justified或者空:靠左
// color:颜色,html颜色 red #ffffff这种
// angle:旋转角度,角度数字
Method DrawBarCode(x, y, barStr, isDrawText, width, height, barType, font, fontSize, fontStyle, alignment, color, angle)
{
s x=$g(x)
s y=$g(y)
s barStr=$g(barStr)
s isDrawText=$g(isDrawText)
s width=$g(width)
s height=$g(height)
s barType=$g(barType)
s font=$g(font)
s fontSize=$g(fontSize)
s fontStyle=$g(fontStyle)
s alignment=$g(alignment)
s color=$g(color)
s angle=$g(angle)
i '$l(width) s width=5
i '$l(height) s height=20
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="Data"
s PrintX=x
s PrintY=y
s PrintFont=font
s PrintFontSize=fontSize
s PrintFontStyle=fontStyle
s PrintText=barStr
s PrintWidth=width
s PrintHeight=height
s PrintAlignment=alignment
s PrintColor=color
s Angle=angle
s Flag=""
i isDrawText=0 s Flag="N"
s PrintFlag="BarCode"_Flag_barType
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
// 画点
// x:x坐标(*必填)
// y:y坐标(*必填)
// width:宽度
// height:高度
// type:点类型o [] <>或者空串
// color:颜色,html颜色 red #ffffff这种
Method DrawPoint(x, y, width, height, type, color)
{
s x=$g(x)
s y=$g(y)
s width=$g(width)
s height=$g(height)
s type=$g(type)
s color=$g(color)
i '$l(width) s width=2
i '$l(height) s height=2
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i $l(type),(type'="o"),(type'="[]"),(type'="<>") s type=""
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="Point"
s PrintX=x
s PrintY=y
s PrintWidth=width
s PrintHeight=height
s PrintFlag=type
s PrintColor=color
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
// 画多边形
// points:点集合描述串多个点用^分割,一个点的xy用@分割 如:10@10^29@20^100@15(*必填)
// color:颜色,html颜色 red #ffffff这种
Method DrawPoly(points, color)
{
s points=$g(points)
s color=$g(color)
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="Poly"
s PrintText=points
s PrintColor=color
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
// 画图片
// x:x坐标(*必填)
// y:y坐标(*必填)
// width:宽度(*必填)
// height:高度(*必填)
// dataField:数据,签名图片就传base64位串,否则传ftp全路径地址(*必填)
// isSign:是否是签名图片 默认不是
Method DrawGraph(x, y, width, height, dataField, isSign)
{
s x=$g(x)
s y=$g(y)
s width=$g(width)
s height=$g(height)
s dataField=$g(dataField)
s isSign=$g(isSign)
i ..CurIndex>10000 q "-1^画元素太多,检测可能的死循环"
i '$l(width) s width=80
i '$l(height) s height=80
i '$l(..CurDay) s ..CurDay=$p($h,",",1)
i '$l(..ImgHander) d
.s ..ImgHander=$zn_"-"_$j_"-"_$I(^CacheTemp)
.k ^LISImageElement("LISDrawBase",..CurDay,..ImgHander)
i '$l(..CurIndex) s ..CurIndex=1
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s (PrintFont,PrintX,PrintY,PrintLength,PrintWidth,PrintHeight)=0
s PrintType="Graph"
s PrintX=x
s PrintY=y
s PrintWidth=width
s PrintHeight=height
s DataField=dataField
i isSign="1" s PrintFlag="D"
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,..CurIndex)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s ..CurIndex=..CurIndex+1
q ""
}
/// 执行绘图
/// imgWidth:图片宽度(*必填)
/// imgHeight:图片高度(*必填)
/// retType:反回类型,可为BASE64或空
/// fileName:返回类型不是BASE64串时指定的上传ftp的文件名(*返回类型不是BASE64时必填)
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名(*返回类型不是BASE64时必填)
Method Save(imgWidth As %String, imgHeight As %String, retType As %String, fileName As %String, ftpFfolderName As %String, bkColor As %String)
{
s imgWidth=$g(imgWidth)
s imgHeight=$g(imgHeight)
s retType=$g(retType)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
s bkColor=$g(bkColor)
s (PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)=""
s PrintType="ImageInfo"
s PrintWidth=imgWidth
s PrintHeight=imgHeight
s PrintColor=bkColor
s ^LISImageElement("LISDrawBase",..CurDay,..ImgHander,0)=$lb(PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle)
s retType=$g(retType)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
i '$l(fileName) s fileName=""
i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
s otherPara=retType_"#"_fileName_"#"_ftpFfolderName
s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
s charStream=##class(%GlobalCharacterStream).%New()
d charStream.Write(..ImgHander)
s ret=retObj.DealStream(charStream,otherPara,"",",")
//删除数据
k ^LISImageElement("LISDrawBase",..ImgHander)
q ret
}
/// 保存图片到仪器
/// fileName:保存图片返回的ftp相对路径名(*必填)
/// mi:仪器主键(*必填)
/// epis:流水号(*必填)
/// ImageClass:图片类别(*必填)
Method SaveToMachine(fileName As %String, mi As %String, epis As %String, ImageClass As %String) As %String
{
s mi=$g(mi)
s epis=$g(epis)
s ImageClass=$g(ImageClass)
s fileName=$g(fileName)
i fileName["-1^" d Trace^MI.MIF000(mi,"路径:"_fileName_"不正常","H<--M")
i fileName["-1^" q "-1^可能的非法路径"
i $l(fileName)>300 q "-1^可能的非法路径"
s ret="1"
i '$d(^dbo.BTMIMachineParameterD(mi)) q "-1^仪器不存在"
d Trace^MI.MIF000(mi,epis_":"_ImageClass_":"_fileName,"H<--M")
s (ReceiveDate, ImageOrder, Caption, DisplayRatio, Height, Width, Sequence)=""
s ret=##Class(MI.Common.MachineResult).SaveImage(ReceiveDate, epis, ImageClass, ImageOrder, fileName, mi, Caption, DisplayRatio, Height, Width, Sequence)
q ret
}
/// 得到直方图(有bug和需求公共修复)
/// retType:反回类型,可为BASE64或空
/// fileName:返回类型不是BASE64串时指定的上传ftp的文件名(*返回类型不是BASE64时必填)
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名(*返回类型不是BASE64时必填)
/// imgWidth:图片宽度(*必填)
/// imgHeight:图片高度(*必填)
/// values:结果值,多个以逗号分隔(*必填)
/// lable:左上角的标题文本
/// title:上面中间的标题文本
/// xShow:x坐标显示的字符 格式:x的位置#显示的文本 如:5#5,10#10,15#15,20#20,24#pL
/// yShow:y坐标显示的字符 格式:y的位置#显示的文本 如:0#0,15#15,30#30,45#45,60#60,75#mol/L
/// s ret=("","","ZLZ",320,160,"12,13,3,22,60,60,80,12,12,13,14,15,16,17,18,19,20,20,21,22,22.1,22,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,23.6,23.7,23.8,23.9,24,24.1,24.2,24.3","PLT","直方图","5#5,10#10,15#15,20#20,24#pL","0#0,15#15,30#30,45#45,60#60,75#mol/L")
Method GetHistogram(retType As %String, fileName As %String, ftpFfolderName As %String, imgWidth As %String, imgHeight As %String, values As %String, lable As %String, title As %String, xShow As %String, yShow As %String) As %String
{
s retType=$g(retType)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
s imgWidth=$g(imgWidth)
s imgHeight=$g(imgHeight)
s values=$g(values)
s lable=$g(lable)
s title=$g(title)
s xShow=$g(xShow)
s yShow=$g(yShow)
s xPianYi=40
s yPianYi=40
//最大值
s maxVal=0
//最大点数
s pointNum=0
//找y轴的最大值
i $l(yShow) d
.f j=1:1:$l(yShow,",") d
..s OneYShow=$p(yShow,",",j)
..i '$l(OneYShow) q
..s yNum=$p(OneYShow,"#",1)
..s yStr=$p(OneYShow,"#",2)
..i '$l(yNum) q
..i '$l(yStr) q
..i yNum>maxVal s maxVal=yNum
//找结果的最大值
f i=1:1:$l(values,",") d
.s val=$p(values,",",i)
.i '$l(val) q
.i '$ISVALIDNUM(val) q
.s pointNum=pointNum+1
.i val>maxVal s maxVal=val
//找x的最大值
i $l(xShow) d
.f j=1:1:$l(xShow,",") d
..s OneXShow=$p(xShow,",",j)
..i '$l(OneXShow) q
..s xNum=$p(OneXShow,"#",1)
..s xStr=$p(OneXShow,"#",2)
..i '$l(xNum) q
..i '$l(xStr) q
..i xNum>pointNum s pointNum=xNum
s xXiShu=(imgWidth-10)/pointNum
s yXiShu=(imgHeight-20)/maxVal
//画纵坐标
s retDraw=..DrawLine(xPianYi,imgHeight,xPianYi,5,1,"","")
//画左上角名称
i $l(lable) s retDraw=..DrawLabel(xPianYi,10,lable,"","","","Right")
//画x坐标要显示的东西
i $l(yShow) d
.f j=1:1:$l(yShow,",") d
..s OneYShow=$p(yShow,",",j)
..i '$l(OneYShow) q
..s yNum=$p(OneYShow,"#",1)
..s yStr=$p(OneYShow,"#",2)
..i '$l(yNum) q
..i '$l(yStr) q
..s curY=(imgHeight-(yXiShu*yNum))
..//换x坐标轴的文字
..s retDraw=..DrawLabel(xPianYi,curY,yStr,"","","","Right")
..s retDraw=..DrawLine(xPianYi-1,curY,xPianYi+1,curY,1,"","")
//画横坐标
s retDraw=..DrawLine(xPianYi,imgHeight,xPianYi+imgWidth-5,imgHeight,1,"","")
//画顶部中间的标题
i $l(title) s retDraw=..DrawLabel(xPianYi+imgWidth/2,10,title,"","","","Center")
//画x坐标要显示的东西
i $l(xShow) d
.f j=1:1:$l(xShow,",") d
..s OneXShow=$p(xShow,",",j)
..i '$l(OneXShow) q
..s xNum=$p(OneXShow,"#",1)
..s xStr=$p(OneXShow,"#",2)
..i '$l(xNum) q
..i '$l(xStr) q
..s curX=xPianYi+(xNum*xXiShu)
..//换x坐标轴的文字
..s retDraw=..DrawLabel(curX,imgHeight+10,xStr,"","","","Center")
..s retDraw=..DrawLine(curX,imgHeight+1,curX,imgHeight-1,1,"","")
//画连线
s preX=""
s preY=""
s pointNum=0
f i=1:1:$l(values,",") d
.s val=$p(values,",",i)
.i '$l(val) q
.i '$ISVALIDNUM(val) q
.s pointNum=pointNum+1
.s curX=xPianYi+(pointNum*xXiShu)
.s curY=(imgHeight-(yXiShu*val))
.s curX=$fn(curX,"",0)
.s curY=$fn(curY,"",0)
.i $l(preX) d
..s retDraw=..DrawLine(preX,preY,curX,curY,1,"","")
.s preX=curX
.s preY=curY
s ret=..Save(imgWidth+xPianYi,imgHeight+yPianYi,retType,fileName,ftpFfolderName,"")
q ret
}
/// 从FTP地址获取图片。如:西门子2120的图在ftp上获取,把目标ftp的图片转到仪器目录下或者得到BASE64串
/// originFTP:源图的FTP全地址,带密码
/// retType:反回类型,可为BASE64或空
/// fileName:返回类型不是BASE64串时指定的上传ftp的文件名
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名
/// w ##Class().GetFTPImgMTHD("ftp://lis:lis@127.0.0.1/MCImage/","","","zlz")
ClassMethod GetFTPImgMTHD(originFTP As %String, retType As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s originFTP=$g(originFTP)
s retType=$g(retType)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
i '$l(fileName) s fileName=""
i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
s otherPara=retType_"-GETFTP#"_fileName_"#"_ftpFfolderName
s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
s charStream=##class(%GlobalCharacterStream).%New()
d charStream.Write(originFTP)
s ret=retObj.DealStream(charStream,otherPara,"",",")
q ret
}
/// 通过BASE64位串获取图片。如:迈瑞BC5800的散点图,把仪器图片串转到仪器目录下或者得到BASE64串
/// base64Str:图片的base64串
/// retType:反回类型,可为BASE64或空
/// fileName:返回类型不是BASE64串时指定的上传ftp的文件名
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名
/// w ##Class().GetFTPImgMTHD("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","","","zlz")
ClassMethod GetImgByBase64MTHD(base64Str As %String, retType As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s base64Str=$g(base64Str)
s retType=$g(retType)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
i '$l(fileName) s fileName=""
i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
s otherPara=retType_"-BASE64GETIMAGE#"_fileName_"#"_ftpFfolderName
s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
s charStream=##class(%GlobalCharacterStream).%New()
d charStream.Write(base64Str)
s ret=retObj.DealStream(charStream,otherPara,"",",")
q ret
}
/// 通过BASE64位串获取图片。如:迈瑞BC5800的散点图,把仪器图片串转到仪器目录下或者得到BASE64串
/// base64Str:图片的base64的字符流
/// retType:反回类型,可为BASE64或空
/// fileName:返回类型不是BASE64串时指定的上传ftp的文件名
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名
/// w ##Class().GetFTPImgMTHD(base64串格式的字符流,"","","zlz")
ClassMethod GetImgByBase64StreamMTHD(base64Stream As %String, retType As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s base64Stream=$g(base64Stream)
s retType=$g(retType)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
i '$l(fileName) s fileName=""
i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
s otherPara=retType_"-BASE64GETIMAGE#"_fileName_"#"_ftpFfolderName
s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
s ret=retObj.DealStream(base64Stream,otherPara,"",",")
q ret
}
/// 通过BASE64位串获取文件。如:迈瑞BC5800的散点图,把仪器图片串转到仪器目录下或者得到BASE64串
/// base64Str:文件的base64的字符流
/// fileName:指定的上传ftp的文件名称,带后缀
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名
/// w ##Class().GetFileByBase64StreamMTHD(base64串格式的字符流,"","","zlz")
ClassMethod GetFileByBase64StreamMTHD(base64Stream As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s base64Stream=$g(base64Stream)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
i '$l(fileName) s fileName=""
i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
s otherPara="FILE-BASE64GETFILE#"_fileName_"#"_ftpFfolderName
s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
s ret=retObj.DealStream(base64Stream,otherPara,"",",")
q ret
}
/// 通过BASE64位串获取文件。如:迈瑞BC5800的散点图,把仪器图片串转到仪器目录下或者得到BASE64串
/// bitStream:文件的比特的字符流
/// fileName:指定的上传ftp的文件名称,带后缀
/// ftpFfolderName:返回类型不是BASE64串时指定的上传ftp的文件夹目录名
/// w ##Class().GetFTPImgMTHD(比特串格式的字符流,"","","zlz")
ClassMethod GetFileByBitStreamMTHD(bitStream As %String, fileName As %String, ftpFfolderName As %String, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s bitStream=$g(bitStream)
s fileName=$g(fileName)
s ftpFfolderName=$g(ftpFfolderName)
i '$l(fileName) s fileName=""
i '$l(ftpFfolderName) s ftpFfolderName="UnKnown"
s otherPara="FILE-BITGETFILE#"_fileName_"#"_ftpFfolderName
s retObj=##Class(wbsLisMsgAsyncHandler.LISMsg.wbsLisDealCharStreamAsyncHandler).%New()
s ret=retObj.DealStream(bitStream,otherPara,"",",")
q ret
}
/// Creator: 查询绘图元素数据
/// CreatDate: 20191012
/// Description: 查询绘图元素数据
/// Table:
/// Input:
/// Output:
/// Return:
/// Others:
Query QryDrawElement(imgHander As %String, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %Query(ROWSPEC = "PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle")
{
}
/// Query的执行方法
/// d ##class(%ResultSet).RunQuery("","QryMachineTestCodeLeave","32","668","2018-09-01","2018-09-30","60116","")
ClassMethod QryDrawElementExecute(ByRef qHandle As %Binary, imgHander As %String, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %Status
{
//得到入参医院编码
s imgHander=$g(imgHander)
Set repid=$I(^CacheTemp)
If $Get(ind)="" Set ind=1
//没有图片句柄退出,退出
i '$l(imgHander) q $$$OK
s CurDay="" f s CurDay=$o(^LISImageElement("LISDrawBase",CurDay)) q:CurDay="" d
.//删除两天前的数据
.i ($p($h,",",1)-CurDay)>2 k ^LISImageElement("LISDrawBase",CurDay) q
.i $d(^LISImageElement("LISDrawBase",CurDay,imgHander)) d
..s index="" f s index=$o(^LISImageElement("LISDrawBase",CurDay,imgHander,index)) q:index="" d
...s Data=^LISImageElement("LISDrawBase",CurDay,imgHander,index)
...d Output
.k ^LISImageElement("LISDrawBase",CurDay,imgHander)
Set qHandle=$lb(0,repid,0)
Quit $$$OK
Output
Set ColFields ="PrintType,PrintX,PrintY,PrintFont,PrintFontSize,PrintFontStyle,PrintLength,PrintWidth,PrintHeight,PrintText,DataField,PrintFlag,PrintAlignment,PrintImageFile,PrintColor,Angle"
Set ^CacheTemp(repid,ind)=##Class(LIS.Util.Common).TransListNull(Data,ColFields)
Set ind=ind+1
quit
}
ClassMethod QryDrawElementClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = QryDrawElementExecute ]
{
Set repid=$LIST(qHandle,2)
Kill ^CacheTemp(repid)
Quit $$$OK
}
ClassMethod QryDrawElementFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = QryDrawElementExecute ]
{
Set AtEnd=$LIST(qHandle,1)
Set repid=$LIST(qHandle,2)
Set ind=$LIST(qHandle,3)
Set ind=$o(^CacheTemp(repid,ind))
If ind="" {
Set AtEnd=1
Set Row=""
}
Else {
Set Row=^CacheTemp(repid,ind)
}
// Save QHandle
s qHandle=$lb(AtEnd,repid,ind)
Quit $$$OK
}
// w ##class().GetFtpMTHD("Sebia")
// 文件夹目录名称
ClassMethod GetFtpMTHD(directName, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
s directName=$g(directName)
s FtpData=##class(OTH.SYSParameter).GetDataValue("LABReportImageFTP","HOS","1")
s Ftp=$p(FtpData,"@",2)
s User=$p($p($p(FtpData,"@",1),":",2),"/",3)
s Password=$p($p(FtpData,"@",1),":",3)
s FilePath="/"_directName_"/"_$tr($zd($h,3),"-")_"/"
q Ftp_"^"_User_"^"_Password_"^"_FilePath
}
}
测试代码
s imgObj=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).%New()
//得到直方图
s ret=imgObj.GetHistogram("","","ZLZ",320,160,"12,13,3,22,60,60,80,12,12,13,14,15,16,17,18,19,20,20,21,22,22.1,22,22.2,22.3,22.4,22.5,22.6,22.7,22.8,22.9,23,23.1,23.2,23.3,23.4,23.5,23.6,23.7,23.8,23.9,24,24.1,24.2,24.3","PLT","直方图","5#5,10#10,15#15,20#20,24#pL","0#0,15#15,30#30,45#45,60#60,75#mol/L")
//文本
s ret=imgObj.DrawLabel(10,10,"测试文本")
s ret=imgObj.DrawLabel(40,40,"画文本")
//选中的复选框
s ret=imgObj.DrawCheckBox(60,60,"1")
//没选中的复选框
s ret=imgObj.DrawCheckBox(90,60,"0")
//线
s ret=imgObj.DrawLine(150,0,150,300,2)
s ret=imgObj.DrawLine(0,150,300,150,1,1,"red")
//条码
s ret=imgObj.DrawBarCode(140,40,"1035891934")
//点
s ret=imgObj.DrawPoint(140,90,4,4)
s ret=imgObj.DrawPoint(180,90,4,4,"[]","red")
//多边形
s ret=imgObj.DrawPoly("100@100^290@200^150@150","red")
//画图
s ret=imgObj.DrawGraph(200,200,100,100,"ftp://lis:lis@127.0.0.1/MCImage/")
set ret=imgObj.Save(300,300,"","","ZLZ","")
set ret=imgObj.Save(300,300,"BASE64","","ZLZ","")
//保存图片路径到仪器
s ret=imgObj.SaveToMachine(ret,16,"999","P")
//从FTP地址获取图片。如:西门子2120的图在ftp上获取
s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFTPImgMTHD("ftp://lis:lis@127.0.0.1/MCImage/","","","zlz")
//把Base64串处理成图片存到ftp上
s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetImgByBase64MTHD("/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiub8XaxqWkxWQ0ufTVnuLiGBo7tWZgsk8UXmqqsC4UyAFcj76ncMbXAOkory+y+IOqXsFtCxgMlxd2jx3MMHk/uHfTiUaNnk+YrfMpIbjbxycjoF8VSRaZpX2S+0q9mu5ZreNtWum02aZ45PL2iIxMWkB+VgFX5uQoDAAA7CivP9L8SeKbbwDpuvXllY3zXMVvLO8moGIRRukS+adtvhVyXkcHIQBiGIwF0NM1bxZDq1pomo6dpVzN5TTXF3DqLkxxCQKpdRbgeYwJx91XMUhGwDAAOworzvxF4z8Q6Jq2j2txZaNb+bcEzqmozSKIvJmIMrfZf3Sbk3b/APpk38Kuy9xpsmpS27NqlpaW0+/Cpa3LTqVwOSzRoQc54x2HPPABcooooAKKKKACiiigAooooAKKKKAOD+LU81v4TtHglkiY6paqWRipwX5HFd5Xn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5/xVplxqkFisNlBcra3cV4odwsgljdTHtYghFzku4ywQMqqxcbegooA8zh8CT6bYackNrd3F9a3tnA8izRCFoI3si0+CQwGyyT5eWDs4G5dr1qWWg+IPN0sGKxtYbLxBf37PJM0jvBI0+zCKAAzCdur/AC4UkMSUHcUUAcXpNrr+l+HF8OXOhWmoxW6CwtpXnVLea2SCNd8+dzgufMG1Y2AI2nj5zc0vT9U8P3gWS2/tZLnyo5L9JsTx4GArLKxzCnzkEOX+flXcvI/UUUAef6v4Q8QXWq2M4vtKvVkuy9291prPhDazx7WHngNCDKyrGAMeZuYsd7P2GjWV5p2nJa3l/wDbWjwElKFW24HBJZi2DnBJLbdoYswLtoUUAFFFFABRRRQAUUUUAFFFFABRRRQB5/8AGD/kULP/ALCtp/6Mr0CvP/jB/wAihZ/9hW0/9GV6BQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXiHj5BP4g8QyrpcFxNaRXkwlj06xkceTaWLIZWnQlo1M0mdpL/MAOAAAD2+ivI/B+mtB4svdLtoZNGlCXSeethYR3aKi6fIoZoYzGRmaTjB4YZ5UYuWFpq/+jCHxVqqeIr27W21KJYbTy1MGPOmKeRlVMe0I5GWEtsG4K4APUKK83+JUN/ZeFNQhi8QarcTXOnzr9k22ojMccBMskhEBcKQMEqQN8qKCgYFek8KreTJLcXmtalczwu9tcWV0LfbDKrDJBjhjYgjDKTjcjq20ZGADpKKKKACiiigAooooAKKK5/x3/wAk88Tf9gq6/wDRTUAc/wDGD/kULP8A7Ctp/wCjK9Ar5g8Zf8kVtv8AsK6b/wCmiGu/l/5KH48/7Cvhv/0bFQB7BRXn/wDzO/8A3Nf/ALha5/xD/wAgPwn/ANlAf/0tuqAPYKK+QP8AmSP+5U/9zVdB4N/5Adz/ANk/1L/0tmoA+n6K8A8Jf8jP8Rf+xr03/wBOTVv3n/JetG/7Ct//AOmu0oA9gorwDxf/AMiR4+/7Zf8Ap6vqPh//AM0d/wC41/7NQB7/AEV8wJ/yHPiP/wBhW9/9ItUr3/wJ/wAk88M/9gq1/wDRS0AdBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXH6x8O9O1vU7q9ubyf/AEiXzjC9pZzoj+XHGSvnQOy5WJM89q7CigDi9O8BSaBerd6Lq0cTpbzRJFcabAIlaR4Sz7bdYcnbCF5J/hORghtT/hGZYf8ASrXWr5dW/jvZgj+eo+7HJGFVPLB7IEYZcqymRy3QVFc3MFnay3NzMkMESl5JJGwqKOSSewoA5zXPBVr4g0m9iurmeLUry0aCW7tp54kLGPaMxCTDRg5YRsSo3P3didTTfD+n6VcNcW32tp2TY0lxezTsy5BAJkdiQCDtB+7ufGN7Zzf+Fi+C/wDoadI/8C0/xq5ceK9HtxpJF2Jxq0whsvs6mTzT1LDH8IHJboKANqiiqGq61peh2y3Oq6hbWULNsWS4kCAt1wCe/BoAv0VzP/CxfBf/AENOkf8AgWn+Nauk69pGvRSS6TqVrfJEQrtbyhwpPTOOlAGjRRRQAVz/AI7/AOSeeJv+wVdf+imroKzPElnFqPhbV7Ge7S0hubKaGS5cDbCrIQXOSOADnqOnWgD5z8Zf8kVtv+wrpv8A6aIa7+X/AJKH48/7Cvhv/wBGxVi/Ejwva6Z8OtM0ZNWM73Wo2UsUi2rYKJax2uTgkAHaH5I67ecZrtX0fTm1vxVrY1K6YXd9pk0kCaZMzxm1kUgIAN0quUI3IMDnrg0AS/8AM7/9zX/7ha5/xD/yA/Cf/ZQH/wDS26rrvs+n/wDCTx3DX1wkkmo/2uEksJVQD7D9n8tpCNqtgGTBw2ONveqFxoem6zpOiIustbC08THU0FzZvDJLI00swg8uQqwOJfvYOQu7GDwAeA/8yR/3Kn/uaroPBv8AyA7n/sn+pf8ApbNXWt8KdPTS7vR28TTh7XRzYySf2RJhgL37UXT5sSEZCFUJIJHf5a1NC+HFhpmkQD/hJCyX+h3Ph+AyWDRMXmmll3FGbcGXLAoQD8pJI6UAc94S/wCRn+Iv/Y16b/6cmrfvP+S9aN/2Fb//ANNdpXQaT8Mv7L1TxHe/2v5v9s6rbals+zbfJ8m5M+zO87s5254x1welaE3gXzfHtn4n/tHH2a7nufs3kfe821ht9u7dxjyd2cc7scYyQDzDxf8A8iR4+/7Zf+nq+o+H/wDzR3/uNf8As1d/rHwy/tXQ9f03+1/K/tfb+8+zbvK23s9103jd/r9nUfdz3wDw/wDDL+wv+EO/4m/n/wDCN/bf+Xbb9o+0Z/2zs2598+1AHkCf8hz4j/8AYVvf/SLVK9/8Cf8AJPPDP/YKtf8A0UtcePg/i+8SXP8Abv8AyGrua52/ZP8AU+ZDdRbc7/mx9qznjOzHfI9A0LTP7E8PaZpPned9htIrbzdu3fsQLuxk4zjOMmgDQooooAKKKKACiiigAooooAKKKKACiiigAooooAK5n4i/8k38Sf8AYOm/9ANdNWL4w0y51nwbrOmWYU3N1ZyxRBjgFmUgc9qAKeqeN9N0LxA+mawsljEbU3MF5LjypwoJdAf7ygZweTn6Z5nwxcNqPiqy8U63BIt5rfmQaNauv/HpaIhcufR3ABOOeQOmava0+r+IrJLPV/hwby3SRZVSTU4MBlOQeD/+sEg8Gp4ovEOt+LtDvb3w9/ZVppnnuzveRy798ewKAn1zzQB29cz4k/5Gnwd/2EZv/SOeumrmvFlrqjXehalpen/b5NOvHlktxMsRZWglj4ZuOC4NAHS1yWhf8lG8Xf8AXOx/9Aej/hIvFn/QjTf+DSD/ABp3haz1c6/r2s6rpo077f8AZ0itzOsrARqwJJXjnd+lAHV0UUUAFRzrK1vIsDokxUhHdC6q2OCQCMj2yPqKkopNXVgPKPijpV5a+EdFea9hleG8tLefZblFlAkG0qC5KY5zy2c9q7CbwveXFtqkdzqFpdm9lVkS8sjNEEU8K8bSYbj+4YxkZ25JzjfGD/kULP8A7Ctp/wCjK9ApvUDnF8LuNTtrlrm2eGG2EDIbU+Y+EK7S4fHl8k7CpIJOGGaisPC99pmjm2ttThN5LeLdXFxPBLMr7duFUPMXHCIMs7dDxjAHUUU79f67gc5/wjEy63qOqRagIpp4WitQqSFYC20sxVpCpJZQTsEeec5OGFObwbqDpojQ+IZIZtOlDy5tllSdd25gPMLSKx4G7exx1yea6+il28geu4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVjXHi7w3aan/Ztzr2mw327aYJLpA4PYEE8H2pvjG6vrLwVrd1pu77bDYzPCV6qwQ8j3HUe4r4cZmdizEszHJJOSTQB9ffGD/kULP8A7Ctp/wCjK9ArwGG81C9/Z+8Oyagzs66rBHE79WjWYhfyAwPYCvfqACobu7t7G0kurqVYoIhud26KKmrnfHf/ACI2r/8AXA/zFTOXLFs2w1JVa0Kb2bS+9h/wnfhf/oN2v5n/AArX0/UrLVrQXVhcJcQElQ6dMjrXyvXvfwn/AORHj/6+JP51xYbFyqz5Wj6bOuH6GX4b21OTbulrbz8juKKKK7z5MKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAr3t4lhbNcypI0KcyNGu4oP7xA5IHtmltLy2v7ZLm0njnhcZWSNgwP4ip6828V+G9U8OXMviHwlNJApO+7s4xlD6sF6Eeo7dRWVScoLmSujuwWHpYmXspS5ZPZvZ+T7ep6TRXm3hz4t2F9st9biFlOePOTJiY+/df1HvXo0M0VxCk0EqSxOMq6MGVh6ginTqwqK8WTjMBicHPlrxt+T9GPrz+6+CvgW71U376QUZm3tBFMyRE/7oPA9hgV6BRWhxnnfxYt4bTwPp1tbRJDBFqdmkccahVRQ4AAA6AV6JXn/xg/5FCz/7Ctp/6Mr0CgAqpqWn2+rabPYXQYwTrscKcHH1q3RSaTVmVGThJSi7NHD/APCp/C//ADyuv+/5rp9D0Sy8PaaLCwVxAGLgO245PXmtGiojShB3irHVXzDFYiPJWqOS82FFFFaHGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHkfxE+Hezzdb0SH5OXubVB09XUenqPxrgdB8Vax4cm36ddssZOWhf5o2+q/wBRg19NV5H8RPh3s83W9Eh+Tl7m1QdPV1Hp6j8a83E4ZxftaR9rkmd060FgsdZp6Jv8n+jN3w38VdJ1XZBqgGnXR43McxMf97+H8fzrvlZXQOjBlYZBByCK+Ta6Dw9401rw04WzuS9tnLW03zRn6Dt+GKijj2tKh05jwnCd54N2fZ7fJ9Pnc9T+MH/IoWf/AGFbT/0ZXoFeJeMPHtj4s8J2lqsElvfpqNrI8R+ZSocZIb0HvivbeoyK9KFSM1eLufFYnCV8LP2deLi/627hRRRVnMFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHkfxE+Hezzdb0SH5OXubVB09XUenqPxryivrOvI/iJ8O9nm63okPycvc2qDp6uo9PUfjXmYvCfbh9x9zw/wAQXthcU/R/o/0Z5RXU+HPH2t+HCsUc32mzH/LtOSQB/snqv4ce1ctRXnQnKDvF2PscRhqWIh7OtFSXmfQ/hv4h6J4h2Q+b9jvW4+zzkDcf9lujfz9q6yvkyuy8N/EnW9B2QzP9vs148qdjuUf7LdR+OR7V6NHH9Kn3nxuY8JPWeDf/AG6/0f8An959A0Vzfh3xxoniRVS2uPJuiObab5X/AA7N+FdJXoxnGavF3Pja+Hq0JunVi4vzCiiiqMQooooAKKKKACiiigAooooAKKKKACiiigDO/tq1/wCeV/8A6zy/+QfP1/746f7XT3o/tq1/55X/APrPL/5B8/X/AL46f7XT3rRoqfeNb0v5X96/yM7+2rX/AJ5X/wDrPL/5B8/X/vjp/tdPej+2rX/nlf8A+s8v/kHz9f8Avjp/tdPetGij3gvS/lf3r/Izv7atf+eV/wD6zy/+QfP1/wC+On+1096P7atf+eV//rPL/wCQfP1/746f7XT3rRoo94L0v5X96/yM7+2rX/nlf/6zy/8AkHz9f++On+1096P7atf+eV//AKzy/wDkHz9f++On+10960aKPeC9L+V/ev8AIzv7atf+eV//AKzy/wDkHz9f++On+1096P7atf8Anlf/AOs8v/kHz9f++On+10960aKPeC9L+V/ev8jO/tq1/wCeV/8A6zy/+QfP1/746f7XT3o/tq1/55X/APrPL/5B8/X/AL46f7XT3rRoo94L0v5X96/yM7+2rX/nlf8A+s8v/kHz9f8Avjp/tdPej+2rX/nlf/6zy/8AkHz9f++On+10960aKPeC9L+V/ev8jO/tq1/55X/+s8v/AJB8/X/vjp/tdPej+2rX/nlf/wCs8v8A5B8/X/vjp/tdPetGij3gvS/lf3r/ACM7+2rX/nlf/wCs8v8A5B8/X/vjp/tdPej+2rX/AJ5X/wDrPL/5B8/X/vjp/tdPetGij3gvS/lf3r/I8O+JHh3TrV/7Z0tJ4EmuBDNBJayRL5h6FCygYJ4wO54rgJYpIJWiljaORThldcEfUV7h8YP+RQs/+wraf+jK7DU9D0vWYvL1GxguRjALp8y/Ruo/A1w1sCpvmi7H1WX8VSw8FSrRckut9fy1PlyivZtY+Dmnz7pNIvZLV+oimHmJ9Aeo/WvP9Y8AeI9F3NNYNPCv/La2/eL9cDkD6gVwVMNVp7o+sweeYHFaQnZ9no/+D8jmgSrBlJBByCO1d14b+KWsaPsg1DOo2g4/eN+9Uezd/wAc/UVwhBBwRgiis4VJ03eLsdmKwdDFw5K8VJf1s+h9HaT490DWUjFpPO074BtxbSNIv1Cg8e/T3rU/tq1/55X/APrPL/5B8/X/AL46f7XT3r5fjkkhkWSJ2SRTlWU4IPsa9D8N/FnUtO2W+sIb+3HHmjiVR9ejfjg+9ejSx99J6Hx2P4U9mufC3l5NpP5aanrv9tWv/PK//wBZ5f8AyD5+v/fHT/a6e9H9tWv/ADyv/wDWeX/yD5+v/fHT/a6e9R6J4k0nxDb+bpt2kpAy8Z4dPqp5/HpWrXem5K6Z8lUhGlJwqQaa6N/8Azv7atf+eV//AKzy/wDkHz9f++On+1096P7atf8Anlf/AOs8v/kHz9f++On+10960aKfvGd6X8r+9f5Gd/bVr/zyv/8AWeX/AMg+fr/3x0/2unvR/bVr/wA8r/8A1nl/8g+fr/3x0/2unvWjRR7wXpfyv71/kZ39tWv/ADyv/wDWeX/yD5+v/fHT/a6e9H9tWv8Azyv/APWeX/yD5+v/AHx0/wBrp71o0Ue8F6X8r+9f5Gd/bVr/AM8r/wD1nl/8g+fr/wB8dP8Aa6e9H9tWv/PK/wD9Z5f/ACD5+v8A3x0/2unvWjRR7wXpfyv71/kZ39tWv/PK/wD9Z5f/ACD5+v8A3x0/2unvT49WtpN22O8G1ip3WUy8j0yvI9xxV6ij3gbpdE/v/wCAFFFFUZBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAef/ABg/5FCz/wCwraf+jK9Arz/4wf8AIoWf/YVtP/RlegUAFFFFAGLrHhPQtdDG/wBOheQ/8tVGyT/voYJ/GuA1j4Nfek0bUfpDdD/2dR/T8a9ZorGph6dT4kelhM3xuE0pVHbs9V9z/Q+ZtY8J67oRY3+nTJGP+WqjfH/30MgfjWLX1mRkYPSuZ1jwB4c1rc01gsEzf8trb9231wOCfqDXDUy97wf3n1GE4wi9MVC3nH/J/wCZ8721zPZ3CXFtNJDMhyskbFWB9iK9J8N/F26ttlvr0Juoun2iIASD6jo36fjSax8HNQg3SaRex3SdRFMPLf6A9D+lcFqeh6po0vl6jYT2xzgF0+U/Ruh/A1zJV8O77fke3KWV5xDlbUn90l+v6H0ppOt6brlqLjTbyO4j77T8y+xB5H41fr5VsdQvNMulubG5lt5l6PG2D/8AXHtXp/hv4vsNlv4gg3Dp9rgXn/gSf1H5V3UcdCWk9GfLZjwrXo3nhnzx7df+D/Wh63RVXT9SstVtFurC6iuIW/jjbOPY+h9jVqu5NNXR8rKMotxkrNBRRRTJCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8/wDjB/yKFn/2FbT/ANGV6BXn/wAYP+RQs/8AsK2n/oyvQKACiiigAooooAKKKKACmSxRzxNFLGskbDDK65B+op9FAJ21RxmsfDDw5qm54bdrCY/xWxwv/fJ4x9MV5/rHwk1yx3Pp8kOoRDoFPlyf98nj8jXudFc1TCUp9Leh7WE4gx+F0U+Zdpa/8H8T5hgudb8K6lujN1p10OqspXcPcHgj68V6Z4b+L0E2y31+DyH6faoQSh/3l6j8M/QV6VeWNpqEBgvbWG4iP8EqBh+tcPrHwk0O+3Pp8k2nynoFPmR/98nn8jXOsPWou9J3XY9eec5bmS5cdT5ZfzLX/g/KzO5tLy2v7ZLm0njnhcZWSNgwP4ip68SHhDxv4LuWutHka4izlvsrbg4/2oz1/AH610+gfFa0nlFn4gt2067B2mTafLz7g8r+OR71vDEq/LUXK/wPLxORy5XVwU1Vh5fEvVf16Ho1FMhmiuIUmglSWJxlXRgysPUEU+uo8Npp2YUUUUCCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP/jB/wAihZ/9hW0/9GV6BXn/AMYP+RQs/wDsK2n/AKMr0CgAooooAKKKKACiivn2Jgr8qGBB4P0oA+gqK8ADYKfexzkAcfiaRcNKqFgoJxk9qYH0BRXgat9oMMEMS7efmzjk/XgVVmXD4BzSA+hqK+dj060itjOeRjvQB9FVn6noel6zF5eo2MFyMYBdPmX6N1H4GvCpbuRrdIXO5VPyj0qpkdCBQ0mrMqE5wlzQdn5HrsXga40OZp/C+sTWQJy1pcjzYH9sdR9eTW1aatfRARazp5tpBx9ogbzYG98/eT/gQA968JEp8sqM4PJXjrj/AOuaRIXlf5QST6VnGmo/DodVXGzrr9+uZ99n9/X53Po9WDKGUgqRkEHg0tfNm08cHr6dKqXkoilVTHM/y5ygyO9apXONn09RRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/wCMH/IoWf8A2FbT/wBGV6BXn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigAr5+VOehzX0DXgZ+VuBkE8nPSgBrAgGqzZDVbIBOAfmA/HH+RUDoGzg+4/xouAxHKsvOC3bPenSKcZccHv61HyHAMeQBkNnv6Ypzy7+uQQMZFADOc4/IUEYw3bOBgdf880h6HOCPQjrS7+2OmaQEUjbULFGfHOE69akS2V0lbeoIGQpzk/SojkHihJcEkOoyMDB5pgRsCrMDwfQ09JzGjqrlVcYbB6inzwu6mcqQjNgN2PTP86r7SAKALCTkNg45BHIzx6/yqjcNmXqelTHkdAQT3qCZVL8bTjg4HSgD6cooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/wCMH/IoWf8A2FbT/wBGV6BXn/xg/wCRQs/+wraf+jK9AoAKKKKACiiigArwYKD3HUjFe814hG8f2RxtUSbgQe5/pj/GgCrHLGGDELNGSQQScehHFDLviZgygg8Z5pm1VwI1UJzkDjH+eaiYuEYxqJWH8BOM80WAjZCXxkc9icCmzwtbzSROQWQkHHIqTary4VQDnjPalkjKK5ZkID4XB5xQBW57nI9MUbQcZ7e9IxyPUH0NAOeM4oAI0MrKqkNvxtDcU+OIyxMy4ZEGTg9ulN4yOOT7UE9O2KABpCICuOBltq+tNbYBnaRgcnP9KXPpjilRN5PUgDkAUIGWtN0W51NZ3hX5YYy7nPQCsa6BWbHoOa04buax3JE7AHg89qzLp902SeSKBn01RRRQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8ihZ/8AYVtP/RlegV5/8YP+RQs/+wraf+jK9AoAKKKKACiiigArwNW3HHr1Fe+V8+Ru0b7hgc0AWZdkfyiRXcKCdoIyT9feqpJXr170jyfu8n73BH164pxAKFy4yDjbjk+9AEZwfm53DkH0OMUjdSc9OKbuyMHJzwe1E0+8LhFXaMfKOvufegBYzHvHmAkYOB057VCTzxRvXYzOcKOpJofo20hmXjGcc+lAD1BZcgdPWmE8YNO3D7pCnuDjkfjQqOyk7S2PTvQA0En60okYYI3KSPoR7U3Bx6H2FTLFvQtkAL78mgCs5LMeeSaqz/fB65FXCMEcdz0HSqs6jeoAwAvagD6booooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8ihZ/8AYVtP/RlegV5/8YP+RQs/+wraf+jK9AoAKKKKACiiigAr50Y/N/8AWr6Lr52RQznJwOpPpQAzccZwRmpJY2jRGOMOOMH3x/SmMDvIU4VeBkfrTdw2KCGGeAPfr+tMBQOM4zSyDe4UJgFcjHPTr/jTsqq5O4nGOOh/zxTY5fKBbIA5JJPTPvQBGoI4xn1qZlBjR2cAltpU9R0x+eafDGHkIJxnpnvUiwJsdmcbcAg9vakBWlRN+IyWXOASMVYtpJo4pFjLBHADAd+c4pI4N8uN2PfNTpuVNgZtmclefzouBVliZHIIqMAjAGQOgFXHtyGORjPJFN8nkkqdoBPA6UXAqbB24+gqpcx/vByRx2rYktih6fnVG5j/AHg+lFwPo2iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPP/AIwf8ihZ/wDYVtP/AEZXoFef/GD/AJFCz/7Ctp/6Mr0CgAooooAKKKKACvnQEA4PIHUV9F185YAUKM4HqaYDm+cgn1zTehpVB/xyafsyT7EYoAnt7KaVkRnHznIZyFzyfwx05qF4ikjKD0PUVLEu6dFdgikgFqva5a2tjdmO1uftCbQd46dOcUMEjOVgrjk7iCQAKfxJ8jZwfSoBL6ULJznle3XrSAvSI8LDcNpb5sH0PSlWQEMGOVbggnt6VSabKhF7ds09FcqX2/KD1x3pNDLwIJ2oVIJwo9B6e9SxGNJSkqgqeGFUkZh82M+2OtSRvGciVwjbcqDyCfTP+elAGi8JuFllAyqDOBxwTgVlXCfvB8h6elSpcsgZVbgnJFVrmQmQY9KVho+g6KKKokKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDz/4wf8AIoWf/YVtP/RlegV5/wDGD/kULP8A7Ctp/wCjK9AoAKKKKACiiigAr5zCkfXvxX0ZXznLMUjTCryOaaEx/IAwfrT43VJVYoGwc1Q+1yZPC/lSvduoXCryfT2oQXL8ke/y+5IyvGDRMFEQU7jLzxxjAx/jWaL6VWDDbkEVJJcndny4+v8AdoC48qQaBkHntUYnbyidq5PPeoftT56L+VKw7l/eDEAsYV1zlic7vSpxcyLbiESgRhg5TPBOMcj6ZrJN3J0wuMelMN0/J2pk4yccmnYLmyJPmY+YTlQNh6DGeR+dQ+Z39eazBdOeCF4OelO+1ybRwv5UCNNGJfHrxTJmJYEE9KpRX0sUoZVj4wQCuRxRNfS7xwnT0oC5/9k=","","","zlz")
s charStream=##class(%GlobalCharacterStream).%New()
d charStream.Write("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")
//通过base64串得到文件
s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBase64StreamMTHD(charStream,"","zlz")
//通过比特串得到文件
s charStreamBit=##class(%GlobalCharacterStream).%New()
d charStreamBit.Write("")
s ret=##Class(wbsLisMsgAsyncHandler.LISMsg.DHCLISImage).GetFileByBitStreamMTHD(charStreamBit,"","zlz")
q ret
绘图效果
这样就得到一个M的图片类,利用M脚本语言的调试修改优势提高仪器画图效率。
本次分享在遇到有处理不了的问题时可以考虑调用别的语言实现。把数据约定好实现代理模式来达到效果。