Skip to content

Instantly share code, notes, and snippets.

@dj1711572002
Created February 23, 2023 02:01
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/4747e1022893534ed4050e2f21a0160d to your computer and use it in GitHub Desktop.
Save dj1711572002/4747e1022893534ed4050e2f21a0160d to your computer and use it in GitHub Desktop.
C# STA23 Monitor Pgm rev04 data grid view Raw data sorting
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