791 lines
33 KiB
C#
791 lines
33 KiB
C#
using CaeGlobals;
|
|
using CaeMesh;
|
|
using CaeModel;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
// ReSharper disable CheckNamespace
|
|
#pragma warning disable IDE0130
|
|
|
|
|
|
namespace CPSO.Forms
|
|
{
|
|
partial class FrmMeshSetupItem : UserControls.FrmPropertyListView, IFormBase, IFormItemSetDataParent, IFormHighlight
|
|
{
|
|
// Variables
|
|
private string[] _meshSetupItemNames;
|
|
private string _meshSetupItemToEditName;
|
|
private ViewMeshSetupItem _viewMeshSetupItem;
|
|
private Controller _controller;
|
|
private bool _meshingParametersChanged;
|
|
|
|
// 控件
|
|
private ContextMenuStrip cmsPropertyGrid;
|
|
private System.ComponentModel.IContainer components;
|
|
private ToolStripMenuItem tsmiResetAll;
|
|
private ToolTip ttText;
|
|
private Button btnPreview;
|
|
|
|
// Callbacks
|
|
public Func<string[], MeshSetupItem, Task> PreviewEdgeMeshAsync;
|
|
|
|
// Properties
|
|
public MeshSetupItem MeshSetupItem
|
|
{
|
|
get => _viewMeshSetupItem?.GetBase();
|
|
set
|
|
{
|
|
if (value is MeshingParameters mp)
|
|
{
|
|
bool defaultSizeIsRelative = _controller.Settings.Meshing.MeshingParameters.RelativeSize;
|
|
//
|
|
bool advancedView = mp.AdvancedView;
|
|
if (_viewMeshSetupItem != null && _viewMeshSetupItem is ViewMeshingParameters vmp)
|
|
advancedView = vmp.AdvancedView;
|
|
//
|
|
_viewMeshSetupItem = new ViewMeshingParameters(mp.DeepClone(), defaultSizeIsRelative, advancedView);
|
|
}
|
|
else if (value is FeMeshRefinement mr) _viewMeshSetupItem = new ViewFeMeshRefinement(mr.DeepClone());
|
|
else if (value is ShellGmsh sg) _viewMeshSetupItem = new ViewShellGmsh(sg.DeepClone());
|
|
else if (value is ThickenShellMesh tsm) _viewMeshSetupItem = new ViewThickenShellMesh(tsm.DeepClone());
|
|
else if (value is TetrahedralGmsh tg) _viewMeshSetupItem = new ViewTetrahedralGmsh(tg.DeepClone());
|
|
else if (value is TransfiniteMesh tm) _viewMeshSetupItem = new ViewTransfiniteMesh(tm.DeepClone());
|
|
else if (value is ExtrudeMesh em) _viewMeshSetupItem = new ViewExtrudeMesh(em.DeepClone());
|
|
else if (value is SweepMesh sm) _viewMeshSetupItem = new ViewSweepMesh(sm.DeepClone());
|
|
else if (value is RevolveMesh rm) _viewMeshSetupItem = new ViewRevolveMesh(rm.DeepClone());
|
|
else throw new NotImplementedException("MeshSetupItemTypeException");
|
|
}
|
|
}
|
|
|
|
// Constructors
|
|
public FrmMeshSetupItem(Controller controller)
|
|
: base(1.72)
|
|
{
|
|
InitializeComponent();
|
|
|
|
_controller = controller;
|
|
_viewMeshSetupItem = null;
|
|
|
|
// 界面本地化
|
|
gbType.Text = @"类型";
|
|
gbProperties.Text = @"参数";
|
|
|
|
// 大图标方式显示
|
|
ImageList imageList = new ImageList();
|
|
imageList.ImageSize = new Size(32, 32);
|
|
|
|
foreach (var key in new[]{"Meshing_Parameters", "Mesh_Refinement",
|
|
"Shell_Gmsh", "Thicken_Shell_Mesh", "Tetrahedral_Gmsh", "Transfinite_Mesh",
|
|
"Extrude_Mesh", "Sweep_Mesh", "Revolve_Mesh"
|
|
})
|
|
{
|
|
imageList.Images.Add(key, EmbeddedResource.Properties.Resource.Icon1);
|
|
}
|
|
|
|
lvTypes.LargeImageList = imageList;
|
|
lvTypes.View = View.LargeIcon;
|
|
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.components = new System.ComponentModel.Container();
|
|
this.cmsPropertyGrid = new System.Windows.Forms.ContextMenuStrip(this.components);
|
|
this.tsmiResetAll = new System.Windows.Forms.ToolStripMenuItem();
|
|
this.btnPreview = new System.Windows.Forms.Button();
|
|
this.ttText = new System.Windows.Forms.ToolTip(this.components);
|
|
this.gbType.SuspendLayout();
|
|
this.gbProperties.SuspendLayout();
|
|
this.cmsPropertyGrid.SuspendLayout();
|
|
this.SuspendLayout();
|
|
//
|
|
// gbType
|
|
//
|
|
this.gbType.Size = new System.Drawing.Size(340, 101);
|
|
//
|
|
// lvTypes
|
|
//
|
|
this.lvTypes.Size = new System.Drawing.Size(328, 73);
|
|
//
|
|
// gbProperties
|
|
//
|
|
this.gbProperties.Size = new System.Drawing.Size(340, 310);
|
|
//
|
|
// propertyGrid
|
|
//
|
|
this.propertyGrid.ContextMenuStrip = this.cmsPropertyGrid;
|
|
this.propertyGrid.Size = new System.Drawing.Size(328, 282);
|
|
//
|
|
// btnOK
|
|
//
|
|
this.btnOK.Location = new System.Drawing.Point(190, 436);
|
|
//
|
|
// btnCancel
|
|
//
|
|
this.btnCancel.Location = new System.Drawing.Point(271, 436);
|
|
//
|
|
// btnOkAddNew
|
|
//
|
|
this.btnOkAddNew.Location = new System.Drawing.Point(109, 436);
|
|
//
|
|
// cmsPropertyGrid
|
|
//
|
|
this.cmsPropertyGrid.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
this.tsmiResetAll});
|
|
this.cmsPropertyGrid.Name = "cmsPropertyGrid";
|
|
this.cmsPropertyGrid.Size = new System.Drawing.Size(118, 26);
|
|
//
|
|
// tsmiResetAll
|
|
//
|
|
this.tsmiResetAll.Name = "tsmiResetAll";
|
|
this.tsmiResetAll.Size = new System.Drawing.Size(117, 22);
|
|
this.tsmiResetAll.Text = @"Reset all";
|
|
this.tsmiResetAll.Click += new System.EventHandler(this.tsmiResetAll_Click);
|
|
//
|
|
// btnPreview
|
|
//
|
|
this.btnPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
|
|
this.btnPreview.Image = global::CPSO.Properties.Resources.Show;
|
|
this.btnPreview.Location = new System.Drawing.Point(75, 436);
|
|
this.btnPreview.Name = "btnPreview";
|
|
this.btnPreview.Size = new System.Drawing.Size(28, 23);
|
|
this.btnPreview.TabIndex = 17;
|
|
this.ttText.SetToolTip(this.btnPreview, "Preview");
|
|
this.btnPreview.UseVisualStyleBackColor = true;
|
|
this.btnPreview.Click += new System.EventHandler(this.btnPreview_Click);
|
|
//
|
|
// FrmMeshSetupItem
|
|
//
|
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
|
this.ClientSize = new System.Drawing.Size(364, 471);
|
|
this.Controls.Add(this.btnPreview);
|
|
this.MinimumSize = new System.Drawing.Size(380, 510);
|
|
this.Name = "FrmMeshSetupItem";
|
|
this.Text = "Edit Mesh Setup Item";
|
|
this.VisibleChanged += new System.EventHandler(this.FrmMeshSetupItem_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.gbType, 0);
|
|
this.Controls.SetChildIndex(this.btnPreview, 0);
|
|
this.gbType.ResumeLayout(false);
|
|
this.gbProperties.ResumeLayout(false);
|
|
this.cmsPropertyGrid.ResumeLayout(false);
|
|
this.ResumeLayout(false);
|
|
|
|
}
|
|
|
|
// Event handlers
|
|
private void FrmMeshSetupItem_VisibleChanged(object sender, EventArgs e)
|
|
{
|
|
_controller.Selection.LimitSelectionToFirstMesherType = Visible;
|
|
|
|
// accounts for minimizing/maximizing the main form
|
|
if (Visible)
|
|
{
|
|
ShowHideSelectionForm();
|
|
}
|
|
}
|
|
|
|
// 重新设置参数
|
|
private void tsmiResetAll_Click(object sender, EventArgs e)
|
|
{
|
|
if (MeshSetupItem != null)
|
|
{
|
|
if (MeshSetupItem is MeshingParameters mp)
|
|
{
|
|
mp.CopyFrom(GetDefaultMeshingParameters(MeshSetupItem.CreationIds));
|
|
((ViewMeshingParameters)_viewMeshSetupItem).AdvancedView = mp.AdvancedView; // update advanced view
|
|
_meshingParametersChanged = false;
|
|
}
|
|
else if (MeshSetupItem is FeMeshRefinement mr) mr.Reset();
|
|
else if (MeshSetupItem is ShellGmsh sg) sg.Reset();
|
|
else if (MeshSetupItem is ThickenShellMesh tsm) tsm.Reset();
|
|
else if (MeshSetupItem is TetrahedralGmsh tg) tg.Reset();
|
|
else if (MeshSetupItem is TransfiniteMesh tm) tm.Reset();
|
|
else if (MeshSetupItem is ExtrudeMesh em) em.Reset();
|
|
else if (MeshSetupItem is SweepMesh sm) sm.Reset();
|
|
else if (MeshSetupItem is RevolveMesh rm) rm.Reset();
|
|
else throw new NotSupportedException("MeshSetupItemTypeException");
|
|
|
|
//
|
|
_propertyItemChanged = true;
|
|
//
|
|
propertyGrid.Refresh();
|
|
}
|
|
}
|
|
|
|
private async void btnPreview_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Enabled = false;
|
|
ItemSetDataEditor.SelectionForm.Enabled = false;
|
|
//
|
|
string[] partNames;
|
|
if (MeshSetupItem is MeshingParameters || MeshSetupItem is TetrahedralGmsh || MeshSetupItem is TransfiniteMesh)
|
|
{
|
|
partNames = _controller.DisplayedMesh.GetPartNamesFromPartIds(MeshSetupItem.CreationIds);
|
|
}
|
|
else if (MeshSetupItem is ShellGmsh || MeshSetupItem is ThickenShellMesh || MeshSetupItem is FeMeshRefinement ||
|
|
MeshSetupItem is ExtrudeMesh || MeshSetupItem is SweepMesh || MeshSetupItem is RevolveMesh)
|
|
{
|
|
partNames = _controller.DisplayedMesh.GetPartNamesFromGeometryIds(MeshSetupItem.CreationIds);
|
|
}
|
|
else throw new NotSupportedException("MeshSetupItemTypeException");
|
|
//
|
|
if (partNames != null && partNames.Length > 0)
|
|
{
|
|
HighlightMeshSetupItem(false);
|
|
//
|
|
await PreviewEdgeMeshAsync?.Invoke(partNames, MeshSetupItem);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ExceptionTools.Show(this, ex);
|
|
}
|
|
finally
|
|
{
|
|
Enabled = true;
|
|
ItemSetDataEditor.SelectionForm.Enabled = true;
|
|
}
|
|
}
|
|
|
|
// Overrides
|
|
protected override void OnListViewTypeSelectedIndexChanged()
|
|
{
|
|
// ReSharper disable once ConditionIsAlwaysTrueOrFalse
|
|
if (lvTypes.SelectedItems != null && lvTypes.SelectedItems.Count > 0)
|
|
{
|
|
object itemTag = lvTypes.SelectedItems[0].Tag;
|
|
|
|
if (itemTag != null)
|
|
{
|
|
if (itemTag is ViewMeshingParameters vmp) _viewMeshSetupItem = vmp;
|
|
else if (itemTag is ViewFeMeshRefinement vmr) _viewMeshSetupItem = vmr;
|
|
else if (itemTag is ViewShellGmsh vsg) _viewMeshSetupItem = vsg;
|
|
else if (itemTag is ViewThickenShellMesh vtsm) _viewMeshSetupItem = vtsm;
|
|
else if (itemTag is ViewTetrahedralGmsh vtg) _viewMeshSetupItem = vtg;
|
|
else if (itemTag is ViewTransfiniteMesh vtm) _viewMeshSetupItem = vtm;
|
|
else if (itemTag is ViewExtrudeMesh vem) _viewMeshSetupItem = vem;
|
|
else if (itemTag is ViewSweepMesh vsm) _viewMeshSetupItem = vsm;
|
|
else if (itemTag is ViewRevolveMesh vrm) _viewMeshSetupItem = vrm;
|
|
else throw new NotImplementedException("MeshSetupItemTypeException");
|
|
}
|
|
|
|
// 显示选择对话框
|
|
ShowHideSelectionForm();
|
|
//
|
|
propertyGrid.SelectedObject = _viewMeshSetupItem;
|
|
//
|
|
HighlightMeshSetupItem();
|
|
}
|
|
}
|
|
|
|
protected override void OnPropertyGridPropertyValueChanged()
|
|
{
|
|
if (propertyGrid.SelectedGridItem.PropertyDescriptor != null)
|
|
{
|
|
string property = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
|
|
//
|
|
if (_viewMeshSetupItem is ViewMeshingParameters vmp &&
|
|
property != nameof(vmp.Name) && property != nameof(vmp.AdvancedView))
|
|
{
|
|
_meshingParametersChanged = true;
|
|
}
|
|
}
|
|
|
|
HighlightMeshSetupItem();
|
|
|
|
base.OnPropertyGridPropertyValueChanged();
|
|
}
|
|
|
|
protected override void OnApply(bool onOkAddNew)
|
|
{
|
|
_viewMeshSetupItem = (ViewMeshSetupItem)propertyGrid.SelectedObject;
|
|
//
|
|
if (_viewMeshSetupItem == null) throw new CaeException("No mesh setup item was selected.");
|
|
// Check if the name exists
|
|
CheckName(_meshSetupItemToEditName, MeshSetupItem.Name, _meshSetupItemNames, "mesh setup item");
|
|
//
|
|
if (MeshSetupItem.CreationIds == null || MeshSetupItem.CreationIds.Length == 0)
|
|
throw new CaeException("The mesh setup item selection must contain at least one item.");
|
|
//
|
|
string error = _controller.IsMeshSetupItemProperlyDefined(MeshSetupItem);
|
|
if (error != null) throw new CaeException(error);
|
|
// When opened from regenerate
|
|
if (this.Modal) { }
|
|
// When opened normally
|
|
else
|
|
{
|
|
// Create
|
|
if (_meshSetupItemToEditName == null)
|
|
{
|
|
_controller.AddMeshSetupItemCommand(MeshSetupItem);
|
|
}
|
|
// Replace
|
|
else if (_propertyItemChanged)
|
|
{
|
|
_controller.ReplaceMeshSetupItemCommand(_meshSetupItemToEditName, MeshSetupItem);
|
|
}
|
|
}
|
|
// If all is successful close the ItemSetSelectionForm - except for OKAddNew
|
|
if (!onOkAddNew)
|
|
{
|
|
DialogResult = DialogResult.OK;
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
}
|
|
}
|
|
|
|
protected override void OnHideOrClose()
|
|
{
|
|
// Close the ItemSetSelectionForm
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
//
|
|
base.OnHideOrClose();
|
|
}
|
|
|
|
protected override bool OnPrepareForm(string stepName, string meshSetupItemToEditName)
|
|
{
|
|
DialogResult = DialogResult.None;
|
|
//
|
|
int dx = btnCancel.Left - btnOK.Right;
|
|
if (meshSetupItemToEditName == null)
|
|
{
|
|
btnOkAddNew.Visible = true;
|
|
btnPreview.Visible = true;
|
|
btnPreview.Location = new System.Drawing.Point(btnOkAddNew.Left - dx - btnPreview.Width, btnOkAddNew.Top);
|
|
}
|
|
else
|
|
{
|
|
btnOkAddNew.Visible = false;
|
|
btnPreview.Visible = true;
|
|
btnPreview.Location = new System.Drawing.Point(btnOK.Left - dx - btnPreview.Width, btnOkAddNew.Top);
|
|
}
|
|
//
|
|
_propertyItemChanged = false;
|
|
_meshSetupItemNames = null;
|
|
_meshSetupItemToEditName = null;
|
|
_viewMeshSetupItem = null;
|
|
lvTypes.Items.Clear();
|
|
propertyGrid.SelectedObject = null;
|
|
_meshingParametersChanged = false;
|
|
_controller.ClearAllSelection();
|
|
//
|
|
_meshSetupItemNames = _controller.GetMeshSetupItemNames();
|
|
_meshSetupItemToEditName = meshSetupItemToEditName;
|
|
_meshingParametersChanged = _meshSetupItemToEditName != null;
|
|
//
|
|
if (_meshSetupItemNames == null)
|
|
throw new CaeException("The mesh setup item names must be defined first.");
|
|
//
|
|
PopulateListOfMeshSetupItems();
|
|
// Create new mesh setup item
|
|
if (_meshSetupItemToEditName == null)
|
|
{
|
|
lvTypes.Enabled = true;
|
|
_viewMeshSetupItem = null;
|
|
}
|
|
// Edit existing mesh setup item
|
|
else
|
|
{
|
|
MeshSetupItem = _controller.GetMeshSetupItem(_meshSetupItemToEditName); // to clone
|
|
// Check validity
|
|
if (!MeshSetupItem.Valid)
|
|
{
|
|
MeshSetupItem.CreationData = null;
|
|
MeshSetupItem.CreationIds = null;
|
|
MeshSetupItem.Valid = true;
|
|
}
|
|
int selectedId;
|
|
if (_viewMeshSetupItem is ViewMeshingParameters) selectedId = 0;
|
|
else if (_viewMeshSetupItem is ViewFeMeshRefinement) selectedId = 1;
|
|
else if (_viewMeshSetupItem is ViewShellGmsh) selectedId = 2;
|
|
else if (_viewMeshSetupItem is ViewThickenShellMesh) selectedId = 3;
|
|
else if (_viewMeshSetupItem is ViewTetrahedralGmsh) selectedId = 4;
|
|
else if (_viewMeshSetupItem is ViewTransfiniteMesh) selectedId = 5;
|
|
else if (_viewMeshSetupItem is ViewExtrudeMesh) selectedId = 6;
|
|
else if (_viewMeshSetupItem is ViewSweepMesh) selectedId = 7;
|
|
else if (_viewMeshSetupItem is ViewRevolveMesh) selectedId = 8;
|
|
else throw new NotSupportedException("MeshSetupItemTypeException");
|
|
//
|
|
lvTypes.Items[selectedId].Tag = _viewMeshSetupItem;
|
|
_preselectIndex = selectedId;
|
|
}
|
|
//
|
|
ShowHideSelectionForm();
|
|
//
|
|
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
|
|
//
|
|
return true;
|
|
}
|
|
|
|
// Methods
|
|
private MeshingParameters GetDefaultMeshingParameters(int[] ids)
|
|
{
|
|
MeshingParameters meshingParameters = _controller.Settings.Meshing.MeshingParameters;
|
|
//
|
|
if (MeshSetupItem is MeshingParameters mp)
|
|
{
|
|
meshingParameters.Name = mp.Name;
|
|
//
|
|
if (ids != null && ids.Length > 0)
|
|
{
|
|
string[] partNames = _controller.Model.Geometry.GetPartNamesFromPartIds(ids);
|
|
MeshingParameters defaultMeshingParameters = _controller.GetPartDefaultMeshingParameters(partNames);
|
|
//
|
|
if (defaultMeshingParameters != null)
|
|
{
|
|
defaultMeshingParameters.Name = mp.Name;
|
|
meshingParameters = defaultMeshingParameters;
|
|
}
|
|
}
|
|
// Copy relative
|
|
meshingParameters.RelativeSize = mp.RelativeSize;
|
|
// Copy creation data
|
|
meshingParameters.CreationIds = mp.CreationIds;
|
|
meshingParameters.CreationData = mp.CreationData;
|
|
}
|
|
return meshingParameters;
|
|
}
|
|
public void SetMeshSetupItem(MeshSetupItem meshSetupItem)
|
|
{
|
|
int selectedId;
|
|
_meshSetupItemToEditName = meshSetupItem.Name; // the OnApply checks this name
|
|
//
|
|
if (meshSetupItem is MeshingParameters mp)
|
|
{
|
|
selectedId = 0;
|
|
bool defaultSizeIsRelative = _controller.Settings.Meshing.MeshingParameters.RelativeSize;
|
|
_viewMeshSetupItem = new ViewMeshingParameters(mp.DeepClone(), defaultSizeIsRelative);
|
|
}
|
|
else if (meshSetupItem is FeMeshRefinement mr)
|
|
{
|
|
selectedId = 1;
|
|
_viewMeshSetupItem = new ViewFeMeshRefinement(mr.DeepClone());
|
|
}
|
|
else if (meshSetupItem is ShellGmsh sg)
|
|
{
|
|
selectedId = 2;
|
|
_viewMeshSetupItem = new ViewShellGmsh(sg.DeepClone());
|
|
}
|
|
else if (meshSetupItem is ThickenShellMesh tsm)
|
|
{
|
|
selectedId = 3;
|
|
_viewMeshSetupItem = new ViewThickenShellMesh(tsm.DeepClone());
|
|
}
|
|
else if (meshSetupItem is TetrahedralGmsh tg)
|
|
{
|
|
selectedId = 4;
|
|
_viewMeshSetupItem = new ViewTetrahedralGmsh(tg.DeepClone());
|
|
}
|
|
else if (meshSetupItem is TransfiniteMesh tm)
|
|
{
|
|
selectedId = 5;
|
|
_viewMeshSetupItem = new ViewTransfiniteMesh(tm.DeepClone());
|
|
}
|
|
else if (meshSetupItem is ExtrudeMesh em)
|
|
{
|
|
selectedId = 6;
|
|
_viewMeshSetupItem = new ViewExtrudeMesh(em.DeepClone());
|
|
}
|
|
else if (meshSetupItem is SweepMesh sm)
|
|
{
|
|
selectedId = 7;
|
|
_viewMeshSetupItem = new ViewSweepMesh(sm.DeepClone());
|
|
}
|
|
else if (meshSetupItem is RevolveMesh rm)
|
|
{
|
|
selectedId = 8;
|
|
_viewMeshSetupItem = new ViewRevolveMesh(rm.DeepClone());
|
|
}
|
|
else
|
|
{
|
|
throw new NotSupportedException("MeshSetupItemTypeException");
|
|
}
|
|
//
|
|
_viewMeshSetupItem.HideName();
|
|
btnOkAddNew.Visible = false;
|
|
btnPreview.Visible = false;
|
|
//
|
|
lvTypes.Items[selectedId].Tag = _viewMeshSetupItem;
|
|
//
|
|
PreselectListViewItem(selectedId);
|
|
//
|
|
ItemSetDataEditor.SelectionForm.Hide();
|
|
}
|
|
//
|
|
private void PopulateListOfMeshSetupItems()
|
|
{
|
|
bool twoD = _controller.Model.Properties.ModelSpace.IsTwoD();
|
|
|
|
// Meshing parameters
|
|
MeshingParameters mp = _controller.GetDefaultMeshingParameters(GetMeshSetupItemName("Meshing_Parameters"));
|
|
bool defaultSizeIsRelative = mp.RelativeSize;
|
|
ViewMeshingParameters vmp = new ViewMeshingParameters(mp, defaultSizeIsRelative);
|
|
|
|
var item = new ListViewItem
|
|
{
|
|
Text = @"网格参数",
|
|
Name = @"Meshing Parameters",
|
|
ImageKey = @"Meshing_Parameters",
|
|
Tag = vmp
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Mesh refinement
|
|
FeMeshRefinement mr = new FeMeshRefinement(GetMeshSetupItemName("Mesh_Refinement"));
|
|
ViewFeMeshRefinement vmr = new ViewFeMeshRefinement(mr);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"细化网格",
|
|
Name = @"Mesh Refinement",
|
|
ImageKey = @"Mesh_Refinement",
|
|
Tag = vmr
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Shell gmsh
|
|
ShellGmsh sg = new ShellGmsh(GetMeshSetupItemName("Shell_Gmsh"));
|
|
ViewShellGmsh vsg = new ViewShellGmsh(sg);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"Gmsh壳单元",
|
|
Name = @"Shell Gmsh",
|
|
ImageKey = @"Shell_Gmsh",
|
|
Tag = vsg
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Thicken shell mesh
|
|
ThickenShellMesh tsm = new ThickenShellMesh(GetMeshSetupItemName("Thicken_Shell_Mesh"));
|
|
ViewThickenShellMesh vtsm = new ViewThickenShellMesh(tsm);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"厚壳单元",
|
|
Name = @"Thicken Shell Mesh",
|
|
ImageKey = @"Thicken_Shell_Mesh",
|
|
Tag = vtsm
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Tetrahedral gmsh
|
|
TetrahedralGmsh tg = new TetrahedralGmsh(GetMeshSetupItemName("Tetrahedral_Gmsh"));
|
|
ViewTetrahedralGmsh vtg = new ViewTetrahedralGmsh(tg);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"四面体单元",
|
|
Name = @"Tetrahedral Gmsh",
|
|
ImageKey = @"Tetrahedral_Gmsh",
|
|
Tag = vtg
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Transfinite mesh
|
|
TransfiniteMesh tm = new TransfiniteMesh(GetMeshSetupItemName("Transfinite_Mesh"));
|
|
ViewTransfiniteMesh vtm = new ViewTransfiniteMesh(tm);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"超限插值",
|
|
Name = @"Transfinite Mesh",
|
|
ImageKey = @"Transfinite_Mesh",
|
|
Tag = vtm
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
if (!twoD)
|
|
{
|
|
// Extrude mesh
|
|
ExtrudeMesh em = new ExtrudeMesh(GetMeshSetupItemName("Extrude_Mesh"));
|
|
ViewExtrudeMesh vem = new ViewExtrudeMesh(em);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"网格拉伸",
|
|
Name = @"Extrude Mesh",
|
|
ImageKey = @"Extrude_Mesh",
|
|
Tag = vem
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Sweep mesh
|
|
SweepMesh sm = new SweepMesh(GetMeshSetupItemName("Sweep_Mesh"));
|
|
ViewSweepMesh vsm = new ViewSweepMesh(sm);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"网格扫略",
|
|
Name = @"Sweep Mesh",
|
|
ImageKey = @"Sweep_Mesh",
|
|
Tag = vsm
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
|
|
// Revolve mesh
|
|
RevolveMesh rm = new RevolveMesh(GetMeshSetupItemName("Revolve_Mesh"));
|
|
ViewRevolveMesh vrm = new ViewRevolveMesh(rm);
|
|
|
|
item = new ListViewItem
|
|
{
|
|
Text = @"网格回转",
|
|
Name = @"Revolve Mesh",
|
|
ImageKey = @"Revolve_Mesh",
|
|
Tag = vrm
|
|
};
|
|
|
|
lvTypes.Items.Add(item);
|
|
}
|
|
}
|
|
private string GetMeshSetupItemName(string name)
|
|
{
|
|
return _meshSetupItemNames.GetNextNumberedKey(name);
|
|
}
|
|
private void HighlightMeshSetupItem(bool highlightNodes = true)
|
|
{
|
|
try
|
|
{
|
|
// This calls selection which might change the view which calls clear
|
|
// which calls SelectionChanged which changes the MeshSetupItem !!!
|
|
if (Modal) return;
|
|
//
|
|
_controller.ClearSelectionHistory();
|
|
//
|
|
if (_viewMeshSetupItem == null) { }
|
|
else
|
|
{
|
|
if (MeshSetupItem.CreationData != null && MeshSetupItem.CreationIds != null &&
|
|
MeshSetupItem.CreationIds.Length > 0)
|
|
{
|
|
try
|
|
{
|
|
if (MeshSetupItem is ExtrudeMesh || MeshSetupItem is SweepMesh || MeshSetupItem is RevolveMesh)
|
|
{
|
|
_controller.IsMeshSetupItemProperlyDefined(MeshSetupItem);
|
|
}
|
|
//
|
|
_controller.HighlightMeshSetupItem(MeshSetupItem, highlightNodes);
|
|
}
|
|
catch { }
|
|
// Set previous selection to continue it
|
|
_controller.Selection = MeshSetupItem.CreationData.DeepClone();
|
|
}
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
private void ShowHideSelectionForm()
|
|
{
|
|
// When opened from regenerate
|
|
if (!Visible || this.Modal) ItemSetDataEditor.SelectionForm.Hide();
|
|
// When opened normally
|
|
else
|
|
{
|
|
if (MeshSetupItem != null)
|
|
{
|
|
ItemSetDataEditor.SelectionForm.ItemSetData = new ItemSetData(MeshSetupItem.CreationIds);
|
|
ItemSetDataEditor.SelectionForm.ShowIfHidden(this.Owner);
|
|
}
|
|
else ItemSetDataEditor.SelectionForm.Hide();
|
|
}
|
|
//
|
|
SetSelectItem();
|
|
}
|
|
private void SetSelectItem()
|
|
{
|
|
if (MeshSetupItem != null)
|
|
{
|
|
if (MeshSetupItem is MeshingParameters) _controller.SetSelectItemToPart();
|
|
else if (MeshSetupItem is FeMeshRefinement) _controller.SetSelectItemToGeometry();
|
|
else if (MeshSetupItem is ShellGmsh) _controller.SetSelectItemToPart();
|
|
else if (MeshSetupItem is ThickenShellMesh) _controller.SetSelectItemToPart();
|
|
else if (MeshSetupItem is TetrahedralGmsh) _controller.SetSelectItemToPart();
|
|
else if (MeshSetupItem is TransfiniteMesh) _controller.SetSelectItemToPart();
|
|
else if (MeshSetupItem is ExtrudeMesh) _controller.SetSelectItemToGeometrySurface();
|
|
else if (MeshSetupItem is SweepMesh) _controller.SetSelectItemToGeometrySurface();
|
|
else if (MeshSetupItem is RevolveMesh) _controller.SetSelectItemToGeometrySurface();
|
|
else throw new NotSupportedException("MeshSetupItemTypeException");
|
|
}
|
|
else _controller.SetSelectByToOff();
|
|
}
|
|
//
|
|
public void SelectionChanged(int[] ids)
|
|
{
|
|
if (MeshSetupItem != null)
|
|
{
|
|
if (MeshSetupItem is MeshingParameters || MeshSetupItem is FeMeshRefinement ||
|
|
MeshSetupItem is ShellGmsh || MeshSetupItem is ThickenShellMesh || MeshSetupItem is TetrahedralGmsh ||
|
|
MeshSetupItem is TransfiniteMesh || MeshSetupItem is ExtrudeMesh || MeshSetupItem is SweepMesh ||
|
|
MeshSetupItem is RevolveMesh)
|
|
{
|
|
if (MeshSetupItem is MeshingParameters mp && !_meshingParametersChanged)
|
|
{
|
|
mp.CopyFrom(GetDefaultMeshingParameters(ids));
|
|
}
|
|
else if (MeshSetupItem is ThickenShellMesh tsm)
|
|
{
|
|
tsm.PartNames = _controller.DisplayedMesh.GetPartNamesFromGeometryIds(ids);
|
|
}
|
|
|
|
MeshSetupItem.CreationIds = ids;
|
|
MeshSetupItem.CreationData = _controller.Selection.DeepClone();
|
|
|
|
// 更新propertyGrid
|
|
propertyGrid.Refresh();
|
|
_propertyItemChanged = true;
|
|
|
|
// this will redraw the selection with correct backfaceCulling
|
|
if (ids.Length != 0)
|
|
{
|
|
HighlightMeshSetupItem();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
throw new NotSupportedException("MeshSetupItemTypeException");
|
|
}
|
|
}
|
|
}
|
|
|
|
// IFormHighlight
|
|
public void Highlight()
|
|
{
|
|
if (!_closing) HighlightMeshSetupItem();
|
|
}
|
|
|
|
// IFormItemSetDataParent
|
|
public bool IsSelectionGeometryBased()
|
|
{
|
|
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
|
|
// All meshing parameters are geometry based
|
|
return true;
|
|
}
|
|
|
|
public bool IsGeometrySelectionIdBased()
|
|
{
|
|
bool defaultMode = _controller.Settings.Pre.GeometrySelectMode == GeometrySelectModeEnum.SelectId;
|
|
// Prepare ItemSetDataEditor - prepare Geometry or Mesh based selection
|
|
MeshSetupItem meshSetupItem = MeshSetupItem;
|
|
//
|
|
if (meshSetupItem.CreationData != null && IsSelectionGeometryBased())
|
|
return meshSetupItem.CreationData.IsGeometryIdBased(defaultMode);
|
|
else return defaultMode;
|
|
}
|
|
}
|
|
}
|