# gdcmscene.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    #include "vtkGDCMPolyDataReader.h"
    //#include "vtkGDCMPolyDataWriter.h"

    #include "vtkAppendPolyData.h"
    #include "vtkPolyDataWriter.h"
    #include "vtkPolyDataMapper.h"
    #include "vtkPolyDataMapper2D.h"
    #include "vtkActor2D.h"
    #include "vtkRenderWindowInteractor.h"
    #include "vtkRenderWindow.h"
    #include "vtkRenderer.h"
    #include "vtkCamera.h"
    #include "vtkProperty.h"
    #include "vtkProperty2D.h"

    // gdcmDataExtra/gdcmNonImageData/exRT_Structure_Set_Storage.dcm
    // gdcmDataExtra/gdcmNonImageData/RTSTRUCT_1.3.6.1.4.1.22213.1.1396.2.dcm
    // gdcmDataExtra/gdcmNonImageData/RT/RTStruct.dcm

    int main(int argc, char *argv[])
    {
      if( argc < 2 )
        {
        std::cerr << argv[0] << " filename1.dcm\n";
        return 1;
        }
      const char * filename = argv[1];

      vtkGDCMPolyDataReader * reader = vtkGDCMPolyDataReader::New();
      reader->SetFileName( filename );
      reader->Update();

    //  vtkGDCMPolyDataWriter * writer2 = vtkGDCMPolyDataWriter::New();
    //  for(int num = 0; num < reader->GetNumberOfOutputPorts(); ++num )
    //    writer2->SetInput( num, reader->GetOutput(num) );
    //  writer2->SetFileName( "rtstruct.dcm" );
    //  writer2->Write();

      // print reader output:
      reader->Print( std::cout );
      // print first output:
      reader->GetOutput()->Print( std::cout );

      vtkAppendPolyData *append = vtkAppendPolyData::New();
      int n = reader->GetNumberOfOutputPorts();
      for(int i = 0; i < n; ++i)
        {
        append->AddInput( reader->GetOutput(i) );
        }

      vtkPolyDataWriter * writer = vtkPolyDataWriter::New();
      writer->SetInput( reader->GetOutput() );
      writer->SetFileName( "rtstruct.vtk" );
      //writer->Write();

      // Now we'll look at it.
      vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
      //vtkPolyDataMapper2D* cubeMapper = vtkPolyDataMapper2D::New();
          //cubeMapper->SetInput( reader->GetOutput() );
          cubeMapper->SetInput( append->GetOutput() );
          cubeMapper->SetScalarRange(0,7);
      vtkActor *cubeActor = vtkActor::New();
      //vtkActor2D* cubeActor = vtkActor2D::New();
          cubeActor->SetMapper(cubeMapper);
      vtkProperty * property = cubeActor->GetProperty();
      property->SetRepresentationToWireframe();
      //cubeActor->GetProperty()->SetColor(1, 0, 0);

      // The usual rendering stuff.
    //  vtkCamera *camera = vtkCamera::New();
    //      camera->SetPosition(1,1,1);
    //      camera->SetFocalPoint(0,0,0);

      vtkRenderer *renderer = vtkRenderer::New();
      vtkRenderWindow *renWin = vtkRenderWindow::New();
        renWin->AddRenderer(renderer);

      vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
        iren->SetRenderWindow(renWin);

      renderer->AddActor(cubeActor);
      //renderer->AddActor2D(cubeActor);
          //renderer->SetActiveCamera(camera);
          renderer->ResetCamera();
          renderer->SetBackground(1,1,1);

      renWin->SetSize(300,300);

      // interact with data
      renWin->Render();
      iren->Start();

      reader->Delete();
      append->Delete();
      cubeMapper->Delete();
      cubeActor->Delete();
    //  camera->Delete();
      renderer->Delete();
      renWin->Delete();
      iren->Delete();

      writer->Delete();

      return 0;
    }