-
-
Save dj1711572002/4747e1022893534ed4050e2f21a0160d to your computer and use it in GitHub Desktop.
C# STA23 Monitor Pgm rev04 data grid view Raw data sorting
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
using static System.Net.WebRequestMethods; | |
using File = System.IO.File; | |
using System.Runtime.Intrinsics.X86; | |
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;//smode[]範囲内でのflag 67未満の個数 | |
public double[] fmissper;//fmiss% | |
// mode | |
public int[] smode_startNo;//=new int[10];//s] modeの開始番号 配列 | |
public int[] smode_endNo;//=new int[10];//s] modeの終了番号 配列 | |
public int smodeN;//測定ファイル内のsmode範囲の個数 | |
// digit error | |
public string [,] digit_err;//itow+err.string | |
public int[] digit_errN;//[smodeN] | |
//itow error | |
public string[,] itow_error;// 足りないitow.Tostring() | |
public int[] itow_errN;//[smodeN] | |
public double[] itow_errper;//% err | |
}; | |
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 = "STA23_SerialMonitor_rev04"; | |
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_upB0,tp,tp0"; | |
string head1 = ",[Base],itowB, NYB, EXB, DZB, gSpeedB, headMotBZ"; | |
string head2 = ",[Rover] ,itowR,NYR,EXR,DZR,gSpeedR,mHead,bnHosei+eX[0],relLm]"; | |
string head3 = ",BNO],yaw1,pitch1,roll1,yaw2,pitch2,roll2,yaw3,pitch3,roll3"; | |
string headall = head0 + head1 + head2 + head3; | |
string[] headArr = headall.Split(','); | |
int headlen = headArr.Length; | |
// string head0 = "md(0), flagsB(1), flagsR(2), pdopB(3), pdopR(4), haccB(5), haccR(6), miscount0(7), count_upB(8),count_upB0(9),tp(10),tp0(11)"; | |
//string head1 = ",[Base](12),itowB(13), NYB(14), EXB(15), DZB(16), gSpeedB(17), headMotBZ(18)"; | |
//string head2 = ",[Rover](19) ,itowR(20),NYR(21),EXR(22),DZR(23),gSpeedR(24),mHead(25),bnHosei+eX[0](26),relLm](27)"; | |
//string head3 = ",BNO](28),yaw1(29),pitch1(30),roll1(31),yaw2(32),pitch2(33),roll2(34),yaw3(35),pitch3(36),roll3(37)" | |
for (i = 0; i < headlen; i++) | |
{ | |
dgv1.Columns[i].HeaderText = headArr[i]; ; | |
dgv1.Rows[0].Cells[i].Value = i; | |
} | |
FileInfo filesize = new FileInfo(ofd.FileName); | |
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('['); | |
int ni=0; | |
for (ic = 1; ic < (int)(sline.Length - 2); ic++) | |
{ | |
//Debug.Print("sline[" + ic.ToString() + "]=" + sline[ic]); | |
string [] tsline = sline[ic].Split("\r\n");//行内に複数ある\r\nと余計なコメントを除去 | |
sline[ic] = tsline[0];//再度sline[]に代入 | |
/* | |
for (ni = 0; ni < tsline.Length; ni++) | |
{ | |
Debug.Print("tsline[" + ni.ToString() + "]=" + tsline[ni]); | |
} | |
*/ | |
} | |
//string[] sline = alldata.Split("\r\n"); | |
//Debug.Print("sline[0]=" + sline[0]); | |
// Debug.Print("sline[1]=" + sline[1]); | |
swtch.Stop(); | |
sizes = sline.Length + "行," + filesize.Length.ToString() + "byte Ellapsed Time=" + swtch.ElapsedMilliseconds.ToString() + "msec"; | |
label8.Text = sizes; | |
if (checkBox3.Checked == true)//dgv visible | |
{ | |
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; | |
string datas0 =""; | |
string datas1 = ""; | |
string datas2=""; | |
for (ic = 1; ic < (int)(sline.Length - 2); ic++) | |
{ | |
//Debug.Print("sline["+ic.ToString()+"]=" + sline[ic].Substring(0, 3).ToString()); | |
if (sline[ic].Length > 2) | |
{ | |
sline[ic] = sline[ic].Replace("\r\n", ""); | |
// string tsline = sline[ic].Replace(Environment.NewLine, ""); | |
//string[] tsline = sline[ic].Split("\r\n"); | |
// Debug.Print("ic=" + ic.ToString() + "sline[0]=" + sline[0]); | |
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); | |
*/ | |
datas2 = datas1; | |
datas1 = datas0; | |
ss = sline[ic - 1] + "," + sline[ic] + sline[ic + 1] + "," + sline[ic + 2]; | |
string[] datas = ss.Split(','); // カンマで区切って配列に格 | |
//Debug.Print("datas[0]=" + datas[0],"datas1="+datas1); | |
datas0 = datas[0]; | |
if (datas[0] == "s]") | |
{ | |
dgv1.Rows.Add(datas);//dgv1書き込み | |
cr++; | |
} | |
if(datas1=="s]" && datas0=="m]") | |
{ | |
dgv1.Rows.Add(datas);//dgv1書き込み | |
cr++; | |
//Debug.Print("[m] cr=" + cr.ToString()); | |
} | |
} | |
} | |
} | |
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;//有効エンドrn | |
public int miss;//itow飛び個数 | |
public double missper;//miss% | |
public int[] fmiss;//smode[]範囲内でのflag 67未満の個数 | |
public double[] fmissper;//fmiss% | |
// mode | |
public int[] smode_startNo;//=new int[10];//s] modeの開始番号 配列 | |
public int[] smode_endNo;//=new int[10];//s] modeの終了番号 配列 | |
public int smodeN;//測定ファイル内のsmode範囲の個数 | |
// digit error | |
public string [,] digit_err;//itow+err.string | |
public int[] digit_errN;//[smodeN] | |
//itow error | |
public string[,] itow_error;// 足りないitow.Tostring() | |
public int[] itow_errN;//[smodeN] | |
public double[] itow_errper;//% err | |
}; | |
dgvchk dc;//1測定dgvに一個 | |
// string head0 = "md(0), flagsB(1), flagsR(2), pdopB(3), pdopR(4), haccB(5), haccR(6), miscount0(7), count_upB(8),count_upB0(9),tp(10),tp0(11)"; | |
//string head1 = ",[Base](12),itowB(13), NYB(14), EXB(15), DZB(16), gSpeedB(17), headMotBZ(18)"; | |
//string head2 = ",[Rover](19) ,itowR(20),NYR(21),EXR(22),DZR(23),gSpeedR(24),mHead(25),bnHosei+eX[0](26),relLm](27)"; | |
//string head3 = ",BNO](28),yaw1(29),pitch1(30),roll1(31),yaw2(32),pitch2(33),roll2(34),yaw3(35),pitch3(36),roll3(37)" | |
*/ | |
private void button11_Click(object sender, EventArgs e)//sortdgv 起動 | |
{ | |
sortdgv(); | |
} | |
void sortdgv()//生データを整理してから各有効データの行番号を抽出 | |
{ | |
var swtch0 = new System.Diagnostics.Stopwatch(); | |
swtch0.Reset(); | |
swtch0.Start(); | |
dgv1.DefaultCellStyle.NullValue = "0"; | |
dgv1.DefaultCellStyle.DataSourceNullValue = "0"; | |
DateTime now = DateTime.Now; | |
Debug.Print("sortdgv In:" + now.ToString()); | |
//行チェック 列ごとに前後チェック | |
//string[,] itow_error = new string[10, 1000];//エラー行列を記録[smodeN,irr] | |
int colitowb = 13;//itowBの列番号 | |
int colitowr = 20;//itowRの列番号 | |
int iir = 0; | |
int iic = 1; | |
int erri = 0; | |
int itowB0, itowB0_1; | |
dc.digit_err = new string[10, 1000]; | |
dc.itow_error= new string[10, 1000];//エラー行列を記録[smodeN,irr] | |
dc.itow_errN = new int[10]; | |
dc.itow_errper = new double[10]; | |
dc.smode_startNo = new int[10]; | |
dc.smode_endNo = new int[10]; | |
//*********Null削除**************************** | |
dc.maxrow = dgv1.RowCount; | |
for (iir = 1; iir < dc.maxrow - 2; iir++)//行ループ | |
{ | |
for (iic = 0; iic < 38; iic++) | |
{ | |
if (dgv1.Rows[iir].Cells[iic].Value == null) | |
{ | |
dgv1.Rows[iir].Cells[iic].Value = "0"; | |
//dgv1.Rows[iir].Cells[iic].Value = dgv1.Rows[iir - 1].Cells[iic].Value; | |
Debug.Print("null repaired 0 [" + iir.ToString() + "],[" + iic.ToString() + "]" + millis()); | |
} | |
} | |
// if (dgv1.Rows[iir].Cells[0].Value == null) | |
// { | |
// dgv1.Rows.RemoveAt(iir); | |
// Debug.Print("Null Remove iir=" + iir.ToString() + "Cells[0]=Null"); | |
//} | |
} | |
//**********Null削除END*******************************: | |
//各データの異常反転基準値配列を作る、<criteria[]は正数、>criteria[]は負数 | |
double[] criteria = new double[38] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38 }; | |
//1:flags 131 67 変化 | |
dc.maxrow = dgv1.RowCount; | |
//最初にmHeadを180度回転補正 | |
mhead180(25, 2, dgv1.Rows.Count - 2); | |
//headMot double | |
hmotd();//headMotをDoubleに変換 | |
//************************smode範囲 check***************************************************** | |
//dc.smode_startNo[], dc.smode_endNo[],dc.smodeNを得る | |
string modes = "+[s]"; | |
int smodenum = 0; | |
int mode_startflag = 0; | |
int mode_startNo = 0; | |
int mode_endNo = 0; | |
//smode Range Count itowが1秒以上離れたら別範囲************************************** | |
smodesearch(); | |
Debug.Print("smode count dc.smode_endNo[" + smodenum.ToString() + "]=" + dc.smode_endNo[smodenum].ToString() + "dc_smodeN=" + dc.smodeN.ToString()); | |
mode_endNo = dc.maxrow - 2; | |
DateTime now1 = DateTime.Now; | |
Debug.Print("smode SearchFinished :" + now1.ToString()); | |
//Smode end*********************************************************************************************************************************** | |
//Digit error repaire*********************************************************************************************** | |
//処理1:nullセルは0代入 | |
//処理2:文字が数値でないセルは、前の行データ代入 | |
int smodeitr = 0; | |
while (smodeitr <= dc.smodeN)//smodeの個数だけスキャン | |
{ | |
DateTime now3 = DateTime.Now; | |
Debug.Print("loop end :" +now3.ToString()+ now3.Millisecond.ToString()); | |
for (iir = dc.smode_startNo[smodeitr]; iir < dc.smode_endNo[smodeitr]; iir++)//行ループ 2行から開始してiir-1行目とiir行目比較 | |
{ // public static bool TryParse( string s, out データ型名 result)を使って文字から数値変換できるかチェック | |
//nullチェック | |
string itows = dgv1.Rows[iir].Cells[13].Value.ToString(); | |
for (iic = 1; iic < 38; iic++) | |
{ | |
if (dgv1.Rows[iir].Cells[iic].Value == null)//nullチェック | |
{ | |
//dgv1.Rows[iir].Cells[iic].Value = "0"; | |
dgv1.Rows[iir].Cells[iic].Value = dgv1.Rows[iir - 1].Cells[iic].Value; | |
Debug.Print("null repaired 0 [" + iir.ToString() + "],[" + iic.ToString() + "]"+millis()); | |
} | |
} | |
int derr = 0; | |
for (iic = 1; iic < 38; iic++) | |
{ | |
if (iic != 12 && iic != 19 && iic != 28) | |
{ | |
double i; | |
//string cellstr = dgv1.Rows[iir].Cells[iic].Value.ToString(); | |
if (double.TryParse(dgv1.Rows[iir].Cells[iic].Value.ToString(), out i))//文字セルが数値かどうかチェック | |
{ | |
//itow_error[smodeitr, erri] = iir.ToString() + "," + itowsa.ToString(); | |
//Debug.Print("Inseted:itow_erri[" + smodeitr.ToString() + "," + erri.ToString() + "] =" + itow_error[smodeitr, erri] + ", itowB=" + dgv1.Rows[iir].Cells[13].Value + "," + dgv1.Rows[iir - 1].Cells[13].Value); | |
} | |
else | |
{ | |
// Debug.Print("数値に変換できません=" + "Rows[" + iir.ToString() + "]Cells[" + iic.ToString() + "]=" + dgv1.Rows[iir].Cells[iic].Value.ToString()+","+millis()); | |
//非数値異常値は、1個上のデータで置き換え | |
dc.digit_err[smodeitr, derr] = itows+","+dgv1.Rows[iir].Cells[iic].Value.ToString(); | |
Debug.Print("dc_err="+dc.digit_err[smodeitr, derr]); | |
derr++; | |
if (checkBox4.Checked == true) | |
{ | |
int iiic; | |
for (iiic = 1; iiic < 38; iiic++) | |
{ | |
// Debug.Print("Rows[" + iir.ToString() + "]Cells[" + iiic.ToString() + "]=" + dgv1.Rows[iir].Cells[iiic].Value.ToString() + "=>Repaired=" + dgv1.Rows[iir].Cells[iiic].Value.ToString()); | |
dgv1.Rows[iir].Cells[iiic].Value = dgv1.Rows[iir - 1].Cells[iiic].Value; | |
} | |
} | |
// erri++;//エラー扱い | |
// iir++;//1個飛ばし | |
} | |
} | |
} | |
} | |
//increment | |
smodeitr++; | |
erri = 0; | |
}//while modeitr end | |
//===============================itow Insert=========================================================== | |
//if (checkBox4.Checked == true) | |
//{ | |
smodeitr = 0; | |
while (smodeitr < dc.smodeN)//smodeの個数だけスキャン | |
{ | |
Debug.Print("itowInsert START"); | |
for (iir = dc.smode_startNo[smodeitr]+1; iir < dc.smode_endNo[smodeitr]; iir++)//行ループ 2行から開始してiir-1行目とiir行目比較 | |
{ | |
itowB0 = Convert.ToInt32(dgv1.Rows[iir].Cells[13].Value); | |
itowB0_1 = Convert.ToInt32(dgv1.Rows[iir - 1].Cells[13].Value); | |
int itowsa = itowB0 - itowB0_1; | |
if (itowsa > 124 && itowsa<244) | |
{ | |
dc.itow_error[smodeitr, erri] = (itowB0 + 120).ToString() + "," + itowsa.ToString(); | |
dc.itow_errN[smodeitr] = erri; | |
rinsert(iir, itowsa); | |
Debug.Print("124<<244iir="+iir.ToString()+"sa="+itowsa.ToString()+"Inserted:itow_erri[" + smodeitr.ToString() + "," + erri.ToString() + "] =" + dc.itow_error[smodeitr, erri] + ", itowB=" + dgv1.Rows[iir].Cells[13].Value + "," + dgv1.Rows[iir - 1].Cells[13].Value + "," + millis()); | |
erri++; | |
} | |
else if(itowsa>244) | |
{ | |
Debug.Print(">244]iir=" + iir.ToString() + "sa=" + itowsa.ToString() + "Inserted:itow_erri[" + smodeitr.ToString() + "," + erri.ToString() + "] =" + dc.itow_error[smodeitr, erri] + ", itowB=" + dgv1.Rows[iir].Cells[13].Value + "," + dgv1.Rows[iir - 1].Cells[13].Value + "," + millis()); | |
} | |
} | |
smodeitr++; | |
erri = 0; | |
// }//itow insert end | |
} | |
smodesearch();//最後の行数でsmode再実施 | |
//Percent 計算 | |
//itow error | |
//public string[,] itow_error;// 足りないitow.Tostring() | |
//public int[] itow_errN;//[smodeN] | |
//public double[] itow_errper;//% err | |
for(smodeitr=0;smodeitr<dc.smodeN;smodeitr++) | |
{ | |
dc.itow_errper[smodeitr] = (double)dc.itow_errN[smodeitr] / (dc.smode_endNo[smodeitr] - dc.smode_startNo[smodeitr])*100; | |
Debug.Print("dc.itow_errper[" + smodeitr.ToString() + "]=" + dc.itow_errper[smodeitr].ToString("F2")+"%"); | |
} | |
//}//checkbox4 end | |
Debug.Print("Sort dgv FINISHED"); | |
//finished | |
label9.Text="sortdgv:smodeN="+dc.smodeN.ToString()+"erri="+erri.ToString(); | |
}//sortdgv end | |
//******************************************************************************************************************************************** | |
private void smodesearch() | |
{ | |
//*********************smode Range Count itowが1秒以上離れたら別範囲************************************** | |
int iir; | |
int mode_startflag = 0; | |
int mode_startNo=0; | |
int smodenum=0; | |
int mode_endNo = 0; | |
dc.maxrow = dgv1.RowCount; | |
for (iir = 1; iir < dc.maxrow - 2; iir++)//行ループ | |
{ | |
int itowd = Convert.ToInt32(dgv1.Rows[iir].Cells[13].Value); | |
int itowd_1 = Convert.ToInt32(dgv1.Rows[iir - 1].Cells[13].Value); | |
//if (md.Substring(0, 2) == "s]" && mode_startflag == 0) | |
if (itowd - itowd_1 < 124 && mode_startflag == 0 && iir<=dc.maxrow-4) | |
{ | |
mode_startflag = 1; | |
mode_startNo = iir; | |
dc.smode_startNo[smodenum] = iir; | |
dc.smodeN = smodenum; | |
Debug.Print("dc.smode_startNo[" + smodenum.ToString() + "]=" + dc.smode_startNo[smodenum].ToString()); | |
} | |
else if ((itowd - itowd_1 > 1000 || iir>=dc.maxrow-4 )&& mode_startflag == 1) | |
{ | |
mode_endNo = iir; | |
mode_startflag = 0; | |
dc.smode_endNo[smodenum] = iir; | |
dc.smodeN = smodenum + 1; | |
Debug.Print("dc.smode_endNo[" + smodenum.ToString() + "]=" + dc.smode_endNo[smodenum].ToString() + "dc_smodeN=" + dc.smodeN.ToString()); | |
smodenum++; | |
} | |
/* | |
else | |
{ | |
mode_endNo = iir; | |
mode_startflag = 1; | |
dc.smode_endNo[smodenum] = iir; | |
dc.smodeN = smodenum + 1; | |
//Debug.Print("dc.smode_endNo[" + smodenum.ToString() + "]=" + dc.smode_endNo[smodenum].ToString() + "dc_smodeN=" + dc.smodeN.ToString()); | |
//smodenum++; | |
} | |
*/ | |
//dc.maxrow = dgv1.RowCount; | |
} | |
} | |
private string millis() | |
{ | |
DateTime now3 = DateTime.Now; | |
string mil= now3.ToString() +":"+ now3.Millisecond.ToString(); | |
return mil; | |
} | |
private void rinsert(int rn, int sa) | |
{ | |
//itow | |
if (sa <= 240) | |
{ | |
try | |
{ | |
int cii; | |
dgv1.Rows.Insert(rn); | |
Debug.Print("rinsert [=" + rn.ToString() + "]"); | |
dgv1.Rows[rn].Cells[13].Value = Convert.ToInt32(dgv1.Rows[rn - 1].Cells[13].Value) + 120;//抜けたitow | |
for (cii = 14; cii < 19; cii++) | |
{ | |
double ave = (Convert.ToDouble(dgv1.Rows[rn - 1].Cells[cii].Value) + Convert.ToDouble(dgv1.Rows[rn + 1].Cells[cii].Value)) / 2; | |
dgv1.Rows[rn].Cells[cii].Value = ave.ToString("F2"); | |
} | |
for (cii = 20; cii < 28; cii++) | |
{ | |
double ave = (Convert.ToDouble(dgv1.Rows[rn - 1].Cells[cii].Value) + Convert.ToDouble(dgv1.Rows[rn + 1].Cells[cii].Value)) / 2; | |
dgv1.Rows[rn].Cells[cii].Value = ave.ToString("F2"); | |
} | |
for (cii = 29; cii < 38; cii++) | |
{ | |
double ave = (Convert.ToDouble(dgv1.Rows[rn - 1].Cells[cii].Value) + Convert.ToDouble(dgv1.Rows[rn + 1].Cells[cii].Value)) / 2; | |
dgv1.Rows[rn].Cells[cii].Value = ave.ToString("F2"); | |
} | |
} | |
catch(Exception e) | |
{ | |
} | |
} | |
} | |
private void mhead180(int col, int startr, int endr) | |
{ | |
int hii; | |
for (hii = startr; hii < endr; hii++) | |
{ | |
double d; | |
string sh = dgv1.Rows[hii].Cells[col].Value.ToString(); | |
if (double.TryParse(sh, out d)) | |
{ | |
double head = Convert.ToDouble(dgv1.Rows[hii].Cells[col].Value) + 180; | |
if (head > 360) | |
{ | |
head = head - 360; | |
} | |
dgv1.Rows[hii].Cells[col].Value = head.ToString("F2"); | |
//変換出来たら、dにその数値が入る | |
// Console.WriteLine("{0} は数値 {1} に変換できます。", sh, d); | |
} | |
else | |
{ | |
//Console.WriteLine("{0} は数字ではありません。", sh); | |
Debug.Print("Not Numerical format Cell= " + hii.ToString() + "sh=" + sh); | |
} | |
} | |
} | |
private void hmotd() | |
{ | |
int ir; | |
double d; | |
for (ir = 1; ir < dc.maxrow - 2; ir++)//行ループ | |
{ | |
string sh = dgv1.Rows[ir].Cells[18].Value.ToString(); | |
if (double.TryParse(sh, out d)) | |
{ | |
double hmotd = Convert.ToDouble(dgv1.Rows[ir].Cells[18].Value) * 0.00001; | |
dgv1.Rows[ir].Cells[18].Value = hmotd.ToString("F2"); | |
//変換出来たら、dにその数値が入る | |
Console.WriteLine("{0} は数値 {1} に変換できます。", sh, d); | |
} | |
else | |
{ | |
Console.WriteLine("{0} は数字ではありません。", sh); | |
Debug.Print("Not Numerical format Cell= " + ir.ToString() + "sh=" + sh); | |
} | |
//double hmotd = Convert.ToDouble(dgv1.Rows[ir].Cells[18].Value) * 0.00001; | |
//dgv1.Rows[ir].Cells[18].Value = hmotd.ToString(); | |
} | |
} | |
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