357 lines
14 KiB
C#
357 lines
14 KiB
C#
//#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;
|
||
}
|
||
}
|
||
}
|