Files
wg_cpso/CPSO/Forms/92_Knowledge/FrmCutter.cs
2026-03-25 18:20:24 +08:00

589 lines
20 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.

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);
}
}
}
}
}