Files
wg_cpso/CPSO/Forms/92_Knowledge/FrmCutter.cs

589 lines
20 KiB
C#
Raw Permalink Normal View History

2026-03-25 18:20:24 +08:00
using CaeGlobals;
using CaeKnowledge.Data;
using CaeKnowledge.View;
using CPSO.Forms._92_Knowledge;
using DynamicDescriptors;
using FastDeepCloner;
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
// ReSharper disable once CheckNamespace
namespace CPSO.Forms
{
public partial class FrmCutter : Form
{
public FrmCutter()
{
InitializeComponent();
}
private Type _modeType;
public void PrepareForm(Type type)
{
MakeColumns(type);
_modeType = type;
if (type == typeof(ViewCutter))
{
Text = @"刀具信息表";
dataGridView1.DataSource = new BindingList<ViewCutter>();
}
else if (type == typeof(ViewCuttingParameter))
{
Text = @"切削力系数表";
dataGridView1.DataSource = new BindingList<ViewCuttingParameter>();
}
else if (type == typeof(ViewToolPosition))
{
Text = @"查看切削力";
SToolStripButton.Visible = false;
OToolStripButton.Visible = false;
dataGridView1.DataSource = new BindingList<ViewToolPosition>();
}
else
{
throw new CaeException("非法数据类型,无法创建对话框!");
}
// By Luke 加载数据库
LoadDatabase();
}
private void MakeColumns(Type type)
{
var memberList = type.GetMembers(BindingFlags.Public | BindingFlags.Instance)
.Where(m => m.MemberType == MemberTypes.Field ||
m.MemberType == MemberTypes.Property);
List<DataGridViewColumn> columns = new List<DataGridViewColumn>();
if (columns == null) throw new ArgumentNullException(nameof(columns));
foreach (var member in memberList)
{
var attribute = member.GetCustomAttributes<DisplayNameAttribute>();
var displayNameAttributes = attribute as DisplayNameAttribute[] ?? attribute.ToArray();
if (displayNameAttributes.Any())
{
var displayName = displayNameAttributes.First().DisplayName;
if (displayName != null)
{
var column = new DataGridViewTextBoxColumn
{
Name = member.Name,
HeaderText = displayName,
DataPropertyName = member.Name,
};
column.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
column.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
columns.Add(column);
}
}
}
dataGridView1.Columns.Clear();
dataGridView1.Columns.AddRange(columns.ToArray());
}
[UsedImplicitly]
private static DataTable LoadDataTable(Type type)
{
var memberList = type.GetMembers(BindingFlags.Public | BindingFlags.Instance)
.Where(m => m.MemberType == MemberTypes.Field ||
m.MemberType == MemberTypes.Property)
.Cast<PropertyInfo>();
DataTable dataTable = new DataTable();
List<DataColumn> columns = new List<DataColumn>();
if (columns == null) throw new ArgumentNullException(nameof(columns));
columns.Add(new DataColumn
{
Caption = "Id",
ColumnName = "Id",
DataType = CaeKnowledge.KnowledgeTools.ObjectIdType,
Unique = true,
ColumnMapping = MappingType.Hidden
});
foreach (var member in memberList)
{
var attribute = member.GetCustomAttributes<DisplayNameAttribute>();
var displayNameAttributes = attribute as DisplayNameAttribute[] ?? attribute.ToArray();
if (displayNameAttributes.Any())
{
var displayName = displayNameAttributes.First().DisplayName;
if (displayName != null)
{
var col = new DataColumn
{
Caption = displayName,
ColumnName = member.Name,
DataType = member.PropertyType,
};
if (member.Name == nameof(ViewCutter.Cid))
{
col.Unique = true;
}
columns.Add(col);
}
}
}
dataTable.Columns.Clear();
dataTable.Columns.AddRange(columns.ToArray());
return dataTable;
}
private void FrmCutter_Load(object sender, EventArgs e)
{
dataGridView1.AutoGenerateColumns = false;
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView1.RowHeadersVisible = false;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}
private void FrmCutter_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
private void tsbExcelImport_Click(object sender, EventArgs e)
{
try
{
using (var openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = @"Excel 文件 (*.xls;*.xlsx)|*.xls;*xlsx";
if (openFileDialog.ShowDialog() != DialogResult.OK) return;
var fullPath = openFileDialog.FileName;
if (!string.IsNullOrEmpty(fullPath) &&
dataGridView1.DataSource is BindingList<ViewCutter> list1)
{
List<ViewCutter> listViewCutters = CaeKnowledge.KnowledgeTools.LoadViewCutters(fullPath);
if (listViewCutters.Count > 0)
{
listViewCutters.GroupBy(v => v.Cid)
.Select(g => g.First())
.ToList()
.ForEach(cutter =>
{
if (list1.Any(vc => vc.Cid == cutter.Cid))
{
throw new CaeException("已有相同库号Cid的刀具信息添加失败");
}
list1.Add(cutter);
});
}
}
if (!string.IsNullOrEmpty(fullPath)
&& dataGridView1.DataSource is BindingList<ViewCuttingParameter> list2)
{
List<ViewCuttingParameter> listCuttingParameters =
CaeKnowledge.KnowledgeTools.LoadCuttingParameters(fullPath);
if (listCuttingParameters.Count > 0)
{
listCuttingParameters.GroupBy(v => v.Pid)
.Select(g => g.First())
.ToList()
.ForEach(cuttingParameter =>
{
if (list2.Any(cp => cp.Pid == cuttingParameter.Pid))
{
throw new CaeException("已有相同编号Pid的切削力系数添加失败");
}
list2.Add(cuttingParameter);
});
}
}
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsbAdd_Click(object sender, EventArgs e)
{
if (_modeType == typeof(ViewCutter))
{
AddViewCutter();
}
else if (_modeType == typeof(ViewCuttingParameter))
{
AddCuttingParameter();
}
else if(_modeType == typeof(ViewToolPosition))
{
AddToolPosition();
}
else
{
throw new CaeException("非法数据类型!");
}
}
private void AddViewCutter()
{
try
{
var dialog = new FrmAddCutter();
ViewCutter cutter = new ViewCutter();
dialog.Text = @"添加刀具信息";
dialog.SetCutter(cutter);
DialogResult result = dialog.ShowDialog();
if (result == DialogResult.OK && cutter.IsValid()
&& dataGridView1.DataSource is BindingList<ViewCutter> list)
{
if (list.Any(vc => vc.Cid == cutter.Cid))
{
throw new CaeException("已有相同库号Cid的刀具信息添加失败");
}
list.Add(cutter);
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void AddCuttingParameter()
{
try
{
var dialog = new FrmAddCutter();
ViewCuttingParameter cuttingParameter = new ViewCuttingParameter();
dialog.Text = @"添加切削力系数";
dialog.SetCuttingParameter(cuttingParameter);
DialogResult result = dialog.ShowDialog();
if (result == DialogResult.OK && cuttingParameter.IsValid()
&& dataGridView1.DataSource is BindingList<ViewCuttingParameter> list)
{
if (list.Any(vcp => vcp.Pid == cuttingParameter.Pid))
{
throw new CaeException("已有相同编号Pid的切削力系数添加失败");
}
list.Add(cuttingParameter);
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void AddToolPosition()
{
try
{
var dialog = new FrmAddCutter();
dialog.Text = @"添加切削力";
var toolPosition = new ViewToolPosition();
dialog.SetToolPosition(toolPosition);
var result = dialog.ShowDialog();
if (result == DialogResult.OK
&& dataGridView1.DataSource is BindingList<ViewToolPosition> list)
{
list.Add(toolPosition);
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void tsbDelete_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0
&& MessageBox.Show(@"Are you sure you want to delete the selected row(s)?",
@"Confirm Deletion", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
// Iterate in reverse to avoid issues with changing row indices
for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--)
{
DataGridViewRow row = dataGridView1.SelectedRows[i];
dataGridView1.Rows.RemoveAt(row.Index);
}
}
}
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
// Ensure a valid row was double-clicked (not a header)
if (e.RowIndex < 0) return;
// Get the selected row
using (var clickedRow = dataGridView1.Rows[e.RowIndex])
{
if (_modeType == typeof(ViewCutter))
{
EditCutter(clickedRow);
}
else if (_modeType == typeof(ViewCuttingParameter))
{
EditCuttingParameter(clickedRow);
}
else if (_modeType == typeof(ViewToolPosition))
{
EditToolPosition(clickedRow);
}
}
}
private static void EditCutter(DataGridViewRow clickedRow)
{
if (!(clickedRow.DataBoundItem is ViewCutter oldCutter))
return;
var dialog = new FrmAddCutter
{
Text = @"编辑刀具信息"
};
// FastDeepCloner
var newCutter = oldCutter.Clone();
var descriptor = DynamicDescriptor.CreateFromInstance(newCutter);
descriptor.GetDynamicProperty(nameof(ViewCutter.Cid)).SetReadOnly(true);
dialog.SetCutter(descriptor);
var result = dialog.ShowDialog();
if (result == DialogResult.OK && newCutter != null && newCutter.IsValid())
{
// FastDeepCloner
newCutter.CloneTo(oldCutter);
}
}
private static void EditCuttingParameter(DataGridViewRow clickedRow)
{
if (!(clickedRow.DataBoundItem is ViewCuttingParameter oldCuttingParameter))
return;
var dialog = new FrmAddCutter
{
Text = @"编辑切削力系数"
};
// FastDeepCloner
var newCuttingParameter = oldCuttingParameter.Clone();
var descriptor = DynamicDescriptor.CreateFromInstance(newCuttingParameter);
descriptor.GetDynamicProperty(nameof(ViewCuttingParameter.Pid)).SetReadOnly(true);
dialog.SetCuttingParameter(descriptor);
var result = dialog.ShowDialog();
if (result == DialogResult.OK
&& newCuttingParameter != null && newCuttingParameter.IsValid())
{
// FastDeepCloner
newCuttingParameter.CloneTo(oldCuttingParameter);
}
}
private static void EditToolPosition(DataGridViewRow clickedRow)
{
if (!(clickedRow.DataBoundItem is ViewToolPosition oldToolPosition))
return;
// FastDeepCloner
var newToolPosition = oldToolPosition.Clone();
var dialog = new FrmAddCutter
{
Text = @"编辑切削力"
};
dialog.SetToolPosition(newToolPosition);
var result = dialog.ShowDialog();
if (result == DialogResult.OK
&& newToolPosition != null)
{
// FastDeepCloner
newToolPosition.CloneTo(oldToolPosition);
}
}
private void OToolStripButton_Click(object sender, EventArgs e)
{
LoadDatabase();
}
private void LoadDatabase()
{
string fullPath = Tools.GetLiteDatabase();
if (fullPath == null || !File.Exists(fullPath)) return;
if (dataGridView1.DataSource is BindingList<ViewCutter> list1)
{
list1.Clear();
List<Cutter> listViewCutters = CaeKnowledge.KnowledgeTools.LoadCuttersFromDatabase(fullPath);
listViewCutters.ForEach(cutter =>
{
list1.Add(new ViewCutter(cutter));
});
}
else if (dataGridView1.DataSource is BindingList<ViewCuttingParameter> list2)
{
list2.Clear();
List<CuttingParameter> listCuttingParameters =
CaeKnowledge.KnowledgeTools.LoadCuttingParametersFromDatabase(fullPath);
listCuttingParameters.ForEach(cuttingParameter =>
{
list2.Add(new ViewCuttingParameter(cuttingParameter));
});
}
}
private void SToolStripButton_Click(object sender, EventArgs e)
{
string fullPath = Tools.GetLiteDatabase();
if (fullPath == null) return;
if (dataGridView1.DataSource is BindingList<ViewCutter> list1)
{
var cutters = list1.Select(x => x.GetBase()).ToList();
CaeKnowledge.KnowledgeTools.SaveDatabase(fullPath, cutters);
}
else if(dataGridView1.DataSource is BindingList<ViewCuttingParameter> list2)
{
var cuttingParameters = list2.Select(x => x.GetBase()).ToList();
CaeKnowledge.KnowledgeTools.SaveDatabase(fullPath, cuttingParameters);
}
}
public void LoadToolPositions(Controller self)
{
if (!(dataGridView1.DataSource is BindingList<ViewToolPosition> list))
return;
list.Clear();
self.ToolPositions.ForEach(tp =>
{
list.Add(tp);
});
}
public void SaveToolPositions(Controller self)
{
if (!(dataGridView1.DataSource is BindingList<ViewToolPosition> list))
return;
self.ToolPositions.Clear();
self.ToolPositions.AddRange(list);
}
private void LoadData()
{
using (var openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = @"LiteDB数据库 (*.db)|*.db";
if (openFileDialog.ShowDialog() != DialogResult.OK) return;
var fullPath = openFileDialog.FileName;
if (dataGridView1.DataSource is BindingList<ViewCutter> list)
{
list.Clear();
List<Cutter> listViewCutters = CaeKnowledge.KnowledgeTools.LoadCuttersFromDatabase(fullPath);
listViewCutters.ForEach(cutter =>
{
list.Add(new ViewCutter(cutter));
});
}
}
}
private void Save()
{
using (var saveFileDialog = new SaveFileDialog())
{
saveFileDialog.Filter = @"LiteDB数据库 (*.db)|*.db";
if (saveFileDialog.ShowDialog() != DialogResult.OK) return;
var fullPath = saveFileDialog.FileName;
if (dataGridView1.DataSource is BindingList<ViewCutter> list)
{
var cutters = list.Select(x => x.GetBase()).ToList();
CaeKnowledge.KnowledgeTools.SaveDatabase(fullPath, cutters);
}
}
}
}
}