1 /*
2  *
3  *  Copyright (C) 2015-2019, Open Connections GmbH
4  *  All rights reserved.  See COPYRIGHT file for details.
5  *
6  *  This software and supporting documentation are maintained by
7  *
8  *    OFFIS e.V.
9  *    R&D Division Health
10  *    Escherweg 2
11  *    D-26121 Oldenburg, Germany
12  *
13  *
14  *  Module:  dcmfg
15  *
16  *  Author:  Michael Onken
17  *
18  *  Purpose: Class for managing Plane Position (Volume) Functional Group
19  *
20  */
21 
22 #include "dcmtk/config/osconfig.h"
23 
24 #include "dcmtk/dcmdata/dcdeftag.h"
25 #include "dcmtk/dcmfg/fgplanposvol.h"
26 #include "dcmtk/dcmfg/fgtypes.h"
27 #include "dcmtk/dcmiod/iodutil.h"
28 
29 // Constructor
FGPlanePositionVolume()30 FGPlanePositionVolume::FGPlanePositionVolume()
31     : FGBase(DcmFGTypes::EFG_PLANEPOSITIONVOLUME)
32     , m_ImagePositionVolume(DCM_ImagePositionVolume)
33 {
34 }
35 
~FGPlanePositionVolume()36 FGPlanePositionVolume::~FGPlanePositionVolume()
37 {
38     // nothing to do
39 }
40 
clone() const41 FGBase* FGPlanePositionVolume::clone() const
42 {
43     FGPlanePositionVolume* copy = new FGPlanePositionVolume();
44     if (copy)
45     {
46         copy->m_ImagePositionVolume = this->m_ImagePositionVolume;
47     }
48     return copy;
49 }
50 
clearData()51 void FGPlanePositionVolume::clearData()
52 {
53     m_ImagePositionVolume.clear();
54 }
55 
check() const56 OFCondition FGPlanePositionVolume::check() const
57 {
58     // Checks in read() and write() are sufficient for now
59     return EC_Normal;
60 }
61 
62 // --- get() functionality ---
63 
getImagePositionVolume(Float64 & value,const long unsigned int pos)64 OFCondition FGPlanePositionVolume::getImagePositionVolume(Float64& value, const long unsigned int pos)
65 {
66     return m_ImagePositionVolume.getFloat64(value, pos);
67 }
68 
getImagePositionVolume(Float64 & valueX,Float64 & valueY,Float64 & valueZ)69 OFCondition FGPlanePositionVolume::getImagePositionVolume(Float64& valueX, Float64& valueY, Float64& valueZ)
70 {
71     OFCondition result = m_ImagePositionVolume.getFloat64(valueX, 0);
72     if (result.good())
73         result = m_ImagePositionVolume.getFloat64(valueY, 1);
74     if (result.good())
75         result = m_ImagePositionVolume.getFloat64(valueZ, 2);
76     return result;
77 }
78 
setImagePositionVolume(const Float64 & valueX,const Float64 & valueY,const Float64 & valueZ,const OFBool checkValue)79 OFCondition FGPlanePositionVolume::setImagePositionVolume(const Float64& valueX,
80                                                           const Float64& valueY,
81                                                           const Float64& valueZ,
82                                                           const OFBool checkValue)
83 {
84     (void)checkValue;
85     OFCondition result = m_ImagePositionVolume.putFloat64(valueX, 0);
86     if (result.good())
87         result = m_ImagePositionVolume.putFloat64(valueY, 1);
88     if (result.good())
89         result = m_ImagePositionVolume.putFloat64(valueZ, 2);
90     return result;
91 }
92 
setImagePositionVolume(const Float64 & value,const long unsigned int pos,const OFBool checkValue)93 OFCondition FGPlanePositionVolume::setImagePositionVolume(const Float64& value,
94                                                           const long unsigned int pos,
95                                                           const OFBool checkValue)
96 {
97     // no checks
98     (void)checkValue;
99     if (pos > 2)
100         return EC_ValueMultiplicityViolated;
101 
102     return m_ImagePositionVolume.putFloat64(value, pos);
103 }
104 
105 /// Read Plane Position (Volume) Sequence from given item
read(DcmItem & item)106 OFCondition FGPlanePositionVolume::read(DcmItem& item)
107 {
108     clearData();
109 
110     DcmItem* seqItem   = NULL;
111     OFCondition result = getItemFromFGSequence(item, DCM_PlanePositionVolumeSequence, 0, seqItem);
112     if (result.bad())
113         return result;
114 
115     DcmIODUtil::getAndCheckElementFromDataset(*seqItem, m_ImagePositionVolume, "3", "1", "PlanePositionVolume");
116 
117     return EC_Normal;
118 }
119 
120 /// Writes single Plane Position (Volume) Sequence into given item
write(DcmItem & item)121 OFCondition FGPlanePositionVolume::write(DcmItem& item)
122 {
123     DcmItem* seqItem   = NULL;
124     OFCondition result = createNewFGSequence(item, DCM_PlanePositionVolumeSequence, 0, seqItem);
125     if (result.bad())
126         return result;
127 
128     // --- write frame content macro attributes ---
129     DcmIODUtil::copyElementToDataset(result, *seqItem, m_ImagePositionVolume, "3", "1", "PlanePositionVolume");
130     return result;
131 }
132 
compare(const FGBase & rhs) const133 int FGPlanePositionVolume::compare(const FGBase& rhs) const
134 {
135     int result = FGBase::compare(rhs);
136     if (result != 0)
137         return result;
138 
139     const FGPlanePositionVolume* myRhs = OFstatic_cast(const FGPlanePositionVolume*, &rhs);
140     if (!myRhs)
141         return -1;
142 
143     // Compare all elements
144     result = m_ImagePositionVolume.compare(myRhs->m_ImagePositionVolume);
145     return result;
146 }
147