- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AtomAction/AddAction.cpp
rceaab1 r26b4d62 55 55 #include "Action_impl_pre.hpp" 56 56 /** =========== define the function ====================== */ 57 58 atom * getNewAtom(const AtomAddAction::AtomAddParameters &_params)59 {60 atom * first = World::getInstance().createAtom();61 first->setType(_params.elemental.get());62 first->setPosition(_params.position.get());63 64 return first;65 }66 67 std::vector<atomId_t> createAtoms(68 const AtomAddAction::AtomAddParameters &_params,69 std::vector<molecule *> &_molecules)70 {71 std::vector<atomId_t> ids;72 if (!_molecules.empty()) {73 if (_molecules.size() == 1) {74 atom *first = getNewAtom(_params);75 molecule *mol = *_molecules.begin();76 LOG(1, "Adding new atom with element " << first->getType()->getName()77 << " at " << (first->getPosition()) << " to selected molecule "78 << mol->getName()+".");79 mol->AddAtom(first);80 ids.push_back(first->getId());81 }82 } else {83 atom *first = getNewAtom(_params);84 molecule *mol = World::getInstance().createMolecule();85 mol->setName("none");86 mol->AddAtom(first);87 LOG(1, "Adding new atom with element " << first->getType()->getName()88 << " at " << (first->getPosition()) << " to new molecule.");89 ids.push_back(first->getId());90 }91 92 return ids;93 }94 95 57 ActionState::ptr AtomAddAction::performCall() { 96 58 // execute action 97 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 98 std::vector<atomId_t> ids = createAtoms(params, molecules); 99 100 if (molecules.size() > 1) 101 return Action::failure; 102 else 103 return ActionState::ptr(new AtomAddState(ids, params)); 59 atom * first = World::getInstance().createAtom(); 60 first->setType(params.elemental.get()); 61 first->setPosition(params.position.get()); 62 LOG(1, "Adding new atom with element " << first->getType()->getName() << " at " << (first->getPosition()) << "."); 63 // TODO: remove when all of World's atoms are stored. 64 std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); 65 if (!molecules.empty()) { 66 std::vector<molecule *>::iterator iter = molecules.begin(); 67 (*iter)->AddAtom(first); 68 } 69 return ActionState::ptr(new AtomAddState(first->getId(), params)); 104 70 } 105 71 … … 107 73 AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); 108 74 109 for (std::vector<atomId_t>::const_iterator iter = state->ids.begin(); 110 iter != state->ids.end(); ++iter) { 111 LOG(1, "Removing atom with id " << *iter << "."); 112 World::getInstance().destroyAtom(*iter); 113 } 75 LOG(1, "Removing atom with id " << state->id << "."); 76 World::getInstance().destroyAtom(state->id); 114 77 115 78 return ActionState::ptr(_state); … … 119 82 AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); 120 83 121 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 122 std::vector<atomId_t> newids = createAtoms(params, molecules); 84 atom * first = World::getInstance().createAtom(); 85 first->setType(state->params.elemental.get()); 86 first->setPosition(state->params.position.get()); 87 LOG(1, "Re-adding new atom with element " << state->params.elemental.get()->getName() << " at " << state->params.position.get() << "."); 88 // TODO: remove when all of World's atoms are stored. 89 std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); 90 if (!molecules.empty()) { 91 std::vector<molecule *>::iterator iter = molecules.begin(); 92 (*iter)->AddAtom(first); 93 } 94 if (first->getId() != state->id) 95 if (!first->changeId(state->id)) { 96 STATUS("Could not change atom id "+toString(first->getId())+"->"+toString(state->id)+"."); 97 return Action::failure; 98 } 123 99 124 if (newids.size() != state->ids.size()) { 125 STATUS("Could not recreate all atoms after undo."); 126 for (std::vector<atomId_t>::const_iterator iter = newids.begin(); iter != newids.end();++iter) 127 World::getInstance().destroyAtom(*iter); 128 return Action::failure; 129 } 130 131 std::vector<atomId_t>::const_iterator newiter = newids.begin(); 132 std::vector<atomId_t>::const_iterator olditer = state->ids.begin(); 133 bool status=true; 134 for (; newiter != newids.end(); ++newiter, ++olditer) { 135 atom * first = World::getInstance().getAtom(AtomById(*newiter)); 136 ASSERT( first != NULL, 137 "AtomAddAction::performRedo() - re-created atom not present?"); 138 if (first->getId() != *olditer) 139 if (!first->changeId(*olditer)) { 140 STATUS("Could not change atom id "+toString(first->getId())+"->"+toString(*olditer)+"."); 141 // remove all created atoms 142 for (std::vector<atomId_t>::const_iterator iter = state->ids.begin(); iter != olditer;++iter) 143 World::getInstance().destroyAtom(*iter); 144 olditer = state->ids.end(); 145 for (std::vector<atomId_t>::const_iterator iter = newiter; iter != newids.end();++iter) 146 World::getInstance().destroyAtom(*iter); 147 status = false; 148 break; 149 } 150 } 151 ASSERT( olditer == state->ids.end(), 152 "AtomAddAction::performRedo() - after all unequal amount of ids in new and old?"); 153 154 if (!status) { 155 return Action::failure; 156 } else 157 return ActionState::ptr(_state); 100 return ActionState::ptr(_state); 158 101 } 159 102
Note:
See TracChangeset
for help on using the changeset viewer.