mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-02 16:59:37 -05:00
Move static functions in HorizonsFile to be free functions + PR comments
This commit is contained in:
@@ -95,7 +95,7 @@ private:
|
||||
bool handleRequest();
|
||||
std::string constructUrl();
|
||||
openspace::HorizonsFile handleAnswer(nlohmann::json& answer);
|
||||
bool handleResult(openspace::HorizonsFile::ResultCode& result);
|
||||
bool handleResult(openspace::HorizonsResultCode& result);
|
||||
|
||||
openspace::HorizonsFile _horizonsFile;
|
||||
#endif // OPENSPACE_MODULE_SPACE_ENABLED
|
||||
|
||||
@@ -738,8 +738,8 @@ bool HorizonsDialog::handleRequest() {
|
||||
}
|
||||
|
||||
_horizonsFile = std::move(file);
|
||||
openspace::HorizonsFile::ResultCode result =
|
||||
openspace::HorizonsFile::isValidHorizonsFile(_horizonsFile.file());
|
||||
openspace::HorizonsResultCode result =
|
||||
openspace::isValidHorizonsFile(_horizonsFile.file());
|
||||
|
||||
bool isValid = handleResult(result);
|
||||
|
||||
@@ -764,12 +764,12 @@ bool HorizonsDialog::handleRequest() {
|
||||
|
||||
std::string HorizonsDialog::constructUrl() {
|
||||
// Construct url for request
|
||||
openspace::HorizonsFile::Type type;
|
||||
openspace::HorizonsType type;
|
||||
if (_typeCombo->currentIndex() == 0) {
|
||||
type = openspace::HorizonsFile::Type::Vector;
|
||||
type = openspace::HorizonsType::Vector;
|
||||
}
|
||||
else if (_typeCombo->currentIndex() == 1) {
|
||||
type = openspace::HorizonsFile::Type::Observer;
|
||||
type = openspace::HorizonsType::Observer;
|
||||
}
|
||||
else {
|
||||
_errorMsg->setText("Invalid Horizons type");
|
||||
@@ -843,7 +843,7 @@ std::string HorizonsDialog::constructUrl() {
|
||||
return "";
|
||||
}
|
||||
|
||||
return openspace::HorizonsFile::constructUrl(
|
||||
return openspace::constructHorizonsUrl(
|
||||
type,
|
||||
command,
|
||||
center,
|
||||
@@ -860,11 +860,11 @@ openspace::HorizonsFile HorizonsDialog::handleAnswer(json& answer) {
|
||||
_latestHorizonsError = *it;
|
||||
}
|
||||
|
||||
openspace::HorizonsFile::ResultCode isValid =
|
||||
openspace::HorizonsFile::isValidAnswer(answer);
|
||||
if (isValid != openspace::HorizonsFile::ResultCode::Valid &&
|
||||
isValid != openspace::HorizonsFile::ResultCode::MultipleObserverStations &&
|
||||
isValid != openspace::HorizonsFile::ResultCode::ErrorTimeRange)
|
||||
openspace::HorizonsResultCode isValid =
|
||||
openspace::isValidHorizonsAnswer(answer);
|
||||
if (isValid != openspace::HorizonsResultCode::Valid &&
|
||||
isValid != openspace::HorizonsResultCode::MultipleObserverStations &&
|
||||
isValid != openspace::HorizonsResultCode::ErrorTimeRange)
|
||||
{
|
||||
// Special case with MultipleObserverStations since it is detected as an error
|
||||
// but could be fixed by parsing the matches and let user choose
|
||||
@@ -914,9 +914,9 @@ openspace::HorizonsFile HorizonsDialog::handleAnswer(json& answer) {
|
||||
return openspace::HorizonsFile(filePath, *result);
|
||||
}
|
||||
|
||||
bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
bool HorizonsDialog::handleResult(openspace::HorizonsResultCode& result) {
|
||||
switch (result) {
|
||||
case openspace::HorizonsFile::ResultCode::Valid: {
|
||||
case openspace::HorizonsResultCode::Valid: {
|
||||
// If the request worked then delete the corresponding error file if it exist
|
||||
std::filesystem::path validFile(_horizonsFile.file());
|
||||
|
||||
@@ -930,7 +930,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::Empty: {
|
||||
case openspace::HorizonsResultCode::Empty: {
|
||||
_errorMsg->setText("The horizons file is empty");
|
||||
if (!_latestHorizonsError.empty()) {
|
||||
std::string msg = fmt::format(
|
||||
@@ -940,7 +940,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::ErrorSize: {
|
||||
case openspace::HorizonsResultCode::ErrorSize: {
|
||||
std::string msg = fmt::format(
|
||||
"Time range '{}' to '{}' with step size '{} {}' is too big, try to "
|
||||
"increase the step size and/or decrease the time range",
|
||||
@@ -953,14 +953,14 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
styleLabel(_stepLabel, true);
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::ErrorSpan:
|
||||
case openspace::HorizonsResultCode::ErrorSpan:
|
||||
appendLog(
|
||||
"Step size is too big, exceeds available time span for target",
|
||||
HorizonsDialog::LogLevel::Error
|
||||
);
|
||||
styleLabel(_stepLabel, true);
|
||||
break;
|
||||
case openspace::HorizonsFile::ResultCode::ErrorTimeRange: {
|
||||
case openspace::HorizonsResultCode::ErrorTimeRange: {
|
||||
std::string msg = fmt::format(
|
||||
"Time range is outside the valid range for target '{}'", _targetName
|
||||
);
|
||||
@@ -985,7 +985,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
_importTimeButton->show();
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::ErrorNoObserver: {
|
||||
case openspace::HorizonsResultCode::ErrorNoObserver: {
|
||||
std::string msg = fmt::format(
|
||||
"No match was found for observer '{}'", _observerName
|
||||
);
|
||||
@@ -999,7 +999,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
styleLabel(_centerLabel, true);
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::ErrorObserverTargetSame: {
|
||||
case openspace::HorizonsResultCode::ErrorObserverTargetSame: {
|
||||
std::string msg = fmt::format(
|
||||
"The observer '{}' and target '{}' are the same. Please use another "
|
||||
"observer for the current target.", _observerName, _targetName
|
||||
@@ -1009,7 +1009,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
styleLabel(_centerLabel, true);
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::ErrorNoData: {
|
||||
case openspace::HorizonsResultCode::ErrorNoData: {
|
||||
std::string msg = fmt::format(
|
||||
"There is not enough data to compute the state of target '{}' in "
|
||||
"relation to the observer '{}' for the time range '{}' to '{}'. Try to "
|
||||
@@ -1019,7 +1019,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
appendLog(msg, HorizonsDialog::LogLevel::Error);
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::MultipleObserverStations: {
|
||||
case openspace::HorizonsResultCode::MultipleObserverStations: {
|
||||
std::string msg = fmt::format(
|
||||
"Multiple matching observer stations were found for observer '{}'. ",
|
||||
_observerName
|
||||
@@ -1060,7 +1060,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
_chooseObserverCombo->show();
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::MultipleObserver: {
|
||||
case openspace::HorizonsResultCode::MultipleObserver: {
|
||||
std::string msg = fmt::format(
|
||||
"Multiple matches were found for observer '{}'", _observerName
|
||||
);
|
||||
@@ -1093,7 +1093,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
_chooseObserverCombo->show();
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::ErrorNoTarget: {
|
||||
case openspace::HorizonsResultCode::ErrorNoTarget: {
|
||||
std::string msg = fmt::format(
|
||||
"No match was found for target '{}'", _targetName
|
||||
);
|
||||
@@ -1107,7 +1107,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
styleLabel(_targetLabel, true);
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::MultipleTarget: {
|
||||
case openspace::HorizonsResultCode::MultipleTarget: {
|
||||
// Case Small Bodies:
|
||||
// Line before data: Matching small-bodies
|
||||
// Format: Record #, Epoch-yr, >MATCH DESIG<, Primary Desig, Name
|
||||
@@ -1149,7 +1149,7 @@ bool HorizonsDialog::handleResult(openspace::HorizonsFile::ResultCode& result) {
|
||||
_chooseTargetCombo->show();
|
||||
break;
|
||||
}
|
||||
case openspace::HorizonsFile::ResultCode::UnknownError: {
|
||||
case openspace::HorizonsResultCode::UnknownError: {
|
||||
appendLog("Unknown error", LogLevel::Error);
|
||||
if (!_latestHorizonsError.empty()) {
|
||||
std::string msg = fmt::format(
|
||||
|
||||
@@ -75,8 +75,8 @@ namespace {
|
||||
return "";
|
||||
}
|
||||
|
||||
size_t startPos = string.find(from);
|
||||
while (startPos != std::string::npos) {
|
||||
size_t startPos = 0;
|
||||
while ((startPos = string.find(from, startPos)) != std::string::npos) {
|
||||
string.replace(startPos, from.length(), to);
|
||||
|
||||
// In case 'to' contains 'from', ex replacing 'x' with 'yx'
|
||||
@@ -132,20 +132,19 @@ std::filesystem::path& HorizonsFile::file() {
|
||||
return _file;
|
||||
}
|
||||
|
||||
std::string HorizonsFile::constructUrl(HorizonsFile::Type type, const std::string& target,
|
||||
const std::string& observer,
|
||||
const std::string& startTime,
|
||||
const std::string& stopTime,
|
||||
const std::string& stepSize,
|
||||
const std::string& unit)
|
||||
std::string constructHorizonsUrl(HorizonsType type, const std::string& target,
|
||||
const std::string& observer,
|
||||
const std::string& startTime,
|
||||
const std::string& stopTime, const std::string& stepSize,
|
||||
const std::string& unit)
|
||||
{
|
||||
// Construct url for request
|
||||
std::string url = "";
|
||||
switch (type) {
|
||||
case Type::Vector:
|
||||
case HorizonsType::Vector:
|
||||
url = VectorUrl;
|
||||
break;
|
||||
case Type::Observer:
|
||||
case HorizonsType::Observer:
|
||||
url = ObserverUrl;
|
||||
break;
|
||||
default:
|
||||
@@ -167,7 +166,7 @@ std::string HorizonsFile::constructUrl(HorizonsFile::Type type, const std::strin
|
||||
return url;
|
||||
}
|
||||
|
||||
HorizonsFile::ResultCode HorizonsFile::isValidAnswer(const json& answer) {
|
||||
HorizonsResultCode isValidHorizonsAnswer(const json& answer) {
|
||||
// Signature, source and version
|
||||
if (auto signature = answer.find("signature"); signature != answer.end()) {
|
||||
|
||||
@@ -203,55 +202,58 @@ HorizonsFile::ResultCode HorizonsFile::isValidAnswer(const json& answer) {
|
||||
// There was an error
|
||||
std::string errorMsg = *it;
|
||||
|
||||
// @CPP23 (malej, 2022-04-08) In all cases below, the string function contains
|
||||
// should be used instead of find
|
||||
|
||||
// Projected output length (~X) exceeds 90024 line max -- change step-size
|
||||
if (errorMsg.find("Projected output length") != std::string::npos) {
|
||||
return ResultCode::ErrorSize;
|
||||
return HorizonsResultCode::ErrorSize;
|
||||
}
|
||||
// STEP_SIZE too big, exceeds available span.
|
||||
else if (errorMsg.find("STEP_SIZE too big") != std::string::npos) {
|
||||
return ResultCode::ErrorSpan;
|
||||
return HorizonsResultCode::ErrorSpan;
|
||||
}
|
||||
// No ephemeris for target "X" after A.D. Y UT
|
||||
else if (errorMsg.find("No ephemeris for target") != std::string::npos) {
|
||||
return ResultCode::ErrorTimeRange;
|
||||
return HorizonsResultCode::ErrorTimeRange;
|
||||
}
|
||||
// No site matches. Use "*@body" to list, "c@body" to enter coords, ?! for help.
|
||||
else if (errorMsg.find("No site matches") != std::string::npos ||
|
||||
errorMsg.find("Cannot find central body") != std::string::npos)
|
||||
{
|
||||
return ResultCode::ErrorNoObserver;
|
||||
return HorizonsResultCode::ErrorNoObserver;
|
||||
}
|
||||
// Observer table for X / Y->Y disallowed.
|
||||
else if (errorMsg.find("disallowed") != std::string::npos) {
|
||||
return ResultCode::ErrorObserverTargetSame;
|
||||
return HorizonsResultCode::ErrorObserverTargetSame;
|
||||
}
|
||||
// Insufficient ephemeris data has been loaded to compute the state of X
|
||||
// relative to Y at the ephemeris epoch Z;
|
||||
else if (errorMsg.find("Insufficient ephemeris data") != std::string::npos) {
|
||||
return ResultCode::ErrorNoData;
|
||||
return HorizonsResultCode::ErrorNoData;
|
||||
}
|
||||
// # E. Lon DXY DZ Observatory Name;
|
||||
// -- - -------- ------ - ------ - ----------------;
|
||||
// * Observer station *
|
||||
// Multiple matching stations found.
|
||||
else if (errorMsg.find("Multiple matching stations found") != std::string::npos) {
|
||||
return ResultCode::MultipleObserverStations;
|
||||
return HorizonsResultCode::MultipleObserverStations;
|
||||
}
|
||||
// Unknown error
|
||||
else {
|
||||
LERROR(errorMsg);
|
||||
return ResultCode::UnknownError;
|
||||
return HorizonsResultCode::UnknownError;
|
||||
}
|
||||
}
|
||||
return ResultCode::Valid;
|
||||
return HorizonsResultCode::Valid;
|
||||
}
|
||||
|
||||
// Check whether the given Horizons file is valid or not
|
||||
// Return an error code with what is the problem if there was one
|
||||
HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path file) {
|
||||
HorizonsResultCode isValidHorizonsFile(std::filesystem::path file) {
|
||||
std::ifstream fileStream(file);
|
||||
if (!fileStream.good()) {
|
||||
return ResultCode::Empty;
|
||||
return HorizonsResultCode::Empty;
|
||||
}
|
||||
|
||||
// The header of a Horizons file has a lot of information about the
|
||||
@@ -262,6 +264,9 @@ HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path
|
||||
std::getline(fileStream, line);
|
||||
std::getline(fileStream, line); // First line is just stars (*) no information, skip
|
||||
|
||||
// @CPP23 (malej, 2022-04-08) In all cases below, the string function contains
|
||||
// should be used instead of find
|
||||
|
||||
// Valid Target?
|
||||
if (fileStream.good() && (line.find("Revised") != std::string::npos ||
|
||||
line.find("JPL") != std::string::npos))
|
||||
@@ -271,18 +276,18 @@ HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path
|
||||
foundTarget = true;
|
||||
}
|
||||
|
||||
ResultCode result = ResultCode::UnknownError;
|
||||
HorizonsResultCode result = HorizonsResultCode::UnknownError;
|
||||
while (fileStream.good() && line.find("$$SOE") == std::string::npos) {
|
||||
// Selected time range too big and step size too small?
|
||||
if (line.find("change step-size") != std::string::npos) {
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorSize;
|
||||
return HorizonsResultCode::ErrorSize;
|
||||
}
|
||||
|
||||
// Selected time range too big for avalable time span?
|
||||
if (line.find("STEP_SIZE too big") != std::string::npos) {
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorSpan;
|
||||
return HorizonsResultCode::ErrorSpan;
|
||||
}
|
||||
|
||||
// Outside valid time range?
|
||||
@@ -290,7 +295,7 @@ HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path
|
||||
// Available time range is located several lines before this in the file
|
||||
// The avalable time range is persed later
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorTimeRange;
|
||||
return HorizonsResultCode::ErrorTimeRange;
|
||||
}
|
||||
|
||||
// Valid Observer?
|
||||
@@ -298,24 +303,24 @@ HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path
|
||||
line.find("Cannot find central body") != std::string::npos)
|
||||
{
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorNoObserver;
|
||||
return HorizonsResultCode::ErrorNoObserver;
|
||||
}
|
||||
|
||||
// Are observer and target the same?
|
||||
if (line.find("disallowed") != std::string::npos) {
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorObserverTargetSame;
|
||||
return HorizonsResultCode::ErrorObserverTargetSame;
|
||||
}
|
||||
|
||||
// Enough data?
|
||||
if (line.find("Insufficient ephemeris data") != std::string::npos) {
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorNoData;
|
||||
return HorizonsResultCode::ErrorNoData;
|
||||
}
|
||||
|
||||
// Multiple Observer stations?
|
||||
if (line.find("Multiple matching stations found") != std::string::npos) {
|
||||
result = ResultCode::MultipleObserverStations;
|
||||
result = HorizonsResultCode::MultipleObserverStations;
|
||||
}
|
||||
|
||||
// Multiple matching major bodies?
|
||||
@@ -323,30 +328,30 @@ HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path
|
||||
// Target
|
||||
if (!foundTarget) {
|
||||
// If target was not found then it is the target that has multiple matches
|
||||
result = ResultCode::MultipleTarget;
|
||||
result = HorizonsResultCode::MultipleTarget;
|
||||
}
|
||||
// Observer
|
||||
else {
|
||||
result = ResultCode::MultipleObserver;
|
||||
result = HorizonsResultCode::MultipleObserver;
|
||||
}
|
||||
}
|
||||
|
||||
// Multiple matching small bodies?
|
||||
if (line.find("Small-body Index Search Results") != std::string::npos) {
|
||||
// Small bodies can only be targets not observers
|
||||
result = ResultCode::MultipleTarget;
|
||||
result = HorizonsResultCode::MultipleTarget;
|
||||
}
|
||||
|
||||
// No Target?
|
||||
if (line.find("No matches found") != std::string::npos) {
|
||||
fileStream.close();
|
||||
return ResultCode::ErrorNoTarget;
|
||||
return HorizonsResultCode::ErrorNoTarget;
|
||||
}
|
||||
|
||||
std::getline(fileStream, line);
|
||||
}
|
||||
|
||||
if (result != ResultCode::UnknownError) {
|
||||
if (result != HorizonsResultCode::UnknownError) {
|
||||
fileStream.close();
|
||||
return result;
|
||||
}
|
||||
@@ -355,11 +360,11 @@ HorizonsFile::ResultCode HorizonsFile::isValidHorizonsFile(std::filesystem::path
|
||||
// not a valid file
|
||||
if (fileStream.good()) {
|
||||
fileStream.close();
|
||||
return ResultCode::Valid;
|
||||
return HorizonsResultCode::Valid;
|
||||
}
|
||||
else {
|
||||
fileStream.close();
|
||||
return ResultCode::UnknownError;
|
||||
return HorizonsResultCode::UnknownError;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,23 +372,23 @@ bool HorizonsFile::hasFile() const {
|
||||
return std::filesystem::is_regular_file(_file);
|
||||
}
|
||||
|
||||
void HorizonsFile::displayErrorMessage(const ResultCode code) const {
|
||||
void HorizonsFile::displayErrorMessage(const HorizonsResultCode code) const {
|
||||
switch (code) {
|
||||
case HorizonsFile::ResultCode::Valid:
|
||||
case HorizonsResultCode::Valid:
|
||||
return;
|
||||
case ResultCode::Empty:
|
||||
case HorizonsResultCode::Empty:
|
||||
LERROR("The horizons file is empty");
|
||||
break;
|
||||
case ResultCode::ErrorSize:
|
||||
case HorizonsResultCode::ErrorSize:
|
||||
LERROR(
|
||||
"The selected time range with the selected step size is too big, "
|
||||
"try to increase the step size and/or decrease the time range"
|
||||
);
|
||||
break;
|
||||
case ResultCode::ErrorSpan:
|
||||
case HorizonsResultCode::ErrorSpan:
|
||||
LERROR("Step size is too big, exceeds available time span for target");
|
||||
break;
|
||||
case ResultCode::ErrorTimeRange: {
|
||||
case HorizonsResultCode::ErrorTimeRange: {
|
||||
LERROR("Time range is outside the valid range for target");
|
||||
|
||||
std::pair<std::string, std::string> validTimeRange = parseValidTimeRange(
|
||||
@@ -402,19 +407,19 @@ void HorizonsFile::displayErrorMessage(const ResultCode code) const {
|
||||
));
|
||||
break;
|
||||
}
|
||||
case ResultCode::ErrorNoObserver:
|
||||
case HorizonsResultCode::ErrorNoObserver:
|
||||
LERROR("No match was found for the observer");
|
||||
break;
|
||||
case ResultCode::ErrorObserverTargetSame:
|
||||
case HorizonsResultCode::ErrorObserverTargetSame:
|
||||
LERROR("The observer and target are the same");
|
||||
break;
|
||||
case ResultCode::ErrorNoData:
|
||||
case HorizonsResultCode::ErrorNoData:
|
||||
LERROR(
|
||||
"There is not enough data to compute the state of the target in "
|
||||
"relation to the observer for the selected time range."
|
||||
);
|
||||
break;
|
||||
case ResultCode::MultipleObserverStations: {
|
||||
case HorizonsResultCode::MultipleObserverStations: {
|
||||
LWARNING(
|
||||
"Multiple matching observer stations were found for the "
|
||||
"selected observer"
|
||||
@@ -434,7 +439,7 @@ void HorizonsFile::displayErrorMessage(const ResultCode code) const {
|
||||
LINFO(fmt::format("Matching Observer Stations: {}", matches));
|
||||
break;
|
||||
}
|
||||
case ResultCode::MultipleObserver: {
|
||||
case HorizonsResultCode::MultipleObserver: {
|
||||
LWARNING("Multiple matches were found for the selected observer");
|
||||
|
||||
std::vector<std::string> matchingObservers =
|
||||
@@ -451,10 +456,10 @@ void HorizonsFile::displayErrorMessage(const ResultCode code) const {
|
||||
LINFO(fmt::format("Matching Observers: {}", matches));
|
||||
break;
|
||||
}
|
||||
case ResultCode::ErrorNoTarget:
|
||||
case HorizonsResultCode::ErrorNoTarget:
|
||||
LERROR("No match was found for the target");
|
||||
break;
|
||||
case ResultCode::MultipleTarget: {
|
||||
case HorizonsResultCode::MultipleTarget: {
|
||||
// Case Small Bodies:
|
||||
// Line before data: Matching small-bodies
|
||||
// Format: Record #, Epoch-yr, >MATCH DESIG<, Primary Desig, Name
|
||||
@@ -482,7 +487,7 @@ void HorizonsFile::displayErrorMessage(const ResultCode code) const {
|
||||
LINFO(fmt::format("Matching targets: {}", matches));
|
||||
break;
|
||||
}
|
||||
case ResultCode::UnknownError:
|
||||
case HorizonsResultCode::UnknownError:
|
||||
LERROR("An unknown error occured");
|
||||
break;
|
||||
default:
|
||||
@@ -491,10 +496,10 @@ void HorizonsFile::displayErrorMessage(const ResultCode code) const {
|
||||
}
|
||||
}
|
||||
|
||||
HorizonsFile::HorizonsResult HorizonsFile::readFile(std::filesystem::path file) {
|
||||
HorizonsResult readHorizonsFile(std::filesystem::path file) {
|
||||
// Check if valid
|
||||
ResultCode code = isValidHorizonsFile(file);
|
||||
if (code != ResultCode::Valid) {
|
||||
HorizonsResultCode code = isValidHorizonsFile(file);
|
||||
if (code != HorizonsResultCode::Valid) {
|
||||
HorizonsResult result;
|
||||
result.errorCode = code;
|
||||
return result;
|
||||
@@ -517,20 +522,20 @@ HorizonsFile::HorizonsResult HorizonsFile::readFile(std::filesystem::path file)
|
||||
while (line[0] != '$') {
|
||||
if (line == "JDTDB") {
|
||||
fileStream.close();
|
||||
return readVectorFile(file);
|
||||
return readHorizonsVectorFile(file);
|
||||
}
|
||||
|
||||
std::getline(fileStream, line);
|
||||
}
|
||||
|
||||
fileStream.close();
|
||||
return readObserverFile(file);
|
||||
return readHorizonsObserverFile(file);
|
||||
}
|
||||
|
||||
HorizonsFile::HorizonsResult HorizonsFile::readVectorFile(std::filesystem::path file) {
|
||||
HorizonsResult readHorizonsVectorFile(std::filesystem::path file) {
|
||||
HorizonsResult result;
|
||||
result.type = HorizonsFile::Type::Vector;
|
||||
result.errorCode = ResultCode::Valid;
|
||||
result.type = HorizonsType::Vector;
|
||||
result.errorCode = HorizonsResultCode::Valid;
|
||||
std::vector<HorizonsKeyframe> data;
|
||||
|
||||
std::ifstream fileStream(file);
|
||||
@@ -597,10 +602,10 @@ HorizonsFile::HorizonsResult HorizonsFile::readVectorFile(std::filesystem::path
|
||||
return result;
|
||||
}
|
||||
|
||||
HorizonsFile::HorizonsResult HorizonsFile::readObserverFile(std::filesystem::path file) {
|
||||
HorizonsResult readHorizonsObserverFile(std::filesystem::path file) {
|
||||
HorizonsResult result;
|
||||
result.type = HorizonsFile::Type::Observer;
|
||||
result.errorCode = ResultCode::Valid;
|
||||
result.type = HorizonsType::Observer;
|
||||
result.errorCode = HorizonsResultCode::Valid;
|
||||
std::vector<HorizonsKeyframe> data;
|
||||
|
||||
std::ifstream fileStream(file);
|
||||
@@ -679,6 +684,9 @@ std::vector<std::string> HorizonsFile::parseMatches(const std::string& startPhra
|
||||
return matches;
|
||||
}
|
||||
|
||||
// @CPP23 (malej, 2022-04-08) In all cases below, the string function contains
|
||||
// should be used instead of find
|
||||
|
||||
// Ignore everything until start of matches
|
||||
std::string line;
|
||||
while (fileStream.good()) {
|
||||
@@ -731,6 +739,9 @@ std::pair<std::string, std::string> HorizonsFile::parseValidTimeRange(
|
||||
return { "", "" };
|
||||
}
|
||||
|
||||
// @CPP23 (malej, 2022-04-08) In all cases below, the string function contains
|
||||
// should be used instead of find
|
||||
|
||||
// Ignore everything until head of time range list
|
||||
std::string line;
|
||||
std::getline(fileStream, line);
|
||||
|
||||
@@ -60,46 +60,46 @@ namespace openspace {
|
||||
* 2. Change "Range units" to "kilometers (km)" instead of "astronomical units (au)"
|
||||
* 3. Check the "Suppress range-rate" option
|
||||
*/
|
||||
enum class HorizonsResultCode {
|
||||
Valid,
|
||||
Empty,
|
||||
|
||||
// Erros caught by the error field in the json output
|
||||
ErrorSize,
|
||||
ErrorSpan,
|
||||
ErrorTimeRange,
|
||||
ErrorNoObserver,
|
||||
ErrorObserverTargetSame,
|
||||
ErrorNoData,
|
||||
MultipleObserverStations,
|
||||
|
||||
// Erros/problems NOT caught by the error field in the json output
|
||||
MultipleObserver,
|
||||
ErrorNoTarget,
|
||||
MultipleTarget,
|
||||
|
||||
UnknownError
|
||||
};
|
||||
|
||||
enum class HorizonsType {
|
||||
Observer, // Default
|
||||
Vector, // Default for sending for new data
|
||||
Invalid // If errors or empty etc
|
||||
};
|
||||
|
||||
struct HorizonsKeyframe {
|
||||
double time; // J2000 seconds
|
||||
glm::dvec3 position; // GALACTIC cartesian coordinates in meters
|
||||
};
|
||||
|
||||
struct HorizonsResult {
|
||||
HorizonsType type = HorizonsType::Invalid;
|
||||
HorizonsResultCode errorCode = HorizonsResultCode::UnknownError;
|
||||
std::vector<HorizonsKeyframe> data = std::vector<HorizonsKeyframe>();
|
||||
};
|
||||
|
||||
class HorizonsFile {
|
||||
public:
|
||||
enum class ResultCode {
|
||||
Valid,
|
||||
Empty,
|
||||
|
||||
// Erros caught by the error field in the json output
|
||||
ErrorSize,
|
||||
ErrorSpan,
|
||||
ErrorTimeRange,
|
||||
ErrorNoObserver,
|
||||
ErrorObserverTargetSame,
|
||||
ErrorNoData,
|
||||
MultipleObserverStations,
|
||||
|
||||
// Erros/problems NOT caught by the error field in the json output
|
||||
MultipleObserver,
|
||||
ErrorNoTarget,
|
||||
MultipleTarget,
|
||||
|
||||
UnknownError
|
||||
};
|
||||
|
||||
enum class Type {
|
||||
Observer, // Default
|
||||
Vector, // Default for sending for new data
|
||||
Invalid // If errors or empty etc
|
||||
};
|
||||
|
||||
struct HorizonsKeyframe {
|
||||
double time; // J2000 seconds
|
||||
glm::dvec3 position; // GALACTIC cartesian coordinates in meters
|
||||
};
|
||||
|
||||
struct HorizonsResult {
|
||||
Type type = Type::Invalid;
|
||||
ResultCode errorCode = ResultCode::UnknownError;
|
||||
std::vector<HorizonsKeyframe> data = std::vector<HorizonsKeyframe>();
|
||||
};
|
||||
|
||||
HorizonsFile() = default;
|
||||
HorizonsFile(std::filesystem::path file);
|
||||
HorizonsFile(std::filesystem::path filePath, const std::string& result);
|
||||
@@ -108,16 +108,8 @@ public:
|
||||
const std::filesystem::path& file() const;
|
||||
std::filesystem::path& file();
|
||||
|
||||
static std::string constructUrl(Type type, const std::string& target,
|
||||
const std::string& observer, const std::string& startTime,
|
||||
const std::string& stopTime, const std::string& stepSize,
|
||||
const std::string& unit);
|
||||
static ResultCode isValidAnswer(const nlohmann::json& answer);
|
||||
static ResultCode isValidHorizonsFile(std::filesystem::path file);
|
||||
static HorizonsResult readFile(std::filesystem::path file);
|
||||
|
||||
bool hasFile() const;
|
||||
void displayErrorMessage(const ResultCode code) const;
|
||||
void displayErrorMessage(const HorizonsResultCode code) const;
|
||||
|
||||
|
||||
std::vector<std::string> parseMatches(const std::string& startPhrase,
|
||||
@@ -127,12 +119,21 @@ public:
|
||||
const std::string& altStartPhrase = "", bool hasTime = true) const;
|
||||
|
||||
private:
|
||||
static HorizonsResult readVectorFile(std::filesystem::path file);
|
||||
static HorizonsResult readObserverFile(std::filesystem::path file);
|
||||
|
||||
std::filesystem::path _file;
|
||||
};
|
||||
|
||||
// Free functions
|
||||
std::string constructHorizonsUrl(HorizonsType type, const std::string& target,
|
||||
const std::string& observer, const std::string& startTime,
|
||||
const std::string& stopTime, const std::string& stepSize,
|
||||
const std::string& unit);
|
||||
HorizonsResultCode isValidHorizonsAnswer(const nlohmann::json& answer);
|
||||
HorizonsResultCode isValidHorizonsFile(std::filesystem::path file);
|
||||
HorizonsResult readHorizonsFile(std::filesystem::path file);
|
||||
|
||||
HorizonsResult readHorizonsVectorFile(std::filesystem::path file);
|
||||
HorizonsResult readHorizonsObserverFile(std::filesystem::path file);
|
||||
|
||||
} // namespace openspace
|
||||
|
||||
#endif // __OPENSPACE_MODULE_SPACE___HORIZONSFILE___H__
|
||||
|
||||
@@ -180,13 +180,13 @@ void HorizonsTranslation::loadData() {
|
||||
}
|
||||
|
||||
bool HorizonsTranslation::readHorizonsTextFile(HorizonsFile& horizonsFile) {
|
||||
HorizonsFile::HorizonsResult result = HorizonsFile::readFile(horizonsFile.file());
|
||||
if (result.errorCode != HorizonsFile::ResultCode::Valid) {
|
||||
HorizonsResult result = readHorizonsFile(horizonsFile.file());
|
||||
if (result.errorCode != HorizonsResultCode::Valid) {
|
||||
horizonsFile.displayErrorMessage(result.errorCode);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (HorizonsFile::HorizonsKeyframe& keyframe : result.data) {
|
||||
for (HorizonsKeyframe& keyframe : result.data) {
|
||||
// Search if the keyframe already exist in the timeline
|
||||
auto it = std::find_if(
|
||||
_timeline.keyframes().begin(),
|
||||
|
||||
Reference in New Issue
Block a user