Changeset 399c69


Ignore:
Timestamp:
Mar 3, 2024, 10:10:53 AM (20 months ago)
Author:
Frederik Heber <frederik.heber@…>
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)
Message:

Rewrote AddAction to use UndoRedoHelpers.

Location:
src/Actions/AtomAction
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/AtomAction/AddAction.cpp

    r0427d1 r399c69  
    3535//#include "CodePatterns/MemDebug.hpp"
    3636
     37#include "Actions/UndoRedoHelpers.hpp"
    3738#include "Descriptors/AtomIdDescriptor.hpp"
    3839#include "Atom/atom.hpp"
     
    5556#include "Action_impl_pre.hpp"
    5657/** =========== define the function ====================== */
    57 
    5858atom * getNewAtom(const AtomAddAction::AtomAddParameters &_params)
    5959{
     
    6565}
    6666
    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());
     67ActionState::ptr AtomAddAction::performCall() {
     68  // execute action
     69  std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules();
    7270
    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();
    8577        LOG(1, "Adding new atom with element " << first->getType()->getName()
    8678            << " at " << (first->getPosition()) << " to selected molecule "
    8779            << mol->getName()+".");
    8880        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.");
    9085    }
    9186  } else {
    92     atom *first = getNewAtom(_params);
     87    atom * first = getNewAtom(params);
    9388    molecule *mol = World::getInstance().createMolecule();
    9489    mol->setName("none");
     
    9691    LOG(1, "Adding new atom with element " << first->getType()->getName()
    9792        << " at " << (first->getPosition()) << " to new molecule.");
    98     ids.push_back(first->getId());
     93    molId = mol->getId();
     94    Walkers.push_back(AtomicInfo(*first));
    9995  }
     96  WalkersInMolecule_t WalkersInMolecule = { { molId, Walkers } };
    10097
    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);
    102106}
    103107
    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) {
     108ActionState::ptr AtomAddAction::performUndo(ActionState::ptr _state){
    148109  AtomAddState *state = assert_cast<AtomAddState*>(_state.get());
    149110
    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);
    155113
    156114  return ActionState::ptr(_state);
    157115}
    158116
    159 ActionState::ptr AtomAddAction::performRedo(ActionState::ptr _state){
     117ActionState::ptr AtomAddAction::performRedo(ActionState::ptr _state) {
    160118  AtomAddState *state = assert_cast<AtomAddState*>(_state.get());
    161119
    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.");
    168125    return Action::failure;
    169126  }
    170   return ActionState::ptr(_state);
    171127}
    172128
  • src/Actions/AtomAction/AddAction.def

    r0427d1 r399c69  
    1010#include "World.hpp"
    1111class element;
     12#include <map>
     13#include <vector>
     14typedef std::map< moleculeId_t, std::vector<AtomicInfo> > WalkersInMolecule_t;
    1215
    1316#include "Parameters/Validators/Specific/BoxVectorValidator.hpp"
     
    2730(BoxVectorValidator())
    2831
    29 #define statetypes (std::vector<atomId_t>)
    30 #define statereferences (ids)
     32#define statetypes (WalkersInMolecule_t)
     33#define statereferences (WalkersInMolecule)
    3134
    3235// some defines for all the names, you may use ACTION, STATE and PARAMS
Note: See TracChangeset for help on using the changeset viewer.