Files
wg_cpso/CPSO/Forms/21_FEModel/FrmRemeshingParameters.cs

304 lines
12 KiB
C#
Raw Normal View History

2026-03-25 18:20:24 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CaeMesh;
using CaeGlobals;
namespace CPSO.Forms
{
class FrmRemeshingParameters : UserControls.FrmProperties, IFormBase, IFormItemSetDataParent, IFormHighlight
{
// Variables
bool _highlightEnabled;
private ViewRemeshingParameters _viewRemeshingParameters;
private RemeshingParameters _prevRemeshingParameters;
private Button btnPreview;
private Controller _controller;
// Properties
public RemeshingParameters RemeshingParameters
{
get { return _viewRemeshingParameters.GetBase(); }
set { _viewRemeshingParameters = new ViewRemeshingParameters(value.DeepClone()); }
}
// Constructors
public FrmRemeshingParameters(Controller controller)
{
InitializeComponent();
//
_controller = controller;
_highlightEnabled = true;
_viewRemeshingParameters = null;
_prevRemeshingParameters = null;
//
SelectionClear = _controller.Selection.Clear;
}
private void InitializeComponent()
{
this.btnPreview = new System.Windows.Forms.Button();
this.gbProperties.SuspendLayout();
this.SuspendLayout();
//
// btnCancel
//
this.btnCancel.Text = "Close";
//
// btnOkAddNew
//
this.btnOkAddNew.Location = new System.Drawing.Point(160, 376);
this.btnOkAddNew.Text = "Apply";
//
// btnPreview
//
this.btnPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnPreview.Location = new System.Drawing.Point(79, 376);
this.btnPreview.Name = "btnPreview";
this.btnPreview.Size = new System.Drawing.Size(75, 23);
this.btnPreview.TabIndex = 17;
this.btnPreview.Text = "Preview";
this.btnPreview.UseVisualStyleBackColor = true;
this.btnPreview.Click += new System.EventHandler(this.btnPreview_Click);
//
// FrmRemeshingParameters
//
this.ClientSize = new System.Drawing.Size(334, 411);
this.Controls.Add(this.btnPreview);
this.Name = "FrmRemeshingParameters";
this.Text = "Remeshing Parameters";
this.VisibleChanged += new System.EventHandler(this.FrmRemeshingParameters_VisibleChanged);
this.Controls.SetChildIndex(this.gbProperties, 0);
this.Controls.SetChildIndex(this.btnCancel, 0);
this.Controls.SetChildIndex(this.btnOK, 0);
this.Controls.SetChildIndex(this.btnOkAddNew, 0);
this.Controls.SetChildIndex(this.btnPreview, 0);
this.gbProperties.ResumeLayout(false);
this.ResumeLayout(false);
}
// Event handlers
private void FrmRemeshingParameters_VisibleChanged(object sender, EventArgs e)
{
// Limit selection to the first selected part
_controller.Selection.LimitSelectionToFirstPart = Visible;
btnPreview.Enabled = true;
//
if (Visible) ShowHideSelectionForm(); // accounts for minimizing/maximizing the main form
}
async private void btnPreview_Click(object sender, EventArgs e)
{
try
{
HighlightElementSet();
//
btnPreview.Enabled = false;
//
CheckRemeshingParameters();
//
await Task.Run(() => _controller.RemeshElements(RemeshingParameters, true));
//
if (RemeshingParameters.RegionType == RegionTypeEnum.Selection &&
RemeshingParameters.CreationData != null)
{
_controller.Selection = RemeshingParameters.CreationData.DeepClone();
}
}
catch (Exception ex)
{
btnPreview.Enabled = true;
ExceptionTools.Show(this, ex);
}
finally
{
btnPreview.Enabled = true;
}
}
// Overrides
protected override void OnPropertyGridPropertyValueChanged()
{
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
//
if (property == nameof(_viewRemeshingParameters.RegionType))
{
ShowHideSelectionForm();
//
HighlightElementSet();
}
else if (property == nameof(_viewRemeshingParameters.ElementSetName))
{
HighlightElementSet();
}
//
base.OnPropertyGridPropertyValueChanged();
}
protected override void OnApply(bool onOkAddNew)
{
_highlightEnabled = false;
//
CheckRemeshingParameters();
//
_controller.RemeshElementsCommand(RemeshingParameters);
// If all is successful close the ItemSetSelectionForm - except for OKAddNew
if (onOkAddNew) _prevRemeshingParameters = RemeshingParameters.DeepClone();
else ItemSetDataEditor.SelectionForm.Hide();
}
protected override void OnHideOrClose()
{
_prevRemeshingParameters = null;
// Close the ItemSetSelectionForm
ItemSetDataEditor.SelectionForm.Hide();
//
base.OnHideOrClose();
}
protected override bool OnPrepareForm(string stepName, string itemToEditName)
{
this.btnOK.Visible = false;
//
_highlightEnabled = true;
_propertyItemChanged = false;
_viewRemeshingParameters = null;
propertyGrid.SelectedObject = null;
//
string[] elementSetNames = _controller.GetUserElementSetNames();
// Create new
if (_prevRemeshingParameters == null)
{
MeshingParameters meshingParameters =
_controller.GetPartDefaultMeshingParameters(_controller.Model.Mesh.Parts.Keys.ToArray(), false);
RemeshingParameters = new RemeshingParameters("", RegionTypeEnum.Selection, meshingParameters);
//
RemeshingParameters.CreationData = new Selection();
RemeshingParameters.CreationData.SelectItem = vtkSelectItem.Element;
}
else RemeshingParameters = _prevRemeshingParameters;
//
_controller.Selection.Clear();
//
_viewRemeshingParameters.PopulateDropDownLists(elementSetNames);
//
propertyGrid.SelectedObject = _viewRemeshingParameters;
propertyGrid.Focus();
// Get start point grid item and select it
GridItem gi = propertyGrid.EnumerateAllItems().First((item) =>
item.PropertyDescriptor != null &&
item.PropertyDescriptor.Name == nameof(_viewRemeshingParameters.RegionType));
gi.Select();
//
ShowHideSelectionForm();
//
HighlightElementSet();
//
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
//
return true;
}
// Methods
private void CheckRemeshingParameters()
{
_viewRemeshingParameters = (ViewRemeshingParameters)propertyGrid.SelectedObject;
//
if (_viewRemeshingParameters == null) throw new CaeException("No remeshing was selected.");
//
if (RemeshingParameters.RegionType == RegionTypeEnum.Selection &&
(RemeshingParameters.CreationIds == null || RemeshingParameters.CreationIds.Length == 0))
throw new CaeException("The element set for remeshing selection must contain at least one item.");
}
private void HighlightElementSet()
{
try
{
_controller.ClearSelectionHistory();
//
if (_viewRemeshingParameters == null) { }
else
{
if (RemeshingParameters.RegionType == RegionTypeEnum.ElementSetName)
{
_controller.Highlight3DObjects(new object[] { RemeshingParameters.RegionName });
}
else if (RemeshingParameters.RegionType == RegionTypeEnum.Selection)
{
SetSelectItem();
//
if (RemeshingParameters.CreationData != null)
{
_controller.Selection = RemeshingParameters.CreationData.DeepClone();
_controller.HighlightSelection();
}
}
else throw new NotSupportedException();
}
}
catch { }
}
//
private void ShowHideSelectionForm()
{
if (RemeshingParameters != null && RemeshingParameters.RegionType == RegionTypeEnum.Selection)
ItemSetDataEditor.SelectionForm.ShowIfHidden(this.Owner);
else
ItemSetDataEditor.SelectionForm.Hide();
//
SetSelectItem();
}
private void SetSelectItem()
{
if (RemeshingParameters != null && RemeshingParameters.RegionType == RegionTypeEnum.Selection)
_controller.SetSelectItemToElement();
else
_controller.SetSelectByToOff();
}
public void SelectionChanged(int[] ids)
{
if (RemeshingParameters != null && RemeshingParameters.RegionType == RegionTypeEnum.Selection)
{
RemeshingParameters.CreationIds = ids;
RemeshingParameters.CreationData = _controller.Selection.DeepClone();
//
propertyGrid.Refresh();
//
_propertyItemChanged = true;
}
}
// IFormHighlight
public void Highlight()
{
if(_highlightEnabled && !_closing) HighlightElementSet();
}
// IFormItemSetDataParent
public bool IsSelectionGeometryBased()
{
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
RemeshingParameters remeshingParameters = RemeshingParameters;
//
if (remeshingParameters != null && remeshingParameters.CreationData != null)
return remeshingParameters.CreationData.IsGeometryBased();
else return true;
}
public bool IsGeometrySelectionIdBased()
{
bool defaultMode = _controller.Settings.Pre.GeometrySelectMode == GeometrySelectModeEnum.SelectId;
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
RemeshingParameters remeshingParameters = RemeshingParameters;
//
if (remeshingParameters != null && remeshingParameters.CreationData != null && IsSelectionGeometryBased())
return remeshingParameters.CreationData.IsGeometryIdBased(defaultMode);
else return defaultMode;
}
}
}