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 namePosition = new Dictionary(); 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; } } }