Ignore:
Timestamp:
Mar 16, 2024, 10:22:34 AM (20 months ago)
Author:
Frederik Heber <frederik.heber@…>
Branches:
Candidate_v1.7.0, stable
Children:
19832d
Parents:
ad0929
git-author:
Frederik Heber <frederik.heber@…> (03/16/24 09:26:59)
git-committer:
Frederik Heber <frederik.heber@…> (03/16/24 10:22:34)
Message:

BondifyAction: added undo/redo.

  • DOC: fixed small typo in Action's explanation.
  • TEST: added regression test (also undo/redo).
File:
1 edited

Legend:

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

    rad0929 r9782e20  
    4141
    4242#include "Actions/AtomAction/BondifyAction.hpp"
    43 //#include "Actions/UndoRedoHelpers.hpp"
     43#include "Actions/UndoRedoHelpers.hpp"
    4444#include "Atom/atom.hpp"
     45#include "Atom/AtomicInfo.hpp"
    4546#include "Bond/bond.hpp"
     47#include "Bond/BondInfo.hpp"
    4648#include "Descriptors/AtomsWithinDistanceOfDescriptor.hpp"
    4749#include "Graph/BondGraph.hpp"
     
    5961
    6062typedef std::vector< std::pair<atom *, int> > candidates_t;
     63
     64const double MAX_DISTANCE = 5.0;
    6165
    6266static int getNumberOfHydrogenAtoms(
     
    7781{
    7882  const std::vector< atom *> atoms_in_vicinity = World::getInstance().getAllAtoms(
    79       AtomsWithinDistanceOf(5., Walker->getPosition()));
     83      AtomsWithinDistanceOf(MAX_DISTANCE, Walker->getPosition()));
    8084  candidates_t candidates;
    8185  for (std::vector<atom *>::const_iterator iter = atoms_in_vicinity.begin();
     
    8892    if (OtherWalker->IsBondedTo(Walker))
    8993      continue;
    90     double distance = OtherWalker->getPosition().distance(Walker->getPosition());
     94    const double distance = OtherWalker->getPosition().distance(Walker->getPosition());
    9195    range<double> typical_distance = BG.getMinMaxDistance(Walker, OtherWalker);
    9296    if (typical_distance.isInRange(distance)) {
     
    126130  all_candidates_t operator()(
    127131      const int open_valence,
    128       const std::multimap<int, atom*>& sorted_candidates) const
     132      const num_hydrogens_atom_map_t& sorted_candidates) const
    129133  {
    130134    all_candidates_t all_candidates;
     
    137141    */
    138142   int remaining_valence = open_valence;
    139    std::multimap<int, atom*>::const_iterator iter = sorted_candidates.begin();
     143   num_hydrogens_atom_map_t::const_iterator iter = sorted_candidates.begin();
    140144   candidates_hydrogens_to_remove_t candidate_set;
    141145   exploreCandidateSetRecursively(
     
    229233
    230234  if (open_valence <= 0) {
    231     STATUS("Nothing selected, we need some unoccupied valence orbitals to have something to work on.");
     235    STATUS("Nothing to do. Atom is saturated already, we need some unoccupied valence orbitals to have something to work on.");
    232236    return Action::success;
    233237  }
     
    238242
    239243  /** We revert the map's key and values, as we want the entries
    240    * sorted by the valence.
     244   * sorted by the number of hydrogens.
    241245   */
    242246  std::multimap<int, atom*> sorted_candidates;
     
    273277
    274278  // execute that
     279  std::vector<AtomicInfo> removedHydrogens;
     280  std::vector<BondInfo> addedBonds;
    275281  int removed_hydrogens = 0;
    276282  int added_bonds = 0;
     
    306312      LOG(2, "DEBUG: Removing hydrogen at distance " << removeiter->first
    307313          << " to Walker at " << Walker->getPosition());
     314      removedHydrogens.push_back(AtomicInfo(*removeiter->second));
    308315      world.destroyAtom(removeiter->second);
    309316      removeiter->second = NULL;
     
    314321    // add the bond
    315322    bond::ptr new_bond = Walker->addBond(other_walker);
     323    addedBonds.push_back(BondInfo(new_bond));
    316324    new_bond->setDegree(num_hydrogens);
    317325    ++added_bonds;
     
    325333      << added_bonds << " new bonds.");
    326334
    327   return Action::success;
    328 //  return ActionState::ptr(new AtomBondifyState(addedHydrogens, params));
     335  return ActionState::ptr(new AtomBondifyState(removedHydrogens, addedBonds, params));
    329336}
    330337
    331338ActionState::ptr AtomBondifyAction::performUndo(ActionState::ptr _state) {
    332 //  AtomBondifyState *state = assert_cast<AtomBondifyState*>(_state.get());
    333 
    334   // remove all added hydrogen atoms
    335 //  RemoveAtomsFromAtomicInfo(state->addedHydrogens);
    336 
    337 //  return ActionState::ptr(_state);
    338   return Action::success;
     339  AtomBondifyState *state = assert_cast<AtomBondifyState*>(_state.get());
     340
     341  AddAtomsFromAtomicInfo(state->removedHydrogens);
     342  RemoveBondsFromBondInfo(state->addedBonds);
     343
     344  return ActionState::ptr(_state);
    339345}
    340346
    341347ActionState::ptr AtomBondifyAction::performRedo(ActionState::ptr _state){
    342 //  AtomBondifyState *state = assert_cast<AtomBondifyState*>(_state.get());
    343 
    344   // re-add all added hydrogen atoms
    345 //  AddAtomsFromAtomicInfo(state->addedHydrogens);
    346 
    347 //  return ActionState::ptr(_state);
    348   return Action::success;
     348  AtomBondifyState *state = assert_cast<AtomBondifyState*>(_state.get());
     349
     350  RemoveAtomsFromAtomicInfo(state->removedHydrogens);
     351  AddBondsFromBondInfo(state->addedBonds);
     352
     353  return ActionState::ptr(_state);
    349354}
    350355
    351356bool AtomBondifyAction::canUndo() {
    352   return false;
     357  return true;
    353358}
    354359
    355360bool AtomBondifyAction::shouldUndo() {
    356   return false;
     361  return true;
    357362}
    358363/** =========== end of function ====================== */
Note: See TracChangeset for help on using the changeset viewer.