Files
easySif/mainProgram/SVDWindows.cs

357 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//#define debug
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace mainProgram
{
public partial class SVDWindows : Form
{
private ProjectManager mProjectManager = null;//保存打开的/新建的工程对象
private string mSifAlgorithm;
public SVDWindows(ProjectManager projectManager,string sifAlgorithm)
{
InitializeComponent();
mProjectManager = projectManager;
mSifAlgorithm = sifAlgorithm;
this.Text = mSifAlgorithm;//设置界面左上角的窗口名
//准备sif算法默认窗口
switch (mSifAlgorithm)
{
case "svd":
Min_FraunhoferWindowTextBox.Text = "740";
Max_FraunhoferWindowTextBox.Text = "770";
FraunhoferPositionTextBox.Text = "760";
UseLeftShoulder(false);
UseRightShoulder(false);
UseFraunhoferPosition(true);
break;
case "sfm":
Min_FraunhoferWindowTextBox.Text = "759";
Max_FraunhoferWindowTextBox.Text = "770";
FraunhoferPositionTextBox.Text = "760";
UseLeftShoulder(false);
UseRightShoulder(false);
UseFraunhoferPosition(true);
break;
case "sfm_gaussian":
Min_FraunhoferWindowTextBox.Text = "759";
Max_FraunhoferWindowTextBox.Text = "770";
FraunhoferPositionTextBox.Text = "760";
UseLeftShoulder(false);
UseRightShoulder(false);
UseFraunhoferPosition(true);
break;
case "doas":
Min_FraunhoferWindowTextBox.Text = "759";
Max_FraunhoferWindowTextBox.Text = "770";
FraunhoferPositionTextBox.Text = "760";
UseLeftShoulder(false);
UseRightShoulder(false);
UseFraunhoferPosition(true);
break;
case "sfld":
Min_FraunhoferWindowTextBox.Text = "740";
Max_FraunhoferWindowTextBox.Text = "780";
LeftShoulder_leftTextBox.Text = "756";
LeftShoulder_rightTextBox.Text = "759";
UseLeftShoulder(true);
UseRightShoulder(false);
UseFraunhoferPosition(false);
break;
case "3fld":
Min_FraunhoferWindowTextBox.Text = "740";
Max_FraunhoferWindowTextBox.Text = "780";
LeftShoulder_leftTextBox.Text = "756";
LeftShoulder_rightTextBox.Text = "759";
RightShoulder_leftTextBox.Text = "761";
RightShoulder_rightTextBox.Text = "762";
UseLeftShoulder(true);
UseRightShoulder(true);
UseFraunhoferPosition(false);
break;
/* 您可以有任意数量的 case 语句 */
default: /* 可选的 */
//statement(s);
break;
}
}
private void UseLeftShoulder(bool readyToUse)
{
LeftShoulder_leftTextBox.Enabled = readyToUse;
LeftShoulder_rightTextBox.Enabled = readyToUse;
}
private void UseRightShoulder(bool readyToUse)
{
RightShoulder_leftTextBox.Enabled = readyToUse;
RightShoulder_rightTextBox.Enabled = readyToUse;
}
private void UseFraunhoferPosition(bool readyToUse)
{
FraunhoferPositionTextBox.Enabled = readyToUse;
}
private void ProcessBtn_Click(object sender, EventArgs e)
{
//准备需要处理的文件
DateTime min = min_dateTimePicker.Value;
DateTime max = max_dateTimePicker.Value;
if (max < min)
{
MessageBox.Show(this, "选择的数据时间错误!", "提示");
return;
}
string minTime = min.Year.ToString() + "_" + min.Month.ToString() + "_" + min.Day.ToString();
string maxTime = max.Year.ToString() + "_" + max.Month.ToString() + "_" + max.Day.ToString();
ProcessMessageTextBox.Text = "Preparing files ...";
mProjectManager.CopyWantedFiles(minTime, maxTime);
this.ProcessMessageTextBox.Text = this.ProcessMessageTextBox.Text + System.Environment.NewLine + "\tdone ..." + System.Environment.NewLine;
try
{
//构建参数
string programDir = System.Environment.CurrentDirectory;
#if debug//条件编译符号 定义在 此源文件的第一行
string param1 = "D:\\PycharmProjects\\sif\\standard_sif.csv";
#else
string param1 = Path.Combine(programDir, "standard_sif.csv");
#endif
string param2 = mProjectManager.mSifTmpPath;//输入数据文件夹
string outputFileName = mSifAlgorithm + "_" + Min_FraunhoferWindowTextBox.Text + "-" + Max_FraunhoferWindowTextBox.Text + "_" + FraunhoferPositionTextBox.Text + "_" + minTime + "-" + maxTime + ".csv";
string param3 = Path.Combine(mProjectManager.mSifPath, outputFileName);//输出文件名
string param4 = "";
switch (mSifAlgorithm)
{
case "svd":
case "sfm":
case "sfm_gaussian":
case "doas":
//string param4 = "[740,770],760";
param4 = "[" + Min_FraunhoferWindowTextBox.Text + "," + Max_FraunhoferWindowTextBox.Text + "]," + FraunhoferPositionTextBox.Text;
break;
case "sfld":
param4 = "[" + Min_FraunhoferWindowTextBox.Text + "," + Max_FraunhoferWindowTextBox.Text + "]," + "[" + LeftShoulder_leftTextBox.Text + "," + LeftShoulder_rightTextBox.Text + "]";
break;
case "3fld":
param4 = "[" + Min_FraunhoferWindowTextBox.Text + "," + Max_FraunhoferWindowTextBox.Text + "]," + "[" + LeftShoulder_leftTextBox.Text + "," + LeftShoulder_rightTextBox.Text + "]," + "[" + RightShoulder_leftTextBox.Text + "," + RightShoulder_rightTextBox.Text + "]";
break;
/* 您可以有任意数量的 case 语句 */
default: /* 可选的 */
//statement(s);
break;
}
string param5 = "P1";
string param6 = mSifAlgorithm;
int a = 1;
int b = 2;
//执行算法
StartTest(param1, param2, param3, param4, param5, param6);
//this.DialogResult = DialogResult.OK;//这行代码会导致窗口直接关闭
}
catch (Exception e1)
{
MessageBox.Show(e1.Message);
}
}
private Process progressTest;
private void log(string log, bool time)
{
//将参数写入到txt文件中 → 调试使用
string programDir = System.Environment.CurrentDirectory;
string tmp = Path.Combine(programDir, "commandLine.txt");//保存的文件路径
//FileStream mystream = new FileStream(tmp, FileMode.OpenOrCreate);
//StreamWriter sw = new StreamWriter(mystream);
StreamWriter sw = new StreamWriter(tmp, true);
if (time)
{
string tradeTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ", DateTimeFormatInfo.InvariantInfo);
sw.WriteLine(tradeTime + log);//按行写
}
else
{
sw.WriteLine(" " + log);//按行写
}
sw.Close();//关闭
}
public bool StartTest(string param1, string param2, string param3, string param4, string param5, string param6)
{
bool state = true;
Console.WriteLine("开始执行sif 算法 python+++++++++++++++++++++++\n");
ProcessStartInfo start = new ProcessStartInfo();
string programDir = System.Environment.CurrentDirectory;
#if debug//条件编译符号 定义在 此源文件的第一行
string sifPlgorithm_exe = Path.Combine(@"D:\csharp_vs2017\easySif\sifAlgorithm_Python_exe\dist", "sif_retrieval.exe");
#else
string sifPlgorithm_exe = Path.Combine(programDir, "sif_retrieval.exe");
#endif
start.FileName = sifPlgorithm_exe;
string sArguments = param1 + " " + param2 + " " + param3 + " " + param4 + " " + param5 + " " + param6;
log(sArguments, true);
start.Arguments = sArguments;
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
start.RedirectStandardInput = true;
start.RedirectStandardError = true;
start.CreateNoWindow = true;
using (progressTest = Process.Start(start))
{
// 异步获取命令行内容
progressTest.BeginOutputReadLine();
// 为异步获取订阅事件
progressTest.OutputDataReceived += new DataReceivedEventHandler(outputDataReceived);
progressTest.ErrorDataReceived += new DataReceivedEventHandler(outputDataReceived2);
//progressTest.StandardError += new
}
Console.WriteLine("开始执行sif 算法 python---------------------\n");
//this.DialogResult = DialogResult.OK;//这行代码会导致窗口直接关闭
return state;
}
public void outputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))//System.Environment.NewLine
{
this.Invoke(
new Action(() => { this.ProcessMessageTextBox.AppendText(e.Data + System.Environment.NewLine); log(e.Data, false); })
);
if (e.Data.Contains("Sif compute Completed!"))//当转换完成后
{
this.Invoke(
new Action(() => { MessageBox.Show(this, "sif计算完成", "提示"); this.DialogResult = DialogResult.OK; this.Close(); })
);
}
if (e.Data.Contains("error"))//当转换完成后
{
this.Invoke(
new Action(() => { MessageBox.Show(this, "sif算法发生错误请联系工程师解决", "提示"); this.DialogResult = DialogResult.No; this.Close(); })
);
}
}
//if (this.InvokeRequired)//InvokeRequired属性为真时说明一个创建它以以外的线程想访问它
//{
// if (e.Data.Contains("Completed"))//System.NullReferenceException:“未将对象引用设置到对象的实例。”
// //System.Diagnostics.DataReceivedEventArgs.Data.get 返回 null。
// {
// DataReceivedEventHandler Tmp = new DataReceivedEventHandler(outputDataReceived);
// this.Invoke(Tmp, new object[] { sender, e });
// }
//}
//else
//{
// MessageBox.Show(this, "sif转换完成", "提示");//线程间操作无效: 从不是创建控件“SVDWindows”的线程访问它。
//}
}
public void outputDataReceived2(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))//System.Environment.NewLine
{
string tmp = this.ProcessMessageTextBox.Text + System.Environment.NewLine + e.Data;
this.Invoke(
new Action(() => { this.ProcessMessageTextBox.Text = tmp; log(e.Data, false); })
);
if (e.Data.Contains("Completed"))//当转换完成后
{
this.Invoke(
new Action(() => { MessageBox.Show(this, "sif转换完成", "提示"); this.DialogResult = DialogResult.OK; this.Close(); })
);
}
}
}
private void CancelBtn_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
Close();
}
private void SVDWindows_Load(object sender, EventArgs e)
{
//获取数据的时间范围
mProjectManager.FindTimespan();
string minDate = mProjectManager.GetMinDate();
string maxDate = mProjectManager.GetMaxDate();
string[] minDateList = minDate.Split('_');
string[] maxDateList = maxDate.Split('_');
//显示数据的时间范围
MinYearTextBox.Text = minDateList[0];
MinMonthTextBox.Text = minDateList[1];
MinDayTextBox.Text = minDateList[2];
MaxYearTextBox.Text = maxDateList[0];
MaxMonthTextBox.Text = maxDateList[1];
MaxDayTextBox.Text = maxDateList[2];
//设置默认需要处理的时间范围
DateTime min = new DateTime(int.Parse(minDateList[0]), int.Parse(minDateList[1]), int.Parse(minDateList[2]));
DateTime max = new DateTime(int.Parse(maxDateList[0]), int.Parse(maxDateList[1]), int.Parse(maxDateList[2]));
min_dateTimePicker.MinDate = min;
min_dateTimePicker.MaxDate = max;
min_dateTimePicker.Value = min;
max_dateTimePicker.MinDate = min;
max_dateTimePicker.MaxDate = max;
max_dateTimePicker.Value = max;
}
}
}