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


using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace V3D_Viewer 
{ 
    class RenderMarchingCubes 
    { 
        public vtk.vtkMarchingCubes mc = new vtk.vtkMarchingCubes(); 
        vtk.vtkRenderWindowInteractor iren = new vtk.vtkRenderWindowInteractor(); 
        vtk.vtkRenderWindow renWin; 
        vtk.vtkRenderer aRenderer; 
        vtk.vtkImageData VoxelData = new vtk.vtkImageData(); 
        vtk.vtkPolyDataMapper mcmap = new vtk.vtkPolyDataMapper(); 
        vtk.vtkActor mcactor = new vtk.vtkActor(); 
 
        public string info = ""; 
        public double isovalue = 0; 
        private V3D_Viewer m_parent; 
 
        public void setParent(V3D_Viewer frm1) 
        { 
            m_parent = frm1; 
        } 
 
        public void setisovalue(double[] metaScalarRange) 
        { 
            isovalue = 0.8 * (metaScalarRange[1] + metaScalarRange[0]); 
        } 
 
        public void SetWindows(vtk.vtkRenderWindow renWint) 
        { 
            renWin = new vtk.vtkRenderWindow(); 
            aRenderer = new vtk.vtkRenderer(); 
            renWin = renWint; 
        } 
 
        public void MC_VTK(vtk.vtkImageData VoxelDatat) 
        { 
            VoxelData = VoxelDatat; 
            mc.SetInput(VoxelData); 
            mc.SetValue(0, isovalue); 
            mc.ComputeGradientsOff(); 
            mc.ComputeScalarsOff(); 
            mc.ComputeNormalsOff(); 
            mc.ComputeNormalsOn(); 
            mc.Update(); 
            int marchingNumberOfPoints = mc.GetOutput().GetNumberOfPoints(); 
            int marchingNumberOfPolys = mc.GetOutput().GetNumberOfPolys(); 
            info += "marching number of points : " + marchingNumberOfPoints + "\r\n"; 
            info += "marching number of polys : " + marchingNumberOfPolys + "\r\n"; 
        } 
 
        public void ShowVTKV3d() 
        { 
            renWin.AddRenderer(aRenderer); 
            iren.SetRenderWindow(renWin); 
 
            vtk.vtkSmoothPolyDataFilter smoother = new vtk.vtkSmoothPolyDataFilter(); 
            smoother.SetInputConnection(mc.GetOutputPort()); 
            smoother.SetRelaxationFactor(0.05); 
            smoother.SetNumberOfIterations(30); 
 
            vtk.vtkDecimatePro deci = new vtk.vtkDecimatePro(); 
            deci.SetInputConnection(smoother.GetOutputPort()); 
            deci.SetTargetReduction(0.9); 
            deci.PreserveTopologyOn(); 
            deci.Update(); 
 
            int marchingNumberOfPoints = deci.GetOutput().GetNumberOfPoints(); 
            int marchingNumberOfPolys = deci.GetOutput().GetNumberOfPolys(); 
            info += "marching number of points : " + marchingNumberOfPoints + "\r\n"; 
            info += "marching number of polys : " + marchingNumberOfPolys + "\r\n"; 
 
            vtk.vtkSmoothPolyDataFilter smoother2 = new vtk.vtkSmoothPolyDataFilter(); 
            smoother2.SetInputConnection(deci.GetOutputPort()); 
            smoother2.SetRelaxationFactor(0.05); 
            smoother2.SetNumberOfIterations(30); 
 
            mcmap.SetInputConnection(smoother2.GetOutputPort()); 
            mcmap.ScalarVisibilityOff(); 
            mcactor.SetMapper(mcmap); 
            mcactor.GetProperty().SetColor(1, 1, 1); 
 
            aRenderer.AddActor(mcactor); 
            aRenderer.SetBackground(0.0f, 0.0f, 0.0f); 
            aRenderer.ResetCamera(); 
            renWin.Render(); 
            addBusyObservers(); 
            iren.Initialize(); iren.Enable();  
 
        } 
 
        public void addBusyObservers() 
        { 
            iren.AddObserver((uint)vtk.EventIds.LeftButtonPressEvent, new vtk.vtkDotNetCallback(MousePress)); 
            iren.AddObserver((uint)vtk.EventIds.RightButtonPressEvent, new vtk.vtkDotNetCallback(MousePress)); 
            iren.AddObserver((uint)vtk.EventIds.MiddleButtonPressEvent, new vtk.vtkDotNetCallback(MousePress)); 
 
            iren.AddObserver((uint)vtk.EventIds.LeftButtonReleaseEvent, new vtk.vtkDotNetCallback(MouseRelease)); 
            iren.AddObserver((uint)vtk.EventIds.MiddleButtonReleaseEvent, new vtk.vtkDotNetCallback(MouseRelease)); 
            iren.AddObserver((uint)vtk.EventIds.RightButtonReleaseEvent, new vtk.vtkDotNetCallback(MouseRelease)); 
        } 
 
        public void MousePress(vtk.vtkObject obj, uint eventId, Object data, IntPtr clientdata) { m_parent.ShowBusy(true); } 
        public void MouseRelease(vtk.vtkObject obj, uint eventId, Object data, IntPtr clientdata) { m_parent.ShowBusy(false); } 
 
 
        public void UpdateIsoValue(double isovaluet) 
        { 
            isovalue = isovaluet; 
            mc.SetValue(0, isovalue); 
            mc.Update(); 
            renWin.Render(); 
        } 
         
        void writepolyfile() 
        { 
            vtk.vtkPolyDataWriter polyDataWriter = new vtk.vtkPolyDataWriter(); 
            polyDataWriter.SetInputConnection(mc.GetOutputPort()); 
            string outputFileName = "c:/pietje"; 
            polyDataWriter.SetFileName(outputFileName); 
            polyDataWriter.SetFileTypeToBinary(); 
            polyDataWriter.Write(); 
        } 
         
        public void deleterender() 
        { 
            EmptyVTK eVolume = new EmptyVTK(); 
            isovalue = 0.5; 
            MC_VTK(eVolume.GetEmptyVolume()); 
            mcmap.SetInputConnection(mc.GetOutputPort()); 
            renWin.Render(); 
            iren.Disable(); 
        } 
    } 
}