20 #include "dcmtk/dcmrt/drtstrct.h" 34 RTStructureSetReaderService::RoiEntry::RoiEntry()
37 DisplayColor[0] = 1.0;
38 DisplayColor[1] = 0.0;
39 DisplayColor[2] = 0.0;
43 RTStructureSetReaderService::RoiEntry::RoiEntry(
const RoiEntry& src)
47 Description = src.Description;
48 DisplayColor[0] = src.DisplayColor[0];
49 DisplayColor[1] = src.DisplayColor[1];
50 DisplayColor[2] = src.DisplayColor[2];
52 SetPolyData(src.ContourModelSet);
55 RTStructureSetReaderService::RoiEntry::~RoiEntry() {}
57 RTStructureSetReaderService::RoiEntry& RTStructureSetReaderService::
58 RoiEntry::operator =(
const RoiEntry& src)
62 Description = src.Description;
63 DisplayColor[0] = src.DisplayColor[0];
64 DisplayColor[1] = src.DisplayColor[1];
65 DisplayColor[2] = src.DisplayColor[2];
66 SetPolyData(src.ContourModelSet);
70 void RTStructureSetReaderService::RoiEntry::
81 size_t RTStructureSetReaderService::GetNumberOfROIs()
const 83 return this->ROISequenceVector.size();
86 RTStructureSetReaderService::RoiEntry* RTStructureSetReaderService::
87 FindRoiByNumber(
unsigned int roiNum)
89 for (
unsigned int i = 0; i < this->ROISequenceVector.size(); ++i)
91 if (this->ROISequenceVector[i].Number == roiNum)
93 return &this->ROISequenceVector[i];
102 std::vector<itk::SmartPointer<mitk::BaseData> > result;
109 for (
const auto& tag : tagsOfInterest) {
110 tagsOfInterestList.push_back(tag.first);
114 scanner->SetInputFiles({ location });
115 scanner->AddTagPaths(tagsOfInterestList);
119 if (frames.empty()) {
120 MITK_ERROR <<
"Error reading the RTSTRUCT file" << std::endl;
127 OFCondition output = file.loadFile(location.c_str(), EXS_Unknown);
131 MITK_ERROR <<
"Can't read the file" << std::endl;
135 DcmDataset* dataset = file.getDataset();
137 DRTStructureSetIOD structureSetObject;
138 OFCondition outp = structureSetObject.read(*dataset);
142 MITK_ERROR <<
"Error reading the file" << std::endl;
146 DRTStructureSetROISequence& roiSequence =
147 structureSetObject.getStructureSetROISequence();
149 if (!roiSequence.gotoFirstItem().good())
151 MITK_ERROR <<
"Error reading the structure sequence" << std::endl;
157 DRTStructureSetROISequence::Item& currentSequence =
158 roiSequence.getCurrentItem();
160 if (!currentSequence.isValid())
166 OFString roiDescription;
170 currentSequence.getROIName(roiName);
171 currentSequence.getROIDescription(roiDescription);
172 currentSequence.getROINumber(roiNumber);
174 roi.Name = roiName.c_str();
175 roi.Description = roiDescription.c_str();
176 roi.Number = roiNumber;
178 this->ROISequenceVector.push_back(roi);
179 }
while (roiSequence.gotoNextItem().good());
182 DRTROIContourSequence& roiContourSeqObject =
183 structureSetObject.getROIContourSequence();
185 if (!roiContourSeqObject.gotoFirstItem().good())
187 MITK_ERROR <<
"Error reading the contour sequence" << std::endl;
194 DRTROIContourSequence::Item& currentRoiObject =
195 roiContourSeqObject.getCurrentItem();
197 if (!currentRoiObject.isValid())
202 currentRoiObject.getReferencedROINumber(refRoiNumber);
203 DRTContourSequence& contourSeqObject =
204 currentRoiObject.getContourSequence();
206 if (contourSeqObject.getNumberOfItems() > 0 && contourSeqObject.gotoFirstItem().good())
210 DRTContourSequence::Item& contourItem =
211 contourSeqObject.getCurrentItem();
213 if (!contourItem.isValid())
218 OFString contourNumber;
219 OFString numberOfPoints;
220 OFVector<Float64> contourData_LPS;
224 contourItem.getContourNumber(contourNumber);
225 contourItem.getNumberOfContourPoints(numberOfPoints);
226 contourItem.getContourData(contourData_LPS);
228 for (
unsigned int i = 0; i < contourData_LPS.size() / 3; i++)
231 point[0] = contourData_LPS.at(3 * i);
232 point[1] = contourData_LPS.at(3 * i + 1);
233 point[2] = contourData_LPS.at(3 * i + 2);
234 contourSequence->AddVertex(point);
237 contourSequence->Close();
238 contourSet->AddContourModel(contourSequence);
239 }
while (contourSeqObject.gotoNextItem().good());
243 MITK_WARN <<
"contourSeqObject has no items in sequence. Object is neglected and not read. Struct name: " << this->FindRoiByNumber(refRoiNumber)->Name << std::endl;
246 RoiEntry* refROI = this->FindRoiByNumber(refRoiNumber);
248 if (refROI ==
nullptr)
250 MITK_ERROR <<
"Can not find references ROI" << std::endl;
256 for (
unsigned int j = 0; j < 3; j++)
258 currentRoiObject.getROIDisplayColor(roiColor, j);
259 refROI->DisplayColor[j] = roiColor / 255.0;
262 refROI->ContourModelSet = contourSet;
265 refROI->DisplayColor[0],
266 refROI->DisplayColor[1],
267 refROI->DisplayColor[2]));
269 }
while (roiContourSeqObject.gotoNextItem().good());
271 for (
auto const& aROI : ROISequenceVector)
273 result.push_back(aROI.ContourModelSet.GetPointer());
274 result.at(result.size() - 1)->SetProperty(
"name", aROI.ContourModelSet->GetProperty(
"name"));
275 result.at(result.size() - 1)->SetProperty(
"color", aROI.ContourModelSet->GetProperty(
"contour.color"));
276 result.at(result.size() - 1)->SetProperty(
"contour.color", aROI.ContourModelSet->GetProperty(
"contour.color"));
277 SetProperties(result.at(result.size() - 1).GetPointer(), findings);
MITKDICOMREADER_EXPORT FindingsListVectorType ExtractPathsOfInterest(const DICOMTagPathList &pathsOfInterest, const DICOMDatasetAccessingImageFrameList &frames)
std::vector< itk::SmartPointer< BaseData > > Read() override
Reads a path or stream and creates a list of BaseData objects.
DataCollection - Class to facilitate loading/accessing structured data.
The CustomMimeType class represents a custom mime-type which may be registered as a service object...
us::ServiceRegistration< IFileReader > RegisterService(us::ModuleContext *context=us::GetModuleContext())
RTStructureSetReaderService()
std::vector< DICOMTagPath > DICOMTagPathList
MITKDICOMREADER_EXPORT void SetProperties(BaseDataPointer image, const FindingsListVectorType &findings)
std::vector< DICOMDatasetAccessingImageFrameInfo::Pointer > DICOMDatasetAccessingImageFrameList
Base class for creating mitk::BaseData objects from files or streams.
MITKDICOMREADER_EXPORT mitk::IDICOMTagsOfInterest * GetDicomTagsOfInterestService()
std::string GetInputLocation() const override
Get the current input location.
~RTStructureSetReaderService() override