- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/WorldAction/CenterOnEdgeAction.cpp
rce7fdc rde7d1d 18 18 #endif 19 19 20 // include headers that implement a archive in simple text format 21 #include <boost/archive/text_oarchive.hpp> 22 #include <boost/archive/text_iarchive.hpp> 23 #include "boost/serialization/vector.hpp" 24 20 25 #include "CodePatterns/MemDebug.hpp" 21 26 22 27 #include "atom.hpp" 23 28 #include "CodePatterns/Log.hpp" 29 #include "LinearAlgebra/MatrixContent.hpp" 30 #include "LinearAlgebra/RealSpaceMatrix.hpp" 24 31 #include "LinearAlgebra/Vector.hpp" 32 #include "molecule.hpp" 25 33 #include "World.hpp" 26 #include "LinearAlgebra/RealSpaceMatrix.hpp"27 34 28 35 #include <iostream> 29 36 #include <string> 37 #include <vector> 30 38 31 39 #include "Actions/WorldAction/CenterOnEdgeAction.hpp" … … 44 52 getParametersfromValueStorage(); 45 53 54 // create undo state 55 std::stringstream undostream; 56 boost::archive::text_oarchive oa(undostream); 57 const RealSpaceMatrix &matrix = World::getInstance().getDomain().getM(); 58 oa << matrix; 59 std::vector< boost::shared_ptr<Vector> > OldPositions; 60 std::vector<atom *> AllAtoms = World::getInstance().getAllAtoms(); 61 for (std::vector<atom *>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) 62 OldPositions.push_back( 63 boost::shared_ptr<Vector>(new Vector( 64 (*AtomRunner)->getPosition() 65 )) 66 ); 67 46 68 // get maximum and minimum 47 vector<atom *> AllAtoms = World::getInstance().getAllAtoms();48 69 ASSERT(AllAtoms.size() > 0, "For CenteronEdge atoms must be present."); 49 vector<atom *>::iterator AtomRunner = AllAtoms.begin();70 std::vector<atom *>::iterator AtomRunner = AllAtoms.begin(); 50 71 Min = (*AtomRunner)->getPosition(); 51 72 Max = (*AtomRunner)->getPosition(); … … 67 88 World::getInstance().setDomain(domain); 68 89 // translate all atoms, such that Min is aty (0,0,0) 69 for ( vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner)90 for (std::vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) 70 91 *(*AtomRunner) -= Min; 71 92 … … 73 94 LOG(0, "Box domain is now " << World::getInstance().getDomain().getM()); 74 95 75 return Action::success; 96 // create undo state 97 WorldCenterOnEdgeState *UndoState = 98 new WorldCenterOnEdgeState( 99 undostream.str(), 100 Min, 101 Max, 102 params 103 ); 104 105 return Action::state_ptr(UndoState); 76 106 } 77 107 78 108 Action::state_ptr WorldCenterOnEdgeAction::performUndo(Action::state_ptr _state) { 79 // ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get());109 WorldCenterOnEdgeState *state = assert_cast<WorldCenterOnEdgeState*>(_state.get()); 80 110 81 return Action::failure; 82 // string newName = state->mol->getName(); 83 // state->mol->setName(state->lastName); 84 // 85 // return Action::state_ptr(new ParserLoadXyzState(state->mol,newName)); 111 // restore domain 112 RealSpaceMatrix matrix; 113 std::stringstream undostream(state->undostring); 114 boost::archive::text_iarchive ia(undostream); 115 ia >> matrix; 116 World::getInstance().setDomain(matrix); 117 118 // translate all atoms back 119 std::vector<atom *> AllAtoms = World::getInstance().getAllAtoms(); 120 for (vector<atom*>::iterator AtomRunner = AllAtoms.begin(); 121 AtomRunner != AllAtoms.end(); 122 ++AtomRunner) 123 *(*AtomRunner) += state->Min; 124 125 // give final box size 126 LOG(0, "Box domain restored to " << World::getInstance().getDomain().getM()); 127 128 return Action::state_ptr(_state); 86 129 } 87 130 88 131 Action::state_ptr WorldCenterOnEdgeAction::performRedo(Action::state_ptr _state){ 89 return Action::failure; 132 WorldCenterOnEdgeState *state = assert_cast<WorldCenterOnEdgeState*>(_state.get()); 133 134 // set new box size 135 RealSpaceMatrix rmatrix; 136 for (int i=0;i<NDIM;i++) { 137 double tmp = state->Max[i]-state->Min[i]; 138 tmp = fabs(tmp)>=1. ? tmp : 1.0; 139 rmatrix.at(i,i) = tmp; 140 } 141 World::getInstance().setDomain(rmatrix); 142 // translate all atoms, such that Min is aty (0,0,0) 143 std::vector<atom *> AllAtoms = World::getInstance().getAllAtoms(); 144 for (vector<atom*>::iterator AtomRunner = AllAtoms.begin(); 145 AtomRunner != AllAtoms.end(); 146 ++AtomRunner) 147 *(*AtomRunner) -= state->Min; 148 149 // give final box size 150 LOG(0, "Box domain is again " << World::getInstance().getDomain().getM()); 151 152 return Action::state_ptr(_state); 90 153 } 91 154 92 155 bool WorldCenterOnEdgeAction::canUndo() { 93 return false;156 return true; 94 157 } 95 158 96 159 bool WorldCenterOnEdgeAction::shouldUndo() { 97 return false;160 return true; 98 161 } 99 162 /** =========== end of function ====================== */
Note:
See TracChangeset
for help on using the changeset viewer.