Ignore:
Timestamp:
Aug 11, 2010, 2:58:43 PM (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:
2b7d1b
Parents:
03c902
Message:

(un)select-atoms-inside-cuboid: cuboid may be rotated.

  • Matrix::rotate() sets contents to arbitrary rotation matrix.
  • BUGFIX: Matrix::transpose() was working only for symmetric matrices.
  • TEST: unit test cases for rotation() and transpose().
  • new options "angle-x", "angle-y", "angle-z"
  • (un)select-atoms-inside-cuboid: have these as optional arguments.
Location:
src/Actions/SelectionAction
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/SelectionAction/AllAtomsInsideCuboidAction.cpp

    r03c902 r31fb1d  
    2020#include "Helpers/Log.hpp"
    2121#include "Helpers/Verbose.hpp"
     22#include "LinearAlgebra/Matrix.hpp"
    2223#include "LinearAlgebra/Vector.hpp"
    2324#include "Shapes/BaseShapes.hpp"
     
    4041class SelectionAllAtomsInsideCuboidState : public ActionState {
    4142public:
    42   SelectionAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension) :
     43  SelectionAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension, const double _Xangle, const double _Yangle, const double _Zangle) :
    4344    selectedAtoms(_selectedAtoms),
    4445    position(_position),
    45     extension(_extension)
     46    extension(_extension),
     47    Xangle(_Xangle),
     48    Yangle(_Yangle),
     49    Zangle(_Zangle)
    4650  {}
    4751  std::vector<atom*> selectedAtoms;
    4852  Vector position;
    4953  Vector extension;
     54  double Xangle;
     55  double Yangle;
     56  double Zangle;
    5057};
    5158
     
    6572};
    6673
     74void SelectionAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle) {
     75  ValueStorage::getInstance().setCurrentValue(SelectionAllAtomsInsideCuboidAction::NAME, extension);
     76  ValueStorage::getInstance().setCurrentValue("position", position);
     77  ValueStorage::getInstance().setCurrentValue("angle-x", Xangle);
     78  ValueStorage::getInstance().setCurrentValue("angle-y", Yangle);
     79  ValueStorage::getInstance().setCurrentValue("angle-z", Zangle);
     80  ActionRegistry::getInstance().getActionByName(SelectionAllAtomsInsideCuboidAction::NAME)->call(Action::NonInteractive);
     81};
     82
    6783Dialog* SelectionAllAtomsInsideCuboidAction::fillDialog(Dialog *dialog) {
    6884  ASSERT(dialog,"No Dialog given when filling action dialog");
     
    7894  Vector position;
    7995  Vector extension;
     96  double Xangle = 0.;
     97  double Yangle = 0.;
     98  double Zangle = 0.;
     99  Matrix RotationMatrix;
    80100
    81101  ValueStorage::getInstance().queryCurrentValue("position", position);
    82102  ValueStorage::getInstance().queryCurrentValue(NAME, extension);
     103  // check whether a rotation is given.
     104  if (ValueStorage::getInstance().queryCurrentValue("angle-x", Xangle, true))
     105    Xangle = 0.;
     106  if (ValueStorage::getInstance().queryCurrentValue("angle-y", Yangle, true))
     107    Yangle = 0.;
     108  if (ValueStorage::getInstance().queryCurrentValue("angle-z", Zangle, true))
     109    Zangle = 0.;
     110  RotationMatrix.rotation(Xangle, Yangle, Zangle);
    83111
    84   DoLog(1) && (Log() << Verbose(1) << "Selecting all atoms inside a cuboid at " << position << " and extension of " << extension << "." << endl);
    85   Shape s = translate(stretch(Cuboid(),extension),position);
     112  DoLog(1) && (Log() << Verbose(1) << "Selecting all atoms inside a rotated " << RotationMatrix << " cuboid at " << position << " and extension of " << extension << "." << endl);
     113  Shape s = translate(transform(stretch(Cuboid(),extension),RotationMatrix),position);
    86114  World::getInstance().selectAllAtoms(AtomByShape(s));
    87   return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(selectedAtoms, position, extension));
     115  return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(selectedAtoms, position, extension, Xangle, Yangle, Zangle));
    88116}
    89117
     
    95123    World::getInstance().selectAtom(*iter);
    96124
    97   return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     125  return Action::state_ptr(_state);
    98126}
    99127
    100128Action::state_ptr SelectionAllAtomsInsideCuboidAction::performRedo(Action::state_ptr _state){
    101129  SelectionAllAtomsInsideCuboidState *state = assert_cast<SelectionAllAtomsInsideCuboidState*>(_state.get());
     130  Matrix RotationMatrix;
    102131
    103   Shape s = translate(stretch(Cuboid(),state->extension),state->position);
     132  RotationMatrix.rotation(state->Xangle, state->Yangle, state->Zangle);
     133  Shape s = translate(transform(stretch(Cuboid(),state->extension),RotationMatrix),state->position);
    104134  World::getInstance().selectAllAtoms(AtomByShape(s));
    105135
    106   return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     136  return Action::state_ptr(_state);
    107137}
    108138
  • src/Actions/SelectionAction/AllAtomsInsideCuboidAction.hpp

    r03c902 r31fb1d  
    1717class SelectionAllAtomsInsideCuboidAction : public Action {
    1818  friend void SelectionAllAtomsInsideCuboid(const Vector &position, const Vector &extension);
     19  friend void SelectionAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle);
    1920
    2021public:
  • src/Actions/SelectionAction/NotAllAtomsInsideCuboidAction.cpp

    r03c902 r31fb1d  
    2020#include "Helpers/Log.hpp"
    2121#include "Helpers/Verbose.hpp"
     22#include "LinearAlgebra/Matrix.hpp"
    2223#include "LinearAlgebra/Vector.hpp"
    2324#include "Shapes/BaseShapes.hpp"
     
    4041class SelectionNotAllAtomsInsideCuboidState : public ActionState {
    4142public:
    42   SelectionNotAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension) :
     43  SelectionNotAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension, const double _Xangle, const double _Yangle, const double _Zangle) :
    4344    selectedAtoms(_selectedAtoms),
    4445    position(_position),
    45     extension(_extension)
     46    extension(_extension),
     47    Xangle(_Xangle),
     48    Yangle(_Yangle),
     49    Zangle(_Zangle)
    4650  {}
    4751  std::vector<atom*> selectedAtoms;
    4852  Vector position;
    4953  Vector extension;
     54  double Xangle;
     55  double Yangle;
     56  double Zangle;
    5057};
    5158
     
    6572};
    6673
     74void SelectionNotAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle) {
     75  ValueStorage::getInstance().setCurrentValue(SelectionNotAllAtomsInsideCuboidAction::NAME, extension);
     76  ValueStorage::getInstance().setCurrentValue("position", position);
     77  ValueStorage::getInstance().setCurrentValue("angle-x", Xangle);
     78  ValueStorage::getInstance().setCurrentValue("angle-y", Yangle);
     79  ValueStorage::getInstance().setCurrentValue("angle-z", Zangle);
     80  ActionRegistry::getInstance().getActionByName(SelectionNotAllAtomsInsideCuboidAction::NAME)->call(Action::NonInteractive);
     81};
     82
    6783Dialog* SelectionNotAllAtomsInsideCuboidAction::fillDialog(Dialog *dialog) {
    6884  ASSERT(dialog,"No Dialog given when filling action dialog");
     
    7894  Vector position;
    7995  Vector extension;
     96  double Xangle = 0.;
     97  double Yangle = 0.;
     98  double Zangle = 0.;
     99  Matrix RotationMatrix;
    80100
    81101  ValueStorage::getInstance().queryCurrentValue("position", position);
    82102  ValueStorage::getInstance().queryCurrentValue(NAME, extension);
     103  // check whether a rotation is given.
     104  if (ValueStorage::getInstance().queryCurrentValue("angle-x", Xangle, true))
     105    Xangle = 0.;
     106  if (ValueStorage::getInstance().queryCurrentValue("angle-y", Yangle, true))
     107    Yangle = 0.;
     108  if (ValueStorage::getInstance().queryCurrentValue("angle-z", Zangle, true))
     109    Zangle = 0.;
     110  RotationMatrix.rotation(Xangle, Yangle, Zangle);
    83111
    84   DoLog(1) && (Log() << Verbose(1) << "Unselecting all atoms inside a cuboid at " << position << " and extension of " << extension << "." << endl);
    85   Shape s = translate(stretch(Cuboid(),extension),position);
     112  DoLog(1) && (Log() << Verbose(1) << "Unselecting all atoms inside a rotated " << RotationMatrix << " cuboid at " << position << " and extension of " << extension << "." << endl);
     113  Shape s = translate(transform(stretch(Cuboid(),extension),RotationMatrix),position);
     114
    86115  World::getInstance().unselectAllAtoms(AtomByShape(s));
    87   return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(selectedAtoms, position, extension));
     116  return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(selectedAtoms, position, extension, Xangle, Yangle, Zangle));
    88117}
    89118
     
    95124    World::getInstance().selectAtom(*iter);
    96125
    97   return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     126  return Action::state_ptr(_state);
    98127}
    99128
    100129Action::state_ptr SelectionNotAllAtomsInsideCuboidAction::performRedo(Action::state_ptr _state){
    101130  SelectionNotAllAtomsInsideCuboidState *state = assert_cast<SelectionNotAllAtomsInsideCuboidState*>(_state.get());
     131  Matrix RotationMatrix;
    102132
    103   Shape s = translate(stretch(Cuboid(),state->extension),state->position);
     133  RotationMatrix.rotation(state->Xangle, state->Yangle, state->Zangle);
     134  Shape s = translate(transform(stretch(Cuboid(),state->extension),RotationMatrix),state->position);
    104135  World::getInstance().unselectAllAtoms(AtomByShape(s));
    105136
    106   return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     137  return Action::state_ptr(_state);
    107138}
    108139
  • src/Actions/SelectionAction/NotAllAtomsInsideCuboidAction.hpp

    r03c902 r31fb1d  
    1717class SelectionNotAllAtomsInsideCuboidAction : public Action {
    1818  friend void SelectionNotAllAtomsInsideCuboid(const Vector &position, const Vector &extension);
     19  friend void SelectionNotAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle);
    1920
    2021public:
Note: See TracChangeset for help on using the changeset viewer.