Mercurial > hg > orthanc-stone
diff OrthancStone/Sources/Toolbox/DicomStructuredReport.h @ 2099:67db5afb305d
partial integration dicom-sr->mainline
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 08 Nov 2023 17:26:22 +0100 |
parents | 7c3d65166c26 |
children | 129cb165ea8d c23eef785569 |
line wrap: on
line diff
--- a/OrthancStone/Sources/Toolbox/DicomStructuredReport.h Wed Nov 08 15:13:21 2023 +0100 +++ b/OrthancStone/Sources/Toolbox/DicomStructuredReport.h Wed Nov 08 17:26:22 2023 +0100 @@ -31,9 +31,12 @@ # error Support for DCMTK must be enabled #endif +#include "../Scene2D/ScenePoint2D.h" + #include <DicomParsing/ParsedDicomFile.h> #include <dcmtk/dcmdata/dcitem.h> +#include <deque> #include <list> #include <set> @@ -41,12 +44,116 @@ { class DicomStructuredReport : public boost::noncopyable { + public: + enum StructureType + { + StructureType_Point, + StructureType_Polyline + }; + + class Structure : public boost::noncopyable + { + private: + std::string sopInstanceUid_; + bool hasFrameNumber_; + unsigned int frameNumber_; + bool hasProbabilityOfCancer_; + float probabilityOfCancer_; + + protected: + void Copy(const Structure& other); + + public: + Structure(const std::string& sopInstanceUid); + + virtual ~Structure() + { + } + + virtual Structure* Clone() const = 0; + + virtual StructureType GetType() const = 0; + + const std::string& GetSopInstanceUid() const + { + return sopInstanceUid_; + } + + void SetFrameNumber(unsigned int frame); + + void SetProbabilityOfCancer(float probability); + + bool HasFrameNumber() const + { + return hasFrameNumber_; + } + + bool HasProbabilityOfCancer() const + { + return hasProbabilityOfCancer_; + } + + unsigned int GetFrameNumber() const; + + float GetProbabilityOfCancer() const; + }; + + + class Point : public Structure + { + private: + ScenePoint2D point_; + + public: + Point(const std::string& sopInstanceUid, + double x, + double y); + + virtual Structure* Clone() const ORTHANC_OVERRIDE; + + virtual StructureType GetType() const ORTHANC_OVERRIDE + { + return StructureType_Point; + } + + const ScenePoint2D& GetPoint() const + { + return point_; + } + }; + + + class Polyline : public Structure + { + private: + std::vector<ScenePoint2D> points_; + + public: + Polyline(const std::string& sopInstanceUid, + const float* points, + unsigned long pointsCount); + + Polyline(const std::string& sopInstanceUid, + const std::vector<ScenePoint2D>& points); + + virtual Structure* Clone() const ORTHANC_OVERRIDE; + + virtual StructureType GetType() const ORTHANC_OVERRIDE + { + return StructureType_Polyline; + } + + size_t GetSize() const + { + return points_.size(); + } + + const ScenePoint2D& GetPoint(size_t i) const; + }; + + private: - class Structure; - class Point; - class Polyline; - - class ReferencedInstance : public boost::noncopyable + class ReferencedInstance { private: std::string studyInstanceUid_; @@ -79,7 +186,10 @@ return sopClassUid_; } - void AddFrame(unsigned int frame); + void AddFrame(unsigned int frame) + { + frames_.insert(frame); + } const std::set<unsigned int>& GetFrames() const { @@ -100,7 +210,7 @@ std::string sopInstanceUid_; std::map<std::string, ReferencedInstance*> instancesInformation_; std::vector<std::string> orderedInstances_; - std::list<Structure*> structures_; + std::deque<Structure*> structures_; public: class ReferencedFrame @@ -154,6 +264,8 @@ DicomStructuredReport(Orthanc::ParsedDicomFile& dicom); + DicomStructuredReport(const DicomStructuredReport& other); // Copy constructor + ~DicomStructuredReport(); const std::string& GetStudyInstanceUid() const @@ -183,5 +295,12 @@ size_t i) const; void ExportReferencedFrames(std::list<ReferencedFrame>& frames) const; + + size_t GetStructuresCount() const + { + return structures_.size(); + } + + const Structure& GetStructure(size_t index) const; }; }