예제 #1
0
Application::Application(void): main_frame(),
				ec(),
				ecm(),
				fc(),
				evc(),
				evcm(),
				fcm(),
				navigator_manager(),
				graphic_factory(), 
				layer_tree(),
				plugin_map(),
				three_dimension_camera_controller(NULL),
				two_dimension_camera_controller(NULL),
				dc(NULL),
				plugin_running(false),
				srs()
{


  //for being able to load all type of images
  wxInitAllImageHandlers();

#ifdef WIN32
  //This is to activate memory-leaks detection
  _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif

  wmsInitialize();
  application_time = ApplicationTime::GetInstance();
  application_time->Off();
  cpw::IdGenerator::SetNamespace(GetMACaddress());

#ifdef WIN32
  SetThreadAffinityMask(GetCurrentThread(), 0);
#endif

}
bool ossimPlanetQtApplication::initWithArgs(int& argc, char** argv)
{
   osg::Texture::setMinimumNumberOfTextureObjectsToRetainInCache(0);
   osg::Drawable::setMinimumNumberOfDisplayListsToRetainInCache(0);
   //osg::DisplaySettings::instance()->setMaxNumberOfGraphicsContexts(1);

   if(getMaximumFiles() < 1024)
   {
            setMaximumFiles(1024);
   }
   //    setMaximumFiles(25);

   //osgDB::DatabasePager* databasePager = osgDB::Registry::instance()->getOrCreateDatabasePager();
   
   ossimArgumentParser argumentParser(&argc, argv);
   
   wmsInitialize();
   ossimInit::instance()->setPluginLoaderEnabledFlag(false);
   ossimInit::instance()->initialize(argumentParser);
   osg::ArgumentParser arguments(&argumentParser.argc(),argumentParser.argv());
   
   std::string tempString;
   osg::ArgumentParser::Parameter stringParam(tempString);
   addCommandLineOptions(arguments);
   
   if(arguments.read("-h") || arguments.read("--help"))
   {
      arguments.getApplicationUsage()->write(std::cout);
      return false;
   }
   
//    if(arguments.read("--enable-flatland"))
//    {
//       theLandType = ossimPlanetLandType_FLAT;
//    }
   if(arguments.read("--wms-timeout", stringParam))
   {
      setWmsNetworkTimeoutInSeconds(ossimString(tempString).toDouble());
   }
   if(arguments.read("--disable-elevation"))
   {
//       theElevEnabled = false;
      writePreferenceSetting("elev-flag",
                             "false");
   }
   if(arguments.read("--elev-estimation", stringParam))
   {
//       theElevEstimate = 1<<ossimString(tempString.c_str()).toUInt32();
      writePreferenceSetting("elev-patchsize",
                             ossimString::toString(1<<ossimString(tempString.c_str()).toUInt32()).c_str());
  }
   if(arguments.read("--elev-patchsize", stringParam))
   {
      writePreferenceSetting("elev-patchsize", tempString.c_str());
//       theElevEstimate = ossimString(tempString.c_str()).toUInt32();
   }
   if(arguments.read("--elev-exag", stringParam))
   {
//       theElevExag = ossimString(tempString.c_str()).toDouble();
      writePreferenceSetting("elev-exag", tempString.c_str());
   }
   if(arguments.read("--split-metric", stringParam))
   {
//       theSplitMetricRatio = ossimString(tempString.c_str()).toDouble();
      writePreferenceSetting("split-metric", tempString.c_str());
   }
   if(arguments.read("--elev-cache", stringParam))
   {
//       theElevCache = tempString.c_str();
      writePreferenceSetting("elev-cache", tempString.c_str());
   }
   if(arguments.read("--level-detail", stringParam))
   {
//       theLevelOfDetail = ossimString(tempString.c_str()).toUInt32();
      writePreferenceSetting("level-detail", tempString.c_str());
   }
   if(arguments.read("--enable-hud"))
   {
      writePreferenceSetting("hud-flag", "true");
//       theHudEnabled = true;
   }
   else if(arguments.read("--disable-hud"))
   {
      writePreferenceSetting("hud-flag", "false");
   }

   // archive mapping enabled
   if( arguments.read("--enable-archive-mapping-enabled") )
   {
	   writePreferenceSetting("archive-mapping-enabled", "true");
   }
   else if( arguments.read("--disable-archive-mapping-enabled") )
   {
	   writePreferenceSetting("archive-mapping-enabled", "false");
   }

   if(arguments.read("--disable-mipmap"))
   {
      writePreferenceSetting("mipmap-flag", "false");
// 	   theMipMapping = false;
   }
   if(arguments.read("--enable-mipmap"))
   {
      writePreferenceSetting("mipmap-flag", "true");
// 	   theMipMapping = false;
   }
   arguments.reportRemainingOptionsAsUnrecognized();
   
   if (arguments.errors())
   {
      arguments.writeErrorMessages(std::cout);
   }
   ossimFilename currentPath = ossimFilename(argv[0]).path();
   ossimFilename imageBundle;
   ossimFilename referenceImageBundle;
   ossimInit::instance()->setPluginLoaderEnabledFlag(true);
//    ossimString paths = ossimEnvironmentUtility::instance()->getEnvironmentVariable("OSSIM_ELEVATION_PATH");
//    std::vector<ossimString> pathArray;
//    ossimString pathSeparator = ":";
   osgDB::Registry::instance()->getDataFilePathList().push_back(theUserSupportDirectory.toStdString());
   ossimFilename installDir = ossimEnvironmentUtility::instance()->getInstalledOssimSupportDir();
   if(installDir.exists())
   {
      osgDB::Registry::instance()->getDataFilePathList().push_back(installDir);
   }
   ossimFilename userDir    = ossimEnvironmentUtility::instance()->getUserOssimSupportDir();
   ossimFilename userImageDir = userDir.dirCat("images");
   ossimFilename userDataDir = userDir.dirCat("data");
   ossimFilename userImageReferenceDir = userImageDir.dirCat("reference");
   ossimFilename installImageDir = installDir.dirCat("images");
   ossimFilename installDataDir = installDir.dirCat("data");
   ossimFilename instalImageReferenceDir = installImageDir.dirCat("reference");
   userDir = userDir.dirCat("images");
   userDir = userDir.dirCat("reference");
   installDir = installDir.dirCat("images");
   installDir = installDir.dirCat("reference");

   // tmp drb
   // ossimFilename userStatePlaneFile = userDataDir.dirCat("state_plane.csv");
   // ossimFilename installStatePlaneFile = installDataDir.dirCat("state_plane.csv");
   // if(userStatePlaneFile.exists())
   // {
      // allow state plane to override from user directory any installed state plane file.
   //   ossimStatePlaneProjectionFactory::instance()->addCsvFile(userStatePlaneFile);
   // }
#ifdef __MACOSX__
   // test for a bundle
   //
   ossimFilename contentsFolder = currentPath.path();

   // Check for embedded geoid grid nder the resource folder Resources/egm96.grd
   ossimFilename resourceFolder = contentsFolder.dirCat("Resources");
   ossimFilename geoid1996File = resourceFolder.dirCat("egm96.grd");
   ossimFilename statePlaneFile = resourceFolder.dirCat("state_plane.csv");
   if(geoid1996File.exists())
   {
      ossimRefPtr<ossimGeoid> geoid96 = new ossimGeoidEgm96;
      if(geoid96->open(geoid1996File, OSSIM_BIG_ENDIAN))
      {
         ossimGeoidManager::instance()->addGeoid(geoid96.get());
      }
   }
//   if(statePlaneFile.exists())
//   {
//      ossimStatePlaneProjectionFactory::instance()->addCsvFile(statePlaneFile);
//   }
   // Check for embedded plugins and reference images
   ossimFilename resources = contentsFolder.dirCat("Resources");
   ossimFilename ossimPluginsBundle = contentsFolder.dirCat("plugins");
   ossimFilename osgPlugins         = contentsFolder.dirCat("osgplugins");
   referenceImageBundle = contentsFolder.dirCat("Resources");
   imageBundle = referenceImageBundle.dirCat("images");
   referenceImageBundle = imageBundle.dirCat("reference");
   if(ossimPluginsBundle.exists())
   {
      ossimInit::instance()->loadPlugins(ossimPluginsBundle);
   }
   if(osgPlugins.exists())
   {
      osgDB::Registry::instance()->getLibraryFilePathList().push_front(osgPlugins);
   }
   if(resources.exists())
   {
      osgDB::Registry::instance()->getDataFilePathList().push_front(resources);
      osgDB::Registry::instance()->getDataFilePathList().push_front(resources.dirCat("fonts"));
   }

   theThemePath = resourceFolder;
   theThemePath = theThemePath.dirCat("themes");

   ossimFilename elevation = resourceFolder.dirCat("elevation");
   if(elevation.exists())
   {
      ossimElevManager::instance()->loadElevationPath(elevation);
   }
//    addLibraryPath(contentsFolder.dirCat("qtplugins").c_str());
#endif
#ifdef WIN32
   ossimFilename geoid = currentPath.dirCat("geoid1996");
   ossimFilename geoid1996File = geoid.dirCat("egm96.grd");
   if(!geoid1996File.exists())
   {
	   geoid = currentPath.dirCat("geoids");
	   geoid = geoid.dirCat("geoid1996");
	   geoid1996File = geoid.dirCat("egm96.grd");
   }
   if(geoid1996File.exists())
   {
      ossimRefPtr<ossimGeoid> geoid96 = new ossimGeoidEgm96;
      if(geoid96->open(geoid1996File, OSSIM_BIG_ENDIAN))
      {
         ossimGeoidManager::instance()->addGeoid(geoid96.get());
      }
   }
   ossimFilename osgPluginsBundle = currentPath.dirCat("osgplugins");
// ossimFilename ossimPluginsBundle = currentPath.dirCat("plugins");
   referenceImageBundle = currentPath;
   imageBundle = referenceImageBundle.dirCat("images");
   referenceImageBundle = imageBundle.dirCat("reference");
   if(osgPluginsBundle.exists())
   {
	   osgDB::Registry::instance()->getLibraryFilePathList().push_back(osgPluginsBundle);
   }
//   if(ossimPluginsBundle.exists())
//   {
//      ossimInit::instance()->loadPlugins(ossimPluginsBundle);
//   }
   ossimFilename elevation = currentPath.dirCat("elevation");
   if(elevation.exists())
   {
      ossimElevManager::instance()->loadElevationPath(elevation);
   }
//    pathSeparator = ";";
#endif
   ossimFilename dataDir = currentPath.dirCat("data");

   // tmp drb
   // ossimFilename statePlane = dataDir.dirCat("state_plane.csv");

   // if(statePlane.exists())
   // {
   // ossimStatePlaneProjectionFactory::instance()->addCsvFile(statePlane);
   //}
  // we will now initialize any other plugins outside the bundle in standard locations
   //
   // if(installStatePlaneFile.exists())
   // {
   // ossimStatePlaneProjectionFactory::instance()->addCsvFile(installStatePlaneFile);
   // }
   ossimInit::instance()->initializePlugins();
   
   if(arguments.argc() > 1)
   {
      ossimKeywordlist kwl;
      if(kwl.addFile(arguments.argv()[1]))
      {
         osg::ref_ptr<ossimPlanetTextureLayer> layer = ossimPlanetTextureLayerRegistry::instance()->createLayer(kwl.toString());
         if(layer.valid())
         {
            layer->resetLookAt();
            theReferenceImages.push_front(layer);
         }
      }
   }
   else
   {
      ossimFilename refFiles;
      
      if(userDir.exists())
      {
         refFiles = userDir;
      }
      else if(installDir.exists())
      {
         refFiles = installDir;
      }
      else if(referenceImageBundle.exists())
      {
         refFiles = referenceImageBundle;
      }
      if(refFiles.exists())
      {
         ossimDirectory dir;
         if(dir.open(refFiles))
         {
            ossimFilename file;
            dir.getFirst(file);
            do
            {
               ossimString ext = file.ext();
               if((ext != "ovr")&&
                  (ext != "omd")&&
                  (ext != "geom")&&
                  (ext != "his"))
               {
                  osg::ref_ptr<ossimPlanetTextureLayer> layer = ossimPlanetTextureLayerRegistry::instance()->createLayer(ossimString(file.c_str()));
                  if(layer.valid())
                  {
                     layer->resetLookAt();
                     theReferenceImages.push_front(layer);
                  }
               }
               
            }while(dir.getNext(file));
         }
      }      
   }
   if(userImageDir.dirCat("compass.png").exists())
   {
      theCompassRing = userImageDir.dirCat("compass.png");
   }
   else if(imageBundle.dirCat("compass.png").exists())
   {
      theCompassRing = imageBundle.dirCat("compass.png");
   }
   else if(installImageDir.dirCat("compassring.png").exists())
   {
      theCompassRing = installImageDir.dirCat("compassring.png");
      //theCompassRose = installImageDir.dirCat("compassrose.png");
   }
   else if(userImageDir.dirCat("compassring.png").exists())
   {
      theCompassRing = userImageDir.dirCat("compassring.png");
      //theCompassRose = userImageDir.dirCat("compassrose.png");
   }
   else if(imageBundle.dirCat("compassring.png").exists())
   {
      theCompassRing = imageBundle.dirCat("compassring.png");
      //theCompassRose = imageBundle.dirCat("compassrose.png");
   }
   else if(installImageDir.dirCat("compassring.png").exists())
   {
      theCompassRing = installImageDir.dirCat("compassring.png");
      //theCompassRose = installImageDir.dirCat("compassrose.png");
   }
   
   if(autoHistogramStretchMode().isEmpty())
   {
      setAutoHistogramStretchMode("Linear Auto Min Max");
   }
   return true;
}