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 { } } } }