using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace vcsGRPARA_png { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //---------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //---------------------------------------------------------------------------- private void toolStripButton2_Click(object sender, EventArgs e) { string fnameW = ""; saveFileDialog1.Filter = "*.bmp|*.bmp|*.jpg|*.jpg|*.png|*.png|*.wmf|*.wmf|*.tif|*.tif|*.gif|*.gif"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { fnameW = saveFileDialog1.FileName; } switch (saveFileDialog1.FilterIndex) { case 1: pictureBox2.Image.Save(fnameW, System.Drawing.Imaging.ImageFormat.Bmp); break; case 2: pictureBox2.Image.Save(fnameW, System.Drawing.Imaging.ImageFormat.Jpeg); break; case 3: pictureBox2.Image.Save(fnameW, System.Drawing.Imaging.ImageFormat.Png); break; case 4: pictureBox2.Image.Save(fnameW, System.Drawing.Imaging.ImageFormat.Wmf); break; case 5: pictureBox2.Image.Save(fnameW, System.Drawing.Imaging.ImageFormat.Tiff); break; case 6: pictureBox2.Image.Save(fnameW, System.Drawing.Imaging.ImageFormat.Gif); break; } } //---------------------------------------------------------------------------- private void main_part() { //作図用変数宣言 int kpt=0; //拡大率 int HSIZE; //画像横寸法 int DHL; //画像左余白寸法:縦軸描画用 int DHR; //画像右余白寸法 int VSIZE; //画像縦寸法 int DVL; //画像下余白寸法:横軸描画用 int DVU; //画像上余白寸法 string sxjiku; //x軸名(単位含む) double xmin; //x軸最小値 double xmax; //x軸最大値 double dx; //x軸増分 string slogx; //x軸の種類(L:対数,N:普通) string syjiku; //y軸名(単位含む) double ymin; //y軸最小値 double ymax; //y軸最大値 double dy; //y軸増分 string slogy; //y軸の種類(L:対数,N:普通) int kxi0, kxf0, kyi0, kyf0; PictureBox thePicBox = pictureBox1; Bitmap bmp; Graphics g; //入力用変数宣言 System.IO.StreamReader sr; string dat; string[] sbuf; char delim=','; string fnameR=""; int nd; //データ組数−1 int md; //データ列数(yの列数)−1 int i, k; //データ読み込み openFileDialog1.InitialDirectory=System.IO.Directory.GetCurrentDirectory(); if(openFileDialog1.ShowDialog()==DialogResult.OK)fnameR=openFileDialog1.FileName; sr = new System.IO.StreamReader(fnameR, System.Text.Encoding.Default); dat = sr.ReadLine(); dat = sr.ReadLine();sbuf=dat.Split(delim);sxjiku = sbuf[0] ; syjiku = sbuf[1]; dat = sr.ReadLine();sbuf=dat.Split(delim);HSIZE = int.Parse(sbuf[0]) ; DHL = int.Parse(sbuf[1]) ; DHR = int.Parse(sbuf[2]); dat = sr.ReadLine();sbuf=dat.Split(delim);VSIZE = int.Parse(sbuf[0]) ; DVL = int.Parse(sbuf[1]) ; DVU = int.Parse(sbuf[2]); dat = sr.ReadLine();sbuf=dat.Split(delim);xmin = double.Parse(sbuf[0]) ; xmax = double.Parse(sbuf[1]) ; dx = double.Parse(sbuf[2]) ; slogx = sbuf[3]; dat = sr.ReadLine();sbuf=dat.Split(delim);ymin = double.Parse(sbuf[0]) ; ymax = double.Parse(sbuf[1]) ; dy = double.Parse(sbuf[2]) ; slogy = sbuf[3]; dat = sr.ReadLine();sbuf=dat.Split(delim);nd = int.Parse(sbuf[0]) - 1 ; md = int.Parse(sbuf[1]) - 1; //プロットデータ格納配列宣言 double[] datax =new double[nd+1]; //x値 double[,] datay =new double[md+1, nd+1]; //y値 int[] kind =new int[md+1]; //線種 string[] dname =new string[md+1]; //データ名(凡例名) for( k = 0 ;k<=md;k++){ dat = sr.ReadLine() ; sbuf = dat.Split(delim); kind[k] = int.Parse(sbuf[0]); } dat = sr.ReadLine() ; sbuf = dat.Split(delim); for( k = 0 ;k<=md;k++){ dname[k] = sbuf[k + 1]; } i = 0; while(!sr.EndOfStream){ dat = sr.ReadLine();sbuf = dat.Split(delim); datax[i] = double.Parse(sbuf[0]); for( k = 0 ;k<=md;k++){ datay[k, i] = double.Parse(sbuf[k + 1]); } i = i + 1; } sr.Close(); nd = i - 1; //プロット領域定義 kxi0 = DHL; kxf0 = HSIZE - DHR; kyi0 = DVU; kyf0 = VSIZE - DVL; //対数値処理 if( slogx == "L"){ for( i = 0 ;i<=nd;i++){ if( datax[i] < Math.Pow(10.0, xmin))datax[i] = Math.Pow(10.0, xmin); datax[i] = Math.Log10(datax[i]); } } if( slogy == "L"){ for( k = 0 ;k<=md;k++){ for( i = 0 ;i<=nd;i++){ if( datay[k, i] < Math.Pow(10.0, ymin))datay[k, i] = Math.Pow(10.0, ymin); datay[k, i] = Math.Log10(datay[k, i]); } } } for( i = 0 ;i<=1;i++){ switch(i){ case 0: //画面描画 kpt = 1; thePicBox = pictureBox1; thePicBox.Visible = true; break; case 1: //画像書き出し kpt = 2; thePicBox = pictureBox2; thePicBox.Visible = false; break; } thePicBox.Size = new Size(kpt * HSIZE, kpt * VSIZE); bmp = new Bitmap(thePicBox.Width, thePicBox.Height); thePicBox.Image = bmp; g = Graphics.FromImage(thePicBox.Image); g.FillRectangle(Brushes.White, 0, 0, thePicBox.Width, thePicBox.Height); PLOT(g, kpt, sxjiku, syjiku, xmin, xmax, dx, ymin, ymax, dy, kxi0, kxf0, kyi0, kyf0, nd, md, datax, datay, kind, dname, slogx, slogy); g.Dispose(); } pictureBox1.Left = 0; pictureBox1.Top = toolStrip1.Height; this.ClientSize = new Size(pictureBox1.Width, pictureBox1.Height + toolStrip1.Height); } //---------------------------------------------------------------------------- private void PLOT(Graphics g, int kpt, string sxjiku, string syjiku, double xmin, double xmax, double dx, double ymin, double ymax, double dy, int kxi0, int kxf0, int kyi0, int kyf0, int nd, int md, double[] datax, double[,] datay, int[] kind, string[] dname, string slogx, string slogy) { int i,k; int kxi,kxf,kyi,kyf; double xx,yy; int kxx,kyy,kxx1,kyy1,kxx2,kyy2; string str; int dc,ds; Font f=new Font("MS ゴシック", kpt * 10); System.Drawing.SizeF TextSize1; System.Drawing.SizeF TextSize2; Pen thePEN=new Pen(Color.Red, 1); int lhanrei; kxi = kpt * kxi0 ; kxf = kpt * kxf0 ; kyi = kpt * kyi0 ; kyf = kpt * kyf0; ds = kpt * 20; lhanrei = 0; for( k = 0 ;k<=md;k++){ str = dname[k]; TextSize2 = g.MeasureString(str, f); if(lhanrei < TextSize2.Width)lhanrei = (int)TextSize2.Width; } kxf = kxf - lhanrei - ds; //座標軸 System.Drawing.Pen LPen =new System.Drawing.Pen(System.Drawing.Color.Black); LPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; if(slogx == "N")DRN_XJIKU(g, f, LPen, kpt, xmin, xmax, dx, kxi, kxf, kyi, kyf); if(slogy == "N")DRN_YJIKU(g, f, LPen, kpt, ymin, ymax, dy, kxi, kxf, kyi, kyf); if(slogx == "L")DRL_XJIKU(g, f, LPen, kpt, xmin, xmax, kxi, kxf, kyi, kyf); if(slogy == "L")DRL_YJIKU(g, f, LPen, kpt, ymin, ymax, kxi, kxf, kyi, kyf); //枠線描画 g.DrawRectangle(new Pen(Color.Black, 2), kxi, kyi, kxf - kxi, kyf - kyi); //y軸名描画 str = syjiku; TextSize2 = g.MeasureString(str, f); TextSize1 = g.MeasureString("-1.0", f); kxx = (int)(kxi - kpt * 10 - TextSize1.Width - TextSize2.Height); kyy = (int)((kyi + kyf) / 2 + TextSize2.Width / 2); INC_STR(g, f, str, kxx, kyy, -90); //x軸名描画 str = sxjiku; TextSize2 = g.MeasureString(str, f); kxx = (int)((kxi + kxf) / 2 - TextSize2.Width / 2); kyy = (int)(kyf + kpt * 10 + TextSize1.Height); INC_STR(g, f, str, kxx, kyy, 0); //データプロット dc = kpt * 5; str = dname[md]; TextSize2 = g.MeasureString(str, f); for( k = 0 ;k<=md;k++){ switch(k){ case 0 : thePEN = new Pen(Color.Red, 1);break; case 1 : thePEN = new Pen(Color.Blue, 1);break; case 2 : thePEN = new Pen(Color.Green, 1);break; case 3 : thePEN = new Pen(Color.Lime, 1);break; case 4 : thePEN = new Pen(Color.Magenta, 1);break; case 5 : thePEN = new Pen(Color.Aqua, 1);break; case 6 : thePEN = new Pen(Color.Gray, 1);break; case 7 : thePEN = new Pen(Color.Brown, 1);break; case 8 : thePEN = new Pen(Color.OrangeRed, 1);break; } switch(kind[k]){ //0:線のみ //1:線+丸印 //2:丸印のみ case 0: //データを線で連結 xx = datax[0]; yy = datay[k, 0]; kxx1 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy1 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); for( i = 1 ;i<=nd;i++){ xx = datax[i]; yy = datay[k, i]; kxx2 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy2 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); g.DrawLine(thePEN, kxx1, kyy1, kxx2, kyy2); kxx1 = kxx2; kyy1 = kyy2; } break; case 1: //データを線で連結 xx = datax[0]; yy = datay[k, 0]; kxx1 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy1 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); for (i = 1; i <= nd; i++){ xx = datax[i]; yy = datay[k, i]; kxx2 = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); kyy2 = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); g.DrawLine(thePEN, kxx1, kyy1, kxx2, kyy2); kxx1 = kxx2; kyy1 = kyy2; } //プロット for (i = 0; i <= nd; i++) { xx = datax[i]; yy = datay[k, i]; kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)) - (int)(dc / 2); kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)) - (int)(dc / 2); g.DrawEllipse(thePEN, kxx, kyy, dc, dc); } break; case 2: //プロット for( i = 0 ;i<=nd;i++){ xx = datax[i]; yy = datay[k, i]; kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)) - (int)(dc / 2); kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)) - (int)(dc / 2); g.DrawEllipse(thePEN, kxx, kyy, dc, dc); } break; } //凡例 switch(kind[k]){ case 0: kxx = kxf + 10 * kpt; kyy = kyi + (int)((k + 1) * TextSize2.Height); g.DrawLine(thePEN, kxx, kyy, kxx + ds, kyy); str = dname[k]; kxx = kxf + 10 * kpt + ds + 5 * kpt; kyy = kyi + (int)((k + 1) * TextSize2.Height) - (int)(TextSize2.Height / 2); g.DrawString(str, f, Brushes.Black, kxx, kyy); break; case 1: kxx = kxf + 10 * kpt; kyy = kyi + (int)((k + 1) * TextSize2.Height); g.DrawLine(thePEN, kxx, kyy, kxx + ds, kyy); kxx = kxf + 10 * kpt + (int)(ds / 2) - (int)(dc / 2); kyy = kyi + (int)((k + 1) * TextSize2.Height) - (int)(dc / 2); g.DrawEllipse(thePEN, kxx, kyy, dc, dc); str = dname[k]; kxx = kxf + 10 * kpt + ds + 5 * kpt; kyy = kyi + (int)((k + 1) * TextSize2.Height) - (int)(TextSize2.Height / 2); g.DrawString(str, f, Brushes.Black, kxx, kyy); break; case 2: kxx = kxf + 10 * kpt + (int)(ds / 2) - (int)(dc / 2); kyy = kyi + (int)((k + 1) * TextSize2.Height) - (int)(dc / 2); g.DrawEllipse(thePEN, kxx, kyy, dc, dc); str = dname[k]; kxx = kxf + 10 * kpt + ds + 5 * kpt; kyy = kyi + (int)((k + 1) * TextSize2.Height) - (int)(TextSize2.Height / 2); g.DrawString(str, f, Brushes.Black, kxx, kyy); break; } } f.Dispose(); } //--------------------------------------------------------------------------------- private void INC_STR(Graphics g, System.Drawing.Font f, string str, int kxx, int kyy, float ang) { //軸名描画 g.ScaleTransform(1, 1);//横・縦の表示比率を設定 g.TranslateTransform(kxx, kyy);//表示位置の設定(表示位置を原点とする座標移動) g.RotateTransform(ang);//表示角度を指定 g.DrawString(str, f, Brushes.Black, 0, 0);//描画実行 g.ResetTransform();//単位行列にリセット } //--------------------------------------------------------------------------------- private void DRN_XJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double xmin, double xmax, double dx, int kxi, int kxf, int kyi, int kyf) { int i, ix, kxx; double xx, wv; string str; System.Drawing.SizeF TextSize1; //普通x軸描画 ix = (int)((xmax - xmin) / dx); for (i = 0; i <= ix; i++) { xx = xmin + (double)(i) * dx; kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); wv = xmin + (double)(i) * dx; str = wv.ToString("0"); if ((int)(dx * 1000.0) % 10 != 0) { str = wv.ToString("0.000"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 != 0) { str = wv.ToString("0.00"); } if ((int)(dx * 1000.0) % 10 == 0 && (int)(dx * 100.0) % 10 == 0 && (int)(dx * 10.0) % 10 != 0) { str = wv.ToString("0.0"); } TextSize1 = g.MeasureString(str, f); g.DrawLine(LPen, kxx, kyi, kxx, kyf); g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3); } } //--------------------------------------------------------------------------------- private void DRN_YJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double ymin, double ymax, double dy, int kxi, int kxf, int kyi, int kyf) { int i, iy, kyy; double yy, wv; string str; System.Drawing.SizeF TextSize1; //普通y軸描画 iy = (int)((ymax - ymin) / dy); for (i = 0; i <= iy; i++) { yy = ymin + (double)(i) * dy; kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); wv = ymin + (int)(i) * dy; str = wv.ToString("0"); if ((int)(dy * 1000.0) % 10 != 0) { str = wv.ToString("0.000"); } if ((int)(dy * 1000.0) % 10 == 0 && (int)(dy * 100.0) % 10 != 0) { str = wv.ToString("0.00"); } if ((int)(dy * 1000.0) % 10 == 0 && (int)(dy * 100.0) % 10 == 0 && (int)(dy * 10.0) % 10 != 0) { str = wv.ToString("0.0"); } TextSize1 = g.MeasureString(str, f); g.DrawLine(LPen, kxi, kyy, kxf, kyy); g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2); } } //--------------------------------------------------------------------------------- private void DRL_XJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double xmin, double xmax, int kxi, int kxf, int kyi, int kyf) { int i, j, kxx; double xx; string str; System.Drawing.SizeF TextSize1; //対数x軸描画 for (i = (int)(xmin); i <= (int)xmax - 1; i++) { for (j = 1; j <= 9; j++) { xx = Math.Log10((double)(j) * Math.Pow(10.0, (double)i)); kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); g.DrawLine(LPen, kxx, kyi, kxx, kyf); } } for (i = (int)xmin; i <= (int)xmax; i++) { xx = (double)i; kxx = kxi + (int)((xx - xmin) * (kxf - kxi) / (xmax - xmin)); str = Math.Pow(10.0, (double)i).ToString(); TextSize1 = g.MeasureString(str, f); g.DrawString(str, f, Brushes.Black, kxx - TextSize1.Width / 2, kyf + kpt * 3); } } //--------------------------------------------------------------------------------- private void DRL_YJIKU(Graphics g, System.Drawing.Font f, System.Drawing.Pen LPen, int kpt, double ymin, double ymax, int kxi, int kxf, int kyi, int kyf) { int i, j; double yy; string str; int kyy; System.Drawing.SizeF TextSize1; //対数y軸描画 for (i = (int)ymin; i <= (int)ymax - 1; i++) { for (j = 1; j <= 9; j++) { yy = Math.Log10((double)j * Math.Pow(10.0, (double)i)); kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); g.DrawLine(LPen, kxi, kyy, kxf, kyy); } } for (i = (int)ymin; i <= (int)ymax; i++) { yy = (double)i; kyy = kyf - (int)((yy - ymin) * (kyf - kyi) / (ymax - ymin)); str = (Math.Pow(10.0, (double)i)).ToString(); TextSize1 = g.MeasureString(str, f); g.DrawString(str, f, Brushes.Black, kxi - TextSize1.Width - kpt * 2, kyy - TextSize1.Height / 2); } } //--------------------------------------------------------------------------------- } }