Changeset 399c69 for src/Actions/AtomAction/AddAction.cpp
- Timestamp:
- Mar 3, 2024, 10:10:53 AM (20 months ago)
- Branches:
- Candidate_v1.7.0, stable
- Children:
- 02f14d
- Parents:
- 0427d1
- git-author:
- Frederik Heber <frederik.heber@…> (03/02/24 20:37:07)
- git-committer:
- Frederik Heber <frederik.heber@…> (03/03/24 10:10:53)
- File:
-
- 1 edited
-
src/Actions/AtomAction/AddAction.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AtomAction/AddAction.cpp
r0427d1 r399c69 35 35 //#include "CodePatterns/MemDebug.hpp" 36 36 37 #include "Actions/UndoRedoHelpers.hpp" 37 38 #include "Descriptors/AtomIdDescriptor.hpp" 38 39 #include "Atom/atom.hpp" … … 55 56 #include "Action_impl_pre.hpp" 56 57 /** =========== define the function ====================== */ 57 58 58 atom * getNewAtom(const AtomAddAction::AtomAddParameters &_params) 59 59 { … … 65 65 } 66 66 67 atom * regetNewAtom(const AtomAddAction::AtomAddParameters &_params, const atomId_t _id) 68 { 69 atom * first = World::getInstance().recreateAtom(_id); 70 first->setType(_params.elemental.get()); 71 first->setPosition(_params.position.get()); 67 ActionState::ptr AtomAddAction::performCall() { 68 // execute action 69 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 72 70 73 return first; 74 } 75 76 std::vector<atomId_t> createAtoms( 77 const AtomAddAction::AtomAddParameters &_params, 78 std::vector<molecule *> &_molecules) 79 { 80 std::vector<atomId_t> ids; 81 if (!_molecules.empty()) { 82 if (_molecules.size() == 1) { 83 atom *first = getNewAtom(_params); 84 molecule *mol = *_molecules.begin(); 71 std::vector<AtomicInfo> Walkers; 72 moleculeId_t molId = -1; 73 if (!molecules.empty()) { 74 if (molecules.size() == 1) { 75 atom *first = getNewAtom(params); 76 molecule *mol = *molecules.begin(); 85 77 LOG(1, "Adding new atom with element " << first->getType()->getName() 86 78 << " at " << (first->getPosition()) << " to selected molecule " 87 79 << mol->getName()+"."); 88 80 mol->AddAtom(first); 89 ids.push_back(first->getId()); 81 molId = mol->getId(); 82 Walkers.push_back(AtomicInfo(*first)); 83 } else { 84 ELOG(1, "Multiple molecules selected. Cannot add atom to multiple molecules."); 90 85 } 91 86 } else { 92 atom * first = getNewAtom(_params);87 atom * first = getNewAtom(params); 93 88 molecule *mol = World::getInstance().createMolecule(); 94 89 mol->setName("none"); … … 96 91 LOG(1, "Adding new atom with element " << first->getType()->getName() 97 92 << " at " << (first->getPosition()) << " to new molecule."); 98 ids.push_back(first->getId()); 93 molId = mol->getId(); 94 Walkers.push_back(AtomicInfo(*first)); 99 95 } 96 WalkersInMolecule_t WalkersInMolecule = { { molId, Walkers } }; 100 97 101 return ids; 98 99 // create undo state 100 AtomAddState *UndoState = new AtomAddState(WalkersInMolecule, params); 101 102 if ((molecules.size() > 1) || (Walkers.empty())) 103 return Action::failure; 104 else 105 return ActionState::ptr(UndoState); 102 106 } 103 107 104 std::vector<atomId_t> recreateAtoms( 105 const AtomAddAction::AtomAddParameters &_params, 106 const std::vector<atomId_t> &_ids, 107 std::vector<molecule *> &_molecules) 108 { 109 molecule *mol = NULL; 110 if (!_molecules.empty()) { 111 ASSERT (_molecules.size() == 1, 112 "recreateAtoms() - more than one molecules given."); 113 mol = *_molecules.begin(); 114 } else { 115 mol = World::getInstance().createMolecule(); 116 mol->setName("none"); 117 } 118 std::vector<atomId_t> newids; 119 for (std::vector<atomId_t>::const_iterator iter = _ids.begin(); 120 iter != _ids.end(); ++iter) { 121 atom *first = regetNewAtom(_params, *iter); 122 if (first != NULL) { 123 newids.push_back(first->getId()); 124 mol->AddAtom(first); 125 LOG(1, "Adding new atom with element " << first->getType()->getName() 126 << " at " << (first->getPosition()) << " to new molecule."); 127 } else { 128 ELOG(1, "Could not recreate atom with id " << *iter); 129 break; 130 } 131 } 132 133 return newids; 134 } 135 136 ActionState::ptr AtomAddAction::performCall() { 137 // execute action 138 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 139 std::vector<atomId_t> ids = createAtoms(params, molecules); 140 141 if (molecules.size() > 1) 142 return Action::failure; 143 else 144 return ActionState::ptr(new AtomAddState(ids, params)); 145 } 146 147 ActionState::ptr AtomAddAction::performUndo(ActionState::ptr _state) { 108 ActionState::ptr AtomAddAction::performUndo(ActionState::ptr _state){ 148 109 AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); 149 110 150 for (std::vector<atomId_t>::const_iterator iter = state->ids.begin(); 151 iter != state->ids.end(); ++iter) { 152 LOG(1, "Removing atom with id " << *iter << "."); 153 World::getInstance().destroyAtom(*iter); 154 } 111 // simple remove again all previously added atoms 112 RemoveAtomsFromAtomicInfo(state->WalkersInMolecule.begin()->second); 155 113 156 114 return ActionState::ptr(_state); 157 115 } 158 116 159 ActionState::ptr AtomAddAction::performRedo(ActionState::ptr _state) {117 ActionState::ptr AtomAddAction::performRedo(ActionState::ptr _state) { 160 118 AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); 161 119 162 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 163 std::vector<atomId_t> newids = recreateAtoms(state->params, state->ids, molecules); 164 if (newids.size() != state->ids.size()) { 165 STATUS("Could not recreate all atoms after undo."); 166 for (std::vector<atomId_t>::const_iterator iter = newids.begin(); iter != newids.end();++iter) 167 World::getInstance().destroyAtom(*iter); 120 // add all removed atoms again 121 if (AddMoleculesFromAtomicInfo(state->WalkersInMolecule)) 122 return ActionState::ptr(_state); 123 else { 124 STATUS("Failed to re-add removed atoms."); 168 125 return Action::failure; 169 126 } 170 return ActionState::ptr(_state);171 127 } 172 128
Note:
See TracChangeset
for help on using the changeset viewer.
