www.pudn.com > V3D_Viewer_1.01_SourceCode.zip > V3D_Viewer.cs


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using vtk; 
 
namespace V3D_Viewer 
{ 
    public partial class V3D_Viewer : Form 
    { 
        readVoxelData VolumeFileObj = new readVoxelData(); 
        Siteplanes SiteplanesObj=new Siteplanes();  
        RenderPlanes RenderPlanesObj=new RenderPlanes();  
        RenderVolume RenderVolumeObj=new RenderVolume(); 
        RenderMarchingCubes RenderMarchingCubesObj=new RenderMarchingCubes(); 
        Histogram HistogramObj=new Histogram(); 
        // Selected x,y,z slices in the small side windows 
        int slizez = 0; int slizey = 0; int slizex = 0; 
 
        // Used pixel space by visible form objects 
        int vtkspacex = 0; int vtkspacey=0; 
         
        int CurrentRender = -1; // The current type of render 
 
        // The format of the selected volume file 
        // 0 = V3D , 1 = Dicom 
        int readtype = 0;  
         
        string SelectedPath = ""; // Selected Path in Dicom file dialog 
 
        public V3D_Viewer() 
        { 
            InitializeComponent(); 
 
            // Send this form as object to the classes,  
            // so the classes can control the form 
         
            RenderPlanesObj.setParent(this); 
            RenderVolumeObj.setParent(this); 
            RenderMarchingCubesObj.setParent(this); 
 
            // Setting the Initial Folder of the File Dialogs 
            // to the application folder or example data folder 
            string exedir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
            string sampledir=exedir+"\\Example Data"; 
            if(System.IO.Directory.Exists(sampledir)) 
            { 
                openDicomFileDialog.InitialDirectory = sampledir; 
                openV3DFileDialog.InitialDirectory = sampledir; 
            } 
            else  
            { 
                openDicomFileDialog.InitialDirectory = exedir; 
                openV3DFileDialog.InitialDirectory = exedir; 
            } 
 
            // Calculation of used space by visible form objects 
            // need in case of windows size change. 
            Size wsize = this.Size; 
            Size vtksize = vtkFormsWindowControlMain.Size; 
            vtkspacex = wsize.Width - vtksize.Width; 
            vtkspacey = wsize.Height - vtksize.Height; 
        } 
 
