📄 frmcalibrate.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using DAS;
namespace MCA
{
public partial class FrmCalibrate : Form
{
#region "私有变量"
internal FrmMain frmmain;
private DataTable paratable;
private DAnalyzer analyzer;
#endregion
#region "构造函数"
public FrmCalibrate()
{
InitializeComponent();
paratable = new DataTable("calibrate");
paratable.Columns.Add("Channel", typeof(double));
paratable.Columns.Add("Energy(keV)", typeof(double));
DataRow row = paratable.NewRow();
row[0] = 0;
row[1] = 0;
paratable.Rows.Add(row);
paratable.AcceptChanges();
gridPara.DataSource = paratable;
analyzer = new DAnalyzer();
}
#endregion
#region "移动窗体"
private bool moveenable;
private int px;
private int py;
private void panelCaption_MouseDown(object sender, MouseEventArgs e)
{
moveenable = true;
//保存原始的坐标点,便于移动时计算相对距离
px = e.X;
py = e.Y;
}
private void panelCaption_MouseMove(object sender, MouseEventArgs e)
{
if (moveenable)
{
this.Left += e.X - px;
this.Top += e.Y - py;
this.Refresh();
frmmain.Refresh();
}
}
private void panelCaption_MouseUp(object sender, MouseEventArgs e)
{
moveenable = false;
}
#endregion
#region "控制输入面板"
private void nUpDownvalue_LostFocus(object sender, EventArgs e)
{
inputPanel.Enabled = false;
}
private void nUpDownvalue_GotFocus(object sender, EventArgs e)
{
inputPanel.Enabled = true;
}
private void nUpDownvalue1_GotFocus(object sender, EventArgs e)
{
inputPanel.Enabled = true;
}
private void nUpDownvalue1_LostFocus(object sender, EventArgs e)
{
inputPanel.Enabled = false;
}
#endregion
#region "保存参数"
/// <summary>
/// 保存参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtSave_MouseUp(object sender, MouseEventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
if (!saveFileDialog.FileName.ToLower().EndsWith(".cal"))
{
saveFileDialog.FileName += ".cal";
}
try
{
paratable.WriteXml(saveFileDialog.FileName, XmlWriteMode.WriteSchema);
MessageBox.Show("参数保存成功。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
}
catch (Exception)
{
MessageBox.Show("参数保存失败。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
return;
}
}
}
#endregion
#region "读入参数"
/// <summary>
/// 读入参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtOpen_MouseUp(object sender, MouseEventArgs e)
{
try
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
paratable.Rows.Clear();
paratable.ReadXml(openFileDialog.FileName);
paratable.AcceptChanges();
MessageBox.Show("参数读入成功。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
}
}
catch (Exception)
{
MessageBox.Show("参数读入失败。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
DataRow row = paratable.NewRow();
row[0] = 0;
row[1] = 0;
paratable.Rows.Add(row);
paratable.AcceptChanges();
return;
}
finally
{
DataGridCell cell = gridPara.CurrentCell;
double d = (double)gridPara[cell.RowNumber, cell.ColumnNumber];
nUpDownvalue.Value = (int)d;
double d1 = d - (double)nUpDownvalue.Value;
if (d1 > 0)
{
nUpDownvalue1.Value = Convert.ToDecimal(d1.ToString().Remove(0, 2));
}
else
{
if (d1 == 0)
{
nUpDownvalue1.Value = 0;
}
else
{
nUpDownvalue1.Value = Convert.ToDecimal(d1.ToString().Remove(0, 3));
}
}
}
}
#endregion
#region "删除参数"
/// <summary>
/// 删除参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtDelect_MouseUp(object sender, MouseEventArgs e)
{
if (paratable.Rows.Count < 2)
{
return;
}
int n = gridPara.CurrentRowIndex;
if (n < paratable.Rows.Count)
{
paratable.Rows[n].Delete();
paratable.AcceptChanges();
}
}
#endregion
#region "新增参数"
/// <summary>
/// 新增参数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtAdd_MouseUp(object sender, MouseEventArgs e)
{
DataRow row = paratable.NewRow();
row[0] = 0;
row[1] = 0;
paratable.Rows.Add(row);
paratable.AcceptChanges();
}
#endregion
#region "显示刻度曲线"
/// <summary>
/// 显示刻度曲线
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtCursor_MouseUp(object sender, MouseEventArgs e)
{
if (DrawBox.Visible)
{
DrawBox.Visible = false;
panel4.Visible = false;
ibtCurve.Image = imageList.Images[0];
}
else
{
int i;
int n = paratable.Rows.Count;
if (n < 2)
{
MessageBox.Show("参数个数太少。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
return;
}
//检查道址是否有重复
ArrayList list = new ArrayList();
list.Add(gridPara[0, 0]);
for (i = 1; i < n; i++)
{
if (list.Contains(gridPara[i, 0]))
{
MessageBox.Show("道址有重复。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
return;
}
else
{
list.Add(gridPara[i, 0]);
}
}
//生成参数
LeastSquareData[] data = new LeastSquareData[n];
for (i = 0; i < data.Length; i++)
{
data[i].X = (double)gridPara[i, 0];
data[i].Fx = (double)gridPara[i, 1];
}
LeastSquareResult result;
if (rbtLine.Checked == false)
{
result = analyzer.LeastSquare(MultinomialType.Square, data);
lbResult.Text = "Energy = " + result.C.ToString("E3") + "*Ch^2 + " + result.B.ToString("E3") + "*Ch + " + result.A.ToString("E3");
}
else
{
result = analyzer.LeastSquare(MultinomialType.Linear, data);
lbResult.Text = "Energy = " + result.B.ToString("E3") + "*Ch + " + result.A.ToString("E3");
}
using (Bitmap b = new Bitmap(1, 1))
{
using (Graphics g = Graphics.FromImage(b))
{
if (g.MeasureString(lbResult.Text, lbResult.Font).Width > lbResult.Width)
{
lbResult.Top = 0;
}
else
{
lbResult.Top = 6;
}
}
}
//显示曲线
int[] drawdata = new int[frmmain.drawbox.MaxX + 1];
int max = 0;
int min = 0;
for (i = 0; i < drawdata.Length; i++)
{
drawdata[i] = (int)(result.A + result.B * i + result.C * i * i);
if (drawdata[i] >= max)
{
max = drawdata[i];
}
if (drawdata[i] <= min)
{
min = drawdata[i];
}
}
DrawBox.MaxX = drawdata.Length - 1;
DrawBox.MaxY = max + 1;
DrawBox.MinY = min - 1;
DrawBox.Data = drawdata;
DrawBox.Visible = true;
panel4.Visible = true;
ibtCurve.Image = imageList.Images[1];
}
}
#endregion
#region "取消"
/// <summary>
/// 取消参数输入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtCancel_MouseUp(object sender, MouseEventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
#endregion
#region "完成参数输入"
/// <summary>
/// 完成参数输入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ibtOK_MouseUp(object sender, MouseEventArgs e)
{
int i;
int n = paratable.Rows.Count;
if (n < 2)
{
MessageBox.Show("参数个数太少。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
return;
}
//检查道址是否有重复
ArrayList list = new ArrayList();
list.Add(gridPara[0, 0]);
for (i = 1; i < n; i++)
{
if (list.Contains(gridPara[i, 0]))
{
MessageBox.Show("道址有重复。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
return;
}
else
{
list.Add(gridPara[i, 0]);
}
}
//生成参数
LeastSquareData[] data = new LeastSquareData[n];
for (i = 0; i < data.Length; i++)
{
data[i].X = (double)gridPara[i, 0];
data[i].Fx = (double)gridPara[i, 1];
}
if (rbtLine.Checked == false)
{
frmmain.caribrateresult = analyzer.LeastSquare(MultinomialType.Square, data);
}
else
{
frmmain.caribrateresult = analyzer.LeastSquare(MultinomialType.Linear, data);
}
this.DialogResult = DialogResult.OK;
this.Close();
}
#endregion
#region "初始化"
/// <summary>
/// 窗口载入
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmCalibrate_Load(object sender, EventArgs e)
{
this.Top = frmmain.Top + (frmmain.Height - this.Height) / 2;
this.Left = frmmain.Left + (frmmain.Width - this.Width) / 2;
}
#endregion
#region "设置参数"
private void nUpDownvalue1_ValueChanged(object sender, EventArgs e)
{
DataGridCell cell = gridPara.CurrentCell;
gridPara[cell.RowNumber, cell.ColumnNumber] = Convert.ToDouble(nUpDownvalue.Value.ToString() + "." + nUpDownvalue1.Value.ToString());
}
private void nUpDownvalue_ValueChanged(object sender, EventArgs e)
{
DataGridCell cell = gridPara.CurrentCell;
gridPara[cell.RowNumber, cell.ColumnNumber] = Convert.ToDouble(nUpDownvalue.Value.ToString() + "." + nUpDownvalue1.Value.ToString());
}
#endregion
#region "获得参数值"
/// <summary>
/// 获得参数值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void gridPara_CurrentCellChanged(object sender, EventArgs e)
{
DataGridCell cell = gridPara.CurrentCell;
double d = (double)gridPara[cell.RowNumber, cell.ColumnNumber];
string[] s = d.ToString("F4").Split('.');
nUpDownvalue.Value = Convert.ToDecimal(s[0]);
nUpDownvalue1.Value = Convert.ToDecimal(s[1]);
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -