515 lines
20 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|