        private void openToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            ConsoleText("File Dialog Open\r\n"); 
            openV3DFileDialog.ShowDialog(); 
        } 
 
 
        private void renderingButton1_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setRAY(); 
            ShowBusy(false); 
        } 
 
        private void renderingButton2_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setMIP(); 
            ShowBusy(false); 
        } 
 
        private void renderingButton3_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setTEXT(); 
            ShowBusy(false); 
        } 
 
        private void openFileDialog1_FileOk(object sender, CancelEventArgs e) 
        { 
            ConsoleText("\r\n----------------------------------------------------------------------------\r\n"); 
            stopCurrentRender(); 
            string filename=openV3DFileDialog.FileName; 
            ConsoleText("File name : " + filename + "\r\n"); 
            readtype = 0; 
            RenderToolStripMenuItem.Enabled = true; 
            LoadTimer.Enabled = true; ShowBusy(true); 
        } 
 
        void UpdateSliceNumber() 
        { 
            slizex = (int)((double)trackBarx.Value * (double)VolumeFileObj.dimensions[0] / 100);  
            slizey = (int)((double)trackBary.Value * (double)VolumeFileObj.dimensions[1] / 100); 
            slizez = (int)((double)trackBarz.Value * (double)VolumeFileObj.dimensions[2] / 100); 
        } 
 
        private void LoadProcess() 
        { 
            ShowBusy(true); 
            if (readtype == 0) 
            { 
                VolumeFileObj.ReadVTKV3D(openV3DFileDialog.FileName); 
            } 
            else 
            { 
                VolumeFileObj.readVTKDicom(SelectedPath); 
            } 
 
            ConsoleText(VolumeFileObj.info); 
            ConsoleText("\r\nVTK voxel data connected \r\n"); 
             
            UpdateSliceNumber(); 
            SiteplanesObj.SetWindows(vtkFormsWindowControlX.GetRenderWindow(), vtkFormsWindowControlY.GetRenderWindow(), vtkFormsWindowControlZ.GetRenderWindow()); 
            SiteplanesObj.SetParameters(slizex, slizey, slizez); 
            SiteplanesObj.rendersiteplanes(VolumeFileObj.VoxelData); 
            ConsoleText("\r\nVTK displayed the slices \r\n"); 
             
            HistogramObj.SetWindows(vtkFormsWindowControlHistogram.GetRenderWindow()); 
            HistogramObj.renderHistogram(VolumeFileObj.VoxelData); 
            ConsoleText(HistogramObj.info); 
             
            CurrentRender = 0; 
            RenderPlanesProcess(); 
            ShowBusy(false); 
            GC.Collect(); 
            //HistogramObj.starteventloop(); 
        } 
 
        public void ConsoleText(string dtext) 
        { 
            DebugOuput.Text += dtext; 
            DebugOuput.SelectionStart = DebugOuput.Text.Length; 
            DebugOuput.ScrollToCaret(); 
            DebugOuput.Refresh(); 
        } 
 
        private void exitToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            this.Close(); 
        } 
 
        private void Form1_Load(object sender, EventArgs e) 
        { 
         } 
 
        private void trackBarx_Scroll(object sender, EventArgs e) 
        { 
            UpdateSliceNumber(); 
            if (CurrentRender == 0) RenderPlanesObj.updateX(slizex); 
            SiteplanesObj.updateX(slizex); 
        } 
 
        private void trackBary_Scroll(object sender, EventArgs e) 
        { 
            UpdateSliceNumber(); 
            if (CurrentRender == 0) RenderPlanesObj.updateY(slizey); 
            SiteplanesObj.updateY(slizey); 
        } 
 
        private void trackBarz_Scroll(object sender, EventArgs e) 
        { 
            UpdateSliceNumber(); 
            if(CurrentRender==0) RenderPlanesObj.updateZ(slizez); 
            SiteplanesObj.updateZ(slizez); 
        } 
 
         
        private void MarchingCubesToolStripMenuItem1_Click(object sender, EventArgs e) 
        { 
 
            if (CurrentRender != 2) 
            { 
                stopCurrentRender(); 
                CurrentRender = 2; 
                IsoSurfacePanel.Visible = true; 
                IsoSurfacePanel.Enabled = true; 
                RenderMarchingCubeProcess(); 
            } 
        } 
 
        private void PlanesToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            if (CurrentRender != 0) 
            { 
                stopCurrentRender(); 
                RenderPlanesObj = new RenderPlanes(); 
                CurrentRender = 0; 
                RenderPlanesProcess(); 
            } 
        } 
 
        public void stopCurrentRender() 
        { 
            if (CurrentRender == 0) 
            { 
                RenderPlanesObj.deleterender(); 
            } 
            if (CurrentRender == 1) 
            { 
                RenderVolumeObj.deleterender(); 
                IsoSurfacePanel.Visible = false; 
                IsoSurfacePanel.Enabled = false; 
                IsoAdvancedPanel.Visible = false; 
                IsoAdvancedPanel.Enabled = false; 
            } 
            if (CurrentRender == 2) 
            { 
                RenderMarchingCubesObj.deleterender(); 
                IsoSurfacePanel.Visible = false; 
                IsoSurfacePanel.Enabled = false; 
            } 
            if (CurrentRender == 3) 
            { 
                RenderVolumeObj.deleterender(); 
                VolumeRenderPanel.Visible = false; 
                VolumeRenderPanel.Enabled = false; 
                RenderVolumeObj.deleterender(); 
            } 
            GC.Collect(); 
        } 
 
        private void volumeRenderToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            if (CurrentRender != 3) 
            { 
                stopCurrentRender(); 
                CurrentRender = 3; 
                RenderVolumeProcess(); 
            } 
        } 
 
        private void RenderPlanesProcess() 
        { 
            ShowBusy(true); 
            RenderPlanesObj.SetWindows(vtkFormsWindowControlMain.GetRenderWindow()); 
            RenderPlanesObj.SetParameters(slizex, slizey, slizez); 
            RenderPlanesObj.render3Dplanes(VolumeFileObj.VoxelData); 
            GC.Collect(); 
            ShowBusy(false); 
        } 
 
        private void showiso(double isovalue) 
        { 
            IsoBox.Text = Convert.ToString((int)isovalue); 
            IsotrackBar.Value = (int)(100 * (isovalue - (double)VolumeFileObj.metaScalarRange[0]) / ((double)VolumeFileObj.metaScalarRange[1] - (double)VolumeFileObj.metaScalarRange[0])); 
        } 
 
        private void RenderMarchingCubeProcess() 
        { 
           ShowBusy(true); 
           RenderMarchingCubesObj.setisovalue(VolumeFileObj.metaScalarRange); 
           showiso(RenderMarchingCubesObj.isovalue); 
 
           RenderMarchingCubesObj.MC_VTK(VolumeFileObj.VoxelData); 
           ConsoleText(RenderMarchingCubesObj.info); 
           ConsoleText("\r\nVTK marching cubes connected\r\n"); 
            
           RenderMarchingCubesObj.SetWindows(vtkFormsWindowControlMain.GetRenderWindow()); 
           RenderMarchingCubesObj.ShowVTKV3d(); 
           ConsoleText(RenderMarchingCubesObj.info); 
           ConsoleText("\r\nVTK displayed the iso-surface \r\n"); 
           GC.Collect(); 
           ShowBusy(false); 
        } 
 
        private void IsoBox_KeyPress(object sender, KeyPressEventArgs e) 
        { 
 
            if (e.KeyChar == (char)13) 
            { 
                ShowBusy(true); 
                double isovalue = Convert.ToDouble(IsoBox.Text); 
                if (isovalue < VolumeFileObj.metaScalarRange[0]) isovalue = VolumeFileObj.metaScalarRange[0]; 
                if (isovalue > VolumeFileObj.metaScalarRange[1]) isovalue = VolumeFileObj.metaScalarRange[1]; 
                showiso(isovalue); 
                if (CurrentRender == 1) 
                { 
                    RenderVolumeObj.UpdateIsoValue(isovalue); 
                } 
                else 
                { 
                    RenderMarchingCubesObj.UpdateIsoValue(isovalue); 
                } 
                ShowBusy(false); 
                e.Handled = true; 
            } 
        } 
 
        private void IsotrackBar_MouseUp(object sender, MouseEventArgs e) 
        { 
            ShowBusy(true); 
            double sliderv = (double)IsotrackBar.Value / 100; 
            double isovalue = VolumeFileObj.metaScalarRange[1] * sliderv + (1 - sliderv) * VolumeFileObj.metaScalarRange[0]; 
            showiso(isovalue); 
            if (CurrentRender == 1) 
            { 
                RenderVolumeObj.UpdateIsoValue(isovalue); 
            } 
            else 
            { 
                RenderMarchingCubesObj.UpdateIsoValue(isovalue); 
            } 
            ShowBusy(false); 
        } 
 
        private void RenderVolumeProcess() 
        { 
            ShowBusy(true); 
            VolumeRenderPanel.Visible = true; 
            VolumeRenderPanel.Enabled = true; 
             
            this.Refresh(); 
 
            RenderVolumeObj.SetWindows(vtkFormsWindowControlMain.GetRenderWindow()); 
            RenderVolumeObj.VolumeRender(VolumeFileObj.VoxelData); 
            GC.Collect(); 
            ShowBusy(false); 
        } 
 
  
        private void UpdateButton_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            if (CurrentRender == 0) RenderPlanesObj.setColorTransferFunction(HistogramObj.getColorTransferFunction(true)); 
            if (CurrentRender == 3) 
            { 
                RenderVolumeObj.setAlphaTransferFunction(HistogramObj.getAlphaTransferFunction()); 
                RenderVolumeObj.setColorTransferFunction(HistogramObj.getColorTransferFunction(false)); 
            } 
            ShowBusy(false); 
        } 
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
        { 
            stopCurrentRender(); 
            Application.Exit(); 
        } 
 
 
        private void RenAdvButton1_Click(object sender, EventArgs e) 
        { 
            RenderVolumeObj.setTextmode(0); 
        } 
 
        private void RenAdvButton2_Click(object sender, EventArgs e) 
        { 
            RenderVolumeObj.setTextmode(1); 
        } 
 
        private void RenAdvButton3_Click(object sender, EventArgs e) 
        { 
            RenderVolumeObj.setTextmode(2); 
        } 
 
        private void toolStripMenuItem2_Click(object sender, EventArgs e) 
        { 
            if (CurrentRender != 1) 
            { 
                stopCurrentRender(); 
                CurrentRender = 1; 
                IsoSurfacePanel.Visible = true; 
                IsoSurfacePanel.Enabled = true; 
                IsoAdvancedPanel.Visible = true; 
                IsoAdvancedPanel.Enabled = true; 
                RenderIsoProcess(); 
            } 
        } 
 
        private void RenderIsoProcess() 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setisovalue(VolumeFileObj.metaScalarRange); 
            showiso(RenderVolumeObj.isovalue); 
             
            RenderVolumeObj.SetWindows(vtkFormsWindowControlMain.GetRenderWindow()); 
            RenderVolumeObj.VolumeRenderISO(VolumeFileObj.VoxelData); 
            GC.Collect(); 
            ShowBusy(false); 
        } 
 
        private void Form1_ResizeEnd(object sender, EventArgs e) 
        { 
            fitwindow(); 
        } 
 
        private void fitwindow() 
        { 
            Size wsize = this.Size; 
            int width = wsize.Width-vtkspacex; 
            int height = wsize.Height - vtkspacey; 
 
            vtkFormsWindowControlMain.Size = new Size(width,height); 
            DebugOuput.Width = width;     
        } 
 
        private void isoButton1_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setIsomode(0); 
            ShowBusy(false); 
        } 
 
        private void isoButton2_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setIsomode(1); 
            ShowBusy(false); 
        } 
 
        private void isoButton3_Click(object sender, EventArgs e) 
        { 
            ShowBusy(true); 
            RenderVolumeObj.setIsomode(2); 
            ShowBusy(false); 
        } 
 
        private void SaveImagestripMenuItem_Click(object sender, EventArgs e) 
        { 
            saveFileDialog1.ShowDialog(); 
        } 
 
        private void saveFileDialog1_FileOk(object sender, CancelEventArgs e) 
        { 
            this.Refresh(); 
            vtkFormsWindowControlMain.Refresh(); 
            SaveTimer.Enabled = true; 
        } 
         
        private void saveimage() 
        { 
            ShowBusy(true); 
            string filename = saveFileDialog1.FileName; 
            ConsoleText("Filename : " + filename + "\r\n"); 
 
            vtk.vtkWindowToImageFilter pWfilter = new vtk.vtkWindowToImageFilter(); 
            pWfilter.SetInput(vtkFormsWindowControlMain.GetRenderWindow()); 
             
            vtk.vtkJPEGWriter jpegWriter = new vtk.vtkJPEGWriter(); 
            vtk.vtkTIFFWriter tiffWriter = new vtk.vtkTIFFWriter(); 
            vtk.vtkPNGWriter pngWriter = new vtk.vtkPNGWriter(); 
            vtk.vtkBMPWriter bmpWriter = new vtk.vtkBMPWriter(); 
             
            switch(saveFileDialog1.FilterIndex) 
            { 
                case 2: 
                    tiffWriter.SetInput(pWfilter.GetOutput()); 
                    tiffWriter.SetFileName(filename); 
                    tiffWriter.Write(); 
                    break; 
                case 3: 
                    pngWriter.SetInput(pWfilter.GetOutput()); 
                    pngWriter.SetFileName(filename); 
                    pngWriter.Write(); 
                    break; 
                case 4: 
                    bmpWriter.SetInput(pWfilter.GetOutput()); 
                    bmpWriter.SetFileName(filename); 
                    bmpWriter.Write(); 
                    break; 
                default: 
                    jpegWriter.SetInput(pWfilter.GetOutput()); 
                    jpegWriter.SetFileName(filename); 
                    jpegWriter.Write(); 
                    break; 
            } 
            ShowBusy(false); 
        } 
         
        private void OpenDicomStripMenuItem_Click(object sender, EventArgs e) 
        { 
            ConsoleText("Folder Dialog Open\r\n"); 
            openDicomFileDialog.ShowDialog(); 
        } 
 
        private void LoadTimer_Tick(object sender, EventArgs e) 
        { 
            LoadTimer.Enabled = false; 
            LoadProcess(); 
        } 
 
        private void SaveTimer_Tick(object sender, EventArgs e) 
        { 
            SaveTimer.Enabled = false; 
            saveimage(); 
        } 
 
        private void aboutToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            AboutBox1 aboutDialog = new AboutBox1(); 
            aboutDialog.ShowDialog(); 
        } 
 
        private void HowDoItoolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            Help helpDialog = new Help(); 
            helpDialog.ShowDialog(); 
        } 
 
        public void ShowBusy(bool b) 
        { 
            if (b) 
            { 
                Readypanel.BackColor = Color.Red; 
                ReadyLabel.Text = "Busy"; 
            } 
            else 
            { 
                Readypanel.BackColor = Color.Lime; 
                ReadyLabel.Text = "Ready"; 
            } 
            Readypanel.Refresh(); 
            ReadyLabel.Refresh(); 
        } 
 
        private void openDicomFileDialog_FileOk(object sender, CancelEventArgs e) 
        { 
            ConsoleText("\r\n----------------------------------------------------------------------------\r\n"); 
            stopCurrentRender(); 
            string tempfile = openDicomFileDialog.FileName; 
            tempfile = tempfile.Replace("/", "\\"); 
            string[] fileparts = tempfile.Split('\\'); 
            string path = ""; 
            for (int i = 0; i < fileparts.Length - 1; i++) 
            { 
                path += fileparts[i] + "\\"; 
            } 
            SelectedPath = path; 
 
            ConsoleText("Folder selected : " + SelectedPath + "\r\n"); 
             
            readtype = 1; 
            RenderToolStripMenuItem.Enabled = true; 
            LoadTimer.Enabled = true; ShowBusy(true); 
        } 
   } 
}