在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
using System; using System.Drawing; namespace Report { /// <summary> /// Chart 的摘要说明。 /// ================================================================================================== /// /// ClassName :Report.Chart /// Intro : /// Example : /// Ver :0.2 /// /// Author :ttyp /// Email :[email protected] /// Date :2007-7-30 /// ================================================================================================== /// </summary> public class Chart { public Chart(){} private string _data = ""; private int _width = 100; private int _height = 100; private int _padding= 8; private Color _grid_color = Color.FromArgb(0x93,0xbe,0xe2); private Color _border_color = Color.FromArgb(0x93,0xbe,0xe2); private Font _font = new Font("Arial",8); public Font Font { get { return _font;} set { _font = value;} } public Color BorderColor { get { return _border_color;} set { _border_color = value;} } public Color GridColor { get { return _grid_color;} set { _grid_color = value;} } public int Padding { get { return _padding;} set { _padding = Math.Max(0,value);} } public int Width { get { return _width;} set { _width = Math.Max(0,value);} } public int Height { get { return _height;} set { _height = Math.Max(0,value);} } public string Data { get { return _data;} set { _data = value;} } public void Render() { int width = this.Width; int height = this.Height; int padding = this.Padding; System.Drawing.Bitmap image = new System.Drawing.Bitmap(width,height); Graphics g = Graphics.FromImage(image); //清空图片背景色 g.Clear(Color.White); //虚线画笔 Pen dot = new Pen(this.GridColor); dot.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; //实线画笔 Pen solid = new Pen(this.BorderColor); //文字字体 Font font = this.Font; try { //冗余,去除最后的数据分割标记,防止空数据 if(this.Data.EndsWith(";")) { this.Data = this.Data.Substring(0,this.Data.Length-1); } string[] info = this.Data.Split(';'); //数据信息 if(info.Length>=2) { string[] lines = info[0].Split(','); //图例 string[] units = info[1].Split(','); //单位和标题格式,a,b,c,d a 纵坐标单位 b 纵坐标格式 N 数字 D 时间 后面是具体格式,c 横坐标单位 d 横坐标格式(同b) //曲线颜色表 Color[] color = new Color[]{Color.Blue,Color.Green,Color.Red,Color.Gray,Color.Black,Color.Magenta,Color.Cyan,Color.Yellow,Color.DeepPink,Color.BurlyWood,Color.DarkRed,Color.Gold}; //图例文字的大小 SizeF sFont = GetMaxSize(lines,g,font); //获得刻度文字高度 int textHeight = (int)(sFont.Height*3/2); //曲线点的个数 int points = info.Length-2; //得到曲线点数组集合 string[,] curve = new string[info.Length-2,lines.Length+1]; for(int i=0;i<points;i++) { string[] l = info[i+2].Split(','); int len = l.Length; for(int j=0;j<=lines.Length;j++) { if(j<len) { curve[i,j] = l[j]; } else { curve[i,j] = "N"; //非数据,不画线 } } } //获得最大,最小值 double maxY,minY,maxX,minX; GetMaxMin(curve,out maxY,out minY,out maxX,out minX); //冗余最大最小值 if(maxY==minY) { if(maxY==0) { maxY = 10; minY = -10; } else { if(maxY>0) { maxY = maxY*2; minY = 0; } else { maxY = 0; minY = maxY*2; } } } if(maxX==minX) { if(maxX==0) { maxX = 10; minX = -10; } else { if(maxX>0) { maxX = maxX*2; minY = 0; } else { maxX = 0; minX = maxX*2; } } } //获取坐标框的上下左右 float left = (padding*2+sFont.Height+2 + sFont.Width + padding+GetMaxSize(units[1],g,font).Width+padding); float bottom = height-padding-textHeight; float top = padding; float right = width -padding; //获取曲线框的宽度和高度(比坐标框略小) float yWidth = bottom-top-GetMaxSize(units[0],g,font).Height*3/2-padding; float xWidth = right-left-GetMaxSize(units[3],g,font).Width/2 - sFont.Width -padding; //--------------------------------------------------------------------------------- //获取最大行 int maxrow = (int)(yWidth/(sFont.Height/2*3)); maxrow = Math.Max(maxrow,1); //获取Y步进值 float stepYv = (float)((maxY-minY)/(maxrow)); if(units[1].Length>1) { //整数分割,调整最大行和最大最小值 if(units[1].Substring(0,1).ToLower()=="d") { maxY = Math.Ceiling(maxY); minY = Math.Floor(minY); stepYv = (float)Math.Ceiling((maxY-minY)/maxrow); maxrow = (int)((maxY-minY)/stepYv); } } float stepy = (float)((yWidth/(maxY-minY))*stepYv); //--------------------------------------------------------------------------------- //得到最大的网格列(最多10列) int maxcol = points; maxcol = Math.Min(points,maxcol); maxcol = Math.Max(maxcol,1); //获取X步进值 float stepXv = (float)((maxX-minX)/(maxcol)); if(units[3].Length>1) { //整数分割,调整最大和最小值,以及步进 if(units[3].Substring(0,1).ToLower()=="d") { maxX = Math.Ceiling(maxX); minX = Math.Floor(minX); stepXv = (float)Math.Ceiling((maxX-minX)/maxcol); maxcol = (int)((maxX-minX)/stepXv); } } //获得最大显示列数 int dispcol = (int)((xWidth)/(GetMaxSize(units[3].Substring(1),g,font).Width+padding)); dispcol = Math.Max(dispcol,1); //如果最大显示列小于最大列,则应该缩减 if(dispcol<maxcol) { stepXv = (float)Math.Ceiling((maxX-minX)/dispcol); maxcol = (int)((maxX-minX)/stepXv); } float stepx = (float)((xWidth/(maxX-minX))*stepXv); //获得最大的曲线数目 int maxline = color.Length; maxline = Math.Min(maxline,lines.Length); //画图例边框 g.DrawRectangle(solid, padding, (height-((sFont.Height+5)*maxline+2*padding))/2,padding*2+sFont.Height+2 + sFont.Width, (sFont.Height+5)*maxline+2*padding); //画图例 for(int i=0;i<maxline;i++) { SolidBrush fb = new SolidBrush(color[i]); SolidBrush bl = new SolidBrush(Color.Black); //画图例方框 g.FillRectangle(fb,padding*2, (height-((sFont.Height+5)*maxline+2*padding))/2+(sFont.Height+5)*i+padding,sFont.Height, sFont.Height); //画图例文字 g.DrawString(lines[i], font, bl, padding*2+sFont.Height+2,(height-((sFont.Height+5)*maxline+2*padding))/2+(sFont.Height+5)*i+padding); } //画坐标 g.DrawLine(solid,left,top,left,bottom); //Y g.DrawLine(solid,left,bottom,right,bottom); //X //画坐标箭头 g.DrawLine(solid,left,top,left-padding/3,top+padding/2); //Y箭头 g.DrawLine(solid,left,top,left+padding/3,top+padding/2); g.DrawLine(solid,right,bottom,right-padding/2,bottom-padding/3); //X箭头 g.DrawLine(solid,right,bottom,right-padding/2,bottom+padding/ |
请发表评论