337 lines
13 KiB
C#
337 lines
13 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using CaeMesh;
|
|
using CaeGlobals;
|
|
|
|
|
|
namespace CPSO.Forms
|
|
{
|
|
public partial class FrmSectionView : UserControls.PrePoMaxChildForm, IFormBase
|
|
{
|
|
// Variables
|
|
private Controller _controller;
|
|
private SectionViewParameters _sectionViewParameters;
|
|
private bool _pause;
|
|
private Vec3D _projHalfSize;
|
|
private Octree.Plane _plane;
|
|
|
|
|
|
// Properties
|
|
|
|
|
|
// Constructors
|
|
public FrmSectionView(Controller controller)
|
|
{
|
|
InitializeComponent();
|
|
//
|
|
_controller = controller;
|
|
_sectionViewParameters = new SectionViewParameters();
|
|
propertyGrid.SelectedObject = _sectionViewParameters;
|
|
_pause = false;
|
|
//
|
|
propertyGrid.SetLabelColumnWidth(1.75);
|
|
}
|
|
|
|
|
|
// Event handlers
|
|
private void FrmSectionView_FormClosing(object sender, FormClosingEventArgs e)
|
|
{
|
|
if (e.CloseReason == CloseReason.UserClosing)
|
|
{
|
|
e.Cancel = true;
|
|
btnCancel_Click(null, null);
|
|
}
|
|
}
|
|
private void FrmSectionView_VisibleChanged(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (this.Visible)
|
|
{
|
|
_pause = true;
|
|
_plane = _controller.GetSectionViewPlane();
|
|
if (_plane == null)
|
|
{
|
|
_sectionViewParameters.Point = _controller.GetSectionViewBBCenter().Coor;
|
|
_sectionViewParameters.Normal = _controller.GetDefaultSectionViewNormal();
|
|
//
|
|
PointOrNormalChanged();
|
|
}
|
|
else
|
|
{
|
|
_sectionViewParameters.Point = _plane.Point.Coor.ToArray(); // keep plane data for Cancel
|
|
_sectionViewParameters.Normal = _plane.Normal.Coor.ToArray(); // keep plane data for Cancel
|
|
SetScrollBarPositionFromPoint();
|
|
}
|
|
//
|
|
_controller.CreateSectionView(_sectionViewParameters.Point, _sectionViewParameters.Normal,
|
|
_sectionViewParameters.LightenColors, _sectionViewParameters.SectionColor);
|
|
//
|
|
this.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
if (DialogResult == DialogResult.Abort) _controller.RemoveSectionView();
|
|
else if (DialogResult == DialogResult.Cancel || DialogResult == DialogResult.None)
|
|
{
|
|
if (_plane == null)
|
|
{
|
|
_controller.RemoveSectionView();
|
|
}
|
|
else
|
|
{
|
|
_sectionViewParameters.Point = _plane.Point.Coor;
|
|
_sectionViewParameters.Normal = _plane.Normal.Coor;
|
|
UpdateSectionView();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch
|
|
{ }
|
|
finally
|
|
{
|
|
_pause = false;
|
|
}
|
|
}
|
|
|
|
private void propertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
|
|
{
|
|
PointOrNormalChanged();
|
|
}
|
|
|
|
private void resetToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
_sectionViewParameters.Clear();
|
|
_sectionViewParameters.Point = _controller.GetSectionViewBBCenter().Coor;
|
|
//
|
|
PointOrNormalChanged();
|
|
}
|
|
private void xDirectionToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
_sectionViewParameters.Normal = new double[] { 1, 0, 0 };
|
|
//
|
|
PointOrNormalChanged();
|
|
}
|
|
private void yDirectionToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
_sectionViewParameters.Normal = new double[] { 0, 1, 0 };
|
|
//
|
|
PointOrNormalChanged();
|
|
}
|
|
private void zDirectionToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
_sectionViewParameters.Normal = new double[] { 0, 0, 1 };
|
|
//
|
|
PointOrNormalChanged();
|
|
}
|
|
private void reverseDirectionToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
_sectionViewParameters.Normal[0] = -_sectionViewParameters.Normal[0];
|
|
_sectionViewParameters.Normal[1] = -_sectionViewParameters.Normal[1];
|
|
_sectionViewParameters.Normal[2] = -_sectionViewParameters.Normal[2];
|
|
//
|
|
PointOrNormalChanged();
|
|
}
|
|
|
|
private void hsbPosition_Scroll(object sender, ScrollEventArgs e)
|
|
{
|
|
if (e.Type == ScrollEventType.EndScroll) return;
|
|
//
|
|
UpdateProjHalfSize();
|
|
//
|
|
double ratio = (double)(hsbPosition.Value - hsbPosition.Minimum) / (hsbPosition.Maximum - hsbPosition.Minimum);
|
|
ratio = 2 * ratio - 1;
|
|
Vec3D point = _controller.GetSectionViewBBCenter() + _projHalfSize * ratio;
|
|
point.X = Tools.RoundToSignificantDigits(point.X, 6);
|
|
point.Y = Tools.RoundToSignificantDigits(point.Y, 6);
|
|
point.Z = Tools.RoundToSignificantDigits(point.Z, 6);
|
|
_sectionViewParameters.Point = point.Coor;
|
|
//
|
|
timerUpdate.Start(); // use timer to speed things up
|
|
}
|
|
private void btnOK_Click(object sender, EventArgs e)
|
|
{
|
|
this.DialogResult = DialogResult.OK;
|
|
Hide();
|
|
}
|
|
private void btnDisable_Click(object sender, EventArgs e)
|
|
{
|
|
this.DialogResult = DialogResult.Abort;
|
|
Hide();
|
|
}
|
|
private void btnCancel_Click(object sender, EventArgs e)
|
|
{
|
|
this.DialogResult = DialogResult.Cancel;
|
|
Hide();
|
|
}
|
|
|
|
private void timerUpdate_Tick(object sender, EventArgs e)
|
|
{
|
|
timerUpdate.Stop();
|
|
UpdateSectionView();
|
|
}
|
|
|
|
// Methods
|
|
|
|
// IFormBase
|
|
public bool PrepareForm(string stepName, string partToEditName)
|
|
{
|
|
this.DialogResult = DialogResult.None;
|
|
// Clear selection
|
|
_controller.ClearSelectionHistoryAndCallSelectionChanged();
|
|
// Disable selection
|
|
_controller.SetSelectByToOff();
|
|
//
|
|
_sectionViewParameters.Clear();
|
|
// Get start point grid item
|
|
GridItem gi = propertyGrid.EnumerateAllItems().First((item) =>
|
|
item.PropertyDescriptor != null &&
|
|
item.PropertyDescriptor.Name == nameof(_sectionViewParameters.PointItemSet));
|
|
// Select it
|
|
gi.Select();
|
|
//
|
|
propertyGrid.Refresh();
|
|
//
|
|
propertyGrid.BuildAutocompleteMenu(_controller.GetAllParameterNames());
|
|
//
|
|
return true;
|
|
}
|
|
//
|
|
public void PickedIds(int[] ids)
|
|
{
|
|
bool selectionFinished = false;
|
|
if (ids != null)
|
|
{
|
|
string propertyName = propertyGrid.SelectedGridItem.PropertyDescriptor.Name;
|
|
if (propertyName == nameof(_sectionViewParameters.PointItemSet))
|
|
{
|
|
if (ids.Length == 0)
|
|
{
|
|
selectionFinished = true;
|
|
}
|
|
else if (ids.Length == 1)
|
|
{
|
|
FeNode node = _controller.DisplayedMesh.Nodes[ids[0]];
|
|
//
|
|
_sectionViewParameters.X = CaeGlobals.Tools.RoundToSignificantDigits(node.X, 6);
|
|
_sectionViewParameters.Y = CaeGlobals.Tools.RoundToSignificantDigits(node.Y, 6);
|
|
_sectionViewParameters.Z = CaeGlobals.Tools.RoundToSignificantDigits(node.Z, 6);
|
|
//
|
|
selectionFinished = true;
|
|
}
|
|
}
|
|
else if (propertyName == nameof(_sectionViewParameters.NormalItemSet))
|
|
{
|
|
if (ids.Length == 2)
|
|
{
|
|
FeNode start = _controller.DisplayedMesh.Nodes[ids[0]];
|
|
FeNode end = _controller.DisplayedMesh.Nodes[ids[1]];
|
|
//
|
|
_sectionViewParameters.Nx = CaeGlobals.Tools.RoundToSignificantDigits(end.X - start.X, 6);
|
|
_sectionViewParameters.Ny = CaeGlobals.Tools.RoundToSignificantDigits(end.Y - start.Y, 6);
|
|
_sectionViewParameters.Nz = CaeGlobals.Tools.RoundToSignificantDigits(end.Z - start.Z, 6);
|
|
//
|
|
selectionFinished = true;
|
|
}
|
|
}
|
|
}
|
|
//
|
|
if (selectionFinished)
|
|
{
|
|
this.Enabled = true;
|
|
_controller.ClearSelectionHistoryAndCallSelectionChanged();
|
|
_controller.SetSelectByToOff();
|
|
_controller.Selection.SelectItem = vtkSelectItem.None;
|
|
//
|
|
PointOrNormalChanged();
|
|
//
|
|
UpdateSectionView();
|
|
}
|
|
}
|
|
//
|
|
private void PointOrNormalChanged()
|
|
{
|
|
SetScrollBarPositionFromPoint();
|
|
timerUpdate.Start();
|
|
}
|
|
private void UpdateProjHalfSize()
|
|
{
|
|
double[] box = _controller.GetBoundingBox();
|
|
//
|
|
Vec3D v = new Vec3D(); // half box diagonal
|
|
v.X = (box[1] - box[0]) / 2;
|
|
v.Y = (box[3] - box[2]) / 2;
|
|
v.Z = (box[5] - box[4]) / 2;
|
|
//
|
|
Vec3D n = new Vec3D(_sectionViewParameters.Normal);
|
|
n.Abs();
|
|
n.Normalize();
|
|
// Project 1/2 diagonal on the positive normal
|
|
double l = Vec3D.DotProduct(v, n) * 1.05;
|
|
if (l == 0) l = 1; // 2D
|
|
//
|
|
_projHalfSize = new Vec3D(_sectionViewParameters.Normal);
|
|
_projHalfSize.Normalize();
|
|
_projHalfSize = l * _projHalfSize;
|
|
}
|
|
private void SetScrollBarPositionFromPoint()
|
|
{
|
|
try
|
|
{
|
|
UpdateProjHalfSize();
|
|
//
|
|
Vec3D c = _controller.GetSectionViewBBCenter();
|
|
Vec3D n = new Vec3D(_sectionViewParameters.Normal);
|
|
n.Normalize();
|
|
//
|
|
Vec3D p = new Vec3D(_sectionViewParameters.Point);
|
|
Vec3D v = p - c;
|
|
//
|
|
double l = Vec3D.DotProduct(v, n);
|
|
double ratio = l / _projHalfSize.Len;
|
|
//
|
|
if (ratio > 1) ratio = 1;
|
|
else if (ratio < -1) ratio = -1;
|
|
//
|
|
ratio = (ratio + 1) / 2; // to iterval from 0 to 1;
|
|
//
|
|
hsbPosition.Value = (int)Math.Round((hsbPosition.Maximum - hsbPosition.Minimum) * ratio, MidpointRounding.AwayFromZero);
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
private void UpdateSectionView()
|
|
{
|
|
try
|
|
{
|
|
if (_pause) return;
|
|
//
|
|
propertyGrid.Refresh(); // must be here to update values
|
|
//
|
|
//System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
|
|
//watch.Start();
|
|
//
|
|
UpdateProjHalfSize();
|
|
//
|
|
_sectionViewParameters = (SectionViewParameters)propertyGrid.SelectedObject;
|
|
//
|
|
_controller.UpdateSectionView(_sectionViewParameters.Point, _sectionViewParameters.Normal,
|
|
_sectionViewParameters.LightenColors, _sectionViewParameters.SectionColor);
|
|
//
|
|
//System.Diagnostics.Debug.WriteLine("Section cut time: " + DateTime.Now.ToLongTimeString() + " Duration: " + watch.ElapsedMilliseconds);
|
|
}
|
|
catch
|
|
{ }
|
|
}
|
|
|
|
}
|
|
}
|