Files
wg_cpso/CPSO/Forms/00_Common/FrmSelectItemSet.cs
2026-03-25 18:20:24 +08:00

515 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using CaeGlobals;
using CPSO.Forms;
namespace CPSO
{
public partial class FrmSelectItemSet : Form
{
// Enum
private enum SelectionType
{
Geometry,
Mesh
}
// Variables
private bool _checkBoxEventRunning;
private ItemSetData _itemSetData;
private Controller _controller;
private SelectionType _prevSelectionType;
private Size _expandedSize;
private Point _btnUndoPosition;
private Point _btnClearPosition;
private bool _initialSetup;
// Properties
public ItemSetData ItemSetData
{
get { return _itemSetData; }
set { if (_itemSetData != value) _itemSetData = value; }
}
// Constructors
public FrmSelectItemSet(Controller controller)
{
//this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
//
InitializeComponent();
//
StringAngleDegConverter angleDegConverter = new StringAngleDegConverter();
tbGeometryEdgeAngle.UnitConverter = angleDegConverter;
tbGeometrySurfaceAngle.UnitConverter = angleDegConverter;
tbEdgeAngle.UnitConverter = angleDegConverter;
tbSurfaceAngle.UnitConverter = angleDegConverter;
//
_checkBoxEventRunning = false;
_controller = controller;
_itemSetData = null;
_prevSelectionType = SelectionType.Geometry;
_expandedSize = Size;
_btnUndoPosition = btnUndoSelection.Location;
_btnClearPosition = btnClearSelection.Location;
_initialSetup = false;
//
SetGeometrySelectMode(_controller.GeometrySelectMode == GeometrySelectModeEnum.SelectId);
//
btnMoreLess_Click(null, null);
}
// Event handlers
private void FrmSelectItemSet_Move(object sender, EventArgs e)
{
return;
//
Point location = Location.DeepClone();
location.X -= ItemSetDataEditor.ParentForm.Width - 15;
ItemSetDataEditor.ParentForm.Location = location;
}
//
private void FrmSelectItemSet_VisibleChanged(object sender, EventArgs e)
{
try
{
//typeof(GroupBox).InvokeMember("DoubleBuffered",
// System.Reflection.BindingFlags.SetProperty |
// System.Reflection.BindingFlags.Instance |
// System.Reflection.BindingFlags.NonPublic,
// null,
// gbFEMesh,
// new object[] { true });
if (this.Visible) ResetSelection(false);
else _controller.SetSelectByToDefault();
}
catch { }
}
private void FrmSelectItemSet_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
//
private void rbSetGeometrySelectMode_CheckedChanged(object sender, EventArgs e)
{
if (sender is RadioButton rb && rb.Checked) // call select geometry mode only once
SetControllerGeometrySelectMode();
}
//
private void rbSelectBy_CheckedChanged(object sender, EventArgs e)
{
// Allow only one running function - disable check box event
if (_checkBoxEventRunning) return;
else _checkBoxEventRunning = true;
// Connect two group boxes of radio buttons
if (sender != null) // radio button check was activated by user
{
// If radio button was checked off - do nothing; this must be
if (!((RadioButton)sender).Checked)
{
_checkBoxEventRunning = false;
return;
}
// Set new states of radio buttons before everything else
if (rbGeometry.Checked && sender != rbGeometry)
rbGeometry.Checked = false;
if (rbGeometryPart.Checked && sender != rbGeometryPart)
rbGeometryPart.Checked = false;
if (rbGeometryEdgeAngle.Checked && sender != rbGeometryEdgeAngle)
rbGeometryEdgeAngle.Checked = false;
if (rbGeometrySurfaceAngle.Checked && sender != rbGeometrySurfaceAngle)
rbGeometrySurfaceAngle.Checked = false;
//
if (rbNode.Checked && sender != rbNode) rbNode.Checked = false;
if (rbElement.Checked && sender != rbElement) rbElement.Checked = false;
if (rbEdge.Checked && sender != rbEdge) rbEdge.Checked = false;
if (rbSurface.Checked && sender != rbSurface) rbSurface.Checked = false;
if (rbPart.Checked && sender != rbPart) rbPart.Checked = false;
if (rbEdgeAngle.Checked && sender != rbEdgeAngle) rbEdgeAngle.Checked = false;
if (rbSurfaceAngle.Checked && sender != rbSurfaceAngle) rbSurfaceAngle.Checked = false;
if (rbId.Checked && sender != rbId) rbId.Checked = false;
}
// Determine selection type and change of selection type
bool selectionTypeChanged;
SelectionType currentSelectionType;
if (rbGeometry.Checked || rbGeometryPart.Checked || rbGeometryEdgeAngle.Checked || rbGeometrySurfaceAngle.Checked)
{
selectionTypeChanged = _prevSelectionType != SelectionType.Geometry;
currentSelectionType = SelectionType.Geometry;
}
else
{
selectionTypeChanged = _prevSelectionType != SelectionType.Mesh;
currentSelectionType = SelectionType.Mesh;
}
// Clear selection - if geometry selection type changed by the USER:
// sender != null
// Visible = true - user action
if (!_initialSetup && sender != null && Visible && selectionTypeChanged)
_controller.ClearSelectionHistoryAndCallSelectionChanged();
// Enable/disable Textboxes
tbGeometryEdgeAngle.Enabled = rbGeometryEdgeAngle.Checked;
tbGeometrySurfaceAngle.Enabled = rbGeometrySurfaceAngle.Checked;
tbSurfaceAngle.Enabled = rbSurfaceAngle.Checked;
tbEdgeAngle.Enabled = rbEdgeAngle.Checked;
tbIds.Enabled = rbId.Checked;
// Enable/disable buttons
btnAddId.Enabled = rbId.Checked;
btnRemoveId.Enabled = rbId.Checked;
// Check geometry selection mode
rbSelectionByLocation.Enabled = currentSelectionType == SelectionType.Geometry;
rbSelectionByID.Enabled = currentSelectionType == SelectionType.Geometry;
// Check All and Invert buttons
btnSelectAll.Enabled = currentSelectionType == SelectionType.Mesh;
btnInvertSelection.Enabled = currentSelectionType == SelectionType.Mesh;
//
vtkSelectBy selectBy;
if (rbGeometry.Checked) selectBy = vtkSelectBy.Geometry;
else if (rbGeometryPart.Checked) selectBy = vtkSelectBy.GeometryPart;
else if (rbGeometryEdgeAngle.Checked)
{
selectBy = vtkSelectBy.GeometryEdgeAngle;
SetSelectionAngle(tbGeometryEdgeAngle);
}
else if (rbGeometrySurfaceAngle.Checked)
{
selectBy = vtkSelectBy.GeometrySurfaceAngle;
SetSelectionAngle(tbGeometrySurfaceAngle);
}
else if (rbNode.Checked) selectBy = vtkSelectBy.Node;
else if (rbElement.Checked) selectBy = vtkSelectBy.Element;
else if (rbEdge.Checked) selectBy = vtkSelectBy.Edge;
else if (rbSurface.Checked) selectBy = vtkSelectBy.Surface;
else if (rbPart.Checked) selectBy = vtkSelectBy.Part;
else if (rbEdgeAngle.Checked)
{
selectBy = vtkSelectBy.EdgeAngle;
SetSelectionAngle(tbEdgeAngle);
}
else if (rbSurfaceAngle.Checked)
{
selectBy = vtkSelectBy.SurfaceAngle;
SetSelectionAngle(tbSurfaceAngle);
}
else if (rbId.Checked) selectBy = vtkSelectBy.Id;
else selectBy = vtkSelectBy.Default;
// Set selection
_controller.SelectBy = selectBy;
// Set previous selection type
_prevSelectionType = currentSelectionType;
// Enable check box event
_checkBoxEventRunning = false;
}
private void btnUndoSelection_Click(object sender, EventArgs e)
{
_controller.RemoveLastSelectionNode();
}
private void btnClearSelection_Click(object sender, EventArgs e)
{
_controller.ClearSelectionHistoryAndCallSelectionChanged();
}
private void btnMoreLess_Click(object sender, EventArgs e)
{
this.gbFEMesh.SuspendLayout();
this.gbGeometry.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
Size size;
if (btnMoreLess.Text == "More")
{
btnMoreLess.Text = "Less";
size = _expandedSize;
//
Point locationAll = btnSelectAll.Location;
Point locationInvert = btnInvertSelection.Location;
int delta = locationInvert.Y - locationAll.Y;
btnUndoSelection.Location = locationInvert;
btnUndoSelection.Top += delta;
btnClearSelection.Location = locationInvert;
btnClearSelection.Top += 2 * delta;
}
else
{
btnMoreLess.Text = "More";
size = new Size(207, 325);
//
btnUndoSelection.Location = _btnUndoPosition;
btnClearSelection.Location = _btnClearPosition;
//
Invalidate();
}
//
this.MaximumSize = size;
this.MinimumSize = size;
this.Size = size;
//
this.gbFEMesh.ResumeLayout();
this.gbGeometry.ResumeLayout();
this.panel1.ResumeLayout();
this.ResumeLayout();
}
//
private void btnSelectAll_Click(object sender, EventArgs e)
{
_controller.AddSelectionNode(new SelectionNodeIds(vtkSelectOperation.None, true), true, true);
}
private void btnInvertSelection_Click(object sender, EventArgs e)
{
_controller.AddSelectionNode(new SelectionNodeInvert(), true, true);
}
private void btnAddId_Click(object sender, EventArgs e)
{
try
{
int[] ids = tbIds.Values;
if (ids != null)
{
SelectionNodeIds selectionNodeIds = new SelectionNodeIds(vtkSelectOperation.Add, false, ids);
_controller.AddSelectionNode(selectionNodeIds, true, true);
}
else
{
MessageBoxes.ShowError("The item id is not a valid integer number.");
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
private void btnRemoveId_Click(object sender, EventArgs e)
{
try
{
int[] ids = tbIds.Values;
if (ids != null)
{
SelectionNodeIds selectionNodeIds = new SelectionNodeIds(vtkSelectOperation.Subtract, false, ids);
_controller.AddSelectionNode(selectionNodeIds, true, true);
}
else
{
MessageBoxes.ShowError("The item id is not a valid integer number.");
}
}
catch (Exception ex)
{
ExceptionTools.Show(this, ex);
}
}
//
private void btnCancel_Click(object sender, EventArgs e)
{
btnClearSelection_Click(null, null);
Hide();
}
private void btnOK_Click(object sender, EventArgs e)
{
_itemSetData.ItemIds = _controller.GetSelectionIds();
Hide();
}
//public void Hide()
//{
// base.Hide();
//}
//
private void tbAngle_KeyUp(object sender, KeyEventArgs e)
{
if (sender is UserControls.UnitAwareTextBox uatb) _controller.SetSelectAngle(uatb.Value);
}
private void tbId_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true; // no beep
}
}
// Methods
public void ShowIfHidden(IWin32Window owner)
{
if (!this.Visible)
{
ItemSetDataEditor.SelectionForm.ResetLocation();
ItemSetDataEditor.SelectionForm.Show(owner);
}
}
public void ResetSelection(bool forceInitialize)
{
try
{
_initialSetup = true;
//
if (ItemSetDataEditor.ParentForm is IFormItemSetDataParent fdsp)
{
SetGeometrySelection(fdsp.IsSelectionGeometryBased(), fdsp.IsGeometrySelectionIdBased(), forceInitialize);
}
//
rbSelectBy_CheckedChanged(null, null);
//
SetControllerGeometrySelectMode();
}
catch { }
finally { _initialSetup = false; }
}
public void ResetLocation()
{
Point location = ItemSetDataEditor.ParentForm.Location.DeepClone();
location.X += ItemSetDataEditor.ParentForm.Width - 15 + 3;
Location = location;
}
private void SetControllerGeometrySelectMode()
{
bool update = false;
//
if (_controller.GeometrySelectMode != GeometrySelectModeEnum.SelectLocation && rbSelectionByLocation.Checked)
{
_controller.GeometrySelectMode = GeometrySelectModeEnum.SelectLocation;
update = true;
}
else if (_controller.GeometrySelectMode != GeometrySelectModeEnum.SelectId && rbSelectionByID.Checked)
{
_controller.GeometrySelectMode = GeometrySelectModeEnum.SelectId;
update = true;
}
//
if (update && !_initialSetup && Visible)
_controller.ClearSelectionHistoryAndCallSelectionChanged();
}
private void SetGeometrySelectMode(bool selectGeometryByIds)
{
rbSelectionByLocation.CheckedChanged -= rbSetGeometrySelectMode_CheckedChanged;
rbSelectionByID.CheckedChanged -= rbSetGeometrySelectMode_CheckedChanged;
//
rbSelectionByLocation.Checked = !selectGeometryByIds;
rbSelectionByID.Checked = selectGeometryByIds;
//
rbSelectionByLocation.CheckedChanged += rbSetGeometrySelectMode_CheckedChanged;
rbSelectionByID.CheckedChanged += rbSetGeometrySelectMode_CheckedChanged;
//
SetControllerGeometrySelectMode();
}
public void SetGeometrySelection(bool selectGeometry, bool selectGeometryByIds, bool forceInitialize)
{
if (selectGeometry)
{
// Hide mesh selection
if (btnMoreLess.Enabled && btnMoreLess.Text == "Less") btnMoreLess_Click(null, null);
//
if (forceInitialize)
{
if (rbGeometry.Checked && rbSelectionByID.Checked) return;
else
{
rbGeometry.Checked = true;
SetGeometrySelectMode(true);
}
}
else
{
if (rbGeometry.Checked || rbGeometryPart.Checked || rbGeometryEdgeAngle.Checked ||
rbGeometrySurfaceAngle.Checked)
{
if (rbSelectionByID.Checked == selectGeometryByIds) return;
else SetGeometrySelectMode(selectGeometryByIds);
}
else
{
rbGeometry.Checked = true;
SetGeometrySelectMode(selectGeometryByIds);
}
}
}
else
{
// Show mesh selection
if (btnMoreLess.Enabled && btnMoreLess.Text == "More") btnMoreLess_Click(null, null);
//
if (forceInitialize)
{
if (rbNode.Checked) return;
}
else
{
if (rbNode.Checked || rbElement.Checked || rbEdge.Checked || rbSurface.Checked || rbPart.Checked ||
rbEdgeAngle.Checked || rbSurfaceAngle.Checked || rbId.Checked) return;
}
//
rbNode.Checked = true;
}
}
public void SetOnlyGeometrySelection(bool onlyGeometrySelection, bool forceInitialize = true)
{
if (onlyGeometrySelection)
{
bool selectGeometryByIds = rbSelectionByID.Checked;
SetGeometrySelection(true, selectGeometryByIds, forceInitialize);
if (btnMoreLess.Text == "Less") btnMoreLess_Click(null, null);
btnMoreLess.Enabled = false;
}
else
{
btnMoreLess.Enabled = true;
}
}
//
private void SetSelectionAngle(UserControls.UnitAwareTextBox uatbAngle)
{
try
{
_controller.SetSelectAngle(uatbAngle.Value);
}
catch
{ }
}
//
// Disable close X button
protected override CreateParams CreateParams
{
get
{
CreateParams myCp = base.CreateParams;
const int CP_NOCLOSE_BUTTON = 0x200;
myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
return myCp;
}
}
}
}