Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/WorldAction/BoundInBoxAction.cpp

    rce7fdc re670e4  
    2020#include "CodePatterns/MemDebug.hpp"
    2121
     22#include <boost/shared_ptr.hpp>
     23
    2224#include "CodePatterns/Log.hpp"
    2325#include "molecule.hpp"
     
    4042  getParametersfromValueStorage();
    4143
     44  // create undo state
     45  std::vector< boost::shared_ptr<Vector> > OldPositions;
     46  std::vector<molecule*> AllMolecules = World::getInstance().getAllMolecules();
     47  for (vector<molecule*>::iterator MolRunner = AllMolecules.begin();
     48      MolRunner != AllMolecules.end();
     49      ++MolRunner) {
     50    for(molecule::const_iterator AtomRunner = (*MolRunner)->begin();
     51        AtomRunner != (*MolRunner)->end();
     52        ++AtomRunner) {
     53      OldPositions.push_back(
     54          boost::shared_ptr<Vector>(new Vector(
     55              (*AtomRunner)->getPosition()
     56              ))
     57          );
     58    }
     59  }
     60  WorldBoundInBoxState *undoState = new WorldBoundInBoxState(OldPositions, params);
     61
    4262  // center
    43   vector<molecule*> AllMolecules = World::getInstance().getAllMolecules();
    44   for (vector<molecule*>::iterator MolRunner = AllMolecules.begin(); MolRunner != AllMolecules.end(); ++MolRunner) {
     63  for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin(); MolRunner != AllMolecules.end(); ++MolRunner) {
    4564    (*MolRunner)->BoundInBox();
    4665  }
    47   return Action::success;
     66  return Action::state_ptr(undoState);
    4867}
    4968
    5069Action::state_ptr WorldBoundInBoxAction::performUndo(Action::state_ptr _state) {
    51 //  ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get());
     70  WorldBoundInBoxState *state = assert_cast<WorldBoundInBoxState*>(_state.get());
    5271
    53   return Action::failure;
    54 //  string newName = state->mol->getName();
    55 //  state->mol->setName(state->lastName);
    56 //
    57 //  return Action::state_ptr(new ParserLoadXyzState(state->mol,newName));
     72  // place atoms on old positions
     73  std::vector< boost::shared_ptr<Vector> >::const_iterator OldPositionsIter = state->OldPositions.begin();
     74  std::vector<molecule*> AllMolecules = World::getInstance().getAllMolecules();
     75  for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin();
     76      MolRunner != AllMolecules.end();
     77      ++MolRunner) {
     78    for(molecule::const_iterator AtomRunner = (*MolRunner)->begin();
     79        AtomRunner != (*MolRunner)->end();
     80        ++AtomRunner) {
     81      ASSERT(OldPositionsIter != state->OldPositions.end(),
     82          "WorldBoundInBoxAction::performUndo() - too few positions stored in UndoState.");
     83      (*AtomRunner)->setPosition(**(OldPositionsIter++));
     84    }
     85  }
     86
     87  return Action::state_ptr(_state);
    5888}
    5989
    6090Action::state_ptr WorldBoundInBoxAction::performRedo(Action::state_ptr _state){
    61   return Action::failure;
     91//  WorldBoundInBoxState *state = assert_cast<WorldBoundInBoxState*>(_state.get());
     92
     93  // center
     94  std::vector<molecule*> AllMolecules = World::getInstance().getAllMolecules();
     95  for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin();
     96      MolRunner != AllMolecules.end();
     97      ++MolRunner) {
     98    (*MolRunner)->BoundInBox();
     99  }
     100
     101  return Action::state_ptr(_state);
    62102}
    63103
    64104bool WorldBoundInBoxAction::canUndo() {
    65   return false;
     105  return true;
    66106}
    67107
    68108bool WorldBoundInBoxAction::shouldUndo() {
    69   return false;
     109  return true;
    70110}
    71111/** =========== end of function ====================== */
Note: See TracChangeset for help on using the changeset viewer.