Files
wg_cpso/CPSO/Forms/44_SurfaceInteraction/FrmSurfaceInteraction.cs

375 lines
16 KiB
C#
Raw Normal View History

2026-03-25 18:20:24 +08:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CaeModel;
using CaeGlobals;
using System.Collections;
using CPSO.PropertyViews;
namespace CPSO.Forms
{
public partial class FrmSurfaceInteraction : UserControls.PrePoMaxChildForm, IFormBase
{
// Variables
private string[] _surfraceInteractionNames;
private string _surfaceInteractionToEditName;
private SurfaceInteraction _surfaceInteraction;
private Controller _controller;
private TabPage[] _pages;
// Properties
public SurfaceInteraction SurfaceInteraction
{
get { return _surfaceInteraction; }
set { _surfaceInteraction = value.DeepClone(); }
}
// Constructors
public FrmSurfaceInteraction(Controller controller)
{
InitializeComponent();
//
_controller = controller;
_surfaceInteraction = null;
//
int i = 0;
_pages = new TabPage[tcProperties.TabPages.Count];
foreach (TabPage tabPage in tcProperties.TabPages)
{
tabPage.Paint += TabPage_Paint;
_pages[i++] = tabPage;
}
//
int count = 0;
Dictionary<string, int> namePosition = new Dictionary<string, int>();
foreach (TreeNode node in tvProperties.Nodes) namePosition.Add(node.Text, count++);
lvAddedProperties.ListViewItemSorter = new ListViewItemComparer(0, namePosition);
//
ClearControls();
}
// Event handling
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 btnAdd_Click(object sender, EventArgs e)
{
if (tvProperties.SelectedNode != null && tvProperties.SelectedNode.Tag != null)
{
string propertyName = tvProperties.SelectedNode.Text;
//
if (lvAddedProperties.FindItemWithText(propertyName) == null)
{
ListViewItem item = new ListViewItem(propertyName);
if (tvProperties.SelectedNode.Tag is SurfaceInteractionProperty sip)
{
if (sip is SurfaceBehavior sb) item.Tag = new ViewSurfaceBehavior(sb.DeepClone());
else if (sip is Friction fr) item.Tag = new ViewFriction(fr.DeepClone());
else if (sip is GapConductance gp) item.Tag = new ViewGapConductance(gp.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();
}
}
_propertyItemChanged = true;
}
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.SelectedItems.Count == 1)
{
// Clear
dgvData.DataSource = null;
dgvData.Columns.Clear();
tcProperties.TabPages.Clear();
//
if (lvAddedProperties.SelectedItems[0].Tag is ViewSurfaceBehavior vsb)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vsb.DataPoints);
}
else if (lvAddedProperties.SelectedItems[0].Tag is ViewFriction vf)
{
tcProperties.TabPages.Add(_pages[0]); // properties
}
else if (lvAddedProperties.SelectedItems[0].Tag is ViewGapConductance vgc)
{
tcProperties.TabPages.Add(_pages[0]); // properties
tcProperties.TabPages.Add(_pages[1]); // data points
//
SetDataGridViewBinding(vgc.DataPoints);
}
else throw new NotSupportedException();
//
propertyGrid.SelectedObject = lvAddedProperties.SelectedItems[0].Tag;
//
SetAllGridViewUnits();
//
propertyGrid_PropertyValueChanged(null, null);
}
lvAddedProperties.Select();
}
private void Binding_ListChanged(object sender, ListChangedEventArgs e)
{
_propertyItemChanged = true;
}
private void propertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
if (propertyGrid.SelectedObject != null && propertyGrid.SelectedObject is ViewSurfaceBehavior vsb)
{
if (vsb.PressureOverclosureType == PressureOverclosureEnum.Tabular && tcProperties.TabPages.Count == 1)
tcProperties.TabPages.Add(_pages[1]);
else if (vsb.PressureOverclosureType != PressureOverclosureEnum.Tabular && tcProperties.TabPages.Count == 2)
tcProperties.TabPages.Remove(_pages[1]);
}
else if (propertyGrid.SelectedObject != null && propertyGrid.SelectedObject is ViewGapConductance vgc)
{
if (vgc.GapConductanceType == GapConductanceEnum.Tabular && tcProperties.TabPages.Count == 1)
tcProperties.TabPages.Add(_pages[1]);
else if (vgc.GapConductanceType != GapConductanceEnum.Tabular && tcProperties.TabPages.Count == 2)
tcProperties.TabPages.Remove(_pages[1]);
}
//
propertyGrid.Refresh();
_propertyItemChanged = true;
}
private void btnOK_Click(object sender, EventArgs e)
{
try
{
Add();
//
Hide();
}
catch (Exception ex)
{
CaeGlobals.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)
{
Hide();
}
private void FrmSurfaceInteraction_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
// Methods
public bool PrepareForm(string stepName, string surfaceInteractionToEditName)
{
this.btnOKAddNew.Visible = surfaceInteractionToEditName == null;
//
_propertyItemChanged = false;
_surfraceInteractionNames = null;
_surfaceInteractionToEditName = null;
_surfaceInteraction = null;
lvAddedProperties.Items.Clear();
ClearControls();
//
_surfraceInteractionNames = _controller.GetSurfaceInteractionNames();
_surfaceInteractionToEditName = surfaceInteractionToEditName;
// Initialize surface interaction properties
tvProperties.Nodes.Find("Surface Behavior", true)[0].Tag = new SurfaceBehavior();
tvProperties.Nodes.Find("Friction", true)[0].Tag = new Friction();
tvProperties.Nodes.Find("Gap Conductance", true)[0].Tag = new GapConductance();
tvProperties.ExpandAll();
//
if (_surfaceInteractionToEditName == null)
{
_surfaceInteraction = null;
tbName.Text = GetSurfaceInteractionName();
}
else
{
SurfaceInteraction = _controller.GetSurfaceInteraction(_surfaceInteractionToEditName); // to clone
//
tbName.Text = _surfaceInteraction.Name;
if (_surfaceInteraction.Properties.Count > 0)
{
ListViewItem item;
ViewSurfaceInteractionProperty view;
foreach (var property in _surfaceInteraction.Properties)
{
if (property is SurfaceBehavior sb) view = new ViewSurfaceBehavior(sb);
else if (property is Friction fr) view = new ViewFriction(fr);
else if (property is GapConductance gc) view = new ViewGapConductance(gc);
else throw new NotSupportedException();
//
item = new ListViewItem(view.Name);
item.Tag = view;
lvAddedProperties.Items.Add(item);
}
//
lvAddedProperties.Items[0].Selected = true;
lvAddedProperties.Select();
}
}
//
_controller.SetSelectByToOff();
//
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
dgvData.BuildAutocompleteMenu(_controller.GetAllParameterNames());
//
return true;
}
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(_surfaceInteractionToEditName, tbName.Text, _surfraceInteractionNames,
"surface interaction");
//
Friction friction = null;
SurfaceBehavior surfaceBehavior = null;
_surfaceInteraction = new SurfaceInteraction(tbName.Text);
foreach (ListViewItem item in lvAddedProperties.Items)
{
_surfaceInteraction.AddProperty(((ViewSurfaceInteractionProperty)(item.Tag)).Base);
if (item.Tag is ViewSurfaceBehavior vsb) surfaceBehavior = (SurfaceBehavior)vsb.Base;
if (item.Tag is ViewFriction vf) friction = (Friction)vf.Base;
}
if (surfaceBehavior == null)
throw new CaeException("Surface interaction must define a surface behavior.");
// Tied contact requires friction definition
if (surfaceBehavior != null && surfaceBehavior.PressureOverclosureType == PressureOverclosureEnum.Tied
&& friction == null)
{
throw new CaeException("A tied contact requires a stick slope definition using the friction interaction model. " +
"The value of the friction coefficient is irrelevant for tied contact.");
}
//
if (_surfaceInteractionToEditName == null)
{
// Create
_controller.AddSurfaceInteractionCommand(SurfaceInteraction);
}
else
{
// Replace
if (_surfaceInteractionToEditName != SurfaceInteraction.Name || _propertyItemChanged)
{
_controller.ReplaceSurfaceInteractionCommand(_surfaceInteractionToEditName, SurfaceInteraction);
}
}
}
private void SetAllGridViewUnits()
{
// Surface behavior
SetGridViewUnit(nameof(PressureOverclosureDataPoint.Pressure), _controller.Model.UnitSystem.PressureUnitAbbreviation,
new StringPressureFromConverter());
SetGridViewUnit(nameof(PressureOverclosureDataPoint.Overclosure), _controller.Model.UnitSystem.LengthUnitAbbreviation,
new StringLengthFromConverter());
// Gap conductance
SetGridViewUnit(nameof(GapConductanceDataPoint.Conductance),
_controller.Model.UnitSystem.HeatTransferCoefficientUnitAbbreviation,
new StringHeatTransferCoefficientFromConverter());
SetGridViewUnit(nameof(GapConductanceDataPoint.Pressure), _controller.Model.UnitSystem.PressureUnitAbbreviation,
new StringPressureFromConverter());
SetGridViewUnit(nameof(GapConductanceDataPoint.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 GetSurfaceInteractionName()
{
return _surfraceInteractionNames.GetNextNumberedKey("Surface_Interaction");
}
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;
}
}
}