- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/WorldAction/ScaleBoxAction.cpp
rce7fdc rcbfb9a 22 22 #include "atom.hpp" 23 23 #include "CodePatterns/Log.hpp" 24 #include "LinearAlgebra/RealSpaceMatrix.hpp" 24 25 #include "LinearAlgebra/Vector.hpp" 25 #include "CodePatterns/Verbose.hpp"26 26 #include "World.hpp" 27 27 #include "Box.hpp" 28 #include "LinearAlgebra/RealSpaceMatrix.hpp"29 28 30 29 #include <iostream> 31 30 #include <string> 31 #include <vector> 32 32 33 33 #include "Actions/WorldAction/ScaleBoxAction.hpp" … … 45 45 getParametersfromValueStorage(); 46 46 47 DoLog(1) && (Log() << Verbose(1) << "Scaling all atomic positions by factor." << endl);47 // scale atoms 48 48 for (int i=0;i<NDIM;i++) 49 49 x[i] = params.Scaler[i]; 50 vector<atom*> AllAtoms = World::getInstance().getAllAtoms();51 for( vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) {50 std::vector<atom*> AllAtoms = World::getInstance().getAllAtoms(); 51 for(std::vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) { 52 52 (*AtomRunner)->ScaleAll(x); 53 53 } 54 54 55 // scale box 55 56 RealSpaceMatrix M = World::getInstance().getDomain().getM(); 56 57 RealSpaceMatrix scale; 57 58 58 for (int i=0;i<NDIM;i++) { 59 scale.at(i,i) = x[i];59 scale.at(i,i) = params.Scaler[i]; 60 60 } 61 61 M *= scale; … … 65 65 LOG(0, "Box domain is now " << World::getInstance().getDomain().getM()); 66 66 67 return Action::success; 67 // create undo state 68 WorldScaleBoxState *UndoState = new WorldScaleBoxState(params); 69 70 return Action::state_ptr(UndoState); 68 71 } 69 72 70 73 Action::state_ptr WorldScaleBoxAction::performUndo(Action::state_ptr _state) { 71 // ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get());74 WorldScaleBoxState *state = assert_cast<WorldScaleBoxState*>(_state.get()); 72 75 73 return Action::failure; 74 // string newName = state->mol->getName(); 75 // state->mol->setName(state->lastName); 76 // 77 // return Action::state_ptr(new ParserLoadXyzState(state->mol,newName)); 76 // scale back atoms 77 double x[NDIM]; 78 for (int i=0;i<NDIM;i++) 79 x[i] = 1./state->params.Scaler[i]; 80 vector<atom*> AllAtoms = World::getInstance().getAllAtoms(); 81 for(vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) { 82 (*AtomRunner)->ScaleAll(x); 83 } 84 85 // scale back box 86 RealSpaceMatrix M = World::getInstance().getDomain().getM(); 87 RealSpaceMatrix scale; 88 for (int i=0;i<NDIM;i++) { 89 scale.at(i,i) = 1./state->params.Scaler[i]; 90 } 91 M *= scale; 92 World::getInstance().setDomain(M); 93 94 // give final box size 95 LOG(0, "Box domain restored to " << World::getInstance().getDomain().getM()); 96 97 return Action::state_ptr(_state); 78 98 } 79 99 80 100 Action::state_ptr WorldScaleBoxAction::performRedo(Action::state_ptr _state){ 81 return Action::failure; 101 WorldScaleBoxState *state = assert_cast<WorldScaleBoxState*>(_state.get()); 102 103 // scale atoms 104 double x[NDIM]; 105 for (int i=0;i<NDIM;i++) 106 x[i] = state->params.Scaler[i]; 107 vector<atom*> AllAtoms = World::getInstance().getAllAtoms(); 108 for(vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) { 109 (*AtomRunner)->ScaleAll(x); 110 } 111 112 // scale box 113 RealSpaceMatrix M = World::getInstance().getDomain().getM(); 114 RealSpaceMatrix scale; 115 for (int i=0;i<NDIM;i++) { 116 scale.at(i,i) = state->params.Scaler[i]; 117 } 118 M *= scale; 119 World::getInstance().setDomain(M); 120 121 // give final box size 122 LOG(0, "Box domain is again " << World::getInstance().getDomain().getM()); 123 124 return Action::state_ptr(_state); 82 125 } 83 126 84 127 bool WorldScaleBoxAction::canUndo() { 85 return false;128 return true; 86 129 } 87 130 88 131 bool WorldScaleBoxAction::shouldUndo() { 89 return false;132 return true; 90 133 } 91 134 /** =========== end of function ====================== */
Note:
See TracChangeset
for help on using the changeset viewer.