| [bcf653] | 1 | /* | 
|---|
|  | 2 | * Project: MoleCuilder | 
|---|
|  | 3 | * Description: creates and alters molecular systems | 
|---|
|  | 4 | * Copyright (C)  2010 University of Bonn. All rights reserved. | 
|---|
|  | 5 | * Please see the LICENSE file or "Copyright notice" in builder.cpp for details. | 
|---|
|  | 6 | */ | 
|---|
|  | 7 |  | 
|---|
| [97ebf8] | 8 | /* | 
|---|
|  | 9 | * AddAction.cpp | 
|---|
|  | 10 | * | 
|---|
|  | 11 | *  Created on: May 9, 2010 | 
|---|
|  | 12 | *      Author: heber | 
|---|
|  | 13 | */ | 
|---|
|  | 14 |  | 
|---|
| [bf3817] | 15 | // include config.h | 
|---|
|  | 16 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 17 | #include <config.h> | 
|---|
|  | 18 | #endif | 
|---|
|  | 19 |  | 
|---|
| [112b09] | 20 | #include "Helpers/MemDebug.hpp" | 
|---|
|  | 21 |  | 
|---|
| [ea2830] | 22 | #include "Descriptors/AtomIdDescriptor.hpp" | 
|---|
| [97ebf8] | 23 | #include "atom.hpp" | 
|---|
|  | 24 | #include "element.hpp" | 
|---|
| [952f38] | 25 | #include "Helpers/Log.hpp" | 
|---|
| [f0a3ec] | 26 | #include "molecule.hpp" | 
|---|
| [57f243] | 27 | #include "LinearAlgebra/Vector.hpp" | 
|---|
| [952f38] | 28 | #include "Helpers/Verbose.hpp" | 
|---|
| [97ebf8] | 29 | #include "World.hpp" | 
|---|
|  | 30 |  | 
|---|
|  | 31 | #include <iostream> | 
|---|
|  | 32 | #include <string> | 
|---|
|  | 33 |  | 
|---|
|  | 34 | using namespace std; | 
|---|
|  | 35 |  | 
|---|
| [8bb05e] | 36 | #include "Actions/AtomAction/AddAction.hpp" | 
|---|
| [9d33ba] | 37 |  | 
|---|
| [8bb05e] | 38 | // and construct the stuff | 
|---|
|  | 39 | #include "AddAction.def" | 
|---|
|  | 40 | #include "Action_impl_pre.hpp" | 
|---|
|  | 41 | /** =========== define the function ====================== */ | 
|---|
| [9d33ba] | 42 | Action::state_ptr AtomAddAction::performCall() { | 
|---|
|  | 43 | // obtain information | 
|---|
| [8bb05e] | 44 | getParametersfromValueStorage(); | 
|---|
| [9d33ba] | 45 |  | 
|---|
|  | 46 | // execute action | 
|---|
| [85537a] | 47 | atom * first = World::getInstance().createAtom(); | 
|---|
| [8bb05e] | 48 | first->setType(params.elemental); | 
|---|
|  | 49 | first->setPosition(params.position); | 
|---|
| [b5c53d] | 50 | DoLog(1) && (Log() << Verbose(1) << "Adding new atom with element " << first->getType()->getName() << " at " << (first->getPosition()) << "." << endl); | 
|---|
| [85537a] | 51 | // TODO: remove when all of World's atoms are stored. | 
|---|
|  | 52 | std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); | 
|---|
|  | 53 | if (!molecules.empty()) { | 
|---|
|  | 54 | std::vector<molecule *>::iterator iter = molecules.begin(); | 
|---|
|  | 55 | (*iter)->AddAtom(first); | 
|---|
| [97ebf8] | 56 | } | 
|---|
| [8bb05e] | 57 | return Action::state_ptr(new AtomAddState(first->getId(), params)); | 
|---|
| [97ebf8] | 58 | } | 
|---|
|  | 59 |  | 
|---|
|  | 60 | Action::state_ptr AtomAddAction::performUndo(Action::state_ptr _state) { | 
|---|
| [ea2830] | 61 | AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); | 
|---|
| [97ebf8] | 62 |  | 
|---|
| [ea2830] | 63 | DoLog(1) && (Log() << Verbose(1) << "Removing atom with id " << state->id << "." << endl); | 
|---|
|  | 64 | World::getInstance().destroyAtom(state->id); | 
|---|
|  | 65 |  | 
|---|
|  | 66 | return Action::state_ptr(_state); | 
|---|
| [97ebf8] | 67 | } | 
|---|
|  | 68 |  | 
|---|
|  | 69 | Action::state_ptr AtomAddAction::performRedo(Action::state_ptr _state){ | 
|---|
| [ea2830] | 70 | AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); | 
|---|
|  | 71 |  | 
|---|
|  | 72 | atom * first = World::getInstance().createAtom(); | 
|---|
| [8bb05e] | 73 | first->setType(state->params.elemental); | 
|---|
|  | 74 | first->setPosition(state->params.position); | 
|---|
|  | 75 | DoLog(1) && (Log() << Verbose(1) << "Re-adding new atom with element " << state->params.elemental->getName() << " at " << state->params.position << "." << endl); | 
|---|
| [ea2830] | 76 | // TODO: remove when all of World's atoms are stored. | 
|---|
|  | 77 | std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); | 
|---|
|  | 78 | if (!molecules.empty()) { | 
|---|
|  | 79 | std::vector<molecule *>::iterator iter = molecules.begin(); | 
|---|
|  | 80 | (*iter)->AddAtom(first); | 
|---|
|  | 81 | } | 
|---|
|  | 82 | if (first->getId() != state->id) | 
|---|
|  | 83 | if (!first->changeId(state->id)) | 
|---|
|  | 84 | return Action::failure; | 
|---|
|  | 85 | return Action::state_ptr(_state); | 
|---|
| [97ebf8] | 86 | } | 
|---|
|  | 87 |  | 
|---|
|  | 88 | bool AtomAddAction::canUndo() { | 
|---|
| [ea2830] | 89 | return true; | 
|---|
| [97ebf8] | 90 | } | 
|---|
|  | 91 |  | 
|---|
|  | 92 | bool AtomAddAction::shouldUndo() { | 
|---|
| [ea2830] | 93 | return true; | 
|---|
| [97ebf8] | 94 | } | 
|---|
| [8bb05e] | 95 | /** =========== end of function ====================== */ | 
|---|