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