Skip to content

Instantly share code, notes, and snippets.

@dj1711572002
Created February 18, 2023 02:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dj1711572002/abef9d4df2ede78d151770c2e04ade85 to your computer and use it in GitHub Desktop.
Save dj1711572002/abef9d4df2ede78d151770c2e04ade85 to your computer and use it in GitHub Desktop.
C# Serial TxtData read DataGridView
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Diagnostics;
using System.Threading;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
using static System.Windows.Forms.AxHost;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.LinkLabel;
//using System.Runtime.Remoting.Channels;
using System.Security.Policy;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
namespace STA23_SerialMonitor_rev04
{
//......................................................................................................................................................
public partial class Form1 : Form
{
int j, rN;
int stopflag = 0;
int selectPos, stopPos;//richtextbox 行位置
string mode, modeset;
string[] row0, row1, row2, row3, row4;//data 格納
int writeflag;
String name;//filename
string[] sline;// = new string[150000];
//****************************dgvデータ構造体**************************************
//生データを検査して、有効データ範囲を得る
struct dgvchk
{
public int maxrow;//Row.Count
public int startrow;//
public int endrow;//
public int maxrn;//data エポック数
public int startrn;//有効スタートrn
public int endrn;//有効エンドrn
public int miss;//itow飛び個数
public double missper;//miss%
public int fmiss;//有効範囲内でのflag 67未満の個数
public double fmissper;//fmiss%
};
dgvchk dc;//1測定dgvに一個
//****************************位置ポイント構造体************************************
struct basep
{
public double Ny;
public double Ex;
public double Dz;
public double Height;
public double gSpeed;
public double headMot;
public double mHead;
public int flags;
public double pdop;
//data n
public int rn;
public int itow;
public int tp;
public int miss;
};
struct rovrp
{
public double Ny;
public double Ex;
public double Dz;
public double Height;
public double gSpeed;
public double headMot;
public double mHead;
public int flags;
public double pdop;
//data n
public int rn;
public int itow;
public int tp;
public int miss;
};
basep[] bp = new basep[50000];
rovrp[] rp = new rovrp[50000];
//******************* ターン構造体 turns********************************************************
struct Turns
{
//Public rNturnNo() As Integer 'rNturnNo(rN)=turnNo
public string skiRL; //左右スキーの指定(0)番に収納
public int turnNo; //ターン番号
public string direction;// 'ターン方向 R L
public int lastNo;// 'ターンの数(0)番に収納
public int startNo, endNo;// '開始データ行No
public double[] NY;
public double[] EX;
public double[] EZ;
public int initX, initY, endX, endY;// '開始座標、終了座標 X:lon Y:lat
public double turnTime;// 'ターン時間
public double turnTimesum;// '累積ターン経過時間
//ターン弧
public double Radius;// '簡易円近似半径
public double theta;//'fallLine 角度
public int minorDia, majorDia;// 'ターン半円の縦短径、横長径
public double Aspectratio;// 'ターン弧のアスペクト比
public double fallen;// 'fallLine長さ
public double fallensum;// ' fallLineの累計
public double initHeight, endHeight;//
public double fallHeight;// 'fallLineの標高差
public double fallHeightsum;//'fallLine標高差の累計
public double Slopedeg;// 'fallLineの斜度deg
public double Arclen;// '円弧長
public double Arclensum;//'円弧長の累計
//Speed
public double[] Speed;//'Speed配列
public double inSpeed, outSpeed, aveSpeed, maxSpeed, minSpeed;//'ターン中の速度各種
//Heading Skidding
public double[] headMot;//'headMot角配列
public double[] headSki;// 'ski角配列
public double[] Skid;// 'Skid角配列
public double maxHeadmot, minHeadmot, dHeadmot;// 'headMot角各種
public double maxSkid, minSkid, aveSkid, dSkid;//
//G Acceleration
public double[] Gacc;//'平均加速度
public double Gaccmax, Gaccmin, Gaccave;//
//Slope ターン開始点標高と終了点標高と傾斜角
public double startHeight;
public double lastHeight;
public double tSlope;
};
//-----------Turns 構造体配列定義-------------------------------
Turns[] tR=new Turns[1000];//'右スキーのターン構造体配列宣言200個まで収納
Turns[] tL=new Turns[1000];//'左スキーのターン構造体配列宣言200個まで収納
//************************************Graphic parameters*************************************************************************
const int blen = 3000;//処理データ単位3000行を1ブロックにしてBitmapメモリー節約
//int rN;
int rowN;//dgv rowCount
String fname;
public double[] f;
public double[] fout;
public double[] fkekka;
//
int[,] dgv = new int[30000, 16];
double[,] dgv16_MA = new double[30000, 5];//FilteredData:M9N_gSpeed_MA(16),M9N_headMot_MA(17),M9N_velN_MA(18),M9N_velE_MA(19),M9N_velD(20)
double[,] dgv21_Igr = new double[30000, 8];//積分要素F9P:igr_F9P_gSpeed(21),igr_F9P_velN(22),igr_F9P_velE(23),igr_F9P_velD(24)
//積分要素M9N:igr_M9N_gSpeed_MA(25),igr_M9N_velN_MA(26),igr_M9N_velE_MA(27),igr_M9N_velD_MA(28)
//bitmap definition
//picturebox size-----------
const int pic1w = 1000;//pictrueBox1  幅
const int pic1h = 500;//pictureBox1  高さ
const int pic2w = 500;
const int pic2h = 500;
const int pic3w = 500;
const int pic3h = 500;
const int bw = 20000;// blen;//180000 ;
const int xysize = 10000;
int wakuflag = 0;
Bitmap sourceBitmap = new Bitmap(bw, pic1h);//X軸bw個 data(10msec周期で300秒) Y軸
Bitmap trimmedBitmap = new Bitmap(pic1w, pic1h);//PictuerBox1に貼りこむBitmap
Bitmap xyBitmap = new Bitmap(xysize, xysize);//xyプロットのソース
Bitmap xysBitmap = new Bitmap(xysize, xysize);//xyプロットのソース拡大用Bitmapとしてポイントサイズを1に最小化した
Bitmap p2Bitmap = new Bitmap(pic2w, pic2h);//picturebox2のBitmap
Bitmap p2sBitmap = new Bitmap(pic2w, pic2h);//picturebox2の拡大用Bitmapとしてポイントサイズを1に最小化した
Bitmap p2wBitmap = new Bitmap(pic2w, pic2h);//picturebox2の枠用Bitmap
Bitmap p3Bitmap = new Bitmap(pic3w, pic3h);//picturebox2のBitmap
//-XYPLOT-----------------
double scalex, scaley;
double scale0 = 1;
int blockn = 0;//データブロックNo ComboBox7のINDEX値
int blockn_1 = 0;//1個前のブロックNo
long lonW, latH;
long[] maxlon = new long[10];
long[] minlon = new long[10];
long[] maxlat = new long[10];
long[] minlat = new long[10];
int a = 1;
int a_1 = 1;
double wheelPos = 0;// Mouse Wheel Position
double wheelVal;
//xycut
int lefttopx;//= (int)(cutcenterx - (pic2w / 2) / magni);//切り取り四角座標計算
int lefttopy;//= (int)(cutcentery - (pic2h / 2) / magni);
int pointrowN;//pictureBox3 クリックで得た指定行No
//-------------------データブロック構造体----------------------------
public struct data_block
{
public int blockSize;
public int blockNo;
public int startRow;
public int endRow;
public long maxlon;
public long minlon;
public long maxlat;
public long minlat;
public long lonW;//全幅
public long latH;//全高
public int[] nutralN;//ニュートラルポイントの行No 配列
}
data_block[] dbk;
int alln;//全ブロック数
//--------------------------------------------------------------------
int px_1, py_1;
//prown  クリック座標逆引き配列
int[] prownx;
int[] prowny;
struct lines
{
public string name;//LIne名 選択されたデータ名
public bool available;//Lineが有効:true 無効:false
public int colN;//Column番号
public Color clr;
public int sa;//data 間隔
public int rN_avail;
public int period;
public int x;
public int x_1;
public int y;
public int y_1;
public int max;
public int min;
public int baseL;//Graph base Line 1/2 1/1
public int uscale;//headMot=100000
}
//Struct GraphLine
public Color[] samples = new Color[] { Color.Red, Color.Blue, Color.Green, Color.Yellow, Color.Aqua, Color.DeepPink, Color.BlanchedAlmond };
lines[] gline;//gline global
//**********************Graphic parameter END **********************************************************
public Form1()
{
InitializeComponent();
}
//......................................................................................................................................................
private void button1_Click(object sender, EventArgs e)
{
stopflag = 0;
serialPort1.BaudRate = 115200;
serialPort1.Parity = Parity.None;
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;
serialPort1.Handshake = Handshake.None;
serialPort1.PortName = portComboBox.Text;
serialPort1.Open();
}
//......................................................................................................................................................
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "STA22_SerialMonitor_rev03";
richTextBox1.Visible = false;
dgv1.Visible = false;
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
portComboBox.Items.Add(port);
}
if (portComboBox.Items.Count > 0)
{
// portComboBox.SelectedIndex = 1;
rN = 0;
}
writeflag = 0;
//------------------------------
}
//..... .................................................................................................................................................
private void button2_Click(object sender, EventArgs e)
{
stopflag = 0;
if (serialPort1.IsOpen)
{
serialPort1.Write(textBox2.Text + "\n");
}
}
//......................................................................................................................................................
delegate void SetTextCallback(string text);
//......................................................................................................................................................
private void Response(string text)
{
if (textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(Response);
BeginInvoke(d, new object[] { text });
}
else
{
string[] data = (text).Split(',');//カンマ区切りにばらす
int dnum = data.Length;
label6.Text = data[0];
//char[] chararray = text.ToCharArray();
//File.AppendAllLines(@"d:\mydata.csv",chararray, Encoding.GetEncoding("shift-jis"));
if (writeflag == 0)
{
DateTime dt = DateTime.Now;
name = dt.ToString($"{dt:MMddHHmmss}");
}
using (StreamWriter sw = new StreamWriter(@"C:\RTK_LOG\" + name + ".csv", true, Encoding.GetEncoding("shift-jis")))
{
writeflag = 1;
// sw.WriteLine(text);
sw.Write(text);
}
rN++;
textBox1.Text = text;
if (checkBox1.Checked == true)
{
//if (data[0] == "[m]")
//{
richTextBox1.AppendText(text + "<" + dnum.ToString() + ">");
//}
}
}
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked == true)
{
checkBox2.Checked = false;
selectPos = richTextBox1.Text.Length;
textBox1.Text = "selectPos=" + selectPos.ToString();
}
else
{
checkBox2.Checked = true;
stopPos = richTextBox1.SelectionStart;
textBox1.Text = "stopPos=" + stopPos.ToString();
}
}
//......................................................................................................................................................
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (stopflag == 0)
{
string str = serialPort1.ReadLine();
Response(str);
}
}
//......................................................................................................................................................
/*
private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (stopflag == 0)
{
string str2 = serialPort2.ReadLine();
Response(str2);
}
}
*/
//......................................................................................................................................................
private void button4_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("s");//Start Log
label6.Text = "Save modeset";
}
}
//......................................................................................................................................................
private void button5_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("q");//Quit log
label6.Text = "Quit modeset";
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
string mes = textBox1.Text;
string head = mes.Substring(0, 3);
// richTextBox1.AppendText(head);
//Status行 md,flagsB,flagsR,pdopB,pdopR,haccB,haccR,miscount0,count_upB,count_upB0,tp,tp0
/*
if (mes.IndexOf("m")>=0)
{
string[] mdata = (mes + ",\n").Split(',');//カンマ区切りにばらす
label6.Text = "m";
textBox6.Text = mdata[0];
textBox3.Text = mdata[1];
textBox4.Text = mdata[3];
textBox5.Text = mdata[7];
textBox7.Text = mdata[8];
}
Debug.Print("indexof [p]=" + mes.IndexOf("p").ToString());
if (mes.IndexOf("p") >= 0)
{
string[] pdata = (mes + ",\n").Split(',');//カンマ区切りにばらす
label6.Text = "p";// pdata[0] + ":" + pdata[1] + ":" + pdata[2] + ":" + pdata[3];
textBox6.Text = pdata[0];
textBox3.Text = pdata[1];
textBox4.Text = pdata[3];
textBox5.Text = pdata[7];
textBox7.Text = pdata[8];
}
if (mes.IndexOf("s") >= 0)
{
string[] sdata = (mes + ",\n").Split(',');//カンマ区切りにばらす
label6.Text = "s";// sdata[0] + ":" + sdata[1] + ":" + sdata[2] + ":" + sdata[3];
textBox6.Text = sdata[0];
textBox3.Text = sdata[1];
textBox4.Text = sdata[3];
textBox5.Text = sdata[7];
textBox7.Text = sdata[8];
}
*/
}
//......................................................................................................................................................
private void button6_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("p");//Pre Averaging Statistic
label6.Text = "Preprocess modeset";
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked == true)
{
richTextBox1.Visible = true;
}
else
{
richTextBox1.Visible = false;
}
}
//......................................................................................................................................................
private void button3_Click(object sender, EventArgs e)
{
stopflag = 1;
Thread.Sleep(1000);//Serial.close前のバッファ待ち時間
writeflag = 0;
serialPort1.Close();
}
private void button7_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("d");//Pre Averaging Statistic
label6.Text = "Dir modeset";
}
}
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
dgv1.Visible = true;
}
private void button8_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("b");//Pre Averaging Statistic
label6.Text = "BnoHoisei modeset";
}
}
//read file
private void button9_Click(object sender, EventArgs e)
{
//dgv1.Visible = true;
ReadDialog();
}
//-----------------Read File ----------------------------------------------------
private void ReadDialog()
{
sline = new string[150000];
int irn = 0;
string sizes=null;
var swtch = new System.Diagnostics.Stopwatch();
dgv1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgv1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
dgv1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
//sourceBitmap_clear();
//OpenFileDialogクラスのインスタンスを作成
OpenFileDialog ofd = new OpenFileDialog();
//ダイアログを表示する
if (ofd.ShowDialog() == DialogResult.OK)
{
// DataGridView初期化(データクリア)
dgv1.Columns.Clear();
dgv1.Rows.Clear();
// dgv1 set
dgv1.ColumnCount = 40;
dgv1.RowCount = 2;
//dgv1.RowHeadersWidth = 80;
// dgv1.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
// DataGridViewColumn target_item = dgv1.Columns[0];
// target_item.AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet;
// headerName();
int rowN = 0;
int i;
int fi = 0;
int ic = 0;
//OKボタンがクリックされたとき、選択されたファイルを読み取り専用で開く
textBox2.Text = ofd.FileName;
//====================================ASCII read start========================================================
//dgvの受信データをパラメータに代入
//("[%c],%d,%d,%4.2f,%4.2f,%d,%d,%d,%d,%d,%d,%d\n\r",md,flagsB,flagsR,pdopB,pdopR,haccB,haccR,miscount0,count_upB,count_upB-count_upB0,tp,tp0);
//"[Base],%d,%4.2f,%4.2f,%4.2f,%d,%d,\n\r",itowB,NYB,EXB,DZB,gSpeedB,headMotB);
//"[Rover],%d,%4.2f,%4.2f,%4.2f,%d,%4.2f,%4.2f,%4.1f\n\r",itowR,NYR,EXR,DZR,gSpeedR,mHead,bnHosei+eX[0],relLm);
//"[BNO],%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f%,\n\r",eX[0],eY[0],eZ[0],eX[1],eY[1],eZ[1],eX[2],eY[2],eZ[2]);
//
string head0= "md, flagsB, flagsR, pdopB, pdopR, haccB, haccR, miscount0, count_upB, count_upB-count_upB0,tp,tp0";
string head1= ",[Base],itowB, NYB, EXB, DZB, gSpeedB, headMotB";
string head2 = ",[Rover] ,itowR,NYR,EXR,DZR,gSpeedR,mHead,bnHosei+eX[0],relLm]";
string headall = head0 + head1 + head2;
string[] headArr = headall.Split(',');
int headlen = headArr.Length;
for (i = 0; i < headlen; i++)
{
dgv1.Columns[i].HeaderText = headArr[i]; ;
dgv1.Rows[1].Cells[i].Value = i;
}
FileInfo filesize = new FileInfo(ofd.FileName);
//long lsize = (int)(filesize.Length / 40);
//label8.Text = lsize.ToString() + "行," + filesize.Length.ToString()+"byte";
//sline = new string[lsize];
swtch.Start();
//-----readAllText-----
// シフトJISのファイルの読み込み
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // memo: Shift-JISを扱うためのおまじない
string alldata = File.ReadAllText(ofd.FileName,System.Text.Encoding.GetEncoding("Shift_JIS"));
// var wordList = alldata.Replace("\r\n", "\n").Split(new[] { '\n', '\r' });
string[] sline = alldata.Split('[');
swtch.Stop();
sizes = sline.Length + "行," + filesize.Length.ToString() + "byte Ellapsed Time=" + swtch.ElapsedMilliseconds.ToString() + "msec";
label8.Text = sizes;
if (checkBox3.Checked == true)
{
dgv1.Visible = true;
dgv1.RowHeadersWidth = 60;
//dgv1.TopLeftHeaderCell.Value = "左上";
// richTextBox1.Visible = true;
swtch.Reset();
swtch.Start();
Debug.Print("sline.Length=" + sline.Length.ToString());
string ss="0";
int cr=0;
for (ic = 1; ic <(int)( sline.Length-2); ic++)
{
//Debug.Print("sline[ic]=" + sline[ic].Substring(0, 2).ToString());
if (sline[ic].Substring(0, 2) == "Ba")
{
dgv1.Rows[cr].HeaderCell.Value = cr.ToString();
sline[ic - 1] = sline[ic - 1].Substring(0, sline[ic - 1].Length-2);
sline[ic ] = sline[ic ].Substring(0, sline[ic].Length-2);
sline[ic+ 1] = sline[ic+ 1].Substring(0, sline[ic + 1].Length-2);
sline[ic + 2] = sline[ic +2].Substring(0, sline[ic +2].Length-3);
ss = sline[ic-1] +","+ sline[ic] + sline[ic + 1] + "," + sline[ic+2];
string[] datas = ss.Split(','); // カンマで区切って配列に格
dgv1.Rows.Add(datas);//dgv1書き込み
cr++;
}
}
swtch.Stop();
// TimeSpan tst = swtch.ElapsedMilliseconds;
label8.Text = sizes + "dgv:" + swtch.ElapsedMilliseconds.ToString() + "msec";
}
}//File read End  *******************************************************************************************************************
} //ReadDialog() end
//==============================================Parameter set=======================================================================
//dgvの受信データをパラメータに代入
//("[%c],%d,%d,%4.2f,%4.2f,%d,%d,%d,%d,%d,%d,%d\n\r",md,flagsB,flagsR,pdopB,pdopR,haccB,haccR,miscount0,count_upB,count_upB-count_upB0,tp,tp0);
//"[Base],%d,%4.2f,%4.2f,%4.2f,%d,%d,\n\r",itowB,NYB,EXB,DZB,gSpeedB,headMotB);
//"[Rover],%d,%4.2f,%4.2f,%4.2f,%d,%4.2f,%4.2f,%4.1f\n\r",itowR,NYR,EXR,DZR,gSpeedR,mHead,bnHosei+eX[0],relLm);
//"[BNO],%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f,%4.1f%,\n\r",eX[0],eY[0],eZ[0],eX[1],eY[1],eZ[1],eX[2],eY[2],eZ[2]);
//
//struct basep/rovrp basep=bp[] rovrp=rp[]
/*
struct basep
{
public double Ny;
public double Ex;
public double Dz;
public double Height;
public double gSpeed;
public double headMot;
public double mHead;
public int flags;
public double pdop;
//data n
public int rn;
public int itow;
public int tp;
public int miss;
};
*/
void bpset(int n)//構造体配列bp[n]作成
{
}
void rpset(int n)//構造体配列rp[n]作成
{
}
/*==================datachk=========================================
struct dgvchk
{
public int maxrow;//Row.Count
public int startrow;//
public int endrow;//
public int maxrn;//data エポック数
public int startrn;//有効スタートrn
public int endrn;//public int miss;//itow飛び個数
public double missper;//miss%
public int fmiss;//有効範囲内でのflag 67未満の個数
public double fmissper;//fmiss%
};
dgvchk dc;
*/
void sortdgv()//生データから各有効データの行番号を抽出
{
int iir=0;
dc.maxrow = dgv1.RowCount;
dc.maxrn = (int)(dc.maxrow / 4);
for (iir = 1;iir < dc.maxrow; iir++)//dgv行内チェック
{
//itow 飛び
}
}
private void dgv1_CellClick(object sender, DataGridViewCellEventArgs e)
{
label7.Text = "row=" + dgv1.CurrentCell.RowIndex.ToString() + "column=" + dgv1.CurrentCell.ColumnIndex.ToString();
}
//======================================================
//===========dgvSave===================================
//====================================================
private void button10_Click(object sender, EventArgs e)
{
dgvsave();
}
private void dgvsave()
{
int i, j;
//Filename Timestamp
DateTime dt = DateTime.Now;
string fn = dt.ToString($"{dt:MMddHHmmss}");
string fnstrng = "c:/RTK_Log/dgv_" + fn + ".csv";
string hdstrng = "c:/RTK_Log/head_" + fn + ".csv";
int dgvron = dgv1.RowCount;
int dgvcln = dgv1.ColumnCount;
Debug.Print("dgvron=" + dgvron.ToString() + ",dgvcln=" + dgvcln.ToString());
using (StreamWriter sw = new StreamWriter(@fnstrng, false, Encoding.UTF8))
{
for (i = 1; i < dgvron - 1; i++)
{
string dgvrow = "";
for (j = 0; j < dgvcln; j++)
{
dgvrow = dgvrow + dgv1.Rows[i].Cells[j].Value + ",";
}
sw.WriteLine(dgvrow);
}
}
//-----------HeaderText save----------------------
//DataGridView1.Columns[0].HeaderTex
if (dgv1.Columns[2].HeaderText !="")
{
using (StreamWriter sw = new StreamWriter(@hdstrng, false, Encoding.UTF8))
{
string dgvhead = "";
for (j = 0; j < dgvcln; j++)
{
dgvhead = dgvhead + dgv1.Columns[j].HeaderCell.Value + ",";
//Debug.Print("i=" + i.ToString() + ",dgvhead=" + dgvhead);
}
sw.WriteLine(dgvhead);
}
}
}
//***************Source Bit Map make*******************************************************************************
private void makeSrcBitmap()
{
int gsel;//gline selector
int irn;
int pw = pictureBox1.Width;
int ph = pictureBox1.Height;
int velMax = 10000;
int velMin = -10000;
int headMax = 36000000;
int headMin = 0;
int xdot = timeScale();
// double yscale = (double)ph / (velMax - velMin);
Graphics g1 = Graphics.FromImage(sourceBitmap);
g1.Clear(Color.Black);
for (gsel = 0; gsel < 6; gsel++)
{
if (gline[gsel].available == true)
{
int pmsec = gline[gsel].period;
int psa = gline[gsel].sa;
int pcoln = gline[gsel].colN;
double yscale = (double)ph / (gline[gsel].max - gline[gsel].min);
//Debug.Print("gline[" + gsel.ToString() + "].colN=" + gline[gsel].colN.ToString());
int itow0 = 0;
int y0, y0_1;
for (irn = 2; irn < rowN; irn++)
{
if (checkBox1.Checked == true)
{ itow0 = Convert.ToInt32(dgv1.Rows[irn].Cells[1].Value); }
else
{ itow0 = dgv[irn, 1]; }
//Debug.Print("itow0=" + itow0.ToString() + "gline[" + gsel.ToString() + "].colN=" + gline[gsel].colN.ToString());
Pen p = new Pen(samples[gsel], 1);
Brush b1 = new SolidBrush(samples[gsel]);
if (itow0 % pmsec == 0 && irn > psa)
{
// Debug.Print("irn=" + irn.ToString() + "psa=" + psa.ToString());
if (checkBox1.Checked == true)
{
y0 = Convert.ToInt32(dgv1.Rows[irn].Cells[pcoln].Value);
y0_1 = Convert.ToInt32(dgv1.Rows[irn - psa].Cells[pcoln].Value);
}
else
{
y0 = dgv[irn, pcoln];
y0_1 = dgv[irn - psa, pcoln];
}
int px = irn * xdot;
int px_1 = (irn - psa) * xdot;
int py0 = ph / gline[gsel].baseL - (int)((double)y0 * yscale);
int py0_1 = ph / gline[gsel].baseL - (int)((double)y0_1 * yscale);
// g1.DrawLine(Pens.Blue, px, py0, px - 1, py0_1);
g1.DrawLine(p, px, py0, px_1, py0_1);
Color c = samples[gsel];
// if (CKarry[gsel].Checked == true) { g1.FillEllipse(b1, px, py0, 5, 5); }
//Debug.Print("itow0="+itow0.ToString()+"px=" + px.ToString()+"py0="+py0.ToString()+"px_1="+px_1.ToString()+"py0_1="+py0_1.ToString());
}
}
}
}
}
private int timeScale()
{
int dot = Convert.ToInt32(textBox1.Text);
// if (dot * dgv1.RowCount >bw)
if (dot * rowN > bw)
{
//dot = (int)(bw / dgv1.RowCount);
dot = (int)(bw / rowN);
if (dot == 0) { dot = 1; }
}
return dot;
}
//VB  移植==========================
//======================TURNカット Nutral()=================================================================================
//headMOTの極値をニュートラル(切り替え)ポイントとして抽出して、配列データとしてもって、ターングラフに重ねる
//へあdMOTを5回MAして 微分してプラスマイナス変化点をポイントとする
private void Nutral()//Turn NutralPointを探す
{
int stNo = Convert.ToInt32(textBox1.Text);
int endNo = Convert.ToInt32(textBox2.Text);
int ic, i5;
int icR_1, icL_1;
double sum5R, sum5L;
double headR, headL;
int nuNR, nuNL ;
int numN = 0;
int num = endNo - stNo;
double[] MA5headR= new double[endNo] ;
double[] DifheadR=new double[endNo];
double[] MA5headL= new double[endNo] ;
double[] DifheadL= new double[endNo] ;
int turnCountR, turnCountL ;
int pared = 0;
turnCountR = 0;
turnCountL = 0;
nuNR = 0;
nuNL = 0;
icR_1 = -8;
icL_1 = -8;
int[] NutralR=new int[100];
int[] NutralL = new int[100];
int[] turnNoR = new int[100];
int[] turnNoL = new int[100];
int TurnNumR, TurnNumL;
//loop ic-------------------------------
for ( ic = stNo; ic< endNo - 5;ic++)
{
numN += 1;
sum5R = 0;
sum5L = 0;
for( i5 = ic;ic< 4 + ic;i5++)//5回の移動平均でheadMotを平均化
{
int col_lon = 0;
int col2_lon = 0;
headR = (double)(dgv1.Rows[i5].Cells[col_lon + 10].Value )* 0.00001;
headL = (double)(dgv1.Rows[i5].Cells[col2_lon + 10].Value)* 0.00001;
sum5R = sum5R + headR;
sum5L = sum5L + headL;
}// for i5 end
MA5headR[ic] = sum5R / 5;
MA5headL[ic] = sum5L / 5;
if( ic > 0)
{
DifheadR[ic] = MA5headR[ic] - MA5headR[ic - 1];
DifheadL[ic] = MA5headL[ic] - MA5headL[ic - 1];
if ((DifheadR[ic] * DifheadR[ic - 1] < 0 )&& ic - icR_1 > 7 ) //前回から8個以上離れて正負逆転した場合NutralPointと判断
{
icR_1 = ic;
if (DifheadR[ic] < 0 )
{
NutralR[ic] = -1; //左ターン
tR[turnCountR].direction = "Rturn";
}
else
{
NutralR[ic] = 1;//右ターン
tR[turnCountR].direction = "Lturn";
}
//CheckBox12.Checked = True;
turnNoR[nuNR] = ic ;//ニュートラルポイントでの行番号記録
//*****ターン構造体記録****************************
//nuNR=1でtr.turnNo=0,nuNR=2でtr.turnNo=1
if (nuNR > 0 )
{
tR[turnCountR].turnNo = turnCountR; //構造体へターン番号記録
tR[turnCountR].startNo = turnNoR[nuNR - 1];//構造体へスタート行番号記録
tR[turnCountR].endNo = turnNoR[nuNR]; //構造体へスタート行番号記録
//RichTextBox2.AppendText("tR(" + CStr(turnCountR) + ") = " + CStr(turnCountR) + ":tr.startNo=" + CStr(tR(turnCountR).startNo) + ",tr.endNo=" + CStr(tR(turnCountR).endNo) + vbCrLf);
turnCountR += 1;
}
//*************************************************
//RichTextBox2.AppendText("NutralheadR(" + CStr(ic) + ") = " + CStr(1) + "TurnNoR(" + CStr(nuNR) + ")=" + CStr(ic) + "DifheadR(ic)=" + CStr(DifheadR(ic)) + vbCrLf);
nuNR += 1;
}//if DifheadR end
else
{
NutralR[ic] = turnCountR + 2;// ' ターンNOを2個多く記憶
}//if DifheadR end
if (DifheadL[ic] * DifheadL[ic - 1] < 0 && ic - icL_1 > 7 )// '前回から8個以上離れて正負逆転した場合NutralPointと判断
{
icL_1 = ic;
if( DifheadL[ic] < 0 )
{
NutralL[ic] = -1;
tL[turnCountL].direction = "Rturn";
}
else
{
NutralL[ic] = 1;
tL[turnCountL].direction = "Lturn";
}
//CheckBox12.Checked = True;
turnNoL[nuNL] = ic;
//*****ターン構造体記録****************************
//nuNR=1でtr.turnNo=0,nuNR=2でtr.turnNo=1
if (nuNL > 0 )
{
tL[turnCountL].turnNo = turnCountL;// '構造体へターン番号記録
tL[turnCountL].startNo = turnNoL[nuNL - 1];// '構造体へスタート行番号記録
tL[turnCountL].endNo = turnNoL[nuNL];// '構造体へスタート行番号記録
//RichTextBox2.AppendText("tL(" + CStr(turnCountL) + ") = " + CStr(turnCountL) + ":tL.startNo=" + CStr(tL(turnCountL).startNo) + ",tL.endNo=" + CStr(tL(turnCountL).endNo) + vbCrLf)
turnCountL += 1;
}
//*************************************************
//RichTextBox2.AppendText("NutralheadL(" + CStr(ic) + ")=" + CStr(1) + "TurnNoL(" + CStr(nuNL) + ")=" + CStr(ic) + "DifheadL(ic)=" + CStr(DifheadL(ic)) + vbCrLf)
nuNL += 1;
}//if DifheadL
else
{
NutralL[ic] = turnCountL + 2;// ' ターンNOを2個多く記憶
}//if DifheadL end
TurnNumR = nuNR;
tR[0].lastNo = turnCountR - 1;// 'ターン最後番号をtR(0).lastNoに収納
TurnNumL = nuNL;
tL[0].lastNo = turnCountL - 1;// 'ターン最後番号をtL(0).lastNoに収納
}//if DifheadL end
}//if C>0 end
}//for ic end
}// Nutral end
//****************************************************************************************************************************
/*************xyplot***********************************************
private void xyplot()
{
Graphics srcxy = Graphics.FromImage(xyBitmap);
Graphics srcsxy = Graphics.FromImage(xysBitmap);
Graphics desxy = Graphics.FromImage(p2Bitmap);
srcxy.Clear(Color.Black);
srcsxy.Clear(Color.Black);
int ix, irow;
int px = 0;
int py = 0;
//prown  クリック座標逆引き配列 宣言
prownx = new int[blen];
prowny = new int[blen];
// int pic2w = 300;
// int PIC2H = 300;
int bitxyw = xysize;// 3000;
int bitxyh = xysize;// 3000;
int nutralflag = 0;
long valx, valy;
long valxi, valyi;
//
blockn_1 = blockn;
blockn = comboBox7.SelectedIndex + 1;//blen個毎にブロック切り替え
Debug.Print("XYPLOT:blockn=" + blockn.ToString() + "dbk[].minlon=" + dbk[blockn].minlon.ToString() + "dbk[].minlat=" + dbk[blockn].minlat.ToString());
// int startrow = (blockn - 2) * blen;
//---------------Nutral Point Array set Block指定のみ----------------------------------------------------
if (blockn < comboBox7.Items.Count)
{
for (irow = dbk[blockn].startRow; irow < dbk[blockn].endRow - 2; irow++)//dgv1.RowCount - 3; irow++)
{
int ni = irow - dbk[blockn].startRow;
long sa = dgv[irow + 1, 3] - dgv[irow, 3];
long sa_1 = dgv[irow + 2, 3] - dgv[irow + 1, 3];
if (sa * sa_1 < 0 && irow > 2)//headmotの極値変化
{
dbk[blockn].nutralN[ni] = 1;//ニポイントを1
//Debug.Print("Nutral ON:headMot="+dgv[irow,3].ToString()+"irow=" + irow.ToString() + ",dbk[blockn].nutralN[" + ni.ToString() + "]=" + dbk[blockn].nutralN[ni].ToString());
}
else if (irow > 2)
{
dbk[blockn].nutralN[ni] = 0;//ニュートラルポイントでない0
// Debug.Print("Nutral Off:headMot="+dgv[irow,3].ToString()+"irow=" + irow.ToString() + ",dbk[blockn].nutralN[" + ni.ToString() + "]=" + dbk[blockn].nutralN[ni].ToString());
}
}
}
//-------------------------------------------------------------------------------------------------
// if (blockn == comboBox7.Items.Count)//all
//{
// startrow = 1;
// }
//
lonW = dbk[blockn].lonW; //maxlon[blockn] - minlon[blockn];
latH = dbk[blockn].latH;//maxlat[blockn] - minlat[blockn];
//Debug.Print("lonW=" + lonW.ToString() + ",latH=" + latH.ToString());
//------------------------ソースxybitmap へ縮小プロット---------------------------------
scalex = (double)(lonW * 1.1 / bitxyw);//lonWは、xysize 20000全幅cm/dot
scaley = (double)(latH * 1.1 / bitxyh);//latHは全高cm/dot
if (scalex > scaley) { scale0 = scalex; }//大きいスケールを採用
if (scalex < scaley) { scale0 = scaley; }
//textBox14.Text = scale0.ToString();
label3.Text = "縦=" + (latH / 100).ToString() + "m,横=" + (lonW / 100).ToString() + "m, 縮尺" + scale0.ToString("n2") + "cm/dot";
//int endblock = 0;
//if (rowN > (blockn - 1) * blen) //最後のブロックでない場合のエンド行No
//{
// endblock = (blockn - 1) * blen;
//}
//else
//{
// endblock = rowN - 2;
//}
for (irow = dbk[blockn].startRow; irow < dbk[blockn].endRow; irow++)//dgv1.RowCount - 3; irow++)
{
if (dgv[irow, 4] > 0 && dgv[irow, 5] > 0)
{
if (checkBox1.Checked == true)
{
valx = Convert.ToInt32(dgv1.Rows[irow].Cells[4].Value);//lon
valy = Convert.ToInt32(dgv1.Rows[irow].Cells[5].Value);//lat
}
else
{
valx = dgv[irow, 4];//Convert.ToInt32(dgv1.Rows[irow].Cells[4].Value);//lon
valy = dgv[irow, 5];//Convert.ToInt32(dgv1.Rows[irow].Cells[5].Value);//lat
}
valxi = valx - dbk[blockn].minlon;
valyi = valy - dbk[blockn].minlat;
px_1 = px;
px = Convert.ToInt32((double)valxi / scale0);
py_1 = py;
py = Convert.ToInt32((double)valyi / scale0);
//prown 逆弾き代入
if (blockn < comboBox7.Items.Count)//AllBlock 以外
{
prownx[irow - dbk[blockn].startRow] = px;
prowny[irow - dbk[blockn].startRow] = py;
}
//
// All block での色分け
Color cxy;
if (blockn > alln)
{
a = Convert.ToInt32(Math.Ceiling((double)irow / blen));
cxy = samples[a - 1];
}
else
{
cxy = samples[blockn - 1];
}
//
if (checkBox11.Checked == true)
{
// Pen p = new Pen(Color.LawnGreen, 2);
Pen p = new Pen(cxy, 4);
srcxy.DrawLine(p, px, py, px_1, py_1);
Pen p1 = new Pen(cxy, 1);
srcsxy.DrawLine(p1, px, py, px_1, py_1);//拡大用ソース
}
// Brush b1 = new SolidBrush(samples[blockn - 1]);
Brush b1 = new SolidBrush(cxy);
Brush b2 = new SolidBrush(Color.White);
//Nutral Point White
if (blockn < comboBox7.Items.Count)//AllBlock 以外
{
//Debug.Print("colorWhite:irow=" + irow.ToString() + "nutralN=" + dbk[blockn].nutralN[irow - dbk[blockn].startRow].ToString());
if (dbk[blockn].nutralN[irow - dbk[blockn].startRow] == 1)
{
nutralflag = 1;
}
}
// Debug.Print("irow=" + irow.ToString() + ",px=" + px.ToString() + "py=" + py.ToString());
if (dgv[irow, 1] % 100 == 0)//F9P 100msec
{
int diam = 16;
int pxd = px - diam / 2;
int pyd = py - diam / 2;
if (nutralflag == 1) { b1 = b2; }
srcxy.FillEllipse(b1, pxd, pyd, 24, 24);
srcsxy.FillEllipse(b1, pxd, pyd, 4, 4);
nutralflag = 0;
}
}
}
// Debug.Print("irow="+irow.otring()+"px,py="+px.ToString() +","+ py.ToString());
//縮小表示 3000x3000を300x300へ縮小表示-------------------------------------------------
Rectangle srcrect = new Rectangle(0, 0, xysize, xysize);
Rectangle desrect = new Rectangle(0, 0, pic2w, pic2h);
desxy.DrawImage(xyBitmap, desrect, srcrect, GraphicsUnit.Pixel);
//p2sBitmap = p2Bitmap;
pictureBox2.Image = p2Bitmap;
Debug.Print("scale0=" + scale0.ToString() + "px,py=" + px.ToString() + "," + py.ToString());
}//Picturebox2 xyplot******************************************************************************************************
*//////////////////////
}
/*
if (checkBox2.Checked == true)
{
//-----------------------------BinaryFilevread----------------------------------------------
FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);
int fileSize = (int)fs.Length; // ファイルのサイズ
byte[] buf = new byte[fileSize]; // データ格納用配列
int readSize; // Readメソッドで読み込んだバイト数
int remain = fileSize; // 読み込むべき残りのバイト数
int bufPos = 0; // データ格納用配列内の追加位置
int bm = 0;
int bi;
while (remain > 0)
{
// 1024Bytesずつ読み込む
readSize = fs.Read(buf, bufPos, Math.Min(1024, remain));
bm++;
bufPos += readSize;
remain -= readSize;
//Debug.Print("bm=" + bm.ToString());
}
fs.Dispose();
int i;
for (i = 0; i < 200; i++)
{
Debug.Print("fileSize=" + fileSize.ToString() + "buf[" + i.ToString() + "]=" + buf[i].ToString("X"));
}
// ubxcnv(buf, fileSize, ofd.FileName);//ubx 一括変換して、配列格納とファイルセーブ 任意でdgv,richtext表示
}// binary read end
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment