Files
wg_cpso/CPSO/Forms/55_Load/FrmLoad.cs
2026-03-25 18:20:24 +08:00

1353 lines
68 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CaeModel;
using CaeGlobals;
using CaeMesh;
using CaeResults;
namespace CPSO.Forms
{
class FrmLoad : UserControls.FrmPropertyListView, IFormBase, IFormItemSetDataParent, IFormHighlight
{
// Variables
private string[] _loadNames;
private string _loadToEditName;
private ViewLoad _viewLoad;
private Controller _controller;
private Selection _selectionCopy;
// Properties
// SetLoad and GetLoad to distinguish from Load event
public Load FELoad
{
get { return _viewLoad != null ? _viewLoad.GetBase() : null; }
set
{
var clone = value.DeepClone();
if (clone is CLoad cl) _viewLoad = new ViewCLoad(cl);
else if (clone is MomentLoad ml) _viewLoad = new ViewMomentLoad(ml);
else if (clone is DLoad dl) _viewLoad = new ViewDLoad(dl);
else if (clone is HydrostaticPressure hpl) _viewLoad = new ViewHydrostaticPressureLoad(hpl);
else if (clone is ImportedPressure ip) _viewLoad = new ViewImportedPressureLoad(ip);
else if (clone is STLoad stl) _viewLoad = new ViewSTLoad(stl);
else if (clone is ImportedSTLoad istl) _viewLoad = new ViewImportedSTLoad(istl);
else if (clone is ShellEdgeLoad sel) _viewLoad = new ViewShellEdgeLoad(sel);
else if (clone is GravityLoad gl) _viewLoad = new ViewGravityLoad(gl);
else if (clone is CentrifLoad cfl) _viewLoad = new ViewCentrifLoad(cfl);
else if (clone is PreTensionLoad ptl) _viewLoad = new ViewPreTensionLoad(ptl);
// Thermal
else if (clone is CFlux cf) _viewLoad = new ViewCFlux(cf);
else if (clone is DFlux df) _viewLoad = new ViewDFlux(df);
else if (clone is BodyFlux bf) _viewLoad = new ViewBodyFlux(bf);
else if (clone is FilmHeatTransfer fht) _viewLoad = new ViewFilmHeatTransfer(fht);
else if (clone is RadiationHeatTransfer rht) _viewLoad = new ViewRadiationHeatTransfer(rht);
//
else throw new NotImplementedException();
}
}
// Constructors
public FrmLoad(Controller controller)
{
InitializeComponent();
//
_controller = controller;
_viewLoad = null;
//
this.Height = 560 + 3 * 19;
}
private void InitializeComponent()
{
this.gbType.SuspendLayout();
this.gbProperties.SuspendLayout();
this.SuspendLayout();
//
// gbType
//
this.gbType.Size = new System.Drawing.Size(330, 101);
//
// lvTypes
//
this.lvTypes.Size = new System.Drawing.Size(318, 73);
//
// gbProperties
//
this.gbProperties.Size = new System.Drawing.Size(330, 371);
//
// propertyGrid
//
this.propertyGrid.Size = new System.Drawing.Size(318, 343);
//
// btnOK
//
this.btnOK.Location = new System.Drawing.Point(180, 496);
//
// btnCancel
//
this.btnCancel.Location = new System.Drawing.Point(261, 496);
//
// btnOkAddNew
//
this.btnOkAddNew.Location = new System.Drawing.Point(99, 496);
//
// FrmLoad
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.ClientSize = new System.Drawing.Size(354, 531);
this.MinimumSize = new System.Drawing.Size(370, 550);
this.Name = "FrmLoad";
this.Text = "Edit Load";
this.EnabledChanged += new System.EventHandler(this.FrmLoad_EnabledChanged);
this.gbType.ResumeLayout(false);
this.gbProperties.ResumeLayout(false);
this.ResumeLayout(false);
}
// Event handlers
private void FrmLoad_EnabledChanged(object sender, EventArgs e)
{
if (!Enabled)
{
_selectionCopy = _controller.Selection.DeepClone();
}
//
ShowHideSelectionForm();
}
// 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;
_controller.Selection.LimitSelectionToFirstGeometryType = false;
_controller.Selection.EnableShellEdgeFaceSelection = false;
_controller.Selection.LimitSelectionToShellEdges = false;
//
if (itemTag is ViewError) _viewLoad = null;
else if (itemTag is ViewCLoad vcl) _viewLoad = vcl;
else if (itemTag is ViewMomentLoad vml) _viewLoad = vml;
else if (itemTag is ViewDLoad vdl)
{
_viewLoad = vdl;
// Set a filter in order for S1, S2,... to include the same element types
_controller.Selection.LimitSelectionToFirstGeometryType = true;
// 2D
if (vdl.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewHydrostaticPressureLoad vhpl)
{
_viewLoad = vhpl;
// Set a filter in order for S1, S2,... to include the same element types
_controller.Selection.LimitSelectionToFirstGeometryType = true;
// 2D
if (vhpl.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewImportedPressureLoad vipl)
{
vipl.UpdateFileBrowserDialog();
_viewLoad = vipl;
// Set a filter in order for S1, S2,... to include the same element types
_controller.Selection.LimitSelectionToFirstGeometryType = true;
// 2D
if (vipl.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewSTLoad vstl)
{
_viewLoad = vstl;
_controller.Selection.EnableShellEdgeFaceSelection = true;
// 2D
if (vstl.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewImportedSTLoad vistl)
{
vistl.UpdateFileBrowserDialog();
_viewLoad = vistl;
_controller.Selection.EnableShellEdgeFaceSelection = true;
// 2D
if (vistl.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewShellEdgeLoad vsel)
{
_viewLoad = vsel;
_controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewGravityLoad vgl) _viewLoad = vgl;
else if (itemTag is ViewCentrifLoad vcfl) _viewLoad = vcfl;
else if (itemTag is ViewPreTensionLoad vprl) _viewLoad = vprl;
// Thermal
else if (itemTag is ViewCFlux vcf) _viewLoad = vcf;
else if (itemTag is ViewDFlux vdf)
{
_viewLoad = vdf;
// Set a filter in order for S1, S2,... to include the same element types
_controller.Selection.LimitSelectionToFirstGeometryType = true;
_controller.Selection.EnableShellEdgeFaceSelection = true;
// 2D
if (vdf.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewBodyFlux vbf) _viewLoad = vbf;
else if (itemTag is ViewFilmHeatTransfer vfht)
{
_viewLoad = vfht;
// Set a filter in order for S1, S2,... to include the same element types
_controller.Selection.LimitSelectionToFirstGeometryType = true;
_controller.Selection.EnableShellEdgeFaceSelection = true;
// 2D
if (vfht.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else if (itemTag is ViewRadiationHeatTransfer vrht)
{
_viewLoad = vrht;
// Set a filter in order for S1, S2,... to include the same element types
_controller.Selection.LimitSelectionToFirstGeometryType = true;
_controller.Selection.EnableShellEdgeFaceSelection = true;
// 2D
if (vrht.GetBase().TwoD) _controller.Selection.LimitSelectionToShellEdges = true;
}
else throw new NotImplementedException();
//
ShowHideSelectionForm();
//
propertyGrid.SelectedObject = itemTag;
//
HighlightLoad();
}
}
protected override void OnPropertyGridSelectedGridItemChanged()
{
if (propertyGrid.SelectedGridItem.PropertyDescriptor != null)
{
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
//
if (_viewLoad is ViewImportedSTLoad vistl)
{
HighlightLoad();
}
}
//
base.OnPropertyGridSelectedGridItemChanged();
}
protected override void OnPropertyGridPropertyValueChanged()
{
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
//
if (property == nameof(_viewLoad.RegionType))
{
ShowHideSelectionForm();
//
HighlightLoad();
}
else if (property == nameof(_viewLoad.CoordinateSystemName))
{
HighlightLoad();
}
else if (_viewLoad is ViewCLoad vcl &&
(property == nameof(vcl.NodeSetName) || property == nameof(vcl.ReferencePointName)))
{
HighlightLoad();
}
else if (_viewLoad is ViewMomentLoad vml &&
(property == nameof(vml.NodeSetName) || property == nameof(vml.ReferencePointName)))
{
HighlightLoad();
}
else if (_viewLoad is ViewDLoad vdl && property == nameof(vdl.SurfaceName))
{
HighlightLoad();
}
else if (_viewLoad is ViewHydrostaticPressureLoad vhpl &&
(property == nameof(vhpl.SurfaceName) ||
property == nameof(vhpl.X1) || property == nameof(vhpl.Y1) || property == nameof(vhpl.Z1) ||
property == nameof(vhpl.X2) || property == nameof(vhpl.Y2) || property == nameof(vhpl.Z2)))
{
HighlightLoad();
}
else if (_viewLoad is ViewImportedPressureLoad vipl && property == nameof(vipl.SurfaceName))
{
HighlightLoad();
}
else if (_viewLoad is ViewSTLoad vstl && property == nameof(vstl.SurfaceName))
{
HighlightLoad();
}
else if (_viewLoad is ViewImportedSTLoad vistl &&
(property == nameof(vistl.SurfaceName) || property == nameof(vistl.FileName) ||
property == nameof(vistl.GeometryScaleFactor)))
{
HighlightLoad();
}
else if (_viewLoad is ViewShellEdgeLoad vsel && property == nameof(vsel.SurfaceName))
{
HighlightLoad();
}
else if (_viewLoad is ViewGravityLoad vgl &&
(property == nameof(vgl.PartName) || property == nameof(vgl.ElementSetName) ||
property == nameof(vgl.MassSectionName)))
{
HighlightLoad();
}
else if (_viewLoad is ViewCentrifLoad vcfl &&
(property == nameof(vcfl.PartName) || property == nameof(vcfl.ElementSetName) ||
property == nameof(vcfl.MassSectionName) ||
property == nameof(vcfl.X) || property == nameof(vcfl.Y) || property == nameof(vcfl.Z)))
{
HighlightLoad();
}
else if (_viewLoad is ViewPreTensionLoad vptl && property == nameof(vptl.SurfaceName))
{
HighlightLoad();
}
// Thermal
else if (_viewLoad is ViewCFlux vcf && property == nameof(vcf.NodeSetName))
{
HighlightLoad();
}
else if (_viewLoad is ViewDFlux vdf && property == nameof(vdf.SurfaceName))
{
HighlightLoad();
}
else if (_viewLoad is ViewBodyFlux vbf &&
(property == nameof(vbf.PartName) || property == nameof(vbf.ElementSetName)))
{
HighlightLoad();
}
else if (_viewLoad is ViewFilmHeatTransfer vfht && property == nameof(vfht.SurfaceName))
{
HighlightLoad();
}
else if (_viewLoad is ViewRadiationHeatTransfer vrht && property == nameof(vrht.SurfaceName))
{
HighlightLoad();
}
//
base.OnPropertyGridPropertyValueChanged();
}
protected override void OnApply(bool onOkAddNew)
{
if (propertyGrid.SelectedObject is ViewError ve) throw new CaeException(ve.Message);
//
_viewLoad = (ViewLoad)propertyGrid.SelectedObject;
//
if (_viewLoad == null) throw new CaeException("No load selected.");
// Check if the name exists
string[] loadNames = _controller.GetStepLoadNames(_stepName);
CheckName(_loadToEditName, FELoad.Name, loadNames, "load");
// Check equations
_viewLoad.GetBase().CheckEquations();
//
if (FELoad.RegionType == RegionTypeEnum.Selection &&
(FELoad.CreationIds == null || FELoad.CreationIds.Length == 0))
throw new CaeException("The load selection must contain at least one item.");
//
// check for 0 values
if (FELoad is CLoad cl)
{
if (cl.Magnitude.Value == 0)
throw new CaeException("At least one force component must not be equal to 0.");
if ((cl.RegionType == RegionTypeEnum.Selection && cl.CreationIds.Length > 5) ||
(cl.RegionType == RegionTypeEnum.NodeSetName &&
_controller.Model.Mesh.NodeSets[cl.RegionName].Labels.Length > 5))
{
if (MessageBoxes.ShowWarningQuestionOKCancel(
"The concentrated force load will apply the entered load magnitude to all selected nodes. Continue?") ==
DialogResult.Cancel)
throw new CaeException("BreakOnApply");
}
}
else if (FELoad is MomentLoad ml)
{
if (ml.Magnitude.Value == 0)
throw new CaeException("At least one moment component must not be equal to 0.");
if ((ml.RegionType == RegionTypeEnum.Selection && ml.CreationIds.Length > 5) ||
(ml.RegionType == RegionTypeEnum.NodeSetName &&
_controller.Model.Mesh.NodeSets[ml.RegionName].Labels.Length > 5))
{
if (MessageBoxes.ShowWarningQuestionOKCancel(
"The moment load will apply the entered load magnitude to all selected nodes. Continue?") ==
DialogResult.Cancel)
throw new CaeException("BreakOnApply");
}
}
else if (FELoad is DLoad dl)
{
if (dl.Magnitude.Value == 0)
throw new CaeException("The pressure load magnitude must not be equal to 0.");
}
else if (FELoad is HydrostaticPressure hpl)
{
if (!hpl.IsProperlyDefined(out string error)) throw new CaeException(error);
}
else if (FELoad is ImportedPressure ip)
{
if (!ip.IsProperlyDefined(out string error)) throw new CaeException(error);
}
else if (FELoad is STLoad stl)
{
// Reset unused magnitude to 0
if (stl.DistributionName == CaeModel.Distribution.DefaultDistributionName)
stl.PMagnitude.SetEquationFromValue(0, true);
else
stl.FMagnitude.SetEquationFromValue(0, true);
//
if (stl.FMagnitude.Value == 0 && stl.PMagnitude.Value == 0)
throw new CaeException("At least one surface traction load component must not be equal to 0.");
}
else if (FELoad is ImportedSTLoad istl)
{
if (!istl.IsProperlyDefined(out string error)) throw new CaeException(error);
}
else if (FELoad is ShellEdgeLoad sel)
{
if (sel.Magnitude.Value == 0)
throw new CaeException("The shell edge load magnitude must not be equal to 0.");
}
else if (FELoad is GravityLoad gl)
{
if (gl.Magnitude.Value == 0)
throw new CaeException("At least one gravity load component must not be equal to 0.");
}
else if (FELoad is CentrifLoad cfl)
{
if (cfl.N1.Value == 0 && cfl.N2.Value == 0 && cfl.N3.Value == 0)
throw new CaeException("At least one axis direction component must not be equal to 0.");
if (cfl.RotationalSpeed2 == 0)
throw new CaeException("Rotational speed must not be equal to 0.");
}
else if (FELoad is PreTensionLoad ptl)
{
if (!ptl.AutoComputeDirection && ptl.X.Value == 0 && ptl.Y.Value == 0 && ptl.Z.Value == 0)
throw new CaeException("At least one pre-tension direction component must not be equal to 0.");
if (ptl.Type == PreTensionLoadType.Force && ptl.GetMagnitudeValue() == 0)
throw new CaeException("Pre-tension magnitude must not be equal to 0.");
}
// Thermal
else if (FELoad is CFlux cf)
{
if ((cf.RegionType == RegionTypeEnum.Selection && cf.CreationIds.Length > 5) ||
(cf.RegionType == RegionTypeEnum.NodeSetName &&
_controller.Model.Mesh.NodeSets[cf.RegionName].Labels.Length > 5))
{
if (MessageBoxes.ShowWarningQuestionOKCancel(
"The concentrated flux load will apply the entered flux magnitude to all selected nodes. Continue?") ==
DialogResult.Cancel)
throw new CaeException("BreakOnApply");
}
}
else if (FELoad is DFlux df) { }
else if (FELoad is BodyFlux bf) { }
else if (FELoad is FilmHeatTransfer fht) { }
else if (FELoad is RadiationHeatTransfer rht)
{
if (rht.CavityRadiation && (rht.CavityName == null || rht.CavityName == ""))
throw new CaeException("For cavity radiation a cavity name must be specified.");
}
// Create
if (_loadToEditName == null)
{
_controller.AddLoadCommand(_stepName, FELoad);
}
// Replace
else if (_propertyItemChanged)
{
_controller.ReplaceLoadCommand(_stepName, _loadToEditName, FELoad);
_loadToEditName = null; // prevents the execution of toInternal in OnHideOrClose
}
// Convert the load from internal to show it
else
{
LoadInternal(false);
}
// 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();
// Deactivate selection limits
_controller.Selection.LimitSelectionToFirstGeometryType = false;
_controller.Selection.EnableShellEdgeFaceSelection = false;
_controller.Selection.LimitSelectionToShellEdges = false;
// Convert the load from internal to show it
LoadInternal(false);
//
base.OnHideOrClose();
}
protected override bool OnPrepareForm(string stepName, string loadToEditName)
{
this.btnOkAddNew.Visible = loadToEditName == null;
// Clear
_propertyItemChanged = false;
_stepName = null;
_loadNames = null;
_loadToEditName = null;
_viewLoad = null;
lvTypes.Items.Clear();
propertyGrid.SelectedObject = null;
//
_stepName = stepName;
_loadNames = _controller.GetAllLoadNames();
_loadToEditName = loadToEditName;
//
string[] partNames = _controller.GetModelPartNames();
string[] nodeSetNames = _controller.GetUserNodeSetNames();
string[] elementSetNames = _controller.GetUserElementSetNames();
// All element based surfaces
string[] elementBasedSurfaceNames = _controller.GetUserSurfaceNames(FeSurfaceType.Element);
// Only element based surfaces based on shell edges
string[] shellEdgeSurfaceNames = _controller.GetUserSurfaceNames(FeSurfaceType.Element,
FeSurfaceFaceTypes.ShellEdgeFaces);
// Only element based surfaces based on solid faces
string[] solidFaceSurfaceNames = _controller.GetUserSurfaceNames(FeSurfaceType.Element,
FeSurfaceFaceTypes.SolidFaces);
string[] referencePointNames = _controller.GetModelReferencePointNames();
string[] massSectionNames = _controller.GetMassSectionNames();
string[] distributionNames = _controller.GetDistributionNames();
string[] amplitudeNames = _controller.GetAmplitudeNames();
string[] coordinateSystemNames = _controller.GetModelCoordinateSystemNames();
//
if (partNames == null) partNames = new string[0];
if (nodeSetNames == null) nodeSetNames = new string[0];
if (elementSetNames == null) elementSetNames = new string[0];
if (elementBasedSurfaceNames == null) elementBasedSurfaceNames = new string[0];
if (shellEdgeSurfaceNames == null) shellEdgeSurfaceNames = new string[0];
if (referencePointNames == null) referencePointNames = new string[0];
if (massSectionNames == null) massSectionNames = new string[0];
if (distributionNames == null) distributionNames = new string[0];
if (amplitudeNames == null) amplitudeNames = new string[0];
if (coordinateSystemNames == null) coordinateSystemNames = new string[0];
//
if (_loadNames == null) throw new CaeException("The load names must be defined first.");
//
// Only element based surfaces based on solid and shell faces
string[] noEdgeSurfaceNames = elementBasedSurfaceNames.Except(shellEdgeSurfaceNames).ToArray();
//
PopulateListOfLoads(partNames, nodeSetNames, elementSetNames, referencePointNames, elementBasedSurfaceNames,
solidFaceSurfaceNames, noEdgeSurfaceNames, shellEdgeSurfaceNames, massSectionNames,
distributionNames, amplitudeNames, coordinateSystemNames);
// Check if this step supports any loads
if (lvTypes.Items.Count == 0) return false;
// Create new load
if (_loadToEditName == null)
{
lvTypes.Enabled = true;
_viewLoad = null;
//
HighlightLoad(); // must be here if called from the menu
}
else
{
// Get and convert a converted load back to selection
FELoad = _controller.GetLoad(stepName, _loadToEditName); // to clone
if (FELoad.CreationData != null)
{
if (!_controller.Model.IsLoadRegionValid(FELoad) ||
!_controller.Model.RegionValid(FELoad)) // do not use FELoad.Valid
{
// Not valid
FELoad.CreationData = null;
FELoad.CreationIds = null;
_propertyItemChanged = true;
}
FELoad.RegionType = RegionTypeEnum.Selection;
}
bool twoD = FELoad.TwoD;
// Convert the load to internal to hide it
LoadInternal(true);
// Check for deleted distributions
if (FELoad is IDistribution ld)
{
if (ld.DistributionName != null && ld.DistributionName != Distribution.DefaultDistributionName)
CheckMissingValueRef(ref distributionNames, ld.DistributionName, a => { ld.DistributionName = a; });
}
// Check for deleted amplitudes
if (_viewLoad.AmplitudeName != null && _viewLoad.AmplitudeName != Amplitude.DefaultAmplitudeName)
CheckMissingValueRef(ref amplitudeNames, _viewLoad.AmplitudeName, a => { _viewLoad.AmplitudeName = a; });
// Check for deleted coordinate systems
if (_viewLoad.CoordinateSystemName != CoordinateSystem.DefaultCoordinateSystemName)
CheckMissingValueRef(ref coordinateSystemNames, _viewLoad.CoordinateSystemName,
s => { _viewLoad.CoordinateSystemName = s; });
//
int selectedId;
if (_viewLoad is ViewCLoad vcl)
{
selectedId = lvTypes.FindItemWithText("Concentrated Force").Index;
// Check for deleted regions
if (vcl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vcl.RegionType == RegionTypeEnum.NodeSetName.ToFriendlyString())
CheckMissingValueRef(ref nodeSetNames, vcl.NodeSetName, s => { vcl.NodeSetName = s; });
else if (vcl.RegionType == RegionTypeEnum.ReferencePointName.ToFriendlyString())
CheckMissingValueRef(ref referencePointNames, vcl.ReferencePointName, s => { vcl.ReferencePointName = s; });
else throw new NotSupportedException();
//
vcl.PopulateDropDownLists(nodeSetNames, referencePointNames, amplitudeNames, coordinateSystemNames);
}
else if (_viewLoad is ViewMomentLoad vml)
{
selectedId = lvTypes.FindItemWithText("Moment").Index;
// Check for deleted regions
if (vml.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vml.RegionType == RegionTypeEnum.NodeSetName.ToFriendlyString())
CheckMissingValueRef(ref nodeSetNames, vml.NodeSetName, s => { vml.NodeSetName = s; });
else if (vml.RegionType == RegionTypeEnum.ReferencePointName.ToFriendlyString())
CheckMissingValueRef(ref referencePointNames, vml.ReferencePointName, s => { vml.ReferencePointName = s; });
else throw new NotSupportedException();
//
vml.PopulateDropDownLists(nodeSetNames, referencePointNames, amplitudeNames);
}
else if (_viewLoad is ViewDLoad vdl)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Pressure").Index;
// Check for deleted regions
if (vdl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vdl.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vdl.SurfaceName, s => { vdl.SurfaceName = s; });
else throw new NotSupportedException();
//
vdl.PopulateDropDownLists(surfaceNames, distributionNames, amplitudeNames);
}
else if (_viewLoad is ViewHydrostaticPressureLoad vhpl)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = elementBasedSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Hydrostatic Pressure").Index;
// Check for deleted regions
if (vhpl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vhpl.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vhpl.SurfaceName, s => { vhpl.SurfaceName = s; });
else throw new NotSupportedException();
//
vhpl.PopulateDropDownLists(surfaceNames, amplitudeNames);
}
else if (_viewLoad is ViewImportedPressureLoad vipl)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = elementBasedSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Imported Pressure").Index;
// Check for deleted regions
if (vipl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vipl.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vipl.SurfaceName, s => { vipl.SurfaceName = s; });
else throw new NotSupportedException();
//
vipl.PopulateDropDownLists(surfaceNames, amplitudeNames);
}
else if (_viewLoad is ViewSTLoad vstl)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = elementBasedSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Surface Traction").Index;
// Check for deleted regions
if (vstl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vstl.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vstl.SurfaceName, s => { vstl.SurfaceName = s; });
else throw new NotSupportedException();
//
vstl.PopulateDropDownLists(surfaceNames, distributionNames, amplitudeNames, coordinateSystemNames);
}
else if (_viewLoad is ViewImportedSTLoad vistl)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = elementBasedSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Surface Traction").Index;
// Check for deleted regions
if (vistl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vistl.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vistl.SurfaceName, s => { vistl.SurfaceName = s; });
else throw new NotSupportedException();
//
vistl.PopulateDropDownLists(surfaceNames, amplitudeNames);
}
else if (_viewLoad is ViewShellEdgeLoad vsel)
{
selectedId = lvTypes.FindItemWithText("Normal Shell Edge Load").Index;
// Check for deleted regions
if (vsel.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vsel.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref shellEdgeSurfaceNames, vsel.SurfaceName, s => { vsel.SurfaceName = s; });
else throw new NotSupportedException();
//
vsel.PopulateDropDownLists(shellEdgeSurfaceNames, amplitudeNames);
}
else if (_viewLoad is ViewGravityLoad vgl)
{
selectedId = lvTypes.FindItemWithText("Gravity").Index;
// Check for deleted regions
if (vgl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vgl.RegionType == RegionTypeEnum.PartName.ToFriendlyString())
CheckMissingValueRef(ref partNames, vgl.PartName, s => { vgl.PartName = s; });
else if (vgl.RegionType == RegionTypeEnum.ElementSetName.ToFriendlyString())
CheckMissingValueRef(ref elementSetNames, vgl.ElementSetName, s => { vgl.ElementSetName = s; });
else if (vgl.RegionType == RegionTypeEnum.MassSection.ToFriendlyString())
CheckMissingValueRef(ref massSectionNames, vgl.MassSectionName, s => { vgl.MassSectionName = s; });
else throw new NotSupportedException();
//
vgl.PopulateDropDownLists(partNames, elementSetNames, massSectionNames, amplitudeNames);
}
else if (_viewLoad is ViewCentrifLoad vcfl)
{
selectedId = lvTypes.FindItemWithText("Centrifugal Load").Index;
// Check for deleted regions
if (vcfl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vcfl.RegionType == RegionTypeEnum.PartName.ToFriendlyString())
CheckMissingValueRef(ref partNames, vcfl.PartName, s => { vcfl.PartName = s; });
else if (vcfl.RegionType == RegionTypeEnum.ElementSetName.ToFriendlyString())
CheckMissingValueRef(ref elementSetNames, vcfl.ElementSetName, s => { vcfl.ElementSetName = s; });
else if (vcfl.RegionType == RegionTypeEnum.MassSection.ToFriendlyString())
CheckMissingValueRef(ref massSectionNames, vcfl.MassSectionName, s => { vcfl.MassSectionName = s; });
else throw new NotSupportedException();
// Check for change in axisymmetric
bool isLoadAxiSymmetric = ((CentrifLoad)vcfl.GetBase()).Axisymmetric;
bool isModelAxiSymmetric = _controller.Model.Properties.ModelSpace == ModelSpaceEnum.Axisymmetric;
if (isLoadAxiSymmetric != isModelAxiSymmetric)
{
vcfl.Axisymmetric = isModelAxiSymmetric;
_propertyItemChanged = true;
}
//
vcfl.PopulateDropDownLists(partNames, elementSetNames, massSectionNames, amplitudeNames);
}
else if (_viewLoad is ViewPreTensionLoad vptl)
{
selectedId = lvTypes.FindItemWithText("Pre-tension").Index;
// Check for deleted regions
if (vptl.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vptl.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref elementBasedSurfaceNames, vptl.SurfaceName, s => { vptl.SurfaceName = s; });
else throw new NotSupportedException();
//
vptl.PopulateDropDownLists(solidFaceSurfaceNames, amplitudeNames);
}
// Thermal
else if (_viewLoad is ViewCFlux vcf)
{
selectedId = lvTypes.FindItemWithText("Concentrated Flux").Index;
// Check for deleted regions
if (vcf.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vcf.RegionType == RegionTypeEnum.NodeSetName.ToFriendlyString())
CheckMissingValueRef(ref nodeSetNames, vcf.NodeSetName, s => { vcf.NodeSetName = s; });
else throw new NotSupportedException();
//
vcf.PopulateDropDownLists(nodeSetNames, amplitudeNames);
}
else if (_viewLoad is ViewDFlux vdf)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Surface Flux").Index;
// Check for deleted regions
if (vdf.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vdf.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vdf.SurfaceName, s => { vdf.SurfaceName = s; });
else throw new NotSupportedException();
//
vdf.PopulateDropDownLists(surfaceNames, amplitudeNames);
}
else if (_viewLoad is ViewBodyFlux vbf)
{
selectedId = lvTypes.FindItemWithText("Body Flux").Index;
// Check for deleted regions
if (vbf.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vbf.RegionType == RegionTypeEnum.PartName.ToFriendlyString())
CheckMissingValueRef(ref partNames, vbf.PartName, s => { vbf.PartName = s; });
else if (vbf.RegionType == RegionTypeEnum.ElementSetName.ToFriendlyString())
CheckMissingValueRef(ref elementSetNames, vbf.ElementSetName, s => { vbf.ElementSetName = s; });
else throw new NotSupportedException();
//
vbf.PopulateDropDownLists(partNames, elementSetNames, amplitudeNames);
}
else if (_viewLoad is ViewFilmHeatTransfer vfht)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Convective Film").Index;
// Check for deleted regions
if (vfht.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vfht.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vfht.SurfaceName, s => { vfht.SurfaceName = s; });
else throw new NotSupportedException();
//
vfht.PopulateDropDownLists(surfaceNames, amplitudeNames);
}
else if (_viewLoad is ViewRadiationHeatTransfer vrht)
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
selectedId = lvTypes.FindItemWithText("Radiation").Index;
// Check for deleted regions
if (vrht.RegionType == RegionTypeEnum.Selection.ToFriendlyString()) { }
else if (vrht.RegionType == RegionTypeEnum.SurfaceName.ToFriendlyString())
CheckMissingValueRef(ref surfaceNames, vrht.SurfaceName, s => { vrht.SurfaceName = s; });
else throw new NotSupportedException();
//
vrht.PopulateDropDownLists(surfaceNames, amplitudeNames);
}
else throw new NotSupportedException();
//
lvTypes.Items[selectedId].Tag = _viewLoad;
_preselectIndex = selectedId;
}
ShowHideSelectionForm();
//
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
//
return true;
}
// Methods
private void PopulateListOfLoads(string[] partNames, string[] nodeSetNames, string[] elementSetNames,
string[] referencePointNames, string[] elementBasedSurfaceNames,
string[] solidFaceSurfaceNames, string[] noEdgeSurfaceNames,
string[] shellEdgeSurfaceNames, string[] massSectionNames,
string[] distributionNames, string[] amplitudeNames,
string[] coordinateSystemNames)
{
Step step = _controller.GetStep(_stepName);
System.Drawing.Color color = _controller.Settings.Pre.LoadSymbolColor;
bool twoD = _controller.Model.Properties.ModelSpace.IsTwoD();
bool complex = step is SteadyStateDynamicsStep;
// Populate list view
ListViewItem item;
string name;
string loadName;
// Concentrated force - node set, reference points
name = "Concentrated Force";
loadName = GetLoadName(name);
item = new ListViewItem(name);
CLoad cLoad = new CLoad(loadName, "", RegionTypeEnum.Selection, 0, 0, 0, twoD, complex, 0);
if (step.IsLoadSupported(cLoad))
{
ViewCLoad vcl = new ViewCLoad(cLoad);
vcl.PopulateDropDownLists(nodeSetNames, referencePointNames, amplitudeNames, coordinateSystemNames);
vcl.Color = color;
item.Tag = vcl;
lvTypes.Items.Add(item);
}
// Moment
name = "Moment";
loadName = GetLoadName(name);
item = new ListViewItem(name);
MomentLoad momentLoad = new MomentLoad(loadName, "", RegionTypeEnum.Selection, 0, 0, 0, twoD, complex, 0);
if (step.IsLoadSupported(momentLoad))
{
ViewMomentLoad vml = new ViewMomentLoad(momentLoad);
vml.PopulateDropDownLists(nodeSetNames, referencePointNames, amplitudeNames);
vml.Color = color;
item.Tag = vml;
lvTypes.Items.Add(item);
}
// Pressure
name = "Pressure";
loadName = GetLoadName(name);
item = new ListViewItem(name);
DLoad dLoad = new DLoad(loadName, "", RegionTypeEnum.Selection, 0, twoD, complex, 0);
if (step.IsLoadSupported(dLoad))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
ViewDLoad vdl = new ViewDLoad(dLoad);
vdl.PopulateDropDownLists(surfaceNames, distributionNames, amplitudeNames);
vdl.Color = color;
item.Tag = vdl;
lvTypes.Items.Add(item);
}
// Hydrostatic pressure
name = "Hydrostatic Pressure";
loadName = GetLoadName(name);
item = new ListViewItem(name);
HydrostaticPressure hpLoad = new HydrostaticPressure(loadName, "", RegionTypeEnum.Selection, twoD, complex, 0);
if (step.IsLoadSupported(hpLoad))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = elementBasedSurfaceNames.ToArray();
//
ViewHydrostaticPressureLoad vhpl = new ViewHydrostaticPressureLoad(hpLoad);
vhpl.PopulateDropDownLists(surfaceNames, amplitudeNames);
vhpl.Color = color;
item.Tag = vhpl;
lvTypes.Items.Add(item);
}
// Pressure
name = "Imported Pressure";
loadName = GetLoadName(name);
item = new ListViewItem(name);
ImportedPressure ipLoad = new ImportedPressure(loadName, "", RegionTypeEnum.Selection, twoD, complex, 0);
if (step.IsLoadSupported(ipLoad))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
ViewImportedPressureLoad vipl = new ViewImportedPressureLoad(ipLoad);
vipl.PopulateDropDownLists(surfaceNames, amplitudeNames);
vipl.Color = color;
item.Tag = vipl;
lvTypes.Items.Add(item);
}
// Surface traction
name = "Surface Traction";
loadName = GetLoadName(name);
item = new ListViewItem(name);
STLoad sTLoad = new STLoad(loadName, "", RegionTypeEnum.Selection, 0, 0, 0, twoD, complex, 0);
if (step.IsLoadSupported(sTLoad))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = elementBasedSurfaceNames.ToArray();
//
ViewSTLoad vstl = new ViewSTLoad(sTLoad);
vstl.PopulateDropDownLists(surfaceNames, distributionNames, amplitudeNames, coordinateSystemNames);
vstl.Color = color;
item.Tag = vstl;
lvTypes.Items.Add(item);
}
// Shell edge load
name = "Normal Shell Edge Load";
loadName = GetLoadName(name);
item = new ListViewItem(name);
ShellEdgeLoad shellEdgeLoad = new ShellEdgeLoad(loadName, "", RegionTypeEnum.Selection, 0, twoD, complex, 0);
if (step.IsLoadSupported(shellEdgeLoad) && !twoD)
{
ViewShellEdgeLoad vsel = new ViewShellEdgeLoad(shellEdgeLoad);
vsel.PopulateDropDownLists(shellEdgeSurfaceNames, amplitudeNames);
vsel.Color = color;
item.Tag = vsel;
lvTypes.Items.Add(item);
}
// Gravity load - part, element sets
name = "Gravity";
loadName = GetLoadName(name);
item = new ListViewItem(name);
GravityLoad gravityLoad = new GravityLoad(loadName, "", RegionTypeEnum.Selection, twoD, complex, 0);
if (step.IsLoadSupported(gravityLoad))
{
ViewGravityLoad vgl = new ViewGravityLoad(gravityLoad);
vgl.PopulateDropDownLists(partNames, elementSetNames, massSectionNames, amplitudeNames);
vgl.Color = color;
item.Tag = vgl;
lvTypes.Items.Add(item);
}
// Centrifugal load - part, element sets
name = "Centrifugal Load";
loadName = GetLoadName(name);
item = new ListViewItem(name);
bool axisymmetric = _controller.Model.Properties.ModelSpace == ModelSpaceEnum.Axisymmetric;
CentrifLoad centrifLoad = new CentrifLoad(loadName, "", RegionTypeEnum.Selection, twoD, axisymmetric, complex, 0);
ViewCentrifLoad vcfl = new ViewCentrifLoad(centrifLoad);
if (step.IsLoadSupported(gravityLoad))
{
vcfl.PopulateDropDownLists(partNames, elementSetNames, massSectionNames, amplitudeNames);
vcfl.Color = color;
item.Tag = vcfl;
lvTypes.Items.Add(item);
}
// Pre-tension load
name = "Pre-tension";
loadName = GetLoadName(name);
item = new ListViewItem(name);
PreTensionLoad preTensionLoad = new PreTensionLoad(loadName, "", RegionTypeEnum.Selection, 0, twoD);
if (step.IsLoadSupported(preTensionLoad) && !twoD)
{
ViewPreTensionLoad vptl = new ViewPreTensionLoad(preTensionLoad);
vptl.PopulateDropDownLists(solidFaceSurfaceNames, amplitudeNames);
vptl.Color = color;
item.Tag = vptl;
lvTypes.Items.Add(item);
}
// Thermal
// Concentrated flux - node set
name = "Concentrated Flux";
loadName = GetLoadName(name);
item = new ListViewItem(name);
CFlux cFlux = new CFlux(loadName, "", RegionTypeEnum.Selection, 0, twoD);
if (step.IsLoadSupported(cFlux))
{
ViewCFlux vcf = new ViewCFlux(cFlux);
vcf.PopulateDropDownLists(nodeSetNames, amplitudeNames);
vcf.Color = color;
item.Tag = vcf;
lvTypes.Items.Add(item);
}
// Surface flux
name = "Surface Flux";
loadName = GetLoadName(name);
item = new ListViewItem(name);
DFlux dFlux = new DFlux(loadName, "", RegionTypeEnum.Selection, 0, twoD);
if (step.IsLoadSupported(dFlux))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
ViewDFlux vdf = new ViewDFlux(dFlux);
vdf.PopulateDropDownLists(surfaceNames, amplitudeNames);
vdf.Color = color;
item.Tag = vdf;
lvTypes.Items.Add(item);
}
// Body flux
name = "Body Flux";
loadName = GetLoadName(name);
item = new ListViewItem(name);
BodyFlux bFlux = new BodyFlux(loadName, "", RegionTypeEnum.Selection, 0, twoD);
if (step.IsLoadSupported(bFlux))
{
ViewBodyFlux vbf = new ViewBodyFlux(bFlux);
vbf.PopulateDropDownLists(partNames, elementSetNames, amplitudeNames);
vbf.Color = color;
item.Tag = vbf;
lvTypes.Items.Add(item);
}
// Film heat transfer
name = "Convective Film";
loadName = GetLoadName(name);
item = new ListViewItem(name);
FilmHeatTransfer filmHeatTransfer = new FilmHeatTransfer(loadName, "", RegionTypeEnum.Selection, 0, 0, twoD);
if (step.IsLoadSupported(filmHeatTransfer))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
ViewFilmHeatTransfer vfht = new ViewFilmHeatTransfer(filmHeatTransfer);
vfht.PopulateDropDownLists(surfaceNames, amplitudeNames);
vfht.Color = color;
item.Tag = vfht;
lvTypes.Items.Add(item);
}
// Radiation heat transfer
name = "Radiation";
loadName = GetLoadName(name);
item = new ListViewItem(name);
RadiationHeatTransfer radiationHeatTransfer = new RadiationHeatTransfer(loadName, "", RegionTypeEnum.Selection,
0, 1, twoD);
if (step.IsLoadSupported(radiationHeatTransfer))
{
string[] surfaceNames;
if (twoD) surfaceNames = shellEdgeSurfaceNames.ToArray();
else surfaceNames = noEdgeSurfaceNames.ToArray();
//
ViewRadiationHeatTransfer vrht = new ViewRadiationHeatTransfer(radiationHeatTransfer);
vrht.PopulateDropDownLists(surfaceNames, amplitudeNames);
vrht.Color = color;
item.Tag = vrht;
lvTypes.Items.Add(item);
}
}
private string GetLoadName(string name)
{
if (name == null || name == "") name = "Load";
name = name.Replace(' ', '_');
name = _loadNames.GetNextNumberedKey(name);
//
return name;
}
private void HighlightLoad()
{
try
{
_controller.ClearSelectionHistory();
Load load = FELoad;
//
if (_viewLoad == null) { }
else if (load is CLoad ||
load is MomentLoad ||
load is DLoad ||
load is HydrostaticPressure ||
load is ImportedPressure ||
load is STLoad ||
load is ImportedSTLoad ||
load is ShellEdgeLoad ||
load is GravityLoad ||
load is CentrifLoad ||
load is PreTensionLoad ||
// Thermal
load is CFlux ||
load is DFlux ||
load is BodyFlux ||
load is FilmHeatTransfer ||
load is RadiationHeatTransfer)
{
if (load.RegionType == RegionTypeEnum.NodeSetName ||
load.RegionType == RegionTypeEnum.ReferencePointName ||
load.RegionType == RegionTypeEnum.SurfaceName ||
load.RegionType == RegionTypeEnum.PartName ||
load.RegionType == RegionTypeEnum.ElementSetName)
{
_controller.Highlight3DObjects(new object[] { load.RegionName });
}
else if (load.RegionType == RegionTypeEnum.MassSection)
{
Section section = _controller.Model.Sections[load.RegionName];
_controller.Highlight3DObjects(new object[] { section.RegionName });
}
else if (load.RegionType == RegionTypeEnum.Selection)
{
SetSelectItem();
//
if (load.CreationData != null)
{
_controller.Selection = load.CreationData.DeepClone();
_controller.HighlightSelection();
}
}
else throw new NotImplementedException();
// Secondary selection
if (load is HydrostaticPressure hp)
{
double[][] nodeCoor = new double[][] { new double[] { hp.X1.Value, hp.Y1.Value, hp.Z1.Value },
new double[] { hp.X2.Value, hp.Y2.Value, hp.Z2.Value } };
_controller.HighlightNodes(nodeCoor, true);
}
else if (load is ImportedSTLoad istl)
{
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
if (property == nameof(istl.FileName) || property == nameof(istl.GeometryScaleFactor))
{
if (istl.Interpolator == null) istl.ImportLoad();
//
if (istl.Interpolator != null && istl.Interpolator.CloudPoints != null)
{
CloudPoint[] cloudPoints = istl.Interpolator.CloudPoints;
double[][] nodeCoor = new double[cloudPoints.Length][];
//
for (int i = 0; i < cloudPoints.Length; i++)
{
nodeCoor[i] = new double[] { cloudPoints[i].Coor[0], cloudPoints[i].Coor[1], cloudPoints[i].Coor[2] };
}
_controller.HighlightNodes(nodeCoor, true);
}
}
}
else if (load is CentrifLoad cf)
{
double[][] nodeCoor = new double[][] { new double[] { cf.X.Value, cf.Y.Value, cf.Z.Value } };
_controller.HighlightNodes(nodeCoor, true);
}
}
else throw new NotSupportedException();
//
if (load != null && load.CoordinateSystemName != null)
_controller.HighlightCoordinateSystem(load.CoordinateSystemName);
}
catch { }
}
private void ShowHideSelectionForm()
{
if (FELoad != null && FELoad.RegionType == RegionTypeEnum.Selection && Enabled)
ItemSetDataEditor.SelectionForm.ShowIfHidden(this.Owner);
else
ItemSetDataEditor.SelectionForm.Hide();
//
SetSelectItem();
}
private void SetSelectItem()
{
if (FELoad != null && FELoad.RegionType == RegionTypeEnum.Selection)
{
if (FELoad is null) { }
else if (FELoad is CLoad) _controller.SetSelectItemToNode();
else if (FELoad is MomentLoad) _controller.SetSelectItemToNode();
else if (FELoad is DLoad) _controller.SetSelectItemToSurface();
else if (FELoad is HydrostaticPressure) _controller.SetSelectItemToSurface();
else if (FELoad is ImportedPressure) _controller.SetSelectItemToSurface();
else if (FELoad is STLoad) _controller.SetSelectItemToSurface();
else if (FELoad is ImportedSTLoad) _controller.SetSelectItemToSurface();
else if (FELoad is ShellEdgeLoad) _controller.SetSelectItemToSurface();
else if (FELoad is GravityLoad) _controller.SetSelectItemToPart();
else if (FELoad is CentrifLoad) _controller.SetSelectItemToPart();
else if (FELoad is PreTensionLoad) _controller.SetSelectItemToSurface();
// Thermal
else if (FELoad is CFlux) _controller.SetSelectItemToNode();
else if (FELoad is DFlux) _controller.SetSelectItemToSurface();
else if (FELoad is BodyFlux) _controller.SetSelectItemToPart();
else if (FELoad is FilmHeatTransfer) _controller.SetSelectItemToSurface();
else if (FELoad is RadiationHeatTransfer) _controller.SetSelectItemToSurface();
//
else throw new NotSupportedException();
}
else _controller.SetSelectByToOff();
}
private void LoadInternal(bool toInternal)
{
if (_stepName != null && _loadToEditName != null)
{
// Convert the load from/to internal to hide/show it
_controller.GetLoad(_stepName, _loadToEditName).Internal = toInternal;
_controller.FeModelUpdate(UpdateType.RedrawSymbols);
}
}
//
public void SelectionChanged(int[] ids)
{
if (Enabled)
{
if (FELoad != null && FELoad.RegionType == RegionTypeEnum.Selection)
{
if (FELoad is CLoad ||
FELoad is MomentLoad ||
FELoad is DLoad ||
FELoad is HydrostaticPressure ||
FELoad is ImportedPressure ||
FELoad is STLoad ||
FELoad is ImportedSTLoad ||
FELoad is ShellEdgeLoad ||
FELoad is GravityLoad ||
FELoad is CentrifLoad ||
FELoad is PreTensionLoad ||
FELoad is CFlux ||
FELoad is DFlux ||
FELoad is BodyFlux ||
FELoad is FilmHeatTransfer ||
FELoad is RadiationHeatTransfer)
{
FELoad.CreationIds = ids;
FELoad.CreationData = _controller.Selection.DeepClone();
//
propertyGrid.Refresh();
//
_propertyItemChanged = true;
//
Highlight();
}
else throw new NotSupportedException();
}
}
else
{
if (ids != null && ids.Length > 0)
{
bool changed = false;
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
//
if (_viewLoad is ViewCentrifLoad vcl)
{
if (property == nameof(vcl.CenterPointItemSet))
{
if (ids.Length == 1)
{
FeNode node = _controller.Model.Mesh.Nodes[ids[0]];
vcl.X = new EquationString(node.X.ToString());
vcl.Y = new EquationString(node.Y.ToString());
vcl.Z = new EquationString(node.Z.ToString());
changed = true;
}
}
}
else if (_viewLoad is ViewHydrostaticPressureLoad vhpl)
{
if (property == nameof(vhpl.FirstPointItemSet))
{
if (ids.Length == 1)
{
FeNode node = _controller.Model.Mesh.Nodes[ids[0]];
vhpl.X1 = new EquationString(node.X.ToString());
vhpl.Y1 = new EquationString(node.Y.ToString());
vhpl.Z1 = new EquationString(node.Z.ToString());
changed = true;
}
}
else if (property == nameof(vhpl.SecondPointItemSet))
{
if (ids.Length == 1)
{
FeNode node = _controller.Model.Mesh.Nodes[ids[0]];
vhpl.X2 = new EquationString(node.X.ToString());
vhpl.Y2 = new EquationString(node.Y.ToString());
vhpl.Z2 = new EquationString(node.Z.ToString());
changed = true;
}
}
else if (property == nameof(vhpl.PressureDirectionItemSet))
{
if (ids.Length == 2)
{
FeNode node1 = _controller.Model.Mesh.Nodes[ids[0]];
FeNode node2 = _controller.Model.Mesh.Nodes[ids[1]];
vhpl.N1 = new EquationString((node2.X - node1.X).ToString());
vhpl.N2 = new EquationString((node2.Y - node1.Y).ToString());
vhpl.N3 = new EquationString((node2.Z - node1.Z).ToString());
changed = true;
}
}
}
//
if (changed)
{
Enabled = true; // must be first for the selection to work
//
propertyGrid.Refresh();
//
_propertyItemChanged = true;
//
_controller.Selection = _selectionCopy;
Highlight();
}
}
}
}
// IFormHighlight
public void Highlight()
{
if (Enabled && !_closing) HighlightLoad();
}
// IFormItemSetDataParent
public bool IsSelectionGeometryBased()
{
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
Load load = FELoad;
//
if (load.CreationData != null) return load.CreationData.IsGeometryBased();
else return true;
}
public bool IsGeometrySelectionIdBased()
{
bool defaultMode = _controller.Settings.Pre.GeometrySelectMode == GeometrySelectModeEnum.SelectId;
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
Load load = FELoad;
//
if (load.CreationData != null && IsSelectionGeometryBased()) return load.CreationData.IsGeometryIdBased(defaultMode);
else return defaultMode;
}
}
}