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);
}
}
}