Files
wg_cpso/CPSO/Forms/41_Material/FrmMaterial.cs

675 lines
29 KiB
C#
Raw Normal View History

2026-03-25 18:20:24 +08:00
using CaeGlobals;
using CaeModel;
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using CPSO.PropertyViews;
namespace CPSO.Forms
{
public partial class FrmMaterial : UserControls.PrePoMaxChildForm, IFormBase
{
// Variables
private string[] _materialNames;
private string _materialToEditName;
private Material _material;
private Controller _controller;
private TabPage[] _pages;
private bool _useSimpleEditor; // a switch to change the form into a simple material editor form
private bool _preview; // a switch to change the form into a preview material form
// Properties
public Material Material
{
get { return _material; }
set
{
_material = value.DeepClone();
// Save selected property
int selectedId = -1;
if (lvAddedProperties.SelectedIndices.Count > 0)
selectedId = lvAddedProperties.SelectedIndices[0];
//
ShowMaterial();
// Select previous property
if (selectedId >= 0 && selectedId < lvAddedProperties.Items.Count)
lvAddedProperties.Items[selectedId].Selected = true;
}
}
public bool UseSimpleEditor { get { return _useSimpleEditor; } set { _useSimpleEditor = value.DeepClone(); } }
// Constructors
public FrmMaterial(Controller controller)
{
InitializeComponent();
//
_controller = controller;
_material = null;
//
int i = 0;
_pages = new TabPage[tcProperties.TabPages.Count];
foreach (TabPage tabPage in tcProperties.TabPages)
{
tabPage.Paint += TabPage_Paint;
_pages[i++] = tabPage;
}
//
ClearControls();
//
_useSimpleEditor = false;
}
// Event handlers
private void FrmMaterial_VisibleChanged(object sender, EventArgs e)
{
cbTemperatureDependent.Enabled = !(_useSimpleEditor || _preview);
tvProperties.Visible = !_useSimpleEditor;
lvAddedProperties.Visible = !_useSimpleEditor;
//
if (Visible) { }
else
{
dgvData.HidePlot();
}
}
private void TabPage_Paint(object sender, PaintEventArgs e)
{
SolidBrush fillBrush = new SolidBrush(((TabPage)sender).BackColor);
e.Graphics.FillRectangle(fillBrush, e.ClipRectangle);
// Enable copy/paste without first selecting the cell 0,0
if (sender == tpDataPoints)
{
ActiveControl = dgvData;
dgvData[0, 0].Selected = true;
}
}
private void tvProperties_DoubleClick(object sender, EventArgs e)
{
btnAdd_Click(null, null);
}
private void tbName_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true; // no beep
}
}
private void tbDescription_TextChanged(object sender, EventArgs e)
{
_propertyItemChanged = true;
}
private void cbTemperatureDependent_CheckedChanged(object sender, EventArgs e)
{
HideShowTemperature();
_propertyItemChanged = true;
}
private void btnAdd_Click(object sender, EventArgs e)
{
if (!_preview && tvProperties.SelectedNodes != null)
{
foreach (TreeNode treeNode in tvProperties.SelectedNodes)
{
if (treeNode.Tag != null)
{
string propertyText = treeNode.Text;
//
ListViewItem existingItem = null;
if (lvAddedProperties.Items.Count > 0)
existingItem = lvAddedProperties.FindItemWithText(propertyText, true, 0, false);
//
if (existingItem == null)
{
ListViewItem item = new ListViewItem(propertyText);
if (treeNode.Tag is MaterialProperty mp)
{
if (mp is Density de)
item.Tag = new ViewDensity(de.DeepClone());
else if (mp is SlipWear sw)
item.Tag = new ViewSlipWear(sw.DeepClone());
else if (mp is Elastic el)
item.Tag = new ViewElastic(el.DeepClone());
else if (mp is Plastic pl)
item.Tag = new ViewPlastic(pl.DeepClone());
else if (mp is ThermalExpansion te)
item.Tag = new ViewThermalExpansion(te.DeepClone(), cbTemperatureDependent.Checked);
else if (mp is ThermalConductivity tc)
item.Tag = new ViewThermalConductivity(tc.DeepClone());
else if (mp is SpecificHeat sh)
item.Tag = new ViewSpecificHeat(sh.DeepClone());
else throw new NotSupportedException();
}
else throw new NotSupportedException();
//
lvAddedProperties.Items.Add(item);
int id = lvAddedProperties.Items.IndexOf(item);
lvAddedProperties.Items[id].Selected = true;
lvAddedProperties.Select();
}
}
}
tvProperties.SelectedNodes.Clear();
}
_propertyItemChanged = true;
}
private void btnMoveUp_Click(object sender, EventArgs e)
{
try
{
int currentIndex = lvAddedProperties.PossiblySelectedItems[0].Index;
ListViewItem item = lvAddedProperties.Items[currentIndex];
if (currentIndex > 0)
{
lvAddedProperties.Items.RemoveAt(currentIndex);
lvAddedProperties.Items.Insert(currentIndex - 1, item);
}
_propertyItemChanged = true;
}
catch
{ }
}
private void btnMoveDown_Click(object sender, EventArgs e)
{
try
{
int currentIndex = lvAddedProperties.PossiblySelectedItems[0].Index;
ListViewItem item = lvAddedProperties.Items[currentIndex];
if (currentIndex < lvAddedProperties.Items.Count - 1)
{
lvAddedProperties.Items.RemoveAt(currentIndex);
lvAddedProperties.Items.Insert(currentIndex + 1, item);
}
_propertyItemChanged = true;
}
catch
{ }
}
private void btnRemove_Click(object sender, EventArgs e)
{
if (lvAddedProperties.PossiblySelectedItems.Count == 1)
{
ListViewItem item = lvAddedProperties.PossiblySelectedItems[0];
int index = item.Index;
if (index == lvAddedProperties.Items.Count - 1) index--;
lvAddedProperties.Items.Remove(item);
//
if (lvAddedProperties.Items.Count > 0) lvAddedProperties.Items[index].Selected = true;
else ClearControls();
//
_propertyItemChanged = true;
}
}
//
private void lvAddedProperties_SelectedIndexChanged(object sender, EventArgs e)
{
if (lvAddedProperties.PossiblySelectedItems.Count == 1)
{
// Clear
dgvData.DataSource = null;
dgvData.Columns.Clear();
tcProperties.TabPages.Clear();
//
if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewDensity vd)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vd.DataPoints);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewElastic ve)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(ve.DataPoints);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewElasticWithDensity)
{
tcProperties.TabPages.Add(_pages[0]); // properties
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewPlastic vp)
{
tcProperties.TabPages.Add(_pages[1]); // data points
tcProperties.TabPages.Add(_pages[0]); // properties
//
SetDataGridViewBinding(vp.DataPoints);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewThermalExpansion vte)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vte.DataPoints);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewThermalConductivity vtc)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vtc.DataPoints);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewSpecificHeat vsh)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vsh.DataPoints);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewSlipWear vsw)
{
tcProperties.TabPages.Add(_pages[0]); // properties
}
else throw new NotSupportedException();
//
propertyGrid.SelectedObject = lvAddedProperties.PossiblySelectedItems[0].Tag;
//
SetAllGridViewUnits();
//
HideShowTemperature();
}
lvAddedProperties.Select();
}
private void Binding_ListChanged(object sender, ListChangedEventArgs e)
{
_propertyItemChanged = true;
}
private void propertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
propertyGrid.Refresh();
_propertyItemChanged = true;
}
private void btnOK_Click(object sender, EventArgs e)
{
try
{
Add();
//
Hide();
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void btnOKAddNew_Click(object sender, EventArgs e)
{
try
{
Add();
//
PrepareForm(null, null);
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
_useSimpleEditor = false;
//
Hide();
}
private void FrmMaterial_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
btnCancel_Click(null, null);
}
}
// Methods
public bool PrepareForm(string stepName, string materialToEditName)
{
_propertyItemChanged = false;
_materialNames = null;
_materialToEditName = null;
_material = null;
_preview = false;
lvAddedProperties.Items.Clear();
ClearControls();
SetControlStates();
//
_materialNames = _controller.GetMaterialNames();
_materialToEditName = materialToEditName;
this.btnOKAddNew.Visible = _materialToEditName == null; // must be here
// Initialize material properties
TreeNode node;
node = tvProperties.Nodes.Find("Density", true)[0];
node.Tag = new Density(new double[][] { new double[] { 0, 0 } });
node = tvProperties.Nodes.Find("Slip Wear", true)[0];
node.Tag = new SlipWear(0, 0);
node = tvProperties.Nodes.Find("Elastic", true)[0];
node.Tag = new Elastic(new double[][] { new double[] { 0, 0, 0 } });
node = tvProperties.Nodes.Find("Plastic", true)[0];
node.Tag = new Plastic(new double[][] { new double[] { 0, 0, 0 } });
node = tvProperties.Nodes.Find("Thermal Expansion", true)[0];
node.Tag = new ThermalExpansion(new double[][] { new double[] { 0, 0 } });
node = tvProperties.Nodes.Find("Thermal Conductivity", true)[0];
node.Tag = new ThermalConductivity(new double[][] { new double[] { 0, 0 } });
node = tvProperties.Nodes.Find("Specific Heat", true)[0];
node.Tag = new SpecificHeat(new double[][] { new double[] { 0, 0 } });
//
tvProperties.ExpandAll();
//
if (_materialToEditName == null)
{
_material = null;
tbName.Text = GetMaterialName();
tbDescription.Text = "";
cbTemperatureDependent.Checked = false;
}
else
{
Material = _controller.GetMaterial(_materialToEditName); // to clone
ShowMaterial();
}
// Simple material editor
int delta;
if (_useSimpleEditor)
{
if (_materialToEditName == null)
{
ViewMaterialProperty view = new ViewElasticWithDensity(new ElasticWithDensity(0, 0, 0));
ListViewItem item = new ListViewItem(view.Name);
item.Tag = view;
lvAddedProperties.Items.Add(item);
lvAddedProperties.Items[0].Selected = true;
lvAddedProperties.Select();
lvAddedProperties_SelectedIndexChanged(null, null);
}
delta = tcProperties.Top - labAvailable.Top;
tcProperties.Top = labAvailable.Top;
tcProperties.Height += delta;
this.Height -= delta;
}
else
{
delta = (tvProperties.Bottom + 5) - tcProperties.Top;
tcProperties.Top = tvProperties.Bottom + 5;
tcProperties.Height -= delta;
this.Height += delta;
}
//
_controller.SetSelectByToOff();
//
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
dgvData.BuildAutocompleteMenu(_controller.GetAllParameterNames());
//
return true;
}
public void ShowMaterial()
{
lvAddedProperties.Items.Clear();
//
tbName.Text = _material.Name;
tbDescription.Text = _material.Description;
cbTemperatureDependent.Checked = _material.TemperatureDependent;
//
if (_material.Properties.Count > 0)
{
ListViewItem item;
ViewMaterialProperty view = null;
foreach (var property in _material.Properties)
{
if (property is Density den) view = new ViewDensity(den);
else if (property is SlipWear sw) view = new ViewSlipWear(sw);
else if (property is Elastic el) view = new ViewElastic(el);
else if (property is ElasticWithDensity ewd)
{
view = new ViewElasticWithDensity(ewd);
_useSimpleEditor = true;
}
else if (property is Plastic pl) view = new ViewPlastic(pl);
else if (property is ThermalExpansion te)
view = new ViewThermalExpansion(te, cbTemperatureDependent.Checked);
else if (property is ThermalConductivity tc) view = new ViewThermalConductivity(tc);
else if (property is SpecificHeat sh) view = new ViewSpecificHeat(sh);
else throw new NotSupportedException();
//
item = new ListViewItem(view.Name);
item.Tag = view;
item = lvAddedProperties.Items.Add(item);
}
//
lvAddedProperties.Items[0].Selected = true;
lvAddedProperties.Select();
}
}
public void PrepareFormForPreview()
{
PrepareForm(null, null);
tbName.Text = "";
//
_preview = true;
SetControlStates();
}
private void SetControlStates()
{
tbName.ReadOnly = _preview;
tbName.BackColor = SystemColors.Window;
tbDescription.ReadOnly = _preview;
tbDescription.BackColor = SystemColors.Window;
// Buttons
btnAdd.Visible = !_preview;
btnMoveUp.Visible = !_preview;
btnMoveDown.Visible = !_preview;
btnRemove.Visible = !_preview;
// All models
tvProperties.Visible = !_preview;
// Added models
if (_preview)
{
lvAddedProperties.Left = tvProperties.Left;
lvAddedProperties.Width = (btnMoveUp.Left + btnMoveUp.Width) - lvAddedProperties.Left;
lvAddedProperties.Top = labAvailable.Top;
lvAddedProperties.Height = tvProperties.Bottom - lvAddedProperties.Top;
lvAddedProperties.BringToFront();
}
// Property grid
propertyGrid.ReadOnly = _preview;
// Data grid
dgvData.AllowUserToAddRows = !_preview;
dgvData.AllowUserToDeleteRows = !_preview;
dgvData.ReadOnly = _preview;
// Buttons
btnOKAddNew.Visible = !_preview;
btnOK.Visible = !_preview;
//btnCancel.Visible = !_preview;
}
private void ClearControls()
{
propertyGrid.SelectedObject = null;
dgvData.DataSource = null;
//
tcProperties.TabPages.Clear();
tcProperties.TabPages.Add(_pages[0]);
}
public void Add()
{
// Check if the name exists
UserControls.FrmProperties.CheckName(_materialToEditName, tbName.Text, _materialNames, "material");
//
_material = new Material(tbName.Text);
_material.Description = tbDescription.Text;
_material.TemperatureDependent = cbTemperatureDependent.Checked;
//
ViewMaterialProperty property;
MaterialProperty materialProperty;
foreach (ListViewItem item in lvAddedProperties.Items)
{
property = (ViewMaterialProperty)item.Tag;
materialProperty = property.GetBase();
// Check equations
materialProperty.CheckEquations();
//
if (property is ViewDensity vd)
{
for (int i = 0; i < vd.DataPoints.Count; i++)
{
if (vd.DataPoints[i].Density.Value <= 0) throw new CaeException("The density must be larger than 0.");
}
}
else if (property is ViewElastic ve && ve.GetYoungsModulusValue() <= 0)
{
throw new CaeException("The Young's modulus must be larger than 0.");
}
else if (property is ViewElasticWithDensity ewd)
{
if (ewd.GetYoungsModulusValue() <= 0) throw new CaeException("The Young's modulus must be larger than 0.");
if (ewd.GetDensityValue() <= 0) throw new CaeException("The density must be larger than 0.");
}
else if (property is ViewThermalExpansion vex)
{
for (int i = 0; i < vex.DataPoints.Count; i++)
{
if (vex.DataPoints[i].ThermalExpansion.Value <= 0)
throw new CaeException("The thermal expansion coefficient must be larger than 0.");
}
}
else if (property is ViewThermalConductivity vtc)
{
for (int i = 0; i < vtc.DataPoints.Count; i++)
{
if (vtc.DataPoints[i].ThermalConductivity.Value <= 0)
throw new CaeException("The thermal conductivity coefficient must be larger than 0.");
}
}
else if (property is ViewSpecificHeat vsh)
{
for (int i = 0; i < vsh.DataPoints.Count; i++)
{
if (vsh.DataPoints[i].SpecificHeat.Value <= 0)
throw new CaeException("The thermal conductivity coefficient must be larger than 0.");
}
}
else if (property is ViewSlipWear vsw)
{
if (vsw.GetHardnessValue() <= 0) throw new CaeException("The hardness must be larger than 0.");
if (vsw.GetWearCoefficientValue() <= 0) throw new CaeException("The wear coefficient must be larger than 0.");
}
//
_material.AddProperty(materialProperty);
}
//
if (_materialToEditName == null)
{
// Create
_controller.AddMaterialCommand(Material);
}
else
{
// Replace
if (_materialToEditName != Material.Name || _propertyItemChanged)
{
_controller.ReplaceMaterialCommand(_materialToEditName, Material);
}
}
}
private void SetAllGridViewUnits()
{
string noUnit = "/";
// Density
SetGridViewUnit(nameof(DensityDataPoint.DensityEq), _controller.Model.UnitSystem.DensityUnitAbbreviation,
new StringDensityFromConverter());
// Elastic
SetGridViewUnit(nameof(ElasticDataPoint.YoungsModulusEq), _controller.Model.UnitSystem.PressureUnitAbbreviation,
new StringPressureFromConverter());
SetGridViewUnit(nameof(ElasticDataPoint.PoissonsRatioEq), noUnit,
new StringDoubleConverter());
// Plastic
SetGridViewUnit(nameof(PlasticDataPoint.StressEq), _controller.Model.UnitSystem.PressureUnitAbbreviation,
new StringPressureFromConverter());
SetGridViewUnit(nameof(PlasticDataPoint.StrainEq), noUnit,
new StringDoubleConverter());
// Thermal expansion
SetGridViewUnit(nameof(ThermalExpansionDataPoint.ThermalExpansionEq),
_controller.Model.UnitSystem.ThermalExpansionUnitAbbreviation,
new StringThermalExpansionFromConverter());
// Thermal conductivity
SetGridViewUnit(nameof(ThermalConductivityDataPoint.ThermalConductivityEq),
_controller.Model.UnitSystem.ThermalConductivityUnitAbbreviation,
new StringThermalConductivityFromConverter());
// Specific heat
SetGridViewUnit(nameof(SpecificHeatDataPoint.SpecificHeatEq), _controller.Model.UnitSystem.SpecificHeatUnitAbbreviation,
new StringSpecificHeatFromConverter());
// Temperature
SetGridViewUnit(nameof(TempDataPoint.TemperatureEq), _controller.Model.UnitSystem.TemperatureUnitAbbreviation,
new StringTemperatureFromConverter());
//
dgvData.XColIndex = 1;
dgvData.StartPlotAtZero = true;
}
private void SetGridViewUnit(string columnName, string unit, TypeConverter converter)
{
DataGridViewColumn col = dgvData.Columns[columnName];
if (col != null)
{
// Unit
if (col.HeaderText != null) col.HeaderText = col.HeaderText.Replace("?", unit);
// Alignment
col.HeaderCell.Style.Alignment = DataGridViewContentAlignment.BottomCenter;
// Converter
col.Tag = converter;
}
}
private string GetMaterialName()
{
return _materialNames.GetNextNumberedKey("Material");
}
private void SetDataGridViewBinding(object data)
{
BindingSource binding = new BindingSource();
binding.DataSource = data;
dgvData.DataSource = binding; // bind datagridview to binding source - enables adding of new lines
binding.ListChanged += Binding_ListChanged;
}
private void HideShowTemperature()
{
if (lvAddedProperties.PossiblySelectedItems.Count > 0)
{
if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewDensity ||
lvAddedProperties.PossiblySelectedItems[0].Tag is ViewElastic ||
lvAddedProperties.PossiblySelectedItems[0].Tag is ViewThermalConductivity ||
lvAddedProperties.PossiblySelectedItems[0].Tag is ViewSpecificHeat)
{
tcProperties.TabPages.Clear();
// Properites
if (!cbTemperatureDependent.Checked) tcProperties.TabPages.Add(_pages[0]);
// Data points
if (cbTemperatureDependent.Checked) tcProperties.TabPages.Add(_pages[1]);
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewThermalExpansion vte)
{
tcProperties.TabPages.Clear();
// Properites
tcProperties.TabPages.Add(_pages[0]);
// Data points
if (cbTemperatureDependent.Checked) tcProperties.TabPages.Add(_pages[1]);
//
vte.SetTemperatureDependence(cbTemperatureDependent.Checked);
propertyGrid.Refresh();
}
else if (lvAddedProperties.PossiblySelectedItems[0].Tag is ViewSlipWear)
{
tcProperties.TabPages.Clear();
tcProperties.TabPages.Add(_pages[0]);
}
}
//
string temperatureName = nameof(TempDataPoint.TemperatureEq);
DataGridViewColumn col = dgvData.Columns[temperatureName];
if (col != null) col.Visible = cbTemperatureDependent.Checked;
}
}
}