Changeset f8456c


Ignore:
Timestamp:
Aug 10, 2010, 11:44:37 AM (15 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
ea2830
Parents:
e41c48
Message:

Added Undo/Redo capability to ChangeElement.

  • added test for undo/redo to Simple_configuration/4.
Files:
2 edited

Legend:

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

    re41c48 rf8456c  
    1010#include "Actions/AtomAction/ChangeElementAction.hpp"
    1111#include "Actions/ActionRegistry.hpp"
     12#include "Descriptors/AtomIdDescriptor.hpp"
    1213#include "atom.hpp"
    1314#include "element.hpp"
     
    1920
    2021#include <iostream>
     22#include <map>
    2123#include <string>
    2224
     
    2628#include "UIElements/Dialog.hpp"
    2729#include "Actions/ValueStorage.hpp"
     30
     31typedef std::map<int, const element *> ElementMap;
     32
     33// memento to remember the state when undoing
     34
     35class AtomChangeElementState : public ActionState {
     36public:
     37  AtomChangeElementState(ElementMap _Elements, const element *_elemental) :
     38    Elements(_Elements),
     39    elemental(_elemental)
     40  {}
     41  ElementMap Elements;
     42  const element *elemental;
     43};
    2844
    2945const char AtomChangeElementAction::NAME[] = "change-element";
     
    5672  ValueStorage::getInstance().queryCurrentValue(NAME, elemental);
    5773
     74  // create undo state
     75  ElementMap Elements;
     76  for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) {
     77    Elements.insert(std::pair<int, const element *> (iter->second->getId(), iter->second->getType()));
     78  }
     79  AtomChangeElementState *UndoState = new AtomChangeElementState(Elements, elemental);
     80
    5881  for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) {
    5982    first = iter->second;
     
    6487    mol->AddAtom(first);  // add atom to ensure correctness of formula
    6588  }
    66   return Action::success;
     89  return Action::state_ptr(UndoState);
    6790}
    6891
    6992Action::state_ptr AtomChangeElementAction::performUndo(Action::state_ptr _state) {
    70 //  ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get());
     93  AtomChangeElementState *state = assert_cast<AtomChangeElementState*>(_state.get());
     94  atom *first = NULL;
     95  molecule *mol = NULL;
    7196
    72   return Action::failure;
    73 //  string newName = state->mol->getName();
    74 //  state->mol->setName(state->lastName);
    75 //
    76 //  return Action::state_ptr(new ParserLoadXyzState(state->mol,newName));
     97  for(ElementMap::const_iterator iter = state->Elements.begin(); iter != state->Elements.end(); ++iter) {
     98    first = World::getInstance().getAtom(AtomById(iter->first));
     99    mol = first->getMolecule();
     100    first->removeFromMolecule(); // remove atom
     101    first->setType(iter->second);
     102    mol->AddAtom(first);  // add atom to ensure correctness of formula
     103  }
     104
     105  return Action::state_ptr(_state);
    77106}
    78107
    79108Action::state_ptr AtomChangeElementAction::performRedo(Action::state_ptr _state){
    80   return Action::failure;
     109  AtomChangeElementState *state = assert_cast<AtomChangeElementState*>(_state.get());
     110  atom *first = NULL;
     111  molecule *mol = NULL;
     112
     113  for(ElementMap::const_iterator iter = state->Elements.begin(); iter != state->Elements.end(); ++iter) {
     114    first = World::getInstance().getAtom(AtomById(iter->first));
     115    mol = first->getMolecule();
     116    first->removeFromMolecule(); // remove atom
     117    first->setType(state->elemental);
     118    mol->AddAtom(first);  // add atom to ensure correctness of formula
     119  }
     120
     121  return Action::state_ptr(_state);
    81122}
    82123
    83124bool AtomChangeElementAction::canUndo() {
    84   return false;
     125  return true;
    85126}
    86127
    87128bool AtomChangeElementAction::shouldUndo() {
    88   return false;
     129  return true;
    89130}
    90131
  • tests/regression/testsuite-simple_configuration.at

    re41c48 rf8456c  
    3737AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/4/pre/test.xyz test.xyz], 0)
    3838AT_CHECK([../../molecuilder -i test.xyz -e ${abs_top_srcdir}/src/ --select-atom-by-id 0 -E 6 ], 0, [ignore], [ignore])
     39AT_CHECK([file=test.xyz; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/4/post/$file], 0, [ignore], [ignore])
     40AT_CLEANUP
     41AT_SETUP([Simple configuration - Changing element with Undo/Redo])
     42AT_KEYWORDS([configuration])
     43AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/4/pre/test.xyz test.xyz], 0)
     44AT_CHECK([../../molecuilder -i test.xyz -e ${abs_top_srcdir}/src/ --select-atom-by-id 0 -E 6 --undo], 0, [ignore], [ignore])
     45AT_CHECK([file=test.xyz; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/4/pre/$file], 0, [ignore], [ignore])
     46AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/4/pre/test.xyz test.xyz], 0)
     47AT_CHECK([../../molecuilder -i test.xyz -e ${abs_top_srcdir}/src/ --select-atom-by-id 0 -E 6 --undo --redo], 0, [ignore], [ignore])
    3948AT_CHECK([file=test.xyz; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/4/post/$file], 0, [ignore], [ignore])
    4049AT_CLEANUP
Note: See TracChangeset for help on using the changeset viewer.