/*============================================================================= Project: SharpImage Module: siFormSelection.cs Language: C# Author: Dan Mueller Date: $Date: 2007-07-06 10:57:00 +1000 (Fri, 06 Jul 2007) $ Revision: $Revision: 2 $ Copyright (c) Queensland University of Technology (QUT) 2007. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =============================================================================*/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using SharpImage.Rendering; namespace SharpImage.Forms { public partial class siFormSelection : siFormTool { #region Form Methods //===================================================================== private List m_Renderers = new List(); /// /// Public constructor. /// /// public siFormSelection(List renderers): base(renderers[0]) { this.m_Renderers = renderers; // Init controls InitializeComponent(); // Add the Point Landmark Selection menu item ToolStripMenuItem menuAddPoints = new ToolStripMenuItem("Add Points"); menuAddPoints.Click += new EventHandler(menuAddPoints_Click); this.menuItem.Items.Add(menuAddPoints); // Add the Circle Selection menu item ToolStripMenuItem menuAddCircle = new ToolStripMenuItem("Add Circle"); menuAddCircle.Click += new EventHandler(menuAddCircle_Click); this.menuItem.Items.Add(menuAddCircle); // Add the Cylinder Selection menu item if (this.Renderer.Inputs[0] is itk.itkImageBase && (this.Renderer.Inputs[0] as itk.itkImageBase).Dimension == 3) { ToolStripMenuItem menuAddCylinder = new ToolStripMenuItem("Add Cylinder"); menuAddCylinder.Click += new EventHandler(menuAddCylinder_Click); this.menuItem.Items.Add(menuAddCylinder); } // Add the Region Selection menu item ToolStripMenuItem menuAddRegion = new ToolStripMenuItem("Add Region"); menuAddRegion.Click += new EventHandler(menuAddRegion_Click); this.menuItem.Items.Add(menuAddRegion); // Add the Polygon Selection menu item ToolStripMenuItem menuAddPolygon = new ToolStripMenuItem("Add Polygon"); menuAddPolygon.Click += new EventHandler(menuAddPolygon_Click); this.menuItem.Items.Add(menuAddPolygon); // Add the Remove menu item ToolStripMenuItem menuRemove = new ToolStripMenuItem("Remove"); menuRemove.Click += new EventHandler(menuRemove_Click); this.menuItem.Items.Add(menuRemove); // Add Form handlers this.FormClosed += new FormClosedEventHandler(FormSelection_FormClosed); } /// /// Closed handler. /// /// /// void FormSelection_FormClosed(object sender, FormClosedEventArgs e) { // Remove actors foreach (siSelection actor in this.Selections) foreach (siRenderer renderer in this.m_Renderers) if (renderer != null && actor != null) renderer.RemoveActor(actor); } //===================================================================== #endregion #region Properties //===================================================================== /// /// Gets the user created selections. /// public List Selections { get { List selections = new List(); foreach (ListViewItem item in this.listSelection.Items) selections.Add(item.Tag as siSelection); return selections; } } //===================================================================== #endregion #region Private Methods //===================================================================== /// /// Returns the currently selected selection from the list view. /// /// private siSelection GetCurrentSelection() { if (this.listSelection.SelectedItems.Count == 1) return this.listSelection.SelectedItems[0].Tag as siSelection; else return null; } private void menuAddPoints_Click(object sender, EventArgs e) { // Create actor siPointsSelection selection = new siPointsSelection(); selection.PointAdded += new siPointsSelection.siPointsHandler(selection_PointAdded); selection.PointSelected += new siPointsSelection.siPointsHandler(selection_PointSelected); selection.ExitedAdditionMode += new siActor.siActorHandler(selection_ExitedAdditionMode); selection.EnterAdditionMode(); this.listSelection.Enabled = false; // Add actor to list of selections ListViewItem item = new ListViewItem(selection.ToString()); item.Tag = selection; this.listSelection.Items.Add(item); // Add actor to renderers this.AddActorToRenderers(selection); } void selection_PointSelected(siPointsSelection sender, itk.itkPoint point) { this.RefreshSelectionInListView(sender); } void selection_PointAdded(siPointsSelection sender, itk.itkPoint point) { sender.SelectPoint(null); this.RefreshSelectionInListView(sender); } void selection_ExitedAdditionMode(siActor sender) { this.listSelection.Enabled = true; } void selection_Modified(siActor sender, bool partial) { this.BringSelectionToFront(sender); this.RefreshSelectionInListView(sender); } private void menuAddCircle_Click(object sender, EventArgs e) { // Create actor itk.itkImageBase input = this.Renderer.Inputs[0] as itk.itkImageBase; siCircleSelection selection = new siCircleSelection(input); selection.Modified += new siActor.siActorModifiedHandler(selection_Modified); // Add actor to list of selections ListViewItem item = new ListViewItem(selection.ToString()); item.Tag = selection; this.listSelection.Items.Add(item); // Add actor to renderers this.AddActorToRenderers(selection); } private void menuAddCylinder_Click(object sender, EventArgs e) { // Create actor itk.itkImageBase input = this.Renderer.Inputs[0] as itk.itkImageBase; siCircleSelection selection = new siCircleSelection(input); selection.ShapeType = siShapeSelection.ShapeTypeEnum.Extrusion; selection.Modified += new siActor.siActorModifiedHandler(selection_Modified); // Add actor to list of selections ListViewItem item = new ListViewItem(selection.ToString()); item.Tag = selection; this.listSelection.Items.Add(item); // Add actor to renderers this.AddActorToRenderers(selection); } private void menuAddRegion_Click(object sender, EventArgs e) { // Create actor itk.itkImageBase input = this.Renderer.Inputs[0] as itk.itkImageBase; siRegionSelection selection = new siRegionSelection(input); selection.Modified += new siActor.siActorModifiedHandler(selection_Modified); // Add actor to list of selections ListViewItem item = new ListViewItem(selection.ToString()); item.Tag = selection; this.listSelection.Items.Add(item); // Add actor to renderers this.AddActorToRenderers(selection); } private void menuAddPolygon_Click(object sender, EventArgs e) { // Clear the key down event. // This is needed because for some reason the Ctrl+Shift+C keypress is // sent to the renderer when the command console is shown, but it is not // cleared in the OnKeyUp event (the OnKeyDown event is called, but not // the OnKeyUp???) this.Renderer.Metadata["KeyDown"] = null; // Create actor itk.itkImageBase input = this.Renderer.Inputs[0] as itk.itkImageBase; int extrusionDimension = (int)(input.Dimension - 1); siPolygonSelection selection = new siPolygonSelection(input, extrusionDimension); selection.Modified += new siActor.siActorModifiedHandler(selection_Modified); // Add actor to list of selections ListViewItem item = new ListViewItem(selection.ToString()); item.Tag = selection; this.listSelection.Items.Add(item); // Add actor to renderers this.AddActorToRenderers(selection); } private void listSelection_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back || e.KeyCode == Keys.D) this.RemoveCurrentSelection(); } private void menuRemove_Click(object sender, EventArgs e) { this.RemoveCurrentSelection(); } private void RemoveCurrentSelection() { // Check there is a selected item if (this.listSelection.Items.Count == 0 || this.listSelection.SelectedItems.Count == 0) return; // Remove the selected item foreach (siRenderer renderer in this.m_Renderers) renderer.RemoveActor(this.listSelection.SelectedItems[0].Tag as siActor); this.listSelection.Items.Remove(this.listSelection.SelectedItems[0]); this.listSelection.SelectedIndices.Clear(); // Select the last item if (this.listSelection.Items.Count >= 1) this.listSelection.Items[this.listSelection.Items.Count - 1].Selected = true; } private void cmdClear_Click(object sender, EventArgs e) { foreach (siSelection actor in this.Selections) foreach (siRenderer renderer in this.m_Renderers) renderer.RemoveActor(actor); this.listSelection.Items.Clear(); } private void BringSelectionToFront(siActor selection) { foreach (siRenderer renderer in this.m_Renderers) renderer.BringActorToFront(selection); } private void RefreshSelectionInListView(siActor selection) { foreach (ListViewItem item in this.listSelection.Items) { if (item.Tag == selection) { item.Text = selection.ToString(); this.listSelection.RedrawItems(item.Index, item.Index, false); break; } } } private void AddActorToRenderers(siSelection selection) { foreach (siRenderer renderer in this.m_Renderers) renderer.AddActorToFront(selection); } //===================================================================== #endregion } }