标签:style blog io color ar os 使用 for sp
/// <summary> /// 导出信令流程矢量图 /// </summary> /// <param name="signalFlowInfos">信令流程</param> /// <returns>路径</returns> public string ExportToImage(List<SignalFlowInfo> list) { List<SignalOpinion> signalOpinionList=GetSignalOpinion(); seriesOpinionOffsetDic = new Dictionary<string, int>(); seriesOpinionBrushDic = new Dictionary<string, Brush>(); string[] seriesNameArr = new string[signalOpinionList.Count]; for(int i=0;i<signalOpinionList.Count;i++) { seriesOpinionOffsetDic.Add(signalOpinionList[i].Name, 80 + itemWidth * i); seriesOpinionBrushDic.Add(signalOpinionList[i].Name, new SolidBrush(Color.FromArgb(signalOpinionList[i].ColorA,signalOpinionList[i].ColorR,signalOpinionList[i].ColorG,signalOpinionList[i].ColorB))); seriesNameArr[i] = signalOpinionList[i].Name; } int imgWidth = 80 + signalOpinionList.Count * itemWidth; Bitmap bmp = new Bitmap(imgWidth, (list.Count + 2) * itemHeight); Graphics gs = Graphics.FromImage(bmp); if (!Directory.Exists(TempFilesPath)) { Directory.CreateDirectory(TempFilesPath); } string fileName = "信令流程图" + System.Guid.NewGuid().ToString() + ".zip"; string filePath = TempFilesPath + "\\" + fileName; Metafile mf = null; Graphics g = null; try { mf = new Metafile(filePath, gs.GetHdc()); g = Graphics.FromImage(mf); DrawNew(g, list, seriesNameArr); g.Save(); } catch (Exception err) { WebLogLayout.Error(new List<string>() { "导出信令流程矢量图失败:" + err.Message }); //return ""; Exception e = new Exception("导出信令流程矢量图失败", err); throw e; } finally { if (g != null) g.Dispose(); if (mf != null) mf.Dispose(); } return fileName; } /// <summary> /// 画图 /// </summary> /// <param name="g">GDI+ 绘图图面</param> /// <param name="signalFlowInfos">数据对象集合</param> private void DrawNew(Graphics g, List<SignalFlowInfo> signalFlowInfos,string[] seriesNameArr ) { int imgWidth = 80 + seriesNameArr.Length * itemWidth;//画布宽 int imgHeight = (signalFlowInfos.Count + 2) * itemHeight;//画布高 Font fontTitle = new Font("宋体", 12, FontStyle.Bold); Font font = new Font("宋体", 9, FontStyle.Regular); #region 定义表头 Point cellLocation = new Point(5, 5); StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; Rectangle cellRect; Pen pen = new Pen(Brushes.Black, 1); ; for (int i = 0; i < seriesNameArr.Length; i++) { string name=seriesNameArr[i]; cellRect = new Rectangle(seriesOpinionOffsetDic[name] + (itemWidth-100)/2, 5, 100, 30);//100为矩形tIttle的宽度 //g.FillRectangle(seriesOpinionBrushDic[name], cellRect); CreateRoundRectangle.FillRoundRectangle(g, seriesOpinionBrushDic[name], cellRect, 5); pen.Brush = Brushes.Black; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;//画虚线 CreateRoundRectangle.DrawRoundRectangle(g, pen, cellRect, 5); g.DrawString(name, fontTitle, Brushes.Black, seriesOpinionOffsetDic[name] + itemWidth/2, 20, format); //pen = new Pen(seriesOpinionBrushDic[name], 2);//柱子颜色 pen.Brush = seriesOpinionBrushDic[name]; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;//画虚线 pen.DashPattern = new float[] { 3, 2 }; int xline=seriesOpinionOffsetDic[name] + itemWidth/2; g.DrawLine(pen, xline, 35, xline, imgHeight);//画柱子 } #endregion int hight = 35; Color colorTO = ColorTranslator.FromHtml("#008000");//向右方向颜色 Color colorFrom = ColorTranslator.FromHtml("#FFA500");//向左方向颜色 string fromX1Name; string toX2Name; int seriesOffsetTo; int seriesOffsetFrom; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;//画实线 for (int i = 0; i < signalFlowInfos.Count; i++) { #region 第一行 fromX1Name = signalFlowInfos[i].From; toX2Name = signalFlowInfos[i].To; seriesOffsetTo = seriesOpinionOffsetDic[toX2Name] + itemWidth / 2; seriesOffsetFrom = seriesOpinionOffsetDic[fromX1Name] + itemWidth / 2; cellRect = new Rectangle(6, hight + 1, imgWidth, itemHeight); format.Alignment = StringAlignment.Near; g.DrawString(signalFlowInfos[i].Time, font, Brushes.Black, cellRect, format); //连接线和箭头 pen.Width = 2; if (Array.IndexOf(seriesNameArr, fromX1Name) < Array.IndexOf(seriesNameArr, toX2Name))//画向右箭头 { pen.Color = colorTO; g.DrawLine(pen, seriesOffsetTo - 10, hight + itemHeight/2-5, seriesOffsetTo - 5, hight + itemHeight / 2);//线上 g.DrawLine(pen, seriesOffsetTo - 10, hight + itemHeight/2+5, seriesOffsetTo - 5, hight + itemHeight / 2);//线下 } else//画向左箭头 { pen.Color = colorFrom; g.DrawLine(pen, seriesOffsetTo + 5, hight + itemHeight / 2, seriesOffsetTo + 10, hight + itemHeight/2-5);//线上 g.DrawLine(pen, seriesOffsetTo + 5, hight + itemHeight / 2, seriesOffsetTo + 10, hight + itemHeight/2+5);//线下 } pen.Width = 1; g.DrawLine(pen, seriesOffsetFrom, hight + itemHeight / 2, seriesOffsetTo, hight + itemHeight/2); cellRect = new Rectangle(seriesOffsetFrom - 5, hight + itemHeight/2-5, 10, 10); g.FillEllipse(seriesOpinionBrushDic[fromX1Name], cellRect);//画圆 g.DrawEllipse(Pens.Black, cellRect);//画边框 cellRect = new Rectangle(seriesOffsetTo - 5, hight + itemHeight/2-5, 10, 10); g.FillEllipse(seriesOpinionBrushDic[toX2Name], cellRect); g.DrawEllipse(Pens.Black, cellRect); //写Message cellRect = new Rectangle(seriesOffsetFrom < seriesOffsetTo ? seriesOffsetFrom : seriesOffsetTo, hight, itemWidth - 10, itemHeight); format.Alignment = StringAlignment.Center; g.DrawString(signalFlowInfos[i].Message, font, Brushes.Black, cellRect, format); #endregion hight += itemHeight; } }
标签:style blog io color ar os 使用 for sp
原文地址:http://www.cnblogs.com/m7777/p/4073217.html