File failed to load: https://isis.astrogeology.usgs.gov/9.0.0/Object/assets/jax/output/NativeMML/config.js
Isis 3 Programmer Reference
CubeAttribute.h
1#ifndef CubeAttribute_h
2#define CubeAttribute_h
7
8/* SPDX-License-Identifier: CC0-1.0 */
9
10#include <typeinfo>
11
12#include <QDebug>
13#include <QStringList>
14
15#include "Cube.h"
16#include "Endian.h"
17#include "FileName.h"
18#include "IException.h"
19#include "PixelType.h"
20
21
22namespace Isis {
42
43
52 inline QString LabelAttachmentName(LabelAttachment labelType) {
53 if(labelType == AttachedLabel) return "Attached";
54 if(labelType == DetachedLabel) return "Detached";
55 if(labelType == ExternalLabel) return "External";
56
57 QString msg = "Invalid label attachment type [" + QString::number(labelType) + "]";
58 throw IException(IException::Programmer, msg, _FILEINFO_);
59 }
60
61
70 inline LabelAttachment LabelAttachmentEnumeration(const QString &labelType) {
71 QString temp = labelType.toUpper();
72 if(temp == "ATTACHED") return AttachedLabel;
73 if(temp == "DETACHED") return DetachedLabel;
74 if(temp == "External") return ExternalLabel;
75
76 QString msg = "Invalid label attachment type string [" + labelType + "]";
77 throw IException(IException::Unknown, msg, _FILEINFO_);
78 }
79
80
81
118 template<typename ChildClass> class CubeAttribute {
119 public:
120
122 CubeAttribute(QList< bool (ChildClass::*)(QString) const > testers) {
123 m_attributeTypeTesters = testers;
124 }
125
126
138 CubeAttribute(QList< bool (ChildClass::*)(QString) const > testers,
139 const FileName &fileName) {
140 m_attributeTypeTesters = testers;
141 setAttributes(fileName);
142 }
143
144
146 virtual ~CubeAttribute() {
147 }
148
149
158 QString toString() const {
159 QString result;
160
161 if (!m_attributes.isEmpty())
162 result = "+" + m_attributes.join("+");
163
164 return result;
165 }
166
167
178 void addAttribute(QString attribute) {
179 QString upcaseAtt = attribute.toUpper();
180
181 if (attribute.contains("+")) {
183 "Individual attributes (for example, BSQ) cannot contain the '+' "
184 "character because that is used to denote the separation of individual "
185 "attributes",
186 _FILEINFO_);
187 }
188
189 // Verify this attribute is legal
190 bool legal = false;
191 bool (ChildClass::*tester)(QString) const;
192 foreach (tester, m_attributeTypeTesters) {
193 if ( (static_cast<const ChildClass *>(this)->*tester)(upcaseAtt) ) {
194 if (legal) {
196 QObject::tr("Attribute [%1] is ambiguous").arg(attribute),
197 _FILEINFO_);
198 }
199
200 legal = true;
201 }
202 }
203
204 if (!legal) {
206 QObject::tr("Attribute [%1] is not recognized").arg(attribute),
207 _FILEINFO_);
208 }
209
210 m_attributes.append(attribute);
211 }
212
213
222 void addAttributes(const FileName &fileNameWithAtts) {
223 addAttributes(fileNameWithAtts.attributes());
224 }
225
226
235 void addAttributes(const char *attributesString) {
236 addAttributes(QString(attributesString));
237 }
238
239
248 void addAttributes(const QString &attributesString) {
249 setAttributes(toString() + "+" + attributesString);
250 }
251
252
262 void setAttributes(const FileName &fileName) {
263 QStringList attributes = fileName.attributes().split("+", Qt::SkipEmptyParts);
264
265 m_attributes.clear();
266 foreach (QString attribute, attributes)
267 addAttribute(attribute);
268 }
269
270
271 protected:
280 QStringList attributeList(bool (ChildClass::*tester)(QString) const) const {
281 QStringList relevantAttributes;
282
283 foreach (QString attribute, m_attributes) {
284 QString upcaseAtt = attribute.toUpper();
285 if ( (static_cast<const ChildClass *>(this)->*tester)(upcaseAtt) ) {
286 relevantAttributes.append(upcaseAtt);
287 }
288 }
289
290 return relevantAttributes;
291 }
292
293
305 void setAttribute(QString newValue, bool (ChildClass::*tester)(QString) const) {
306 QMutableListIterator<QString> it(m_attributes);
307
308 bool found = false;
309 while (it.hasNext()) {
310 QString &attribute = it.next();
311
312 QString upcaseAtt = attribute.toUpper();
313 if ( (static_cast<const ChildClass *>(this)->*tester)(upcaseAtt) ) {
314 if (found || newValue == "") {
315 // already found one (remove the duplicate) or just deleting it
316 it.remove();
317 }
318 else {
319 // modify existing attribute value
320 attribute = newValue;
321 }
322
323 found = true;
324 }
325 }
326
327 // Attribute doesn't exist, add it
328 if (!found && newValue != "") {
329 m_attributes.append(newValue);
330 }
331 }
332
333 private:
340
348 QList< bool (ChildClass::*)(QString) const > m_attributeTypeTesters;
349 };
350
351
381 class CubeAttributeInput : public CubeAttribute<CubeAttributeInput> {
382
383 public:
384
387
388
398 CubeAttributeInput(const FileName &fileName);
399
400
403
404
406 std::vector<QString> bands() const;
407
419 QString bandsString() const;
420
422 void setBands(const std::vector<QString> &bands);
423
424 using CubeAttribute<CubeAttributeInput>::toString;
425
426 private:
427 bool isBandRange(QString attribute) const;
428
429 static QString toString(const std::vector<QString> &bands);
430 static QList<bool (CubeAttributeInput::*)(QString) const> testers();
431
432 private:
433 std::vector<QString> m_bands;
434 };
435
436
473 class CubeAttributeOutput : public CubeAttribute<CubeAttributeOutput> {
474
475 public:
476
479
492 CubeAttributeOutput(const FileName &fileName);
493
494
497
498
500 bool propagatePixelType() const;
501
503 bool propagateMinimumMaximum() const;
504
506 Cube::Format fileFormat() const;
507
509 QString fileFormatString() const;
510
512 void setFileFormat(Cube::Format fmt);
513
515 ByteOrder byteOrder() const;
516
518 QString byteOrderString() const;
519
521 void setByteOrder(ByteOrder order);
522
524 double minimum() const;
525
527 double maximum() const;
528
530 void setMinimum(double min);
531
533 void setMaximum(double max);
534
536 PixelType pixelType() const;
537
539 void setPixelType(PixelType type);
540
542 void setLabelAttachment(LabelAttachment attachment);
543
544 LabelAttachment labelAttachment() const;
545
546 using CubeAttribute<CubeAttributeOutput>::toString;
547
548
549 private:
550 bool isByteOrder(QString attribute) const;
551 bool isFileFormat(QString attribute) const;
552 bool isLabelAttachment(QString attribute) const;
553 bool isPixelType(QString attribute) const;
554 bool isRange(QString attribute) const;
555
556 static QString toString(Cube::Format);
557
568
569 static QList<bool (CubeAttributeOutput::*)(QString) const> testers();
570 };
571};
572
573#endif
CubeAttribute(QList< bool(ChildClass::*)(QString) const > testers, const FileName &fileName)
Constructs a CubeAttribute using the argument.
void addAttributes(const FileName &fileNameWithAtts)
Append the attributes found in the filename to these cube attributes.
void addAttribute(QString attribute)
Add a single attribute to these attributes.
QString toString() const
Return a string-representation of this cube attributes.
virtual ~CubeAttribute()
Destroys the object.
void addAttributes(const QString &attributesString)
Append the attributes in the string to these cube attributes.
QStringList attributeList(bool(ChildClass::*tester)(QString) const) const
Get a list of attributes that the tester returns true on.
QList< bool(ChildClass::*)(QString) const > m_attributeTypeTesters
These testers determine if an attribute looks like a particular option.
void setAttributes(const FileName &fileName)
Replaces the current attributes with the attributes in the given file name.
QStringList m_attributes
These are the attributes that this cube attribute stores.
void setAttribute(QString newValue, bool(ChildClass::*tester)(QString) const)
Set the attribute(s) for which tester returns true to newValue.
CubeAttribute(QList< bool(ChildClass::*)(QString) const > testers)
Constructs an empty CubeAttribute.
void addAttributes(const char *attributesString)
Append the attributes in the string to these cube attributes.
std::vector< QString > m_bands
A list of the specified bands.
void setBands(const std::vector< QString > &bands)
Set the band attribute according to the list of bands.
QString bandsString() const
Return a string representation of all the bands.
CubeAttributeInput()
Constructs an empty CubeAttributeInput.
~CubeAttributeInput()
Destroys the object.
std::vector< QString > bands() const
Return a vector of the input bands specified.
Manipulate and parse attributes of output cube filenames.
double minimum() const
Return the output cube attribute minimum.
void setLabelAttachment(LabelAttachment attachment)
Set the label attachment type to the parameter value.
ByteOrder byteOrder() const
Return the byte order as an Isis::ByteOrder.
double maximum() const
Return the output cube attribute maximum.
void setByteOrder(ByteOrder order)
Set the order according to the parameter order.
bool propagateMinimumMaximum() const
Return true if the min/max are to be propagated from an input cube.
bool propagatePixelType() const
Return true if the pixel type is to be propagated from an input cube.
Cube::Format fileFormat() const
Return the file format an Cube::Format.
QString fileFormatString() const
Return the file format as a string.
QString byteOrderString() const
Return the byte order as a string.
CubeAttributeOutput()
Constructs an empty CubeAttributeOutput.
PixelType pixelType() const
Return the pixel type as an Isis::PixelType.
void setMinimum(double min)
Set the output cube attribute minimum.
void setMaximum(double max)
Set the output cube attribute maximum.
~CubeAttributeOutput()
Destroys the object.
void setPixelType(PixelType type)
Set the pixel type to that given by the parameter.
void setFileFormat(Cube::Format fmt)
Set the format to the fmt parameter.
RangeType
Output cube range tracker.
@ PropagateRange
Propagate the range from an input cube.
@ RangeSet
The range has been set.
Format
These are the possible storage formats of ISIS cubes.
Definition Cube.h:179
File name manipulation and expansion.
Definition FileName.h:100
QString attributes() const
Returns a QString of the attributes in a filename, attributes are expected to be of type CubeAttribut...
Definition FileName.cpp:121
Isis exception class.
Definition IException.h:91
@ Unknown
A type of error that cannot be classified as any of the other error types.
Definition IException.h:118
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition IException.h:146
This is free and unencumbered software released into the public domain.
ByteOrder
Tests the current architecture for byte order.
Definition Endian.h:42
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16
LabelAttachment LabelAttachmentEnumeration(const QString &labelType)
Return the appropriate LabelType depending on which of the valid values the argument spells.
LabelAttachment
Input cube label type tracker.
@ ExternalLabel
The label is pointing to an external DN file - the label is also external to the data.
@ AttachedLabel
The input label is embedded in the image file.
@ DetachedLabel
The input label is in a separate data file from the image.
QString LabelAttachmentName(LabelAttachment labelType)
Return the string representation of the contents of a variable of type LabelAttachment.
PixelType
Enumerations for Isis Pixel Types.
Definition PixelType.h:27