favorites.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // favorites.cpp
  2. //
  3. // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <algorithm>
  10. #include <iostream>
  11. #include <iomanip>
  12. #include <celutil/debug.h>
  13. #include <celutil/util.h>
  14. #include <celengine/cmdparser.h>
  15. #include "favorites.h"
  16. using namespace std;
  17. FavoritesList* ReadFavoritesList(istream& in)
  18. {
  19.     FavoritesList* favorites = new FavoritesList();
  20.     Tokenizer tokenizer(&in);
  21.     Parser parser(&tokenizer);
  22.     while (tokenizer.nextToken() != Tokenizer::TokenEnd)
  23.     {
  24.         if (tokenizer.getTokenType() != Tokenizer::TokenString)
  25.         {
  26.             DPRINTF(0, "Error parsing favorites file.n");
  27.             for_each(favorites->begin(), favorites->end(), deleteFunc<FavoritesEntry*>());
  28.             delete favorites;
  29.             return NULL;
  30.         }
  31.         FavoritesEntry* fav = new FavoritesEntry();
  32.         fav->name = tokenizer.getStringValue();
  33.         Value* favParamsValue = parser.readValue();
  34.         if (favParamsValue == NULL || favParamsValue->getType() != Value::HashType)
  35.         {
  36.             DPRINTF(0, "Error parsing favorites entry %sn", fav->name.c_str());
  37.             for_each(favorites->begin(), favorites->end(), deleteFunc<FavoritesEntry*>());
  38.             delete favorites;
  39.             if (favParamsValue != NULL)
  40.                 delete favParamsValue;
  41.             return NULL;
  42.         }
  43.         Hash* favParams = favParamsValue->getHash();
  44.         //If this is a folder, don't get any other params.
  45.         if(!favParams->getBoolean("isFolder", fav->isFolder))
  46.             fav->isFolder = false;
  47.         if(fav->isFolder)
  48.         {
  49.             favorites->insert(favorites->end(), fav);
  50.             continue;
  51.         }
  52.         // Get parentFolder
  53.         favParams->getString("parentFolder", fav->parentFolder);
  54.         // Get position
  55.         Vec3d base(0.0, 0.0, 0.0);
  56.         Vec3d offset(0.0, 0.0, 0.0);
  57.         favParams->getVector("base", base);
  58.         favParams->getVector("offset", offset);
  59.         base *= 1e6;
  60.         fav->position = UniversalCoord(Point3d(base.x, base.y, base.z)) + offset;
  61.         // Get orientation
  62.         Vec3d axis(1.0, 0.0, 0.0);
  63.         double angle = 0.0;
  64.         favParams->getVector("axis", axis);
  65.         favParams->getNumber("angle", angle);
  66.         fav->orientation.setAxisAngle(Vec3f((float) axis.x, (float) axis.y, (float) axis.z),
  67.                                       (float) angle);
  68.         // Get time
  69.         fav->jd = 0.0;
  70.         favParams->getNumber("time", fav->jd);
  71.         // Get the selected object
  72.         favParams->getString("selection", fav->selectionName);
  73.         string coordSysName;
  74.         favParams->getString("coordsys", coordSysName);
  75.         if (coordSysName == "ecliptical")
  76.             fav->coordSys = ObserverFrame::Ecliptical;
  77.         else if (coordSysName == "equatorial")
  78.             fav->coordSys = ObserverFrame::Equatorial;
  79.         else if (coordSysName == "geographic")
  80.             fav->coordSys = ObserverFrame::BodyFixed;
  81.         else
  82.             fav->coordSys = ObserverFrame::Universal;
  83.         favorites->insert(favorites->end(), fav);
  84.     }
  85.     return favorites;
  86. }
  87. void WriteFavoritesList(FavoritesList& favorites, ostream& out)
  88. {
  89.     for (FavoritesList::const_iterator iter = favorites.begin();
  90.          iter != favorites.end(); iter++)
  91.     {
  92.         FavoritesEntry* fav = *iter;
  93.         Vec3f axis;
  94.         float angle = 0;
  95.         fav->orientation.getAxisAngle(axis, angle);
  96.         Point3d base = (Point3d) fav->position;
  97.         Vec3d offset = fav->position - base;
  98.         base.x *= 1e-6; base.y *= 1e-6; base.z *= 1e-6;
  99.         out << '"' << fav->name << "" {n";
  100.         if(fav->isFolder)
  101.             out << "tisFolder " << "truen";
  102.         else
  103.         {
  104.             out << "tisFolder " << "falsen";
  105.             out << "tparentFolder "" << fav->parentFolder << ""n";
  106.             out << setprecision(16);
  107.             out << "tbase   [ " << base.x << ' ' << base.y << ' ' << base.z << " ]n";
  108.             out << "toffset [ " << offset.x << ' ' << offset.y << ' ' << offset.z << " ]n";
  109.             out << setprecision(6);
  110.             out << "taxis   [ " << axis.x << ' ' << axis.y << ' ' << axis.z << " ]n";
  111.             out << "tangle  " << angle << 'n';
  112.             out << setprecision(16);
  113.             out << "ttime   " << fav->jd << 'n';
  114.             out << "tselection "" << fav->selectionName << ""n";
  115.             out << "tcoordsys "";
  116.             switch (fav->coordSys)
  117.             {
  118.             case ObserverFrame::Universal:
  119.                 out << "universal"; break;
  120.             case ObserverFrame::Ecliptical:
  121.                 out << "ecliptical"; break;
  122.             case ObserverFrame::Equatorial:
  123.                 out << "equatorial"; break;
  124.             case ObserverFrame::BodyFixed:
  125.                 out << "geographic"; break;
  126.             case ObserverFrame::ObserverLocal:
  127.                 out << "local"; break;
  128.             case ObserverFrame::PhaseLock:
  129.                 out << "phaselock"; break;
  130.             case ObserverFrame::Chase:
  131.                 out << "chase"; break;
  132.             }
  133.             out << ""n";
  134.         }
  135.         out << "}nn";
  136.     }
  137. }
  138. #if 0
  139. FavoritesList* ReadFavoritesList(string filename)
  140. {
  141.     ifstream in(filename.c_str());
  142.     if (!in.good())
  143.         return NULL;
  144.     FavoritesList* favorites = new FavoritesList();
  145.     Tokenizer tokenizer(&in);
  146.     CommandParser parser(tokenizer);
  147.     while (tokenizer.nextToken() != Tokenizer::TokenEnd)
  148.     {
  149.         if (tokenizer.getTokenType() != Tokenizer::TokenString)
  150.         {
  151.             DPRINTF(0, "Error parsing favorites file.n");
  152.             for_each(favorites->begin(), favorites->end(), deleteFunc<FavoritesEntry*>());
  153.             delete favorites;
  154.             return NULL;
  155.         }
  156.         string name = tokenizer.getStringValue();
  157.         CommandSequence* cmdSeq = parser.parse();
  158.         if (cmdSeq == NULL)
  159.         {
  160.             DPRINTF(0, "Error parsing favorites entry %sn", name.c_str());
  161.             for_each(favorites->begin(), favorites->end(), deleteFunc<FavoritesEntry*>());
  162.             delete favorites;
  163.             return NULL;
  164.         }
  165.         favorites->insert(favorites->end(), new FavoritesEntry(name, cmdSeq));
  166.     }
  167.     return favorites;
  168. }
  169. #endif