402 lines
17 KiB
C#
402 lines
17 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 FrmDefinedField : UserControls.FrmPropertyListView, IFormBase, IFormItemSetDataParent, IFormHighlight
|
|
{
|
|
// Variables
|
|
private string[] _definedFieldNames;
|
|
private string _definedFieldToEditName;
|
|
private ViewDefinedField _viewDefinedField;
|
|
private Controller _controller;
|
|
|
|
|
|
// Properties
|
|
public DefinedField DefinedField
|
|
{
|
|
get { return _viewDefinedField != null ? _viewDefinedField.GetBase() : null; }
|
|
set
|
|
{
|
|
if (value is DefinedTemperature dt) _viewDefinedField = new ViewDefinedTemperature(dt.DeepClone());
|
|
else throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
|
|
// Constructors
|
|
public FrmDefinedField(Controller controller)
|
|
: base (1.7)
|
|
{
|
|
InitializeComponent();
|
|
//
|
|
_controller = controller;
|
|
_viewDefinedField = null;
|
|
}
|
|
private void InitializeComponent()
|
|
{
|
|
this.gbType.SuspendLayout();
|
|
this.gbProperties.SuspendLayout();
|
|
this.SuspendLayout();
|
|
//
|
|
// gbType
|
|
//
|
|
this.gbType.Size = new System.Drawing.Size(310, 108);
|
|
//
|
|
// lvTypes
|
|
//
|
|
this.lvTypes.Size = new System.Drawing.Size(298, 80);
|
|
//
|
|
// gbProperties
|
|
//
|
|
this.gbProperties.Location = new System.Drawing.Point(12, 126);
|
|
this.gbProperties.Size = new System.Drawing.Size(310, 314);
|
|
//
|
|
// propertyGrid
|
|
//
|
|
this.propertyGrid.Size = new System.Drawing.Size(298, 286);
|
|
//
|
|
// btnOK
|
|
//
|
|
this.btnOK.Location = new System.Drawing.Point(160, 446);
|
|
//
|
|
// btnCancel
|
|
//
|
|
this.btnCancel.Location = new System.Drawing.Point(241, 446);
|
|
//
|
|
// btnOkAddNew
|
|
//
|
|
this.btnOkAddNew.Location = new System.Drawing.Point(79, 446);
|
|
//
|
|
// FrmDefinedField
|
|
//
|
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
|
this.ClientSize = new System.Drawing.Size(334, 481);
|
|
this.Name = "FrmDefinedField";
|
|
this.Text = "Edit Defined Field";
|
|
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) _viewDefinedField = null;
|
|
else if (itemTag is ViewDefinedTemperature vdt) _viewDefinedField = vdt;
|
|
else throw new NotImplementedException();
|
|
//
|
|
ShowHideSelectionForm();
|
|
//
|
|
propertyGrid.SelectedObject = itemTag;
|
|
//
|
|
HighlightDefinedField();
|
|
}
|
|
}
|
|
protected override void OnPropertyGridPropertyValueChanged()
|
|
{
|
|
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
|
|
//
|
|
if (property == nameof(_viewDefinedField.RegionType))
|
|
{
|
|
ShowHideSelectionForm();
|
|
HighlightDefinedField();
|
|
}
|
|
else if (_viewDefinedField is ViewDefinedTemperature vdt)
|
|
{
|
|
if (property == nameof(vdt.DefinedTemperatureType))
|
|
{
|
|
ShowHideSelectionForm();
|
|
HighlightDefinedField();
|
|
}
|
|
else if (property == nameof(vdt.NodeSetName) || property == nameof(vdt.SurfaceName))
|
|
{
|
|
HighlightDefinedField();
|
|
}
|
|
}
|
|
//
|
|
base.OnPropertyGridPropertyValueChanged();
|
|
}
|
|
protected override void OnApply(bool onOkAddNew)
|
|
{
|
|
if (propertyGrid.SelectedObject is ViewError ve) throw new CaeException(ve.Message);
|
|
//
|
|
_viewDefinedField = (ViewDefinedField)propertyGrid.SelectedObject;
|
|
//
|
|
if (DefinedField == null) throw new CaeException("No defined field was selected.");
|
|
//
|
|
if (DefinedField is DefinedTemperature dt)
|
|
{
|
|
// Empty selection
|
|
if (dt.Type == DefinedTemperatureTypeEnum.ByValue && DefinedField.RegionType == RegionTypeEnum.Selection &&
|
|
(DefinedField.CreationIds == null || DefinedField.CreationIds.Length == 0))
|
|
throw new CaeException("The defined field selection must contain at least one item.");
|
|
// Empty file name
|
|
else if (dt.Type == DefinedTemperatureTypeEnum.FromFile && dt.FileName == null && dt.FileName.Length == 0)
|
|
throw new CaeException("The file name to read the temperature from is missing.");
|
|
}
|
|
// Check if the name exists
|
|
CheckName(_definedFieldToEditName, DefinedField.Name, _definedFieldNames, "defined field");
|
|
// Create
|
|
if (_definedFieldToEditName == null)
|
|
{
|
|
_controller.AddDefinedFieldCommand(_stepName, DefinedField);
|
|
}
|
|
// Replace
|
|
else if (_propertyItemChanged)
|
|
{
|
|
_controller.ReplaceDefinedFieldCommand(_stepName, _definedFieldToEditName, DefinedField);
|
|
}
|
|
// 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 definedFieldToEditName)
|
|
{
|
|
this.btnOkAddNew.Visible = definedFieldToEditName == null;
|
|
//
|
|
_propertyItemChanged = false;
|
|
_stepName = null;
|
|
_definedFieldNames = null;
|
|
_definedFieldToEditName = null;
|
|
_viewDefinedField = null;
|
|
lvTypes.Items.Clear();
|
|
propertyGrid.SelectedObject = null;
|
|
//
|
|
_stepName = stepName;
|
|
_definedFieldNames = _controller.GetDefinedFieldNamesForStep(_stepName);
|
|
_definedFieldToEditName = definedFieldToEditName;
|
|
string[] nodeSetNames = _controller.GetUserNodeSetNames();
|
|
string[] surfaceNames = _controller.GetUserSurfaceNames();
|
|
string[] distributionNames = _controller.GetDistributionNames();
|
|
string[] amplitudeNames = _controller.GetAmplitudeNames();
|
|
//
|
|
if (nodeSetNames == null) nodeSetNames = new string[0];
|
|
if (surfaceNames == null) surfaceNames = new string[0];
|
|
if (distributionNames == null) distributionNames = new string[0];
|
|
if (amplitudeNames == null) amplitudeNames = new string[0];
|
|
//
|
|
if (_definedFieldNames == null)
|
|
throw new CaeException("The defined field names must be defined first.");
|
|
// Populate list view
|
|
PopulateListOfDefinedFields(nodeSetNames, surfaceNames, distributionNames, amplitudeNames);
|
|
// Check if this step supports any defined fields
|
|
if (lvTypes.Items.Count == 0) return false;
|
|
// Create new defined field
|
|
if (_definedFieldToEditName == null)
|
|
{
|
|
lvTypes.Enabled = true;
|
|
_viewDefinedField = null;
|
|
if (lvTypes.Items.Count == 1) _preselectIndex = 0;
|
|
//
|
|
HighlightDefinedField(); // must be here if called from the menu
|
|
}
|
|
else
|
|
// Edit existing defined field
|
|
{
|
|
// Get and convert a converted history output back to selection
|
|
DefinedField = _controller.GetDefinedField(_stepName, _definedFieldToEditName); // to clone
|
|
if (DefinedField.CreationData != null)
|
|
{
|
|
if (!DefinedField.Valid || !_controller.Model.RegionValid(DefinedField))
|
|
{
|
|
DefinedField.CreationData = null;
|
|
DefinedField.CreationIds = null;
|
|
_propertyItemChanged = true;
|
|
}
|
|
DefinedField.RegionType = RegionTypeEnum.Selection;
|
|
}
|
|
// Check for deleted distributions
|
|
if (DefinedField is IDistribution dfd)
|
|
{
|
|
if (dfd.DistributionName != null && dfd.DistributionName != Distribution.DefaultDistributionName)
|
|
CheckMissingValueRef(ref distributionNames, dfd.DistributionName, a => { dfd.DistributionName = a; });
|
|
}
|
|
// Check for deleted amplitudes
|
|
if (_viewDefinedField.AmplitudeName != null && _viewDefinedField.AmplitudeName != Amplitude.DefaultAmplitudeName)
|
|
CheckMissingValueRef(ref amplitudeNames, _viewDefinedField.AmplitudeName,
|
|
a => { _viewDefinedField.AmplitudeName = a; });
|
|
//
|
|
int selectedId;
|
|
if (_viewDefinedField is ViewDefinedTemperature vdt)
|
|
{
|
|
selectedId = lvTypes.FindItemWithText("Temperature").Index;
|
|
// Check for deleted entities
|
|
if (vdt.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
|
|
else if (vdt.RegionType == RegionTypeEnum.NodeSetName.ToFriendlyString())
|
|
CheckMissingValueRef(ref nodeSetNames, vdt.NodeSetName, s => { vdt.NodeSetName = s; });
|
|
else if (vdt.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
|
|
CheckMissingValueRef(ref surfaceNames, vdt.SurfaceName, s => { vdt.SurfaceName = s; });
|
|
else throw new NotSupportedException();
|
|
//
|
|
vdt.PopulateDropDownLists(nodeSetNames, surfaceNames, distributionNames, amplitudeNames);
|
|
}
|
|
else throw new NotSupportedException();
|
|
//
|
|
lvTypes.Items[selectedId].Tag = _viewDefinedField;
|
|
_preselectIndex = selectedId;
|
|
}
|
|
ShowHideSelectionForm();
|
|
//
|
|
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
|
|
//
|
|
return true;
|
|
}
|
|
|
|
|
|
// Methods
|
|
private void PopulateListOfDefinedFields(string[] nodeSetNames, string[] surfaceNames, string[] distributionNames,
|
|
string[] amplitudeNames)
|
|
{
|
|
Step step = _controller.GetStep(_stepName);
|
|
System.Drawing.Color color = _controller.Settings.Pre.DefinedFieldSymbolColor;
|
|
// Populate list view
|
|
ListViewItem item;
|
|
// Defined temperature
|
|
string name = "Temperature";
|
|
item = new ListViewItem(name);
|
|
DefinedTemperature definedTemperature = new DefinedTemperature(GetDefinedFieldName(name), "",
|
|
RegionTypeEnum.Selection, 0);
|
|
if (step.IsDefinedFieldSupported(definedTemperature))
|
|
{
|
|
ViewDefinedTemperature vdt = new ViewDefinedTemperature(definedTemperature);
|
|
vdt.PopulateDropDownLists(nodeSetNames, surfaceNames, distributionNames, amplitudeNames);
|
|
vdt.Color = color;
|
|
item.Tag = vdt;
|
|
lvTypes.Items.Add(item);
|
|
}
|
|
}
|
|
private string GetDefinedFieldName(string name)
|
|
{
|
|
if (name == null || name == "") name = "Defined Field";
|
|
name = name.Replace(' ', '_');
|
|
name = _definedFieldNames.GetNextNumberedKey(name);
|
|
return name;
|
|
}
|
|
private void HighlightDefinedField()
|
|
{
|
|
try
|
|
{
|
|
_controller.ClearSelectionHistory();
|
|
//
|
|
if (_viewDefinedField == null) { }
|
|
else if (DefinedField is DefinedTemperature dt)
|
|
{
|
|
if (dt.Type == DefinedTemperatureTypeEnum.ByValue)
|
|
{
|
|
if (DefinedField.RegionType == RegionTypeEnum.NodeSetName ||
|
|
DefinedField.RegionType == RegionTypeEnum.SurfaceName)
|
|
{
|
|
_controller.Highlight3DObjects(new object[] { DefinedField.RegionName });
|
|
}
|
|
else if (DefinedField.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
SetSelectItem();
|
|
//
|
|
if (DefinedField.CreationData != null)
|
|
{
|
|
_controller.Selection = DefinedField.CreationData.DeepClone();
|
|
_controller.HighlightSelection();
|
|
}
|
|
}
|
|
else throw new NotImplementedException();
|
|
}
|
|
}
|
|
else throw new NotSupportedException();
|
|
}
|
|
catch { }
|
|
}
|
|
private void ShowHideSelectionForm()
|
|
{
|
|
if (DefinedField != null && DefinedField.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
if (DefinedField is DefinedTemperature dt && dt.Type == DefinedTemperatureTypeEnum.FromFile)
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
else
|
|
ItemSetDataEditor.SelectionForm.ShowIfHidden(this.Owner);
|
|
}
|
|
else
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
//
|
|
SetSelectItem();
|
|
}
|
|
private void SetSelectItem()
|
|
{
|
|
if (DefinedField != null && DefinedField.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
if (DefinedField is null) { }
|
|
else if (DefinedField is DefinedTemperature dt)
|
|
{
|
|
if (dt.Type == DefinedTemperatureTypeEnum.ByValue) _controller.SetSelectItemToGeometry();
|
|
else _controller.SetSelectByToOff();
|
|
}
|
|
}
|
|
else _controller.SetSelectByToOff();
|
|
}
|
|
//
|
|
public void SelectionChanged(int[] ids)
|
|
{
|
|
if (DefinedField != null && DefinedField.RegionType == RegionTypeEnum.Selection)
|
|
{
|
|
if (DefinedField is DefinedTemperature)
|
|
{
|
|
DefinedField.CreationIds = ids;
|
|
DefinedField.CreationData = _controller.Selection.DeepClone();
|
|
//
|
|
propertyGrid.Refresh();
|
|
//
|
|
_propertyItemChanged = true;
|
|
}
|
|
else throw new NotSupportedException();
|
|
}
|
|
}
|
|
// IFormHighlight
|
|
public void Highlight()
|
|
{
|
|
if (!_closing) HighlightDefinedField();
|
|
}
|
|
// IFormItemSetDataParent
|
|
public bool IsSelectionGeometryBased()
|
|
{
|
|
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
|
|
DefinedField definedField = DefinedField;
|
|
//
|
|
if (definedField.CreationData != null) return definedField.CreationData.IsGeometryBased();
|
|
else return true;
|
|
}
|
|
public bool IsGeometrySelectionIdBased()
|
|
{
|
|
bool defaultMode = _controller.Settings.Pre.GeometrySelectMode == GeometrySelectModeEnum.SelectId;
|
|
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
|
|
DefinedField definedField = DefinedField;
|
|
//
|
|
if (definedField.CreationData != null && IsSelectionGeometryBased())
|
|
return definedField.CreationData.IsGeometryIdBased(defaultMode);
|
|
else return defaultMode;
|
|
}
|
|
}
|
|
}
|