392 lines
18 KiB
C#
392 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using CaeModel;
|
|
using CaeGlobals;
|
|
using System.Windows.Forms;
|
|
|
|
namespace CPSO.Forms
|
|
{
|
|
class FrmHistoryOutput : UserControls.FrmPropertyListView, IFormBase, IFormItemSetDataParent, IFormHighlight
|
|
{
|
|
// Variables
|
|
private string[] _historyOutputNames;
|
|
private string _historyOutputToEditName;
|
|
private ViewHistoryOutput _viewHistoryOutput;
|
|
private Controller _controller;
|
|
|
|
|
|
// Properties
|
|
public HistoryOutput HistoryOutput
|
|
{
|
|
get { return _viewHistoryOutput != null ? _viewHistoryOutput.GetBase() : null; }
|
|
set
|
|
{
|
|
if (value is NodalHistoryOutput nho) _viewHistoryOutput = new ViewNodalHistoryOutput(nho.DeepClone());
|
|
else if (value is ElementHistoryOutput eho) _viewHistoryOutput = new ViewElementHistoryOutput(eho.DeepClone());
|
|
else if (value is ContactHistoryOutput cho) _viewHistoryOutput = new ViewContactHistoryOutput(cho.DeepClone());
|
|
else throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
|
|
// Constructors
|
|
public FrmHistoryOutput(Controller controller)
|
|
{
|
|
InitializeComponent();
|
|
//
|
|
_controller = controller;
|
|
_viewHistoryOutput = null;
|
|
}
|
|
private void InitializeComponent()
|
|
{
|
|
this.gbType.SuspendLayout();
|
|
this.gbProperties.SuspendLayout();
|
|
this.SuspendLayout();
|
|
//
|
|
// FrmHistoryOutput
|
|
//
|
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
|
this.ClientSize = new System.Drawing.Size(334, 461);
|
|
this.Name = "FrmHistoryOutput";
|
|
this.Text = "Edit History Output";
|
|
this.gbType.ResumeLayout(false);
|
|
this.gbProperties.ResumeLayout(false);
|
|
this.ResumeLayout(false);
|
|
|
|
}
|
|
|
|
|
|
// Overrides
|
|
protected override void OnVisibleChanged(EventArgs e)
|
|
{
|
|
if (Visible) ShowHideSelectionForm(); // accounts for minimizing/maximizing the main form
|
|
//
|
|
base.OnVisibleChanged(e);
|
|
}
|
|
protected override void OnListViewTypeSelectedIndexChanged()
|
|
{
|
|
if (lvTypes.SelectedItems != null && lvTypes.SelectedItems.Count > 0)
|
|
{
|
|
object itemTag = lvTypes.SelectedItems[0].Tag;
|
|
if (itemTag is ViewError) _viewHistoryOutput = null;
|
|
else if (itemTag is ViewNodalHistoryOutput vnho) _viewHistoryOutput = vnho;
|
|
else if (itemTag is ViewElementHistoryOutput veho) _viewHistoryOutput = veho;
|
|
else if (itemTag is ViewContactHistoryOutput vcho) _viewHistoryOutput = vcho;
|
|
else throw new NotImplementedException();
|
|
//
|
|
ShowHideSelectionForm();
|
|
//
|
|
propertyGrid.SelectedObject = itemTag;
|
|
//
|
|
HighlightHistoryOutput();
|
|
}
|
|
}
|
|
protected override void OnPropertyGridPropertyValueChanged()
|
|
{
|
|
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
|
|
//
|
|
if (property == nameof(_viewHistoryOutput.RegionType))
|
|
{
|
|
ShowHideSelectionForm();
|
|
//
|
|
HighlightHistoryOutput();
|
|
}
|
|
else if (_viewHistoryOutput is ViewNodalHistoryOutput vnho &&
|
|
(property == nameof(vnho.NodeSetName) ||
|
|
property == nameof(vnho.ReferencePointName) ||
|
|
property == nameof(vnho.SurfaceName)))
|
|
{
|
|
HighlightHistoryOutput();
|
|
}
|
|
else if (_viewHistoryOutput is ViewElementHistoryOutput veho &&
|
|
property == nameof(veho.ElementSetName))
|
|
{
|
|
HighlightHistoryOutput();
|
|
}
|
|
else if (_viewHistoryOutput is ViewContactHistoryOutput vcho &&
|
|
property == nameof(vcho.ContactPairName))
|
|
{
|
|
HighlightHistoryOutput();
|
|
}
|
|
//
|
|
base.OnPropertyGridPropertyValueChanged();
|
|
}
|
|
protected override void OnApply(bool onOkAddNew)
|
|
{
|
|
if (propertyGrid.SelectedObject is ViewError ve) throw new CaeException(ve.Message);
|
|
//
|
|
_viewHistoryOutput = (ViewHistoryOutput)propertyGrid.SelectedObject;
|
|
//
|
|
if (HistoryOutput == null) throw new CaeException("No history output was selected.");
|
|
//
|
|
if (HistoryOutput.RegionType == RegionTypeEnum.Selection &&
|
|
(HistoryOutput.CreationIds == null || HistoryOutput.CreationIds.Length == 0))
|
|
throw new CaeException("The history output selection must contain at least one item.");
|
|
// Check if the name exists
|
|
CheckName(_historyOutputToEditName, HistoryOutput.Name, _historyOutputNames, "history output");
|
|
// Create
|
|
if (_historyOutputToEditName == null)
|
|
{
|
|
_controller.AddHistoryOutputCommand(_stepName, HistoryOutput);
|
|
}
|
|
// Replace
|
|
else if (_propertyItemChanged || !HistoryOutput.Valid)
|
|
{
|
|
_controller.ReplaceHistoryOutputCommand(_stepName, _historyOutputToEditName, HistoryOutput);
|
|
}
|
|
// If all is successful close the ItemSetSelectionForm - except for OKAddNew
|
|
if (!onOkAddNew) ItemSetDataEditor.SelectionForm.Hide();
|
|
}
|
|
protected override void OnHideOrClose()
|
|
{
|
|
// Close the ItemSetSelectionForm
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
//
|
|
base.OnHideOrClose();
|
|
}
|
|
protected override bool OnPrepareForm(string stepName, string historyOutputToEditName)
|
|
{
|
|
this.btnOkAddNew.Visible = historyOutputToEditName == null;
|
|
//
|
|
_propertyItemChanged = false;
|
|
_stepName = null;
|
|
_historyOutputNames = null;
|
|
_historyOutputToEditName = null;
|
|
_viewHistoryOutput = null;
|
|
lvTypes.Items.Clear();
|
|
propertyGrid.SelectedObject = null;
|
|
//
|
|
_stepName = stepName;
|
|
_historyOutputNames = _controller.GetHistoryOutputNamesForStep(_stepName);
|
|
_historyOutputToEditName = historyOutputToEditName;
|
|
string[] nodeSetNames = _controller.GetUserNodeSetNames();
|
|
string[] elementSetNames = _controller.GetUserElementSetNames();
|
|
string[] surfaceNames = _controller.GetUserSurfaceNames();
|
|
string[] referencePointNames = _controller.GetModelReferencePointNames();
|
|
string[] contactPairNames = _controller.GetContactPairNames();
|
|
//
|
|
if (_historyOutputNames == null)
|
|
throw new CaeException("The history output names must be defined first.");
|
|
// Populate list view
|
|
PopulateListOfHistoryOutputs(nodeSetNames, elementSetNames, surfaceNames, referencePointNames, contactPairNames);
|
|
// Create new history output
|
|
if (_historyOutputToEditName == null)
|
|
{
|
|
lvTypes.Enabled = true;
|
|
_viewHistoryOutput = null;
|
|
//
|
|
HighlightHistoryOutput(); // must be here if called from the menu
|
|
}
|
|
else
|
|
// Edit existing history output
|
|
{
|
|
// Get and convert a converted history output back to selection
|
|
HistoryOutput = _controller.GetHistoryOutput(_stepName, _historyOutputToEditName); // to clone
|
|
if (HistoryOutput.CreationData != null)
|
|
{
|
|
if (!_controller.Model.IsHistoryOutputRegionValid(HistoryOutput) || // do not use HistoryOutput.Valid
|
|
!_controller.Model.RegionValid(HistoryOutput))
|
|
{
|
|
// Region invalid
|
|
HistoryOutput.CreationData = null;
|
|
HistoryOutput.CreationIds = null;
|
|
_propertyItemChanged = true;
|
|
}
|
|
HistoryOutput.RegionType = RegionTypeEnum.Selection;
|
|
}
|
|
//
|
|
int selectedId;
|
|
if (_viewHistoryOutput is ViewNodalHistoryOutput vnho)
|
|
{
|
|
selectedId = 0;
|
|
// Check for deleted entities
|
|
if (vnho.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
|
|
else if (vnho.RegionType == RegionTypeEnum.NodeSetName.ToFriendlyString())
|
|
CheckMissingValueRef(ref nodeSetNames, vnho.NodeSetName, s => { vnho.NodeSetName = s; });
|
|
else if (vnho.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
|
|
CheckMissingValueRef(ref surfaceNames, vnho.SurfaceName, s => { vnho.SurfaceName = s; });
|
|
else if (vnho.RegionType == RegionTypeEnum.ReferencePointName.ToFriendlyString())
|
|
CheckMissingValueRef(ref referencePointNames, vnho.ReferencePointName, s => { vnho.ReferencePointName = s; });
|
|
else throw new NotSupportedException();
|
|
//
|
|
vnho.PopulateDropDownLists(nodeSetNames, surfaceNames, referencePointNames);
|
|
}
|
|
else if (_viewHistoryOutput is ViewElementHistoryOutput veho)
|
|
{
|
|
selectedId = 1;
|
|
// Check for deleted entities
|
|
if (veho.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
|
|
else if (veho.RegionType == RegionTypeEnum.ElementSetName.ToFriendlyString())
|
|
CheckMissingValueRef(ref elementSetNames, veho.ElementSetName, s => { veho.ElementSetName = s; });
|
|
else throw new NotSupportedException();
|
|
//
|
|
veho.PopulateDropDownLists(elementSetNames);
|
|
}
|
|
else if (_viewHistoryOutput is ViewContactHistoryOutput vcho)
|
|
{
|
|
selectedId = 2;
|
|
// Check for deleted entities
|
|
CheckMissingValueRef(ref contactPairNames, vcho.ContactPairName, s => { vcho.ContactPairName = s; });
|
|
//
|
|
vcho.PopulateDropDownLists(contactPairNames);
|
|
}
|
|
else throw new NotSupportedException();
|
|
//
|
|
lvTypes.Items[selectedId].Tag = _viewHistoryOutput;
|
|
_preselectIndex = selectedId;
|
|
}
|
|
ShowHideSelectionForm();
|
|
//
|
|
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
|
|
//
|
|
return true;
|
|
}
|
|
|
|
|
|
// Methods
|
|
private void PopulateListOfHistoryOutputs(string[] nodeSetNames, string[] elementSetNames,
|
|
string[] surfaceNames, string[] referencePointNames, string[] contactPairNames)
|
|
{
|
|
ListViewItem item;
|
|
// Node output
|
|
item = new ListViewItem("Node Output");
|
|
NodalHistoryOutput nho = new NodalHistoryOutput(GetHistoryOutputName("N"), NodalHistoryVariable.U,
|
|
"", RegionTypeEnum.Selection);
|
|
ViewNodalHistoryOutput vnho = new ViewNodalHistoryOutput(nho);
|
|
vnho.PopulateDropDownLists(nodeSetNames, surfaceNames, referencePointNames);
|
|
item.Tag = vnho;
|
|
lvTypes.Items.Add(item);
|
|
// Element output
|
|
item = new ListViewItem("Element Output");
|
|
ElementHistoryOutput eho = new ElementHistoryOutput(GetHistoryOutputName("E"), ElementHistoryVariable.S,
|
|
"", RegionTypeEnum.Selection);
|
|
ViewElementHistoryOutput veho = new ViewElementHistoryOutput(eho);
|
|
veho.PopulateDropDownLists(elementSetNames);
|
|
item.Tag = veho;
|
|
lvTypes.Items.Add(item);
|
|
// Contact output
|
|
item = new ListViewItem("Contact Output");
|
|
if (contactPairNames.Length > 0)
|
|
{
|
|
Step step = _controller.Model.StepCollection.GetStep(_stepName);
|
|
ContactHistoryOutput cho = new ContactHistoryOutput(GetHistoryOutputName("C"),
|
|
//ContactHistoryVariable.CDIS |
|
|
//ContactHistoryVariable.CSTR |
|
|
ContactHistoryVariable.CF,
|
|
contactPairNames[0]);
|
|
ViewContactHistoryOutput vcho = new ViewContactHistoryOutput(cho);
|
|
vcho.PopulateDropDownLists(contactPairNames);
|
|
item.Tag = vcho;
|
|
}
|
|
else item.Tag = new ViewError("There is no contact pair defined for the history output definition.");
|
|
lvTypes.Items.Add(item);
|
|
}
|
|
private string GetHistoryOutputName(string prefix)
|
|
{
|
|
return _historyOutputNames.GetNextNumberedKey(prefix + "H_Output");
|
|
}
|
|
private void HighlightHistoryOutput()
|
|
{
|
|
try
|
|
{
|
|
_controller.ClearSelectionHistory();
|
|
//
|
|
if (_viewHistoryOutput == null) { }
|
|
else if (HistoryOutput is NodalHistoryOutput || HistoryOutput is ElementHistoryOutput)
|
|
{
|
|
if (HistoryOutput.RegionType == RegionTypeEnum.NodeSetName ||
|
|
HistoryOutput.RegionType == RegionTypeEnum.ReferencePointName ||
|
|
HistoryOutput.RegionType == RegionTypeEnum.SurfaceName ||
|
|
HistoryOutput.RegionType == RegionTypeEnum.ElementSetName)
|
|
{
|
|
_controller.Highlight3DObjects(new object[] { HistoryOutput.RegionName });
|
|
}
|
|
else if (HistoryOutput.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
SetSelectItem();
|
|
//
|
|
if (HistoryOutput.CreationData != null)
|
|
{
|
|
_controller.Selection = HistoryOutput.CreationData.DeepClone();
|
|
_controller.HighlightSelection();
|
|
}
|
|
}
|
|
else throw new NotImplementedException();
|
|
}
|
|
else if (HistoryOutput is ContactHistoryOutput)
|
|
{
|
|
_controller.HighlightContactPair(HistoryOutput.RegionName);
|
|
}
|
|
else throw new NotSupportedException();
|
|
}
|
|
catch { }
|
|
}
|
|
private void ShowHideSelectionForm()
|
|
{
|
|
if (HistoryOutput != null && HistoryOutput.RegionType == RegionTypeEnum.Selection)
|
|
ItemSetDataEditor.SelectionForm.ShowIfHidden(this.Owner);
|
|
else
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
//
|
|
SetSelectItem();
|
|
}
|
|
private void SetSelectItem()
|
|
{
|
|
if (HistoryOutput != null && HistoryOutput.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
if (HistoryOutput is null) { }
|
|
else if (HistoryOutput is NodalHistoryOutput) _controller.SetSelectItemToNode();
|
|
else if (HistoryOutput is ElementHistoryOutput) _controller.SetSelectItemToElement();
|
|
else if (HistoryOutput is ContactHistoryOutput) _controller.SelectItem = vtkSelectItem.None;
|
|
}
|
|
else _controller.SetSelectByToOff();
|
|
}
|
|
//
|
|
public void SelectionChanged(int[] ids)
|
|
{
|
|
if (HistoryOutput != null && HistoryOutput.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
if (HistoryOutput is NodalHistoryOutput || HistoryOutput is ElementHistoryOutput)
|
|
{
|
|
HistoryOutput.CreationIds = ids;
|
|
HistoryOutput.CreationData = _controller.Selection.DeepClone();
|
|
//
|
|
propertyGrid.Refresh();
|
|
//
|
|
_propertyItemChanged = true;
|
|
}
|
|
else throw new NotSupportedException();
|
|
}
|
|
}
|
|
|
|
// IFormHighlight
|
|
public void Highlight()
|
|
{
|
|
if (!_closing) HighlightHistoryOutput();
|
|
}
|
|
|
|
// IFormItemSetDataParent
|
|
public bool IsSelectionGeometryBased()
|
|
{
|
|
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
|
|
HistoryOutput historyOutput = HistoryOutput;
|
|
//
|
|
if (historyOutput.CreationData != null) return historyOutput.CreationData.IsGeometryBased();
|
|
else return true;
|
|
}
|
|
public bool IsGeometrySelectionIdBased()
|
|
{
|
|
bool defaultMode = _controller.Settings.Pre.GeometrySelectMode == GeometrySelectModeEnum.SelectId;
|
|
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
|
|
HistoryOutput historyOutput = HistoryOutput;
|
|
//
|
|
if (historyOutput.CreationData != null && IsSelectionGeometryBased())
|
|
return historyOutput.CreationData.IsGeometryIdBased(defaultMode);
|
|
else return defaultMode;
|
|
}
|
|
}
|
|
}
|