// favorites.cpp // // Copyright (C) 2001, Chris Laurel // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. #include #include #include #include #include #include #include "favorites.h" using namespace std; FavoritesList* ReadFavoritesList(istream& in) { FavoritesList* favorites = new FavoritesList(); Tokenizer tokenizer(&in); Parser parser(&tokenizer); while (tokenizer.nextToken() != Tokenizer::TokenEnd) { if (tokenizer.getTokenType() != Tokenizer::TokenString) { DPRINTF(0, "Error parsing favorites file.\n"); for_each(favorites->begin(), favorites->end(), deleteFunc()); delete favorites; return NULL; } FavoritesEntry* fav = new FavoritesEntry(); fav->name = tokenizer.getStringValue(); Value* favParamsValue = parser.readValue(); if (favParamsValue == NULL || favParamsValue->getType() != Value::HashType) { DPRINTF(0, "Error parsing favorites entry %s\n", fav->name.c_str()); for_each(favorites->begin(), favorites->end(), deleteFunc()); delete favorites; if (favParamsValue != NULL) delete favParamsValue; return NULL; } Hash* favParams = favParamsValue->getHash(); //If this is a folder, don't get any other params. if(!favParams->getBoolean("isFolder", fav->isFolder)) fav->isFolder = false; if(fav->isFolder) { favorites->insert(favorites->end(), fav); continue; } // Get parentFolder favParams->getString("parentFolder", fav->parentFolder); // Get position Vec3d base(0.0, 0.0, 0.0); Vec3d offset(0.0, 0.0, 0.0); favParams->getVector("base", base); favParams->getVector("offset", offset); base *= 1e6; fav->position = UniversalCoord(Point3d(base.x, base.y, base.z)) + offset; // Get orientation Vec3d axis(1.0, 0.0, 0.0); double angle = 0.0; favParams->getVector("axis", axis); favParams->getNumber("angle", angle); fav->orientation.setAxisAngle(Vec3f((float) axis.x, (float) axis.y, (float) axis.z), (float) angle); // Get time fav->jd = 0.0; favParams->getNumber("time", fav->jd); // Get the selected object favParams->getString("selection", fav->selectionName); string coordSysName; favParams->getString("coordsys", coordSysName); if (coordSysName == "ecliptical") fav->coordSys = astro::Ecliptical; else if (coordSysName == "equatorial") fav->coordSys = astro::Equatorial; else if (coordSysName == "geographic") fav->coordSys = astro::Geographic; else fav->coordSys = astro::Universal; favorites->insert(favorites->end(), fav); } return favorites; } void WriteFavoritesList(FavoritesList& favorites, ostream& out) { for (FavoritesList::const_iterator iter = favorites.begin(); iter != favorites.end(); iter++) { FavoritesEntry* fav = *iter; Vec3f axis; float angle = 0; fav->orientation.getAxisAngle(axis, angle); Point3d base = (Point3d) fav->position; Vec3d offset = fav->position - base; base.x *= 1e-6; base.y *= 1e-6; base.z *= 1e-6; out << '"' << fav->name << "\" {\n"; if(fav->isFolder) out << "\tisFolder " << "true\n"; else { out << "\tisFolder " << "false\n"; out << "\tparentFolder \"" << fav->parentFolder << "\"\n"; out << setprecision(16); out << "\tbase [ " << base.x << ' ' << base.y << ' ' << base.z << " ]\n"; out << "\toffset [ " << offset.x << ' ' << offset.y << ' ' << offset.z << " ]\n"; out << setprecision(6); out << "\taxis [ " << axis.x << ' ' << axis.y << ' ' << axis.z << " ]\n"; out << "\tangle " << angle << '\n'; out << setprecision(16); out << "\ttime " << fav->jd << '\n'; out << "\tselection \"" << fav->selectionName << "\"\n"; out << "\tcoordsys \""; switch (fav->coordSys) { case astro::Universal: out << "universal"; break; case astro::Ecliptical: out << "ecliptical"; break; case astro::Equatorial: out << "equatorial"; break; case astro::Geographic: out << "geographic"; break; case astro::ObserverLocal: out << "local"; break; case astro::PhaseLock: out << "phaselock"; break; case astro::Chase: out << "chase"; break; } out << "\"\n"; } out << "}\n\n"; } } #if 0 FavoritesList* ReadFavoritesList(string filename) { ifstream in(filename.c_str()); if (!in.good()) return NULL; FavoritesList* favorites = new FavoritesList(); Tokenizer tokenizer(&in); CommandParser parser(tokenizer); while (tokenizer.nextToken() != Tokenizer::TokenEnd) { if (tokenizer.getTokenType() != Tokenizer::TokenString) { DPRINTF(0, "Error parsing favorites file.\n"); for_each(favorites->begin(), favorites->end(), deleteFunc()); delete favorites; return NULL; } string name = tokenizer.getStringValue(); CommandSequence* cmdSeq = parser.parse(); if (cmdSeq == NULL) { DPRINTF(0, "Error parsing favorites entry %s\n", name.c_str()); for_each(favorites->begin(), favorites->end(), deleteFunc()); delete favorites; return NULL; } favorites->insert(favorites->end(), new FavoritesEntry(name, cmdSeq)); } return favorites; } #endif