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(); } else if (type == typeof(ViewCuttingParameter)) { Text = @"切削力系数表"; dataGridView1.DataSource = new BindingList(); } else if (type == typeof(ViewToolPosition)) { Text = @"查看切削力"; 保存SToolStripButton.Visible = false; 打开OToolStripButton.Visible = false; dataGridView1.DataSource = new BindingList(); } 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 columns = new List(); if (columns == null) throw new ArgumentNullException(nameof(columns)); foreach (var member in memberList) { var attribute = member.GetCustomAttributes(); 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(); DataTable dataTable = new DataTable(); List columns = new List(); 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(); 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 list1) { List 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 list2) { List 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 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 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 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 list1) { list1.Clear(); List listViewCutters = CaeKnowledge.KnowledgeTools.LoadCuttersFromDatabase(fullPath); listViewCutters.ForEach(cutter => { list1.Add(new ViewCutter(cutter)); }); } else if (dataGridView1.DataSource is BindingList list2) { list2.Clear(); List 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 list1) { var cutters = list1.Select(x => x.GetBase()).ToList(); CaeKnowledge.KnowledgeTools.SaveDatabase(fullPath, cutters); } else if(dataGridView1.DataSource is BindingList list2) { var cuttingParameters = list2.Select(x => x.GetBase()).ToList(); CaeKnowledge.KnowledgeTools.SaveDatabase(fullPath, cuttingParameters); } } public void LoadToolPositions(Controller self) { if (!(dataGridView1.DataSource is BindingList list)) return; list.Clear(); self.ToolPositions.ForEach(tp => { list.Add(tp); }); } public void SaveToolPositions(Controller self) { if (!(dataGridView1.DataSource is BindingList 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 list) { list.Clear(); List 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 list) { var cutters = list.Select(x => x.GetBase()).ToList(); CaeKnowledge.KnowledgeTools.SaveDatabase(fullPath, cutters); } } } } }