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

OpenGL

开发平台:

Visual C++

  1. // spiceinterface.cpp
  2. //
  3. // Interface to the SPICE Toolkit
  4. //
  5. // Copyright (C) 2006, Chris Laurel <claurel@shatters.net>
  6. //
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU General Public License
  9. // as published by the Free Software Foundation; either version 2
  10. // of the License, or (at your option) any later version.
  11. #include "SpiceUsr.h"
  12. #include "spiceinterface.h"
  13. #include <iostream>
  14. #include <set>
  15. using namespace std;
  16. // Track loaded SPICE kernels in order to avoid loading the same kernel
  17. // multiple times. This is a global variable because SPICE uses a global
  18. // kernel pool.
  19. static set<string> ResidentSpiceKernels;
  20. /*! Perform one-time initialization of SPICE.
  21.  */
  22. bool
  23. InitializeSpice()
  24. {
  25.     // Set the error behavior to the RETURN action, so that
  26.     // Celestia do its own handling of SPICE errors.
  27.     erract_c("SET", 0, (SpiceChar*)"RETURN");
  28.     return true;
  29. }
  30. /*! Convert an object name to a NAIF integer ID. Return true if the name
  31.  *  refers to a known object, false if not. Both names and numeric IDs are
  32.  *  accepted in the string.
  33.  */
  34. bool GetNaifId(const string& name, int* id)
  35. {
  36.     SpiceInt spiceID = 0;
  37.     SpiceBoolean found = SPICEFALSE;
  38.     // Don't call bodn2c on an empty string because SPICE generates
  39.     // an error if we do.
  40.     if (!name.empty())
  41.     {
  42.         bodn2c_c(name.c_str(), &spiceID, &found);
  43.         if (found)
  44.         {
  45.             *id = (int) spiceID;
  46.         }
  47.         else   // Is it a numeric ID?
  48.         {
  49.             // SpiceInt maps to an int on those architectures where sizeof(long) != sizeof(double)/2.
  50.             // Otherwise it maps to a long. This avoids GCC complaints about type mismatches:
  51.             long spiceIDlng;
  52.             if (sscanf(name.c_str(), " %ld", &spiceIDlng) == 1)
  53.             {
  54.                 *id = (int) spiceIDlng;
  55.                 found = SPICETRUE;
  56.             }
  57.         }
  58.     }
  59.     return found == SPICETRUE;
  60. }
  61. /*! Return true if a SPICE kernel has already been loaded, false if not.
  62.  */
  63. bool IsSpiceKernelLoaded(const string& filepath)
  64. {
  65. return ResidentSpiceKernels.find(filepath) != ResidentSpiceKernels.end();
  66. }
  67. /*! Load a SPICE kernel file of any type into the kernel pool. If the kernel
  68.  *  is already resident, it will not be reloaded.
  69.  */
  70. bool LoadSpiceKernel(const string& filepath)
  71. {
  72. // Only load the kernel if it is not already resident. Note that this detection
  73.     // of duplicate kernels will not work if a file was originally loaded through
  74.     // a metakernel.
  75. if (IsSpiceKernelLoaded(filepath))
  76. return true;
  77. ResidentSpiceKernels.insert(filepath);
  78. furnsh_c(filepath.c_str());
  79. // If there was an error loading the kernel, dump the error message.
  80. if (failed_c())
  81. {
  82. char errMsg[1024];
  83. getmsg_c("long", sizeof(errMsg), errMsg);
  84. clog << errMsg << "n";
  85. // Reset the SPICE error state so that future calls to
  86. // SPICE can still succeed.
  87. reset_c();
  88. return false;
  89. }
  90. else
  91. {
  92. clog << "Loaded SPK file " << filepath << "n";
  93. return true;
  94. }
  95. }