当绘图遇上Caché之元数据代理

时间:2024-11-14 08:29:04

很久以前到沈阳实习的时候还一个个问度娘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("/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")
/// //Base64字符流的参数方法
/// s charStream=##class(%GlobalCharacterStream).%New()
/// d ("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")
/// 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("/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")
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("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","","","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脚本语言的调试修改优势提高仪器画图效率。

本次分享在遇到有处理不了的问题时可以考虑调用别的语言实现。把数据约定好实现代理模式来达到效果。