Exemple #1
0
//------------------------------------------------------------------------------
bool Target::Initialize()
{
    GmatBase *mapObj = NULL;
    cloneCount = 0;

    if ((mapObj = FindObject(solverName)) == NULL)
    {
        wxString errorString = wxT("Target command cannot find targeter \"");
        errorString += solverName;
        errorString += wxT("\"");
        throw CommandException(errorString, Gmat::ERROR_);
    }

    // Clone the targeter for local use
#ifdef DEBUG_TARGET_INIT
    MessageInterface::ShowMessage
    (wxT("Target::Initialize() cloning mapObj <%p>'%s'\n"), mapObj,
     mapObj->GetName().c_str());
    MessageInterface::ShowMessage
    (wxT("mapObj maxIter=%d\n"),
     mapObj->GetIntegerParameter(mapObj->GetParameterID(wxT("MaximumIterations"))));
#endif

    // Delete the old cloned solver
    if (theSolver)
    {
#ifdef DEBUG_MEMORY
        MemoryTracker::Instance()->Remove
        (theSolver, wxT("local solver", "Target::Initialize()"),
         wxT("deleting local cloned solver"));
#endif
        delete theSolver;
    }

    theSolver = (Solver *)(mapObj->Clone());
    if (theSolver != NULL)
        ++cloneCount;

#ifdef DEBUG_MEMORY
    MemoryTracker::Instance()->Add
    (theSolver, theSolver->GetName(), wxT("Target::Initialize()"),
     wxT("theSolver = (Solver *)(mapObj->Clone())"));
#endif

    theSolver->TakeAction(wxT("ResetInstanceCount"));
    mapObj->TakeAction(wxT("ResetInstanceCount"));

    theSolver->TakeAction(wxT("IncrementInstanceCount"));
    mapObj->TakeAction(wxT("IncrementInstanceCount"));

    if (theSolver->GetStringParameter(wxT("ReportStyle")) == wxT("Debug"))
        targeterInDebugMode = true;
    theSolver->SetStringParameter(wxT("SolverMode"),
                                  GetStringParameter(SOLVER_SOLVE_MODE));
    theSolver->SetStringParameter(wxT("ExitMode"),
                                  GetStringParameter(SOLVER_EXIT_MODE));

    // Set the local copy of the targeter on each node
    std::vector<GmatCommand*>::iterator node;
    GmatCommand *current;
    specialState = Solver::INITIALIZING;

    for (node = branch.begin(); node != branch.end(); ++node)
    {
        current = *node;

#ifdef DEBUG_TARGET_COMMANDS
        Integer nodeNum = 0;
#endif
        while ((current != NULL) && (current != this))
        {
#ifdef DEBUG_TARGET_COMMANDS
            MessageInterface::ShowMessage(
                wxT("   Target Command %d:  %s\n"), ++nodeNum,
                current->GetTypeName().c_str());
#endif
            if ((current->GetTypeName() == wxT("Vary")) ||
                    (current->GetTypeName() == wxT("Achieve")))
                current->SetRefObject(theSolver, Gmat::SOLVER, solverName);
            current = current->GetNext();
        }
    }

    bool retval = SolverBranchCommand::Initialize();

    if (retval == true) {
        // Targeter specific initialization goes here:
        if (FindObject(solverName) == NULL)
        {
            wxString errorString = wxT("Target command cannot find targeter \"");
            errorString += solverName;
            errorString += wxT("\"");
            throw CommandException(errorString);
        }

        retval = theSolver->Initialize();
    }

    targeterInFunctionInitialized = false;
    return retval;
}
//------------------------------------------------------------------------------
// virtual void SaveData()
//------------------------------------------------------------------------------
void GroundTrackPlotPanel::SaveData()
{
   #if DEBUG_PANEL_SAVE
   MessageInterface::ShowMessage
      ("GroundTrackPlotPanel::SaveData() entered, mHasCentralBodyChanged=%d, "
       " mHasObjectListChanged=%d\n   mHasIntegerDataChanged=%d, "
       "mHasTextureMapChanged=%d\n", mHasCentralBodyChanged, mHasObjectListChanged,
       mHasIntegerDataChanged, mHasTextureMapChanged);
   #endif
   
   canClose = true;
   std::string str1, str2;
   Integer collectFreq = 0, updateFreq = 0, pointsToRedraw = 0;
   
   //-----------------------------------------------------------------
   // check values from text field
   //-----------------------------------------------------------------
   
   if (mHasIntegerDataChanged)
   {
      CheckInteger(collectFreq, mDataCollectFreqTextCtrl->GetValue().c_str(),
                   "DataCollectFrequency", "Integer Number > 0", false, true, true);
      
      CheckInteger(updateFreq, mUpdatePlotFreqTextCtrl->GetValue().c_str(),
                   "UpdatePlotFrequency", "Integer Number > 0", false, true, true);
      
      CheckInteger(pointsToRedraw, mNumPointsToRedrawTextCtrl->GetValue().c_str(),
                   "NumPointsToRedraw", "Integer Number >= 0", false, true, true, true);
   }
      
   if (!canClose)
      return;
   
   //-----------------------------------------------------------------
   // save values to base, base code should do the range checking
   //-----------------------------------------------------------------
   GmatBase *clonedObj = mGroundTrackPlot->Clone();
   try
   {
      if (mHasCentralBodyChanged)
      {
         std::string newCentralBody = mCentralBodyComboBox->GetValue().WX_TO_STD_STRING;
         std::string newTexture = mTextureMapTextCtrl->GetValue().WX_TO_STD_STRING;
         clonedObj->SetStringParameter("CentralBody", newCentralBody);
         mHasCentralBodyChanged = false;
         // Set mHasTextureMapChanged to true so that it can be validated below (LOJ: 2014.11.03)
         mHasTextureMapChanged = true;
      }
      
      if (mHasObjectListChanged)
      {
         #if DEBUG_PANEL_SAVE
         MessageInterface::ShowMessage("   Saving object list\n");
         #endif
         clonedObj->TakeAction("Clear");
         int count = mObjectCheckListBox->GetCount();
         for (int i = 0; i < count; i++)
         {
            if (mObjectCheckListBox->IsChecked(i))
            {
               std::string objName =  mObjectCheckListBox->GetString(i).WX_TO_STD_STRING;
               #ifdef DEBUG_PANEL_SAVE
               MessageInterface::ShowMessage("   objName = '%s'\n", objName.c_str());
               #endif
               clonedObj->SetStringParameter("Add", objName);
            }
         }
         mHasObjectListChanged = false;
      }
      
      if (mHasIntegerDataChanged)
      {
         #if DEBUG_PANEL_SAVE
         MessageInterface::ShowMessage("   Saving Integer data\n");
         #endif
         clonedObj->SetIntegerParameter("DataCollectFrequency", collectFreq);
         clonedObj->SetIntegerParameter("UpdatePlotFrequency", updateFreq);
         clonedObj->SetIntegerParameter("NumPointsToRedraw", pointsToRedraw);
         mHasIntegerDataChanged = false;
      }
      
      if (mHasDataOptionChanged)
      {
         #if DEBUG_PANEL_SAVE
         MessageInterface::ShowMessage("   Saving drawing options\n");
         #endif
         clonedObj->SetBooleanParameter("ShowPlot", mShowPlotCheckBox->GetValue());
         clonedObj->SetStringParameter("SolverIterations",
                                       mSolverIterComboBox->GetValue().c_str());
         mHasDataOptionChanged = false;
      }
      
      // Save texture map
      if (mHasTextureMapChanged)
      {
         #if DEBUG_PANEL_SAVE
         MessageInterface::ShowMessage("   Saving new texture map\n");
         #endif
         // Validate texture map file (LOJ: 2014.10.30)
         wxString wxTextureMap = mTextureMapTextCtrl->GetValue();
         std::string textureMap = wxTextureMap.WX_TO_STD_STRING;
         if (clonedObj->IsParameterValid("TextureMap", textureMap))
         {
            clonedObj->SetStringParameter("TextureMap", textureMap);
            // If texture map file is blank, display default one
            if (wxTextureMap == "")
               mTextureMapTextCtrl->SetValue(STD_TO_WX_STRING(clonedObj->GetStringParameter("TextureMap").c_str()));
            mHasTextureMapChanged = false;
         }
         else
         {
            // Recheck central body
            mHasCentralBodyChanged = true;
            canClose = false;
            MessageInterface::PopupMessage(Gmat::ERROR_, clonedObj->GetLastErrorMessage());
         }
      }
      
      #ifdef __USE_COLOR_FROM_SUBSCRIBER__
      // Save orbit colors
      if (mHasOrbitColorChanged)
      {
         SaveObjectColors("Orbit", mOrbitColorMap);
         mHasOrbitColorChanged = false;
      }
      
      // Save target colors
      if (mHasTargetColorChanged)
      {
         SaveObjectColors("Target", mTargetColorMap);
         mHasTargetColorChanged = false;
      }
      #endif
      
      // Copy new values to original object (LOJ: 2014.10.30)
      if (canClose)
      {
         mGroundTrackPlot->Copy(clonedObj);
         mCentralBody = mCentralBodyComboBox->GetValue().c_str();
         mTextureFile = mTextureMapTextCtrl->GetValue().c_str();
         EnableUpdate(false);
      }
   }
   catch (BaseException &e)
   {
      canClose = false;
      MessageInterface::PopupMessage(Gmat::ERROR_, e.GetFullMessage().c_str());
   }
   
   delete clonedObj;
   
   #if DEBUG_PANEL_SAVE
   MessageInterface::ShowMessage("GroundTrackPlotPanel::SaveData() exiting.\n");
   #endif
}