Ignore:
File:
1 edited

Legend:

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

    rceaab1 r26b4d62  
    5555#include "Action_impl_pre.hpp"
    5656/** =========== 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 
    9557ActionState::ptr AtomAddAction::performCall() {
    9658  // 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));
    10470}
    10571
     
    10773  AtomAddState *state = assert_cast<AtomAddState*>(_state.get());
    10874
    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);
    11477
    11578  return ActionState::ptr(_state);
     
    11982  AtomAddState *state = assert_cast<AtomAddState*>(_state.get());
    12083
    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    }
    12399
    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);
    158101}
    159102
Note: See TracChangeset for help on using the changeset viewer.