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 vcsGRLN_png { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //--------------------------------------------------------------------------------- private void toolStripButton1_Click(object sender, EventArgs e) { main_part(); } //--------------------------------------------------------------------------------- private void main_part() { //作図用変数宣言 int kpt; //拡大率(画面表示:1,ファイル保存:2) int HSIZE; //画像横寸法(px) int DHL; //画像左余白寸法:縦軸描画用(px) int DHR; //画像右余白寸法(px) int VSIZE; //画像縦寸法(px) int DVL; //画像下余白寸法:横軸描画用(px) int DVU; //画像上余白寸法(px) 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; char delim=','; string dat; string[] sbuf; string fname1=""; int nd; //データ数(入力はデータ数,プログラム上数値はデータ数−1) int i; //データ読み込み openFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); if(openFileDialog1.ShowDialog()==DialogResult.OK){fname1=openFileDialog1.FileName;} sr=new System.IO.StreamReader(fname1,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; //プロットデータ格納配列宣言 double[] datax=new double[nd+1];//データx値 double[] datay=new double[nd+1];//データy値 for(i=0;i<=nd;i++){ dat=sr.ReadLine(); sbuf=dat.Split(delim); datax[i]=double.Parse(sbuf[0]); datay[i]=double.Parse(sbuf[1]); } sr.Close(); //データ対数値処理 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 (i = 0; i <= nd; i++) { if (datay[i] < Math.Pow(10.0, ymin)) { datay[i] = Math.Pow(10.0, ymin); } datay[i] = Math.Log10(datay[i]); } } //プロット領域定義 kxi0=DHL; kxf0=HSIZE-DHR; kyi0=DVU; kyf0=VSIZE-DVL; kpt = 1; 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, datax, datay, 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,double[] datax,double[] datay,string slogx,string slogy) { int i; int kxi,kxf,kyi,kyf; double xx,yy; int kxx,kyy; int kxx1,kyy1,kxx2,kyy2; string str; int dc; System.Drawing.Font f=new Font("MSゴシック",kpt*10); System.Drawing.SizeF TextSize1; System.Drawing.SizeF TextSize2; kxi=kpt*kxi0;kxf=kpt*kxf0;kyi=kpt*kyi0;kyf=kpt*kyf0; //座標軸 System.Drawing.Pen LPen=new 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; for(i=0;i<=nd;i++){ xx=datax[i]; yy=datay[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(new Pen(Color.Red,1),kxx,kyy,dc,dc); } //データを線で連結 xx=datax[0]; yy=datay[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[i]; kxx2=kxi+(int)((xx-xmin)*(kxf-kxi)/(xmax-xmin)); kyy2=kyf-(int)((yy-ymin)*(kyf-kyi)/(ymax-ymin)); g.DrawLine(new Pen(Color.Blue,1),kxx1,kyy1,kxx2,kyy2); kxx1=kxx2; kyy1=kyy2; } 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); } } //--------------------------------------------------------------------------------- private void toolStripButton2_Click(object sender, EventArgs e) { string fname2=""; saveFileDialog1.Filter = "*.bmp|*.bmp|*.jpg|*.jpg|*.png|*.png|*.wmf|*.wmf|*.tif|*.tif|*.gif|*.gif"; if(saveFileDialog1.ShowDialog()==DialogResult.OK){fname2=saveFileDialog1.FileName;} switch(saveFileDialog1.FilterIndex){ case 1:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Bmp);break; case 2:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Jpeg);break; case 3:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Png);break; case 4:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Wmf);break; case 5:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Tiff);break; case 6:pictureBox2.Image.Save(fname2, System.Drawing.Imaging.ImageFormat.Gif);break; } } //--------------------------------------------------------------------------------- } }