Files
wg_cpso/CPSO/Forms/51_Step/FrmStep.cs

440 lines
19 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 CaeModel;
using CaeGlobals;
using System.Windows.Forms;
namespace CPSO.Forms
{
class FrmStep : UserControls.FrmPropertyListView, IFormBase
{
// Variables
private string[] _stepNames;
private string _stepToEditName;
private ViewStep _viewStep;
private Controller _controller;
// Properties
public string[] StepNames { get { return _stepNames; } set { _stepNames = value; } }
public Step Step
{
get { return _viewStep.GetBase(); }
set
{
if (value.GetType() == typeof(StaticStep)) // use this form due to inheritance
_viewStep = new ViewStaticStep((value as StaticStep).DeepClone());
else if (value is SlipWearStep sws)
_viewStep = new ViewSlipWearStep(sws.DeepClone());
else if (value is BoundaryDisplacementStep bds)
_viewStep = new ViewBoundaryDisplacementStep(bds.DeepClone());
else if (value is FrequencyStep fs)
_viewStep = new ViewFrequencyStep(fs.DeepClone());
else if (value is ComplexFrequencyStep cfs)
_viewStep = new ViewComplexFrequencyStep(cfs.DeepClone());
else if (value is BuckleStep bs)
_viewStep = new ViewBuckleStep(bs.DeepClone());
else if (value is ModalDynamicsStep md)
_viewStep = new ViewModalDynamics(md.DeepClone());
else if (value is SteadyStateDynamicsStep ssd)
_viewStep = new ViewSteadyStateDynamics(ssd.DeepClone());
else if (value.GetType() == typeof(DynamicStep)) // use this form due to inheritance
_viewStep = new ViewDynamicStep((value as DynamicStep).DeepClone());
// Thermal
else if (value.GetType() == typeof(HeatTransferStep)) // use this form due to inheritance
_viewStep = new ViewHeatTransferStep((value as HeatTransferStep).DeepClone());
else if (value.GetType() == typeof(UncoupledTempDispStep)) // use this form due to inheritance
_viewStep = new ViewUncoupledTempDispStep((value as UncoupledTempDispStep).DeepClone());
else if (value.GetType() == typeof(CoupledTempDispStep)) // use this form due to inheritance
_viewStep = new ViewCoupledTempDispStep((value as CoupledTempDispStep).DeepClone());
else throw new NotImplementedException();
}
}
// Constructors
public FrmStep(Controller controller)
: base(1.7)
{
InitializeComponent();
//
_controller = controller;
_viewStep = null;
}
private void InitializeComponent()
{
this.gbType.SuspendLayout();
this.gbProperties.SuspendLayout();
this.SuspendLayout();
//
// gbProperties
//
this.gbProperties.Size = new System.Drawing.Size(310, 353);
//
// propertyGrid
//
this.propertyGrid.Size = new System.Drawing.Size(298, 325);
//
// btnOK
//
this.btnOK.Location = new System.Drawing.Point(160, 476);
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(241, 476);
//
// btnOkAddNew
//
this.btnOkAddNew.Location = new System.Drawing.Point(79, 476);
//
// FrmStep
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.ClientSize = new System.Drawing.Size(334, 511);
this.MinimumSize = new System.Drawing.Size(350, 550);
this.Name = "FrmStep";
this.Text = "Edit Step";
this.gbType.ResumeLayout(false);
this.gbProperties.ResumeLayout(false);
this.ResumeLayout(false);
}
// Overrides
protected override void OnListViewTypeSelectedIndexChanged()
{
if (lvTypes.SelectedItems != null && lvTypes.SelectedItems.Count > 0)
{
propertyGrid.SelectedObject = lvTypes.SelectedItems[0].Tag;
}
}
protected override void OnPropertyGridPropertyValueChanged()
{
(propertyGrid.SelectedObject as ViewStep).UpdateVisibility();
//
base.OnPropertyGridPropertyValueChanged();
}
protected override void OnApply(bool onOkAddNew)
{
_viewStep = (ViewStep)propertyGrid.SelectedObject;
//
if (_viewStep == null) throw new CaeException("No step selected.");
// Check if the name exists
CheckName(_stepToEditName, Step.Name, _stepNames, "step");
// Create
if (_stepToEditName == null)
{
bool copyBCsAndLoads = true;
if (Step is BoundaryDisplacementStep) copyBCsAndLoads = false;
//
_controller.AddStepCommand(Step, copyBCsAndLoads);
_controller.AddDefaultJobCommand();
}
// Replace
else
{
if (_propertyItemChanged) _controller.ReplaceStepCommand(_stepToEditName, this.Step);
}
}
protected override bool OnPrepareForm(string stepName, string stepToEditName)
{
this.btnOkAddNew.Visible = stepToEditName == null;
//
_propertyItemChanged = false;
_stepNames = null;
_stepToEditName = null;
_viewStep = null;
lvTypes.Items.Clear();
propertyGrid.SelectedObject = null;
//
_stepNames = _controller.GetStepNames();
_stepToEditName = stepToEditName;
//
if (_stepNames == null)
throw new CaeException("The step names must be defined first.");
//
PopulateListOfSteps();
//
if (_stepToEditName == null)
{
lvTypes.Enabled = true;
_viewStep = null;
//
if (lvTypes.Items.Count == 1) lvTypes.Items[0].Selected = true;
}
else
{
Step = _controller.GetStep(_stepToEditName); // to clone and set _viewStep
// Select the appropriate load in the list view
int selectedId = 0;
foreach (ListViewItem item in lvTypes.Items)
{
if (item.Tag != null && item.Tag.GetType() == _viewStep.GetType())
{
lvTypes.Items[selectedId].Tag = _viewStep;
_preselectIndex = selectedId;
break;
}
selectedId++;
}
}
//
_controller.SetSelectByToOff();
//
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
//
return true;
}
// Methods
private void PopulateListOfSteps()
{
Step prevOrLastStep = GetPreviousOrLastStep();
bool addStaticStep = false;
bool addSlipWearStep = false;
bool addBoundaryDisplacementStep = false;
bool addFrequencyStep = false;
bool addComplexFrequencyStep = false;
bool addBuckleStep = false;
bool addModalDynamicsStep = false;
bool addSteadyStepDynamicsStep = false;
bool addDynamicStep = false;
bool addHeatTransferStep = false;
bool addUncoupledTemDispStep = false;
bool addCoupledTemDispStep = false;
bool cannotAdd;
//
if (prevOrLastStep is SlipWearStep)
{
addSlipWearStep = true;
addBoundaryDisplacementStep = true; // only one possibility
}
else
{
if (prevOrLastStep == null || prevOrLastStep.GetType() == typeof(StaticStep) ||
prevOrLastStep is HeatTransferStep)
{
addStaticStep = true;
addSlipWearStep = true;
}
if (!(prevOrLastStep is FrequencyStep)) addFrequencyStep = true;
if (!(prevOrLastStep is FrequencyStep)) addComplexFrequencyStep = true;
if (!(prevOrLastStep is BuckleStep)) addBuckleStep = true;
//
addModalDynamicsStep = true;
addSteadyStepDynamicsStep = true;
addDynamicStep = true;
addHeatTransferStep = true;
addUncoupledTemDispStep = true;
addCoupledTemDispStep = true;
// Overwrite all possibilities
if (true)
{
addStaticStep = true;
addFrequencyStep = true;
addComplexFrequencyStep = true;
addBuckleStep = true;
addModalDynamicsStep = true;
addSteadyStepDynamicsStep = true;
addDynamicStep = true;
addHeatTransferStep = true;
addUncoupledTemDispStep = true;
addCoupledTemDispStep = true;
}
}
//
cannotAdd = !(addStaticStep || addSlipWearStep || addBoundaryDisplacementStep || addFrequencyStep ||
addComplexFrequencyStep || addBuckleStep || addModalDynamicsStep || addSteadyStepDynamicsStep ||
addDynamicStep || addHeatTransferStep || addUncoupledTemDispStep || addCoupledTemDispStep);
//
ListViewItem item;
if (cannotAdd)
{
item = new ListViewItem("No steps can be added after the last step type.");
item.Tag = null;
lvTypes.Items.Add(item);
}
else
{
SolverTypeEnum defaultSolverType = _controller.Settings.Calculix.DefaultSolverType;
if (addStaticStep)
{
// Static step
item = new ListViewItem("Static Step");
StaticStep staticStep = (StaticStep)CreateNewOrCloneLast(typeof(StaticStep));
staticStep.SolverType = defaultSolverType;
item.Tag = new ViewStaticStep(staticStep);
lvTypes.Items.Add(item);
}
if (addSlipWearStep)
{
// Slip wear step
item = new ListViewItem("Slip Wear Step");
//SlipWearStep slipWearStep = new SlipWearStep(GetStepName());
SlipWearStep slipWearStep = (SlipWearStep)CreateNewOrCloneLast(typeof(SlipWearStep));
slipWearStep.SolverType = defaultSolverType;
item.Tag = new ViewSlipWearStep(slipWearStep);
lvTypes.Items.Add(item);
}
if (addBoundaryDisplacementStep)
{
// Boundary displacement step
item = new ListViewItem("Boundary Displacement Step");
BoundaryDisplacementStep boundaryDisplacementStep = new BoundaryDisplacementStep(GetStepName());
item.Tag = new ViewBoundaryDisplacementStep(boundaryDisplacementStep);
lvTypes.Items.Add(item);
}
if (addFrequencyStep)
{
// Frequency step
item = new ListViewItem("Frequency Step");
FrequencyStep frequencyStep = new FrequencyStep(GetStepName());
frequencyStep.SolverType = defaultSolverType;
item.Tag = new ViewFrequencyStep(frequencyStep);
lvTypes.Items.Add(item);
}
if (addComplexFrequencyStep)
{
// Complex frequency step
item = new ListViewItem("Complex Frequency Step");
ComplexFrequencyStep complexFrequencyStep = new ComplexFrequencyStep(GetStepName());
complexFrequencyStep.SolverType = defaultSolverType;
item.Tag = new ViewComplexFrequencyStep(complexFrequencyStep);
lvTypes.Items.Add(item);
}
if (addBuckleStep)
{
// Buckle step
item = new ListViewItem("Buckle Step");
BuckleStep buckleStep = new BuckleStep(GetStepName());
buckleStep.SolverType = defaultSolverType;
item.Tag = new ViewBuckleStep(buckleStep);
lvTypes.Items.Add(item);
}
if (addModalDynamicsStep)
{
// Modal dynamics step
item = new ListViewItem("Modal Dynamics Step");
ModalDynamicsStep modalDynamicsStep = new ModalDynamicsStep(GetStepName());
modalDynamicsStep.SolverType = defaultSolverType;
item.Tag = new ViewModalDynamics(modalDynamicsStep);
lvTypes.Items.Add(item);
}
if (addSteadyStepDynamicsStep)
{
// Steady state dynamics step
item = new ListViewItem("Steady State Dynamics Step");
SteadyStateDynamicsStep steadyStateDynamicsStep = new SteadyStateDynamicsStep(GetStepName());
steadyStateDynamicsStep.SolverType = defaultSolverType;
item.Tag = new ViewSteadyStateDynamics(steadyStateDynamicsStep);
lvTypes.Items.Add(item);
}
if (addDynamicStep)
{
// Dynamic step
item = new ListViewItem("Dynamic Step");
DynamicStep dynamicStep = new DynamicStep(GetStepName());
dynamicStep.SolverType = defaultSolverType;
item.Tag = new ViewDynamicStep(dynamicStep);
lvTypes.Items.Add(item);
}
if (addHeatTransferStep)
{
// Heat transfer step
item = new ListViewItem("Heat Transfer Step");
HeatTransferStep heatTransferStep = new HeatTransferStep(GetStepName());
heatTransferStep.SolverType = defaultSolverType;
item.Tag = new ViewHeatTransferStep(heatTransferStep);
lvTypes.Items.Add(item);
}
if (addUncoupledTemDispStep)
{
// Uncoupled temperature-displacement step
item = new ListViewItem("Uncoupled Temperature-displacement Step");
UncoupledTempDispStep uncoupledTempDispStep = new UncoupledTempDispStep(GetStepName());
uncoupledTempDispStep.SolverType = defaultSolverType;
item.Tag = new ViewUncoupledTempDispStep(uncoupledTempDispStep);
lvTypes.Items.Add(item);
}
if (addCoupledTemDispStep)
{
// Coupled temperature-displacement step
item = new ListViewItem("Coupled Temperature-displacement Step");
CoupledTempDispStep coupledTempDispStep = new CoupledTempDispStep(GetStepName());
coupledTempDispStep.SolverType = defaultSolverType;
item.Tag = new ViewCoupledTempDispStep(coupledTempDispStep);
lvTypes.Items.Add(item);
}
}
}
private Step CreateNewOrCloneLast(Type stepTypeToCreate)
{
if (stepTypeToCreate == null) throw new ArgumentNullException();
//
Step newStep;
Step prevOrLastStep = GetPreviousOrLastStep();
//
if (prevOrLastStep == null || prevOrLastStep.GetType() != stepTypeToCreate)
{
newStep = (Step)Activator.CreateInstance(stepTypeToCreate, new object[] { GetStepName() });
//
if (prevOrLastStep != null)
{
newStep.Perturbation = prevOrLastStep.Perturbation;
newStep.Nlgeom = prevOrLastStep.Nlgeom;
newStep.MaxIncrements = prevOrLastStep.MaxIncrements;
newStep.IncrementationType = prevOrLastStep.IncrementationType;
newStep.SolverType = prevOrLastStep.SolverType;
}
}
else
{
newStep = prevOrLastStep.DeepClone();
//
newStep.BoundaryConditions.Clear(); // this gets added at the step collection
newStep.Loads.Clear(); // this gets added at the step collection
newStep.DefinedFields.Clear(); // this gets added at the step collection
//
newStep.Name = GetStepName();
}
return newStep;
}
private Step GetPreviousOrLastStep()
{
Step prevOrLastStep = null;
// Find previous step
if (_stepToEditName != null)
{
Step[] steps = _controller.GetAllSteps();
int prevStepId = -1;
for (int i = 0; i < steps.Length; i++)
{
if (steps[i].Name == _stepToEditName)
{
prevStepId = i - 1;
break;
}
}
if (prevStepId >= 0) prevOrLastStep = steps[prevStepId];
}
// Find last step
else if (_stepNames.Length > 0)
{
prevOrLastStep = _controller.GetAllSteps().Last();
}
//
return prevOrLastStep;
}
private string GetStepName()
{
return _stepNames.GetNextNumberedKey("Step");
}
}
}