X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkImage2DicomRTStructFilter.txx;h=1b241a99824a233a094058f1b8196d09c4e99772;hb=f4ee750a005c1406848ffdfd85a0ebcbe824bca6;hp=cc90104216d6ca2ef9d37f77e92156bf47c4fe9f;hpb=2b5b3e906ee95519169e9b6d4bb2da9d2e00d8b3;p=clitk.git diff --git a/common/clitkImage2DicomRTStructFilter.txx b/common/clitkImage2DicomRTStructFilter.txx index cc90104..1b241a9 100644 --- a/common/clitkImage2DicomRTStructFilter.txx +++ b/common/clitkImage2DicomRTStructFilter.txx @@ -57,7 +57,10 @@ template clitk::Image2DicomRTStructFilter::Image2DicomRTStructFilter() { - DD("Image2DicomRTStructFilter Const"); + m_StructureSetFilename = ""; + m_DicomFolder = ""; + m_OutputFilename = "default-output.dcm"; + m_ThresholdValue = 0.5; } //-------------------------------------------------------------------- @@ -66,7 +69,17 @@ clitk::Image2DicomRTStructFilter::Image2DicomRTStructFilter() template clitk::Image2DicomRTStructFilter::~Image2DicomRTStructFilter() { - DD("Image2DicomRTStructFilter Destructor"); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void +clitk::Image2DicomRTStructFilter::SetROIName(std::string name, std::string type) +{ + m_ROIName = name; + m_ROIType = type; } //-------------------------------------------------------------------- @@ -75,27 +88,33 @@ clitk::Image2DicomRTStructFilter::~Image2DicomRTStructFilter() template void clitk::Image2DicomRTStructFilter::Update() { - DD("Image2DicomRTStructFilter::GenerateData"); + // Check this is a RT-Struct + gdcm::Reader gdcm_reader; + gdcm_reader.SetFileName(m_StructureSetFilename.c_str()); + if (!gdcm_reader.Read()) { + clitkExceptionMacro("Error could not open the file '" << m_StructureSetFilename << std::endl); + } + gdcm::MediaStorage ms; + ms.SetFromFile(gdcm_reader.GetFile()); + if (ms != gdcm::MediaStorage::RTStructureSetStorage) { + clitkExceptionMacro("File '" << m_StructureSetFilename << "' is not a DICOM-RT-Struct file." << std::endl); + } // Read rt struct vtkSmartPointer reader = vtkGDCMPolyDataReader::New(); reader->SetFileName(m_StructureSetFilename.c_str()); - reader->Update(); - DD("reader done"); + reader->Update(); // Get properties vtkRTStructSetProperties * p = reader->GetRTStructSetProperties(); - DD(p->GetNumberOfStructureSetROIs()); - DD(p->GetStructureSetROIName(0)); - DD(p->GetStructureSetROINumber(0)); + if (GetVerboseFlag()) { + std::cout << "Number of structures in the dicom-rt-struct : " + << p->GetNumberOfStructureSetROIs() << std::endl; + } // Init writer vtkGDCMPolyDataWriter * writer = vtkGDCMPolyDataWriter::New(); int numMasks = reader->GetNumberOfOutputPorts() + 1;//add one more - DD(numMasks); - - // numMasks = 3; //FIXME temporary - writer->SetNumberOfInputPorts(numMasks); writer->SetFileName(m_OutputFilename.c_str()); writer->SetMedicalImageProperties(reader->GetMedicalImageProperties()); @@ -108,41 +127,37 @@ void clitk::Image2DicomRTStructFilter::Update() roiAlgorithms->SetNumberOfValues(numMasks); roiTypes->SetNumberOfValues(numMasks); + // Convert the image into a mesh typedef clitk::BinaryImageToMeshFilter BinaryImageToMeshFilterType; typename BinaryImageToMeshFilterType::Pointer convert = BinaryImageToMeshFilterType::New(); + convert->SetThresholdValue(m_ThresholdValue); convert->SetInput(m_Input); - DD("Update"); convert->Update(); - DD("here"); - DD("end update"); vtkPolyData* mesh = convert->GetOutputMesh(); - DD(mesh->GetNumberOfVerts()); - DD(mesh->GetNumberOfLines()); - DD(mesh->GetNumberOfPolys()); - DD(mesh->GetNumberOfStrips()); - - // Add on (FIXME) to replace with binary image - // vtkPolyData* blank = vtkPolyData::New(); - // writer->SetInput(0, blank); - writer->SetInput(0, mesh); - roiNames->InsertValue(0, "blank"); - roiAlgorithms->InsertValue(0, "blank"); - roiTypes->InsertValue(0, "ORGAN"); - - for (unsigned int i = 1; i < numMasks; ++i) { - // DD(i); - writer->SetInput(i, reader->GetOutput(i-1)); - std::string theString = reader->GetRTStructSetProperties()->GetStructureSetROIName(i-1); + if (GetVerboseFlag()) { + std::cout << "Mesh has " << mesh->GetNumberOfLines() << " lines." << std::endl; + } + + // Copy previous contours + for (unsigned int i = 0; i < numMasks-1; ++i) { + writer->SetInput(i, reader->GetOutput(i)); + std::string theString = reader->GetRTStructSetProperties()->GetStructureSetROIName(i); roiNames->InsertValue(i, theString); - theString = reader->GetRTStructSetProperties()->GetStructureSetROIGenerationAlgorithm(i-1); + theString = reader->GetRTStructSetProperties()->GetStructureSetROIGenerationAlgorithm(i); roiAlgorithms->InsertValue(i, theString); - theString = reader->GetRTStructSetProperties()->GetStructureSetRTROIInterpretedType(i-1); + theString = reader->GetRTStructSetProperties()->GetStructureSetRTROIInterpretedType(i); roiTypes->InsertValue(i, theString); - } - + } + + // Add new one + int last = numMasks-1; + writer->SetInput(last, mesh); + roiNames->InsertValue(last, m_ROIName); + roiAlgorithms->InsertValue(last, "CLITK_CREATED"); + roiTypes->InsertValue(last, m_ROIType); /* - // Visu + // Visu DEBUG vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New(); cubeMapper->SetInput( mesh ); cubeMapper->SetScalarRange(0,7); @@ -167,80 +182,25 @@ void clitk::Image2DicomRTStructFilter::Update() renWin->Render(); iren->Start(); */ - - // End visu - + // Write (need to read dicom for slice id) vtkRTStructSetProperties* theProperties = vtkRTStructSetProperties::New(); - DD(p->GetStudyInstanceUID()); writer->SetRTStructSetProperties(theProperties); - /*writer->InitializeRTStructSet2(p,"./", - reader->GetRTStructSetProperties()->GetStructureSetLabel(), - reader->GetRTStructSetProperties()->GetStructureSetName(), - roiNames, roiAlgorithms, roiTypes);*/ + if (GetVerboseFlag()) { + std::cout << "Looking for dicom info, study instance " + << p->GetStudyInstanceUID() << std::endl; + } writer->InitializeRTStructSet(m_DicomFolder, reader->GetRTStructSetProperties()->GetStructureSetLabel(), reader->GetRTStructSetProperties()->GetStructureSetName(), - roiNames, roiAlgorithms, roiTypes); - - DD("after init"); + roiNames, roiAlgorithms, roiTypes); writer->Write(); - DD("write done"); - reader->Delete(); roiNames->Delete(); roiTypes->Delete(); - //theProperties->Delete(); roiAlgorithms->Delete(); - //blank->Delete(); writer->Delete(); - - //////////////////// - - - /* - - // DicomRTStruct - DD(m_StructureSet->GetName()); - clitk::DicomRT_ROI * roi = m_StructureSet->GetROIFromROINumber(1); // Aorta - DD(roi->GetName()); - DD(roi->GetROINumber()); - - - // Get - - - - - // Add an image to the roi - vvImage::Pointer im = vvImageFromITK<3, PixelType>(m_Input); - roi->SetImage(im); - - // Get one contour - DD("Compute Mesh"); - roi->ComputeContoursFromImage(); // FIXME do the set mesh for the moment (to change) - // roi->ComputeMeshFromContour(); - vtkSmartPointer mesh = roi->GetMesh(); - DD("done"); - - // Change the mesh (shift by 10); - // const vtkSmartPointer & points = mesh->GetPoints(); - // for(uint i=0; iGetNumberOfVerts (); i++) { - // DD(i); - // double * p = points->GetPoint(i); - // p[0] += 30; - // points->SetPoint(i, p); - // } - roi->SetName("TOTO"); - roi->SetDicomUptodateFlag(true); // indicate that dicom info must be updated from the mesh. - - // Convert to dicom ? - DD("TODO"); - - // Write - structset->Write("toto.dcm"); - */ } //--------------------------------------------------------------------