30 #include <getSpkAbCorrState.hpp> 59 Spice::Spice(
Pvl &lab) {
61 bool hasTables = (kernels[
"TargetPosition"][0] ==
"Table");
63 init(lab, !hasTables);
92 bool hasTables = (kernels[
"TargetPosition"][0] ==
"Table");
94 init(lab, !hasTables);
103 Spice::Spice(
Cube &cube,
bool noTables) {
104 init(*cube.
label(), noTables);
120 void Spice::init(
Pvl &lab,
bool noTables) {
121 NaifStatus::CheckErrors();
128 m_startTime =
new iTime;
129 m_endTime =
new iTime;
130 m_cacheSize =
new SpiceDouble;
133 m_startTimePadding =
new SpiceDouble;
134 *m_startTimePadding = 0;
135 m_endTimePadding =
new SpiceDouble;
136 *m_endTimePadding = 0;
138 m_instrumentPosition = NULL;
139 m_instrumentRotation = NULL;
140 m_sunPosition = NULL;
141 m_bodyRotation = NULL;
143 m_allowDownsizing =
false;
145 m_spkCode =
new SpiceInt;
146 m_ckCode =
new SpiceInt;
147 m_ikCode =
new SpiceInt;
148 m_sclkCode =
new SpiceInt;
149 m_spkBodyCode =
new SpiceInt;
150 m_bodyFrameCode =
new SpiceInt;
152 m_naifKeywords =
new PvlObject(
"NaifKeywords");
161 *m_startTimePadding =
toDouble(kernels[
"StartPadding"][0]);
164 *m_startTimePadding = 0.0;
168 *m_endTimePadding =
toDouble(kernels[
"EndPadding"][0]);
171 *m_endTimePadding = 0.0;
174 m_usingNaif = !lab.
hasObject(
"NaifKeywords") || noTables;
181 load(kernels[
"TargetPosition"], noTables);
182 load(kernels[
"InstrumentPosition"], noTables);
183 load(kernels[
"InstrumentPointing"], noTables);
187 load(kernels[
"Frame"], noTables);
190 load(kernels[
"TargetAttitudeShape"], noTables);
192 load(kernels[
"Instrument"], noTables);
195 if (kernels.
hasKeyword(
"InstrumentAddendum")) {
196 load(kernels[
"InstrumentAddendum"], noTables);
198 load(kernels[
"LeapSecond"], noTables);
200 load(kernels[
"SpacecraftClock"], noTables);
206 load(kernels[
"Extra"], noTables);
213 m_target =
new Target(
this, lab);
220 if (m_target->name().toUpper() ==
"SATURN" && m_target->shape()->name().toUpper() ==
"PLANE") {
222 load(ringPck, noTables);
226 *m_naifKeywords = lab.
findObject(
"NaifKeywords");
232 m_target =
new Target(
this, lab);
252 QString trykey =
"NaifIkCode";
253 if (kernels.
hasKeyword(
"NaifFrameCode")) trykey =
"NaifFrameCode";
254 *m_ikCode =
toInt(kernels[trykey][0]);
256 *m_spkCode = *m_ikCode / 1000;
257 *m_sclkCode = *m_spkCode;
258 *m_ckCode = *m_ikCode;
260 if (!m_target->isSky()) {
264 QString radiiKey =
"BODY" +
Isis::toString(m_target->naifBodyCode()) +
"_RADII";
265 QVariant result = m_target->naifBodyCode();
266 storeValue(
"BODY_CODE", 0, SpiceIntType, result);
267 std::vector<Distance> radii(3,
Distance());
268 radii[0] =
Distance(getDouble(radiiKey, 0), Distance::Kilometers);
269 radii[1] =
Distance(getDouble(radiiKey, 1), Distance::Kilometers);
270 radii[2] =
Distance(getDouble(radiiKey, 2), Distance::Kilometers);
272 m_target->setRadii(radii);
274 *m_spkBodyCode = m_target->naifBodyCode();
278 *m_spkCode = (int) kernels[
"NaifSpkCode"];
282 *m_ckCode = (int) kernels[
"NaifCkCode"];
286 *m_sclkCode = (int) kernels[
"NaifSclkCode"];
289 if (!m_target->isSky()) {
291 *m_spkBodyCode = (int) kernels[
"NaifSpkBodyCode"];
295 if (m_target->isSky()) {
303 if ((m_usingNaif) || (!m_naifKeywords->hasKeyword(
"BODY_FRAME_CODE"))) {
306 cidfrm_c(*m_spkBodyCode,
sizeof(frameName), &frameCode, frameName, &found);
309 QString naifTarget =
"IAU_" + m_target->name().toUpper();
310 namfrm_c(naifTarget.toLatin1().data(), &frameCode);
311 if (frameCode == 0) {
312 QString msg =
"Can not find NAIF BODY_FRAME_CODE for target [" 313 + m_target->name() +
"]";
318 QVariant result = (int)frameCode;
319 storeValue(
"BODY_FRAME_CODE", 0, SpiceIntType, result);
322 frameCode = getInteger(
"BODY_FRAME_CODE", 0);
326 *m_bodyFrameCode = frameCode;
336 vector<Distance> radius = m_target->radii();
337 Distance targetRadius((radius[0] + radius[2])/2.0);
339 ltState, targetRadius);
341 m_sunPosition =
new SpicePosition(10, m_target->naifBodyCode());
345 if (kernels[
"TargetPosition"][0].toUpper() ==
"TABLE") {
347 m_sunPosition->LoadCache(t);
350 m_bodyRotation->LoadCache(t2);
351 if (t2.Label().hasKeyword(
"SolarLongitude")) {
352 *m_solarLongitude =
Longitude(t2.Label()[
"SolarLongitude"],
366 if (kernels[
"InstrumentPointing"].size() == 0) {
368 "No camera pointing available",
374 if (kernels[
"InstrumentPointing"][0].toUpper() ==
"NADIR") {
375 if (m_instrumentRotation) {
376 delete m_instrumentRotation;
377 m_instrumentRotation = NULL;
380 m_instrumentRotation =
new SpiceRotation(*m_ikCode, *m_spkBodyCode);
382 else if (kernels[
"InstrumentPointing"][0].toUpper() ==
"TABLE") {
384 m_instrumentRotation->LoadCache(t);
387 if (kernels[
"InstrumentPosition"].size() == 0) {
389 "No instrument position available",
393 if (kernels[
"InstrumentPosition"][0].toUpper() ==
"TABLE") {
395 m_instrumentPosition->LoadCache(t);
398 NaifStatus::CheckErrors();
411 NaifStatus::CheckErrors();
413 for (
int i = 0; i < key.
size(); i++) {
414 if (key[i] ==
"")
continue;
415 if (key[i].toUpper() ==
"NULL")
break;
416 if (key[i].toUpper() ==
"NADIR")
break;
417 if (key[i].toUpper() ==
"TABLE" && !noTables)
break;
418 if (key[i].toUpper() ==
"TABLE" && noTables)
continue;
421 QString msg =
"Spice file does not exist [" + file.
expanded() +
"]";
425 furnsh_c(fileName.toLatin1().data());
426 m_kernels->push_back(key[i]);
429 NaifStatus::CheckErrors();
436 NaifStatus::CheckErrors();
438 if (m_solarLongitude != NULL) {
439 delete m_solarLongitude;
440 m_solarLongitude = NULL;
448 if (m_startTime != NULL) {
453 if (m_endTime != NULL) {
458 if (m_cacheSize != NULL) {
463 if (m_startTimePadding != NULL) {
464 delete m_startTimePadding;
465 m_startTimePadding = NULL;
468 if (m_endTimePadding != NULL) {
469 delete m_endTimePadding;
470 m_endTimePadding = NULL;
473 if (m_instrumentPosition != NULL) {
474 delete m_instrumentPosition;
475 m_instrumentPosition = NULL;
478 if (m_instrumentRotation != NULL) {
479 delete m_instrumentRotation;
480 m_instrumentRotation = NULL;
483 if (m_sunPosition != NULL) {
484 delete m_sunPosition;
485 m_sunPosition = NULL;
488 if (m_bodyRotation != NULL) {
489 delete m_bodyRotation;
490 m_bodyRotation = NULL;
493 if (m_spkCode != NULL) {
498 if (m_ckCode != NULL) {
503 if (m_ikCode != NULL) {
508 if (m_sclkCode != NULL) {
513 if (m_spkBodyCode != NULL) {
514 delete m_spkBodyCode;
515 m_spkBodyCode = NULL;
518 if (m_bodyFrameCode != NULL) {
519 delete m_bodyFrameCode;
520 m_bodyFrameCode = NULL;
523 if (m_target != NULL) {
529 for (
int i = 0; m_kernels && i < m_kernels->size(); i++) {
532 unload_c(fileName.toLatin1().data());
535 if (m_kernels != NULL) {
540 NaifStatus::CheckErrors();
575 int cacheSize,
double tol) {
576 NaifStatus::CheckErrors();
579 if (cacheSize <= 0) {
580 QString msg =
"Argument cacheSize must be greater than zero";
584 if (startTime > endTime) {
585 QString msg =
"Argument startTime must be less than or equal to endTime";
589 if (*m_cacheSize > 0) {
590 QString msg =
"A cache has already been created";
594 if (cacheSize == 1 && (*m_startTimePadding != 0 || *m_endTimePadding != 0)) {
595 QString msg =
"This instrument does not support time padding";
600 if (getSpkAbCorrState(abcorr)) {
601 instrumentPosition()->SetAberrationCorrection(
"NONE");
604 iTime avgTime((startTime.
Et() + endTime.
Et()) / 2.0);
605 computeSolarLongitude(avgTime);
608 if (!m_bodyRotation->IsCached()) {
609 int bodyRotationCacheSize = cacheSize;
610 if (cacheSize > 2) bodyRotationCacheSize = 2;
611 m_bodyRotation->LoadCache(
612 startTime.
Et() - *m_startTimePadding,
613 endTime.
Et() + *m_endTimePadding,
614 bodyRotationCacheSize);
617 if (m_instrumentRotation->GetSource() < SpiceRotation::Memcache) {
618 if (cacheSize > 3) m_instrumentRotation->MinimizeCache(SpiceRotation::Yes);
619 m_instrumentRotation->LoadCache(
620 startTime.
Et() - *m_startTimePadding,
621 endTime.
Et() + *m_endTimePadding,
625 if (m_instrumentPosition->GetSource() < SpicePosition::Memcache) {
626 m_instrumentPosition->LoadCache(
627 startTime.
Et() - *m_startTimePadding,
628 endTime.
Et() + *m_endTimePadding,
630 if (cacheSize > 3) m_instrumentPosition->Memcache2HermiteCache(tol);
633 if (!m_sunPosition->IsCached()) {
634 int sunPositionCacheSize = cacheSize;
635 if (cacheSize > 2) sunPositionCacheSize = 2;
636 m_sunPosition->LoadCache(
637 startTime.
Et() - *m_startTimePadding,
638 endTime.
Et() + *m_endTimePadding,
639 sunPositionCacheSize);
643 *m_startTime = startTime;
644 *m_endTime = endTime;
645 *m_cacheSize = cacheSize;
649 for (
int i = 0; i < m_kernels->size(); i++) {
652 unload_c(fileName.toLatin1().data());
657 NaifStatus::CheckErrors();
668 iTime Spice::cacheStartTime()
const {
705 void Spice::setTime(
const iTime &et) {
715 if (*m_cacheSize == 0) {
716 if (m_startTime->Et() == 0.0 && m_endTime->Et() == 0.0
717 && getSpkAbCorrState(abcorr)) {
718 instrumentPosition()->SetAberrationCorrection(
"NONE");
725 m_bodyRotation->SetEphemerisTime(et.
Et());
726 m_instrumentRotation->SetEphemerisTime(et.
Et());
727 m_instrumentPosition->SetEphemerisTime(et.
Et());
728 m_sunPosition->SetEphemerisTime(et.
Et());
730 std::vector<double> uB = m_bodyRotation->ReferenceVector(m_sunPosition->Coordinate());
735 computeSolarLongitude(*m_et);
747 void Spice::instrumentPosition(
double p[3])
const {
748 instrumentBodyFixedPosition(p);
760 void Spice::instrumentBodyFixedPosition(
double p[3])
const {
762 QString msg =
"Unable to retrieve instrument's body fixed position." 763 " Spice::SetTime must be called first.";
767 std::vector<double> sB = m_bodyRotation->ReferenceVector(m_instrumentPosition->Coordinate());
778 void Spice::instrumentBodyFixedVelocity(
double v[3])
const {
780 QString msg =
"Unable to retrieve instrument's body fixed velocity." 781 " Spice::SetTime must be called first.";
785 std::vector<double> state;
786 state.push_back(m_instrumentPosition->Coordinate()[0]);
787 state.push_back(m_instrumentPosition->Coordinate()[1]);
788 state.push_back(m_instrumentPosition->Coordinate()[2]);
789 state.push_back(m_instrumentPosition->Velocity()[0]);
790 state.push_back(m_instrumentPosition->Velocity()[1]);
791 state.push_back(m_instrumentPosition->Velocity()[2]);
793 std::vector<double> vB = m_bodyRotation->ReferenceVector(state);
811 QString msg =
"Unable to retrieve the time." 812 " Spice::SetTime must be called first.";
827 void Spice::sunPosition(
double p[3])
const {
829 QString msg =
"Unable to retrieve sun's position." 830 " Spice::SetTime must be called first.";
843 double Spice::targetCenterDistance()
const {
844 std::vector<double> sB = m_bodyRotation->ReferenceVector(m_instrumentPosition->Coordinate());
845 return sqrt(pow(sB[0], 2) + pow(sB[1], 2) + pow(sB[2], 2));
856 for (
int i = 0; i < 3; i++)
857 r[i] =m_target->radii()[i];
866 SpiceInt Spice::naifBodyCode()
const {
867 return (
int) m_target->naifBodyCode();
875 SpiceInt Spice::naifSpkCode()
const {
884 SpiceInt Spice::naifCkCode()
const {
893 SpiceInt Spice::naifIkCode()
const {
903 SpiceInt Spice::naifSclkCode()
const {
914 SpiceInt Spice::naifBodyFrameCode()
const {
915 return *m_bodyFrameCode;
924 return *m_naifKeywords;
933 double Spice::resolution() {
949 SpiceInt Spice::getInteger(
const QString &key,
int index) {
950 return readValue(key, SpiceIntType, index).toInt();
963 SpiceDouble Spice::getDouble(
const QString &key,
int index) {
964 return readValue(key, SpiceDoubleType, index).toDouble();
977 iTime Spice::getClockTime(QString clockValue,
int sclkCode,
bool clockTicks) {
978 if (sclkCode == -1) {
979 sclkCode = naifSclkCode();
984 QString key =
"CLOCK_ET_" +
Isis::toString(sclkCode) +
"_" + clockValue;
985 QVariant storedClockTime = getStoredResult(key, SpiceDoubleType);
987 if (storedClockTime.isNull()) {
988 SpiceDouble timeOutput;
989 NaifStatus::CheckErrors();
991 sct2e_c(sclkCode, (SpiceDouble) clockValue.toDouble(), &timeOutput);
994 scs2e_c(sclkCode, clockValue.toLatin1().data(), &timeOutput);
996 NaifStatus::CheckErrors();
997 storedClockTime = timeOutput;
998 storeResult(key, SpiceDoubleType, timeOutput);
1001 result = storedClockTime.toDouble();
1021 NaifStatus::CheckErrors();
1024 SpiceBoolean found =
false;
1028 SpiceInt numValuesRead;
1030 if (type == SpiceDoubleType) {
1031 SpiceDouble kernelValue;
1032 gdpool_c(key.toLatin1().data(), (SpiceInt)index, 1,
1033 &numValuesRead, &kernelValue, &found);
1036 result = kernelValue;
1038 else if (type == SpiceStringType) {
1039 char kernelValue[512];
1040 gcpool_c(key.toLatin1().data(), (SpiceInt)index, 1,
sizeof(kernelValue),
1041 &numValuesRead, kernelValue, &found);
1044 result = kernelValue;
1046 else if (type == SpiceIntType) {
1047 SpiceInt kernelValue;
1048 gipool_c(key.toLatin1().data(), (SpiceInt)index, 1, &numValuesRead,
1049 &kernelValue, &found);
1052 result = (int)kernelValue;
1056 QString msg =
"Can not find [" + key +
"] in text kernels";
1060 storeValue(key, index, type, result);
1061 NaifStatus::CheckErrors();
1065 result = readStoredValue(key, type, index);
1067 if (result.isNull()) {
1068 QString msg =
"The camera is requesting spice data [" + key +
"] that " 1069 "was not attached, please re-run spiceinit";
1078 void Spice::storeResult(QString name, SpiceValueType type, QVariant value) {
1079 if (type == SpiceDoubleType) {
1082 double doubleVal = value.toDouble();
1083 doubleVal = swapper.Double(&doubleVal);
1084 QByteArray byteCode((
char *) &doubleVal,
sizeof(
double));
1086 type = SpiceByteCodeType;
1089 storeValue(name +
"_COMPUTED", 0, type, value);
1093 QVariant Spice::getStoredResult(QString name, SpiceValueType type) {
1094 bool wasDouble =
false;
1096 if (type == SpiceDoubleType) {
1098 type = SpiceByteCodeType;
1101 QVariant stored = readStoredValue(name +
"_COMPUTED", type, 0);
1103 if (wasDouble && !stored.isNull()) {
1104 EndianSwapper swapper(
"LSB");
1105 double doubleVal = swapper.Double((
void *)QByteArray::fromHex(
1106 stored.toByteArray()).data());
1114 void Spice::storeValue(QString key,
int index, SpiceValueType type,
1116 if (!m_naifKeywords->hasKeyword(key)) {
1117 m_naifKeywords->addKeyword(PvlKeyword(key));
1120 PvlKeyword &storedKey = m_naifKeywords->findKeyword(key);
1122 while(index >= storedKey.size()) {
1123 storedKey.addValue(
"");
1126 if (type == SpiceByteCodeType) {
1127 storedKey[index] = QString(value.toByteArray().toHex().data());
1129 else if (type == SpiceStringType) {
1130 storedKey[index] = value.toString();
1132 else if (type == SpiceDoubleType) {
1133 storedKey[index] =
toString(value.toDouble());
1135 else if (type == SpiceIntType) {
1136 storedKey[index] =
toString(value.toInt());
1139 QString msg =
"Unable to store variant in labels for key [" + key +
"]";
1140 throw IException(IException::Unknown, msg,
_FILEINFO_);
1145 QVariant Spice::readStoredValue(QString key, SpiceValueType type,
1150 if (m_naifKeywords->hasKeyword(key) && !m_usingNaif) {
1151 PvlKeyword &storedKeyword = m_naifKeywords->findKeyword(key);
1154 if (type == SpiceDoubleType) {
1155 result =
toDouble(storedKeyword[index]);
1157 else if (type == SpiceStringType) {
1158 result = storedKeyword[index];
1160 else if (type == SpiceByteCodeType || SpiceStringType) {
1161 result = storedKeyword[index].toLatin1();
1163 else if (type == SpiceIntType) {
1164 result =
toInt(storedKeyword[index]);
1167 catch(IException &) {
1185 QString Spice::getString(
const QString &key,
int index) {
1186 return readValue(key, SpiceStringType, index).toString();
1202 void Spice::subSpacecraftPoint(
double &lat,
double &lon) {
1203 NaifStatus::CheckErrors();
1206 QString msg =
"Unable to retrieve subspacecraft position." 1207 " Spice::SetTime must be called first.";
1211 SpiceDouble usB[3], dist;
1212 std::vector<double> vsB = m_bodyRotation->ReferenceVector(m_instrumentPosition->Coordinate());
1217 unorm_c(sB, usB, &dist);
1219 std::vector<Distance> radii = target()->radii();
1220 SpiceDouble a = radii[0].kilometers();
1221 SpiceDouble b = radii[1].kilometers();
1222 SpiceDouble c = radii[2].kilometers();
1224 SpiceDouble originB[3];
1225 originB[0] = originB[1] = originB[2] = 0.0;
1228 SpiceDouble subB[3];
1229 surfpt_c(originB, usB, a, b, c, subB, &found);
1231 SpiceDouble mylon, mylat;
1232 reclat_c(subB, &a, &mylon, &mylat);
1233 lat = mylat * 180.0 /
PI;
1234 lon = mylon * 180.0 /
PI;
1235 if (lon < 0.0) lon += 360.0;
1237 NaifStatus::CheckErrors();
1251 void Spice::subSolarPoint(
double &lat,
double &lon) {
1252 NaifStatus::CheckErrors();
1255 QString msg =
"Unable to retrieve subsolar point." 1256 " Spice::SetTime must be called first.";
1260 SpiceDouble uuB[3], dist;
1261 unorm_c(m_uB, uuB, &dist);
1263 std::vector<Distance> radii = target()->radii();
1264 SpiceDouble a = radii[0].kilometers();
1265 SpiceDouble b = radii[1].kilometers();
1266 SpiceDouble c = radii[2].kilometers();
1268 SpiceDouble originB[3];
1269 originB[0] = originB[1] = originB[2] = 0.0;
1272 SpiceDouble subB[3];
1273 surfpt_c(originB, uuB, a, b, c, subB, &found);
1275 SpiceDouble mylon, mylat;
1276 reclat_c(subB, &a, &mylon, &mylat);
1277 lat = mylat * 180.0 /
PI;
1278 lon = mylon * 180.0 /
PI;
1279 if (lon < 0.0) lon += 360.0;
1281 NaifStatus::CheckErrors();
1300 QString Spice::targetName()
const {
1301 return m_target->
name();
1311 void Spice::computeSolarLongitude(
iTime et) {
1312 NaifStatus::CheckErrors();
1314 if (m_target->isSky()) {
1319 if (m_bodyRotation->IsCached())
return;
1321 double tipm[3][3], npole[3];
1326 cidfrm_c(*m_spkBodyCode,
sizeof(frameName), &frameCode, frameName, &found);
1329 pxform_c(
"J2000", frameName, et.
Et(), tipm);
1332 tipbod_c(
"J2000", *m_spkBodyCode, et.
Et(), tipm);
1335 for (
int i = 0; i < 3; i++) {
1336 npole[i] = tipm[2][i];
1339 double state[6], lt;
1340 spkez_c(*m_spkBodyCode, et.
Et(),
"J2000",
"NONE", 10, state, <);
1343 ucrss_c(state, &state[3], uavel);
1345 double x[3], y[3], z[3];
1347 ucrss_c(npole, z, x);
1351 for (
int i = 0; i < 3; i++) {
1357 spkez_c(10, et.
Et(),
"J2000",
"LT+S", *m_spkBodyCode, state, <);
1360 mxv_c(trans, state, pos);
1362 double radius, ls, lat;
1363 reclat_c(pos, &radius, &ls, &lat);
1367 NaifStatus::CheckErrors();
1378 computeSolarLongitude(*m_et);
1379 return *m_solarLongitude;
1393 bool Spice::hasKernels(
Pvl &lab) {
1397 std::vector<string> keywords;
1398 keywords.push_back(
"TargetPosition");
1400 if (kernels.
hasKeyword(
"SpacecraftPosition")) {
1401 keywords.push_back(
"SpacecraftPosition");
1404 keywords.push_back(
"InstrumentPosition");
1407 if (kernels.
hasKeyword(
"SpacecraftPointing")) {
1408 keywords.push_back(
"SpacecraftPointing");
1411 keywords.push_back(
"InstrumentPointing");
1415 keywords.push_back(
"Frame");
1419 keywords.push_back(
"Extra");
1423 for (
int ikey = 0; ikey < (int) keywords.size(); ikey++) {
1424 key = kernels[ikey];
1426 for (
int i = 0; i < key.
size(); i++) {
1427 if (key[i] ==
"")
return false;
1428 if (key[i].toUpper() ==
"NULL")
return false;
1429 if (key[i].toUpper() ==
"NADIR")
return false;
1430 if (key[i].toUpper() ==
"TABLE")
return false;
1444 bool Spice::isTimeSet(){
1445 return !(m_et == NULL);
1457 return m_sunPosition;
1468 return m_instrumentPosition;
1479 return m_bodyRotation;
1490 return m_instrumentRotation;
Provides swap observer/target and improved light time correction.
bool hasKeyword(const QString &name) const
Check to see if a keyword exists.
PvlGroupIterator findGroup(const QString &name, PvlGroupIterator beg, PvlGroupIterator end)
Find a group with the specified name, within these indexes.
File name manipulation and expansion.
Parse and return pieces of a time string.
const double PI
The mathematical constant PI.
SpiceValueType
NAIF value primitive type.
PvlObjectIterator findObject(const QString &name, PvlObjectIterator beg, PvlObjectIterator end)
Find the index of object with a specified name, between two indexes.
int toInt(const QString &string)
Global function to convert from a string to an integer.
Provides interface to user configurable Light Time correction feature.
Namespace for the standard library.
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
double toDouble(const QString &string)
Global function to convert from a string to a double.
Distance measurement, usually in meters.
Longitude force360Domain() const
This returns a longitude that is constricted to 0-360 degrees.
bool hasObject(const QString &name) const
Returns a boolean value based on whether the object exists in the current PvlObject or not...
This class is designed to encapsulate the concept of a Longitude.
int size() const
Returns the number of values stored in this keyword.
Contains multiple PvlContainers.
#define _FILEINFO_
Macro for the filename and line number.
A single keyword-value pair.
QString expanded() const
Returns a QString of the full file name including the file path, excluding the attributes.
QString name() const
Return target name.
Obtain SPICE rotation information for a body.
Container for cube-like labels.
This class is used to create and store valid Isis3 targets.
bool checkSpkKernelsForAberrationCorrection()
Check for light time/stellar aberration tag in SPK comments.
Unless noted otherwise, the portions of Isis written by the USGS are public domain.
Pvl * label() const
Returns a pointer to the IsisLabel object associated with the cube.
Class for storing Table blobs information.
QString fileName() const
Returns the filename used to initialise the Pvl object.
Obtain SPICE position information for a body.
Namespace for ISIS/Bullet specific routines.
Contains Pvl Groups and Pvl Objects.
double Et() const
Returns the ephemeris time (TDB) representation of the time as a double.
bool fileExists() const
Returns true if the file exists; false otherwise.
IO Handler for Isis Cubes.