- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/WorldAction/CenterInBoxAction.cpp
r23526c rce7fdc 18 18 #endif 19 19 20 // include headers that implement a archive in simple text format21 #include <boost/archive/text_oarchive.hpp>22 #include <boost/archive/text_iarchive.hpp>23 #include "boost/serialization/vector.hpp"24 25 20 #include "CodePatterns/MemDebug.hpp" 26 27 #include <boost/shared_ptr.hpp>28 21 29 22 #include "Box.hpp" 30 23 #include "CodePatterns/Log.hpp" 31 #include "LinearAlgebra/MatrixContent.hpp"32 24 #include "LinearAlgebra/RealSpaceMatrix.hpp" 33 25 #include "molecule.hpp" … … 36 28 #include <iostream> 37 29 #include <string> 38 #include <vector>39 30 40 31 #include "Actions/WorldAction/CenterInBoxAction.hpp" … … 50 41 getParametersfromValueStorage(); 51 42 52 // create undo state53 std::stringstream undostream;54 boost::archive::text_oarchive oa(undostream);55 RealSpaceMatrix matrix(World::getInstance().getDomain().getM());56 oa << matrix;57 std::vector< boost::shared_ptr<Vector> > OldPositions;58 std::vector<molecule*> AllMolecules = World::getInstance().getAllMolecules();59 for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin();60 MolRunner != AllMolecules.end();61 ++MolRunner) {62 for(molecule::const_iterator AtomRunner = (*MolRunner)->begin();63 AtomRunner != (*MolRunner)->end();64 ++AtomRunner) {65 OldPositions.push_back(66 boost::shared_ptr<Vector>(new Vector(67 (*AtomRunner)->getPosition()68 ))69 );70 }71 }72 73 // set new domain74 43 World::getInstance().setDomain(params.cell_size.getM()); 75 44 76 // center atoms 77 for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin(); MolRunner != AllMolecules.end(); ++MolRunner) { 45 // center 46 vector<molecule *> AllMolecules = World::getInstance().getAllMolecules(); 47 for (vector<molecule*>::iterator MolRunner = AllMolecules.begin(); MolRunner != AllMolecules.end(); ++MolRunner) { 78 48 (*MolRunner)->CenterInBox(); 79 49 } … … 82 52 LOG(0, "Box domain is now " << World::getInstance().getDomain().getM()); 83 53 84 // create undo state 85 WorldCenterInBoxState *UndoState = 86 new WorldCenterInBoxState( 87 undostream.str(), 88 OldPositions, 89 params 90 ); 91 92 return Action::state_ptr(UndoState); 54 return Action::success; 93 55 } 94 56 95 57 Action::state_ptr WorldCenterInBoxAction::performUndo(Action::state_ptr _state) { 96 WorldCenterInBoxState *state = assert_cast<WorldCenterInBoxState*>(_state.get());58 // ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get()); 97 59 98 // restore domain 99 RealSpaceMatrix matrix; 100 std::stringstream undostream(state->undostring); 101 boost::archive::text_iarchive ia(undostream); 102 ia >> matrix; 103 World::getInstance().setDomain(matrix); 104 105 // place atoms on old positions 106 std::vector< boost::shared_ptr<Vector> >::const_iterator OldPositionsIter = state->OldPositions.begin(); 107 std::vector<molecule*> AllMolecules = World::getInstance().getAllMolecules(); 108 for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin(); 109 MolRunner != AllMolecules.end(); 110 ++MolRunner) { 111 for(molecule::const_iterator AtomRunner = (*MolRunner)->begin(); 112 AtomRunner != (*MolRunner)->end(); 113 ++AtomRunner) { 114 ASSERT(OldPositionsIter != state->OldPositions.end(), 115 "WorldBoundInBoxAction::performUndo() - too few positions stored in UndoState."); 116 (*AtomRunner)->setPosition(**(OldPositionsIter++)); 117 } 118 } 119 120 // give final box size 121 LOG(0, "Box domain restored to " << World::getInstance().getDomain().getM()); 122 123 return Action::state_ptr(_state); 60 return Action::failure; 61 // string newName = state->mol->getName(); 62 // state->mol->setName(state->lastName); 63 // 64 // return Action::state_ptr(new ParserLoadXyzState(state->mol,newName)); 124 65 } 125 66 126 67 Action::state_ptr WorldCenterInBoxAction::performRedo(Action::state_ptr _state){ 127 WorldCenterInBoxState *state = assert_cast<WorldCenterInBoxState*>(_state.get()); 128 129 // set new domain 130 World::getInstance().setDomain(state->params.cell_size.getM()); 131 132 // center atoms 133 std::vector<molecule *> AllMolecules = World::getInstance().getAllMolecules(); 134 for (std::vector<molecule*>::iterator MolRunner = AllMolecules.begin(); MolRunner != AllMolecules.end(); ++MolRunner) { 135 (*MolRunner)->CenterInBox(); 136 } 137 138 // give final box size 139 LOG(0, "Box domain is again " << World::getInstance().getDomain().getM()); 140 141 return Action::state_ptr(_state); 68 return Action::failure; 142 69 } 143 70 144 71 bool WorldCenterInBoxAction::canUndo() { 145 return true;72 return false; 146 73 } 147 74 148 75 bool WorldCenterInBoxAction::shouldUndo() { 149 return true;76 return false; 150 77 } 151 78 /** =========== end of function ====================== */
Note:
See TracChangeset
for help on using the changeset viewer.