Changes in / [7b38d3:0ac85c3]


Ignore:
Files:
81 added
2 deleted
67 edited

Legend:

Unmodified
Added
Removed
  • doc/userguide/userguide.xml

    r7b38d3 r0ac85c3  
    629629                </programlisting>
    630630              </listitem>
     631
     632              <listitem>
     633                <para>Push/Pop the current selection to/from a stack to store
     634                it momentarily and allow modifications in MakroActions.</para>
     635                <programlisting>
     636                ... --push-atom-selection
     637                </programlisting>
     638                <programlisting>
     639                ... --pop-atom-selection
     640                </programlisting>
     641              </listitem>
    631642            </itemizedlist>
    632643          </listitem>
     
    709720                <programlisting>
    710721                ... --unselect-atoms-molecules
     722                </programlisting>
     723              </listitem>
     724
     725              <listitem>
     726                <para>Push/Pop the current selection to/from a stack to store
     727                it momentarily and allow modifications in MakroActions.</para>
     728                <programlisting>
     729                ... --push-molecule-selection
     730                </programlisting>
     731                <programlisting>
     732                ... --pop-molecule-selection
    711733                </programlisting>
    712734              </listitem>
     
    12471269            (without suffix) as its name.</para>
    12481270          </note>
     1271        </section>
     1272
     1273        <section xml:id='molecule.remove-molecule'>
     1274          <title xml:id='molecule.remove-molecule.title'>Remove molecules
     1275          </title>
     1276
     1277          <para>This removes one or multiple selected molecules.</para>
     1278
     1279          <programlisting>... -remove-molecule</programlisting>
     1280
     1281          <para>This essentially just removes all of the molecules' atoms
     1282          which in turn also causes the removal of the molecule.</para>
     1283        </section>
     1284
     1285        <section xml:id='molecule.translate-molecules'>
     1286          <title xml:id='molecule.translate-molecules.title'>Translate molecules
     1287          </title>
     1288
     1289          <para>This translates one or multiple selected molecules by a
     1290          specific offset..</para>
     1291
     1292          <programlisting>... -translate-molecules</programlisting>
     1293
     1294          <para>This essentially translates all of the molecules' atoms.</para>
    12491295        </section>
    12501296
  • src/Actions/Action.cpp

    r7b38d3 r0ac85c3  
    146146  endTimer();
    147147
    148   if(shouldUndo() && state != failure){
    149     if(canUndo()){
     148  if (shouldUndo() && state != Action::failure) {
     149    if (canUndo()) {
    150150      ActionQueue::getInstance().addElement(this,state);
    151151    }
    152     else{
    153       ActionQueue::getInstance().clear();
    154     }
     152//    else{
     153//      ActionQueue::getInstance().clear();
     154//    }
    155155  }
    156156
  • src/Actions/ActionQueue.cpp

    r7b38d3 r0ac85c3  
    4444#include <boost/date_time/posix_time/posix_time.hpp>
    4545#include <boost/version.hpp>
     46#include <iterator>
    4647#include <string>
    4748#include <sstream>
     
    6162    AR(new ActionRegistry()),
    6263    history(new ActionHistory),
    63     CurrentAction(0),
    6464#ifndef HAVE_ACTION_THREAD
    6565    lastActionOk(true)
    6666#else
     67    CurrentAction(0),
    6768    lastActionOk(true),
    6869    run_thread(boost::bind(&ActionQueue::run, this)),
     
    8283#ifdef HAVE_ACTION_THREAD
    8384  stop();
     85
     86  clearTempQueue();
    8487#endif
    8588
     
    111114    std::cerr << "Action " << *boost::get_error_info<ActionNameString>(e) << " has failed." << std::endl;
    112115    World::getInstance().setExitFlag(5);
    113     clearQueue();
     116    clearQueue(actionqueue.size()-1);
    114117    lastActionOk = false;
    115     std::cerr << "ActionQueue cleared." << std::endl;
     118    std::cerr << "Remaining Actions cleared from queue." << std::endl;
    116119  } catch (std::exception &e) {
    117120    pushStatus("FAIL: General exception caught, aborting.");
    118121    World::getInstance().setExitFlag(134);
    119     clearQueue();
     122    clearQueue(actionqueue.size()-1);
    120123    lastActionOk = false;
    121     std::cerr << "ActionQueue cleared." << std::endl;
     124    std::cerr << "Remaining Actions cleared from queue." << std::endl;
    122125  }
    123126  if (lastActionOk) {
     
    127130  }
    128131#else
    129   {
    130     boost::lock_guard<boost::mutex> lock(mtx_idle);
    131     run_thread_isIdle = (CurrentAction == actionqueue.size());
    132   }
     132  setRunThreadIdle(CurrentAction == actionqueue.size());
    133133  mtx_queue.unlock();
    134134#endif
     
    144144  mtx_queue.lock();
    145145  tempqueue.push_back( newaction );
    146   {
    147     boost::lock_guard<boost::mutex> lock(mtx_idle);
    148     run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
    149   }
     146  setRunThreadIdle( !((CurrentAction != actionqueue.size()) || !tempqueue.empty()) );
    150147  mtx_queue.unlock();
    151148#endif
     
    184181        pushStatus("FAIL: Action "+*boost::get_error_info<ActionNameString>(e)+" has failed.");
    185182        World::getInstance().setExitFlag(5);
    186         clearQueue();
     183        clearQueue(CurrentAction);
     184        clearTempQueue();
    187185        lastActionOk = false;
    188         std::cerr << "ActionQueue cleared." << std::endl;
    189         CurrentAction = (size_t)-1;
     186        std::cerr << "Remaining Actions cleared from queue." << std::endl;
    190187      } catch (std::exception &e) {
    191188        pushStatus("FAIL: General exception caught, aborting.");
    192189        World::getInstance().setExitFlag(134);
    193         clearQueue();
    194         std::cerr << "ActionQueue cleared." << std::endl;
    195         CurrentAction = (size_t)-1;
     190        clearQueue(CurrentAction);
     191        clearTempQueue();
     192        std::cerr << "Remaining Actions cleared from queue." << std::endl;
    196193      }
    197194      if (lastActionOk) {
     
    199196        NOTIFY(ActionQueued);
    200197        _lastchangedaction = actionqueue[CurrentAction];
     198        mtx_queue.lock();
     199        CurrentAction++;
     200        mtx_queue.unlock();
    201201      }
    202202      // access actionqueue, hence using mutex
    203203      mtx_queue.lock();
    204       // step on to next action and check for end
    205       CurrentAction++;
    206204      // insert new actions (before [CurrentAction]) if they have been spawned
    207205      // we must have an extra vector for this, as we cannot change actionqueue
     
    211209      mtx_queue.unlock();
    212210    }
    213     {
    214       boost::lock_guard<boost::mutex> lock(mtx_idle);
    215       run_thread_isIdle = !((CurrentAction != actionqueue.size()) || !tempqueue.empty());
    216     }
     211    setRunThreadIdle( !((CurrentAction != actionqueue.size()) || !tempqueue.empty()) );
    217212    cond_idle.notify_one();
    218213//    LOG(1, "DEBUG: End of ActionQueue's run() loop.");
    219214  } while (!Interrupted);
    220215}
    221 #endif
    222216
    223217void ActionQueue::insertTempQueue()
     
    231225}
    232226
    233 #ifdef HAVE_ACTION_THREAD
    234227void ActionQueue::wait()
    235228{
     
    316309}
    317310
    318 void ActionQueue::clearQueue()
    319 {
    320   // free all actions contained in actionqueue
    321   for (ActionQueue_t::iterator iter = actionqueue.begin();
    322       !actionqueue.empty(); iter = actionqueue.begin()) {
     311void ActionQueue::clearQueue(const size_t _fromAction)
     312{
     313#ifdef HAVE_ACTION_THREAD
     314  mtx_queue.lock();
     315#endif
     316  LOG(1, "Removing all Actions from position " << _fromAction << " onward.");
     317  // free all actions still to be called contained in actionqueue
     318  ActionQueue_t::iterator inititer = actionqueue.begin();
     319  std::advance(inititer, _fromAction);
     320  for (ActionQueue_t::iterator iter = inititer; iter != actionqueue.end(); ++iter)
    323321    delete *iter;
    324     actionqueue.erase(iter);
    325   }
     322  actionqueue.erase(inititer, actionqueue.end());
     323  LOG(1, "There are " << actionqueue.size() << " remaining Actions.");
     324#ifdef HAVE_ACTION_THREAD
     325  CurrentAction = actionqueue.size();
     326  mtx_queue.unlock();
     327#endif
     328}
     329
     330#ifdef HAVE_ACTION_THREAD
     331void ActionQueue::clearTempQueue()
     332{
    326333  // free all actions contained in tempqueue
    327334  for (ActionQueue_t::iterator iter = tempqueue.begin();
     
    330337    tempqueue.erase(iter);
    331338  }
    332 #ifdef HAVE_ACTION_THREAD
     339}
     340
     341void ActionQueue::setRunThreadIdle(const bool _flag)
     342{
    333343  {
    334344    boost::unique_lock<boost::mutex> lock(mtx_idle);
    335     run_thread_isIdle = true;
    336   }
    337 #endif
    338 }
     345    run_thread_isIdle = _flag;
     346  }
     347}
     348#endif
    339349
    340350const ActionQueue::ActionTokens_t ActionQueue::getListOfActions() const
     
    355365}
    356366
     367bool ActionQueue::canUndo() const
     368{
     369  return history->hasUndo();
     370}
     371
    357372void ActionQueue::redoLast()
    358373{
     
    360375}
    361376
     377bool ActionQueue::canRedo() const
     378{
     379  return history->hasRedo();
     380}
     381
    362382
    363383CONSTRUCT_SINGLETON(ActionQueue)
  • src/Actions/ActionQueue.hpp

    r7b38d3 r0ac85c3  
    145145  void redoLast();
    146146
     147  /** Checks whether there is one completed Action stored in ActionHistory in the past.
     148   *
     149   * @return true - at least one Action to undo present, false - else
     150   */
     151  bool canUndo() const;
     152
     153  /** Checks whether there is one completed Action stored in ActionHistory in the future.
     154   *
     155   * @return true - at least one Action to redo present, false - else
     156   */
     157  bool canRedo() const;
     158
    147159  /** Return status of last executed action.
    148160   *
     
    190202  void clear();
    191203
    192   /** Clears all actions currently present in the actionqueues.
    193    *
    194    */
    195   void clearQueue();
    196 
    197 #ifdef HAVE_ACTION_THREAD
     204  /** Clears all actions present in the actionqueues from \a _fromAction.
     205   *
     206   * @param _fromAction 0 if all Actions to clear or else
     207   */
     208  void clearQueue(const size_t _fromAction = 0);
     209
     210#ifdef HAVE_ACTION_THREAD
     211
     212  /** Clears the temporary queue.
     213   *
     214   */
     215  void clearTempQueue();
     216
     217  /** Sets the run_thread_isIdle flag.
     218   *
     219   * @param _flag state to set to
     220   */
     221  void setRunThreadIdle(const bool _flag);
     222
    198223  /** Runs the ActionQueue.
    199224   *
     
    214239   */
    215240  void wait();
     241
     242  /** Moves all action from tempqueue into real queue.
     243   *
     244   */
     245  void insertTempQueue();
     246
    216247#endif
    217248
     
    224255  void insertAction(Action *_action, enum Action::QueryOptions state);
    225256
    226   /** Moves all action from tempqueue into real queue.
    227    *
    228    */
    229   void insertTempQueue();
    230 
    231257private:
    232258  /** Private cstor for ActionQueue.
     
    255281  ActionQueue_t actionqueue;
    256282
     283  //!> indicates that the last action has failed
     284  bool lastActionOk;
     285
     286#ifdef HAVE_ACTION_THREAD
    257287  //!> point to current action in actionqueue
    258288  size_t CurrentAction;
     
    261291  ActionQueue_t tempqueue;
    262292
    263   //!> indicates that the last action has failed
    264   bool lastActionOk;
    265 
    266 #ifdef HAVE_ACTION_THREAD
    267293  //!> internal thread to call Actions
    268294  boost::thread run_thread;
  • src/Actions/ActionRegistry.cpp

    r7b38d3 r0ac85c3  
    9191    MakroAction * presentAction =
    9292        dynamic_cast<MakroAction *>(getActionByName("subgraph-dissection"));
     93    ASSERT( presentAction != NULL,
     94        "ActionRegistry::fillRegistry() - makro action has not been registered.");
     95    presentAction->unprepare(*this);
     96  }
     97  {
     98    MakroAction * presentAction =
     99        dynamic_cast<MakroAction *>(getActionByName("translate-molecules"));
    93100    ASSERT( presentAction != NULL,
    94101        "ActionRegistry::fillRegistry() - makro action has not been registered.");
     
    136143    MakroAction * presentAction =
    137144        dynamic_cast<MakroAction *>(getActionByName("optimize-structure"));
     145    ASSERT( presentAction != NULL,
     146        "ActionRegistry::fillRegistry() - makro action has not been registered.");
     147    presentAction->prepare(*this);
     148  }
     149  {
     150    MakroAction * presentAction =
     151        dynamic_cast<MakroAction *>(getActionByName("translate-molecules"));
    138152    ASSERT( presentAction != NULL,
    139153        "ActionRegistry::fillRegistry() - makro action has not been registered.");
  • src/Actions/AtomAction/TranslateAction.def

    r7b38d3 r0ac85c3  
    1616// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    1717#define paramtypes (Vector)(bool)
    18 #define paramtokens ("translate-atoms")("periodic")
     18#define paramtokens ("position")("periodic")
    1919#define paramdescriptions ("translation vector")("system is constraint to periodic boundary conditions")
    2020#define paramreferences (x)(periodic)
  • src/Actions/FillAction/SuspendInMoleculeAction.cpp

    r7b38d3 r0ac85c3  
    129129  filler->CenterEdge();
    130130
     131  std::vector<molecule *> molecules = World::getInstance().getAllMolecules();
     132  if (molecules.size() < 2) {
     133    STATUS("There must be at least two molecules: filler and to be suspended.");
     134    return Action::failure;
     135  }
     136
    131137  /// first we need to calculate some volumes and masses
    132   std::vector<molecule *> molecules = World::getInstance().getAllMolecules();
    133138  double totalmass = 0.;
    134139  const bool IsAngstroem = true;
     
    139144      iter != molecules.end(); ++iter)
    140145  {
     146    // skip the filler
     147    if (*iter == filler)
     148      continue;
    141149    molecule & mol = **iter;
    142150    const double mass = calculateMass(mol);
     
    152160  LOG(1, "INFO: The average density is " << setprecision(10)
    153161      << totalmass / clustervolume << " atomicmassunit/"
    154       << (IsAngstroem ? "angstrom" : "atomiclength") << "^3.");
     162      << (IsAngstroem ? " angstrom" : " atomiclength") << "^3.");
     163  if ( ((totalmass / clustervolume < 1.) && (params.density.get() > 1.))
     164      || ((totalmass / clustervolume > 1.) && (params.density.get() < 1.))) {
     165    STATUS("Desired and present molecular densities must both be either in [0,1) or in (1, inf).");
     166    return Action::failure;
     167  }
    155168
    156169  // calculate maximum solvent density
    157170  std::vector<double> fillerdiameters(NDIM, 0.);
    158   const double solventdensity =
    159       calculateMass(*filler) / calculateEnvelopeVolume(*filler, fillerdiameters);
    160 
    161   std::vector<unsigned int> counts(3, 0);
    162   Vector offset(.5,.5,.5);
     171  const double fillervolume = calculateEnvelopeVolume(*filler, fillerdiameters);
     172  const double fillermass = calculateMass(*filler);
     173  LOG(1, "INFO: The filler's mass is " << setprecision(10)
     174      << fillermass << " atomicmassunit, and it's volume is "
     175      << fillervolume << (IsAngstroem ? " angstrom" : " atomiclength") << "^3.");
     176  const double solventdensity = fillermass / fillervolume;
    163177
    164178  /// solve cubic polynomial
    165179  double cellvolume = 0.;
    166180  LOG(1, "Solving equidistant suspension in water problem ...");
    167   cellvolume = (totalmass / solventdensity
    168       - (totalmass / clustervolume)) / (params.density.get() - 1.);
     181  // s = solvent, f = filler, 0 = initial molecules/cluster
     182  // v_s = v_0 + v_f, m_s = m_0 + rho_f * v_f --> rho_s = m_s/v_s ==> v_f = (m_0 - rho_s * v_o) / (rho_s - rho_f)
     183  cellvolume = (totalmass - params.density.get() * clustervolume) / (params.density.get() - 1.) + clustervolume;
    169184  LOG(1, "Cellvolume needed for a density of " << params.density.get()
    170185      << " g/cm^3 is " << cellvolume << " angstroem^3.");
     
    173188      (GreatestDiameter[0] * GreatestDiameter[1] * GreatestDiameter[2]);
    174189  LOG(1, "Minimum volume of the convex envelope contained in a rectangular box is "
    175       << minimumvolume << "angstrom^3.");
     190      << minimumvolume << " angstrom^3.");
    176191
    177192  if (minimumvolume > cellvolume) {
     
    187202        + GreatestDiameter[1] * GreatestDiameter[2];
    188203    BoxLengths[2] = minimumvolume - cellvolume;
    189     double x0 = 0.;
    190     double x1 = 0.;
    191     double x2 = 0.;
     204    std::vector<double> x(3, 0.);
    192205    // for cubic polynomial there are either 1 or 3 unique solutions
    193     if (gsl_poly_solve_cubic(BoxLengths[0], BoxLengths[1], BoxLengths[2], &x0, &x1, &x2) == 1)
    194       LOG(0, "RESULT: The resulting spacing is: " << x0 << " .");
    195     else {
    196       LOG(0, "RESULT: The resulting spacings are: " << x0 << " and " << x1 << " and " << x2 << " .");
    197       std::swap(x0, x2); // sorted in ascending order
    198     }
     206    if (gsl_poly_solve_cubic(BoxLengths[0], BoxLengths[1], BoxLengths[2], &x[0], &x[1], &x[2]) == 1) {
     207      x[1] = x[0];
     208      x[2] = x[0];
     209    } else {
     210      std::swap(x[0], x[2]); // sorted in ascending order
     211    }
     212    LOG(0, "RESULT: The resulting spacing is: " << x << " .");
    199213
    200214    cellvolume = 1.;
    201215    for (size_t i = 0; i < NDIM; ++i) {
    202       BoxLengths[i] = x0 + GreatestDiameter[i];
     216      BoxLengths[i] = x[i] + GreatestDiameter[i];
    203217      cellvolume *= BoxLengths[i];
    204218    }
    205 
    206     // set new box dimensions
    207     LOG(0, "Translating to box with these boundaries.");
    208     {
    209       RealSpaceMatrix domain;
    210       for(size_t i =0; i<NDIM;++i)
    211         domain.at(i,i) = BoxLengths[i];
    212       World::getInstance().setDomain(domain);
    213     }
    214 //    mol->CenterInBox();
     219  }
     220
     221  // TODO: Determine counts from resulting mass correctly (hard problem due to integers)
     222  std::vector<unsigned int> counts(3, 0);
     223  const unsigned int totalcounts = round(params.density.get() * cellvolume - totalmass) / fillermass;
     224  if (totalcounts > 0) {
     225    counts[0] = ceil(BoxLengths[0]/3.1);
     226    counts[1] = ceil(BoxLengths[1]/3.1);
     227    counts[2] = ceil(BoxLengths[2]/3.1);
    215228  }
    216229
     
    231244      params.RandMoleculeDisplacement.get(),
    232245      params.DoRotate.get());
     246  Vector offset(.5,.5,.5);
    233247  filler_preparator.addCubeMesh(
    234248      counts,
  • src/Actions/FillAction/SuspendInMoleculeAction.def

    r7b38d3 r0ac85c3  
    1717#include "Parameters/Validators/RangeValidator.hpp"
    1818#include "Parameters/Validators/STLVectorValidator.hpp"
     19#include "Parameters/Validators/Ops_Validator.hpp"
    1920#include "Parameters/Validators/Specific/BoxLengthValidator.hpp"
    2021#include "Parameters/Validators/Specific/VectorZeroOneComponentsValidator.hpp"
     
    2526#define paramtypes (double)(double)(double)(double)(bool)
    2627#define paramtokens ("density")("min-distance")("random-atom-displacement")("random-molecule-displacement")("DoRotate")
    27 #define paramdescriptions ("desired density for the total domain")("minimum distance of water molecules to present atoms")("magnitude of random atom displacement")("magnitude of random molecule displacement")("whether to rotate or not")
     28#define paramdescriptions ("desired density for the total domain, unequal 1.")("minimum distance of water molecules to present atoms")("magnitude of random atom displacement")("magnitude of random molecule displacement")("whether to rotate or not")
    2829#define paramdefaults (PARAM_DEFAULT(1.))(PARAM_DEFAULT(1.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(false))
    2930#define paramreferences (density)(mindistance)(RandAtomDisplacement)(RandMoleculeDisplacement)(DoRotate)
    3031#define paramvalids \
    31 (RangeValidator< double >(0., std::numeric_limits<double>::max())) \
     32(RangeValidator< double >(0., 1. - std::numeric_limits<double>::epsilon()) || RangeValidator< double >(1. + std::numeric_limits<double>::epsilon(), std::numeric_limits<double>::max())) \
    3233(BoxLengthValidator()) \
    3334(BoxLengthValidator()) \
  • src/Actions/GlobalListOfActions.hpp

    r7b38d3 r0ac85c3  
    7676  (MoleculeLinearInterpolationofTrajectories) \
    7777  (MoleculeLoad) \
     78  (MoleculeRemove) \
    7879  (MoleculeRotateAroundSelfByAngle) \
    7980  (MoleculeRotateToPrincipalAxisSystem) \
     
    8384  (MoleculeSaveTemperature) \
    8485  (MoleculeStretchBond) \
     86  (MoleculeTranslate) \
    8587  (MoleculeVerletIntegration) \
    8688  (PotentialFitParticleCharges) \
     
    126128  (SelectionNotMoleculeByOrder) \
    127129  (SelectionNotShapeByName) \
     130  (SelectionPopAtoms) \
     131  (SelectionPushAtoms) \
     132  (SelectionPopMolecules) \
     133  (SelectionPushMolecules) \
    128134  (SelectionShapeByName) \
    129135  (ShapeCombineShapes) \
  • src/Actions/GraphAction/SubgraphDissectionAction.cpp

    r7b38d3 r0ac85c3  
    4242#include "Actions/GraphAction/UpdateMoleculesAction.hpp"
    4343#include "Actions/GraphAction/SubgraphDissectionAction.hpp"
     44#include "Actions/SelectionAction/Atoms/PushAtomsAction.hpp"
     45#include "Actions/SelectionAction/Atoms/PopAtomsAction.hpp"
     46#include "Actions/SelectionAction/Atoms/AllAtomsAction.hpp"
    4447#include "Actions/ActionQueue.hpp"
    4548#include "Actions/ActionRegistry.hpp"
     
    6063void GraphSubgraphDissectionAction::prepare(ActionRegistry &AR)
    6164{
     65  actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
    6266  actions.addAction(AR.getActionByName(std::string("select-all-atoms")));
    6367  actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
    6468  actions.addAction(AR.getActionByName(std::string("create-adjacency")));
    6569  actions.addAction(AR.getActionByName(std::string("update-molecules")));
     70  actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
    6671  isPrepared = true;
    6772}
     
    7479}
    7580
    76 void reselectAtoms(const std::vector<atom *> &selected_atoms)
    77 {
    78   World::getInstance().clearAtomSelection();
    79   for (std::vector<atom *>::const_iterator iter = selected_atoms.begin();
    80       iter != selected_atoms.end();
    81       ++iter)
    82     World::getInstance().selectAtom(*iter);
    83 }
    84 
    8581ActionState::ptr GraphSubgraphDissectionAction::performCall(){
    86   // we need to "emulate" that all atoms have been selected without destroying
    87   // current selection
    88   const std::vector<atom *> selected_atoms = World::getInstance().getSelectedAtoms();
    8982  ActionState::ptr state(MakroAction::performCall());
    90   reselectAtoms(selected_atoms);
    9183
    9284  return state;
     
    9486
    9587ActionState::ptr GraphSubgraphDissectionAction::performUndo(ActionState::ptr _state) {
    96   // we need to "emulate" that all atoms have been selected without destroying
    97   // current selection
    98   const std::vector<atom *> selected_atoms = World::getInstance().getSelectedAtoms();
    9988  ActionState::ptr state(MakroAction::performUndo(_state));
    100   reselectAtoms(selected_atoms);
    10189
    10290  return state;
     
    10492
    10593ActionState::ptr GraphSubgraphDissectionAction::performRedo(ActionState::ptr _state){
    106   // we need to "emulate" that all atoms have been selected without destroying
    107   // current selection
    108   const std::vector<atom *> selected_atoms = World::getInstance().getSelectedAtoms();
    10994  ActionState::ptr state(MakroAction::performRedo(_state));
    110   reselectAtoms(selected_atoms);
    11195
    11296  return state;
  • src/Actions/Makefile.am

    r7b38d3 r0ac85c3  
    297297  Actions/MoleculeAction/LinearInterpolationofTrajectoriesAction.cpp \
    298298  Actions/MoleculeAction/LoadAction.cpp \
     299  Actions/MoleculeAction/RemoveAction.cpp \
    299300  Actions/MoleculeAction/RotateAroundSelfByAngleAction.cpp \
    300301  Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.cpp \
     
    304305  Actions/MoleculeAction/SaveTemperatureAction.cpp \
    305306  Actions/MoleculeAction/StretchBondAction.cpp \
     307  Actions/MoleculeAction/TranslateAction.cpp \
    306308  Actions/MoleculeAction/VerletIntegrationAction.cpp
    307309MOLECULEACTIONHEADER = \
     
    313315  Actions/MoleculeAction/LinearInterpolationofTrajectoriesAction.hpp \
    314316  Actions/MoleculeAction/LoadAction.hpp \
     317  Actions/MoleculeAction/RemoveAction.hpp \
    315318  Actions/MoleculeAction/RotateAroundSelfByAngleAction.hpp \
    316319  Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.hpp \
     
    320323  Actions/MoleculeAction/SaveTemperatureAction.hpp \
    321324  Actions/MoleculeAction/StretchBondAction.hpp \
     325  Actions/MoleculeAction/TranslateAction.hpp \
    322326  Actions/MoleculeAction/VerletIntegrationAction.hpp
    323327MOLECULEACTIONDEFS = \
     
    329333  Actions/MoleculeAction/LinearInterpolationofTrajectoriesAction.def \
    330334  Actions/MoleculeAction/LoadAction.def \
     335  Actions/MoleculeAction/RemoveAction.def \
    331336  Actions/MoleculeAction/RotateAroundSelfByAngleAction.def \
    332337  Actions/MoleculeAction/RotateToPrincipalAxisSystemAction.def \
     
    336341  Actions/MoleculeAction/SaveTemperatureAction.def \
    337342  Actions/MoleculeAction/StretchBondAction.def \
     343  Actions/MoleculeAction/TranslateAction.def \
    338344  Actions/MoleculeAction/VerletIntegrationAction.def
    339345
     
    412418  Actions/SelectionAction/Atoms/NotAtomByElementAction.cpp \
    413419  Actions/SelectionAction/Atoms/NotAtomByIdAction.cpp \
    414   Actions/SelectionAction/Atoms/NotAtomByOrderAction.cpp
     420  Actions/SelectionAction/Atoms/NotAtomByOrderAction.cpp \
     421  Actions/SelectionAction/Atoms/PopAtomsAction.cpp \
     422  Actions/SelectionAction/Atoms/PushAtomsAction.cpp
    415423SELECTIONATOMACTIONHEADER = \
    416424  Actions/SelectionAction/Atoms/AllAtomsAction.hpp \
     
    427435  Actions/SelectionAction/Atoms/NotAtomByElementAction.hpp \
    428436  Actions/SelectionAction/Atoms/NotAtomByIdAction.hpp \
    429   Actions/SelectionAction/Atoms/NotAtomByOrderAction.hpp
     437  Actions/SelectionAction/Atoms/NotAtomByOrderAction.hpp \
     438  Actions/SelectionAction/Atoms/PopAtomsAction.hpp \
     439  Actions/SelectionAction/Atoms/PushAtomsAction.hpp
    430440SELECTIONATOMACTIONDEFS = \
    431441  Actions/SelectionAction/Atoms/AllAtomsAction.def \
     
    442452  Actions/SelectionAction/Atoms/NotAtomByElementAction.def \
    443453  Actions/SelectionAction/Atoms/NotAtomByIdAction.def \
    444   Actions/SelectionAction/Atoms/NotAtomByOrderAction.def
     454  Actions/SelectionAction/Atoms/NotAtomByOrderAction.def \
     455  Actions/SelectionAction/Atoms/PopAtomsAction.def \
     456  Actions/SelectionAction/Atoms/PushAtomsAction.def
    445457
    446458SELECTIONMOLECULEACTIONSOURCE = \
     
    458470  Actions/SelectionAction/Molecules/NotMoleculeByNameAction.cpp \
    459471  Actions/SelectionAction/Molecules/NotMoleculeByOrderAction.cpp \
    460   Actions/SelectionAction/Molecules/NotMoleculeOfAtomAction.cpp
     472  Actions/SelectionAction/Molecules/NotMoleculeOfAtomAction.cpp \
     473  Actions/SelectionAction/Molecules/PopMoleculesAction.cpp \
     474  Actions/SelectionAction/Molecules/PushMoleculesAction.cpp
    461475SELECTIONMOLECULEACTIONHEADER = \
    462476  Actions/SelectionAction/Molecules/AllMoleculesAction.hpp \
     
    473487  Actions/SelectionAction/Molecules/NotMoleculeByNameAction.hpp \
    474488  Actions/SelectionAction/Molecules/NotMoleculeByOrderAction.hpp \
    475   Actions/SelectionAction/Molecules/NotMoleculeOfAtomAction.hpp
     489  Actions/SelectionAction/Molecules/NotMoleculeOfAtomAction.hpp \
     490  Actions/SelectionAction/Molecules/PopMoleculesAction.hpp \
     491  Actions/SelectionAction/Molecules/PushMoleculesAction.hpp
    476492SELECTIONMOLECULEACTIONDEFS = \
    477493  Actions/SelectionAction/Molecules/AllMoleculesAction.def \
     
    488504  Actions/SelectionAction/Molecules/NotMoleculeByNameAction.def \
    489505  Actions/SelectionAction/Molecules/NotMoleculeByOrderAction.def \
    490   Actions/SelectionAction/Molecules/NotMoleculeOfAtomAction.def
     506  Actions/SelectionAction/Molecules/NotMoleculeOfAtomAction.def \
     507  Actions/SelectionAction/Molecules/PopMoleculesAction.def \
     508  Actions/SelectionAction/Molecules/PushMoleculesAction.def
    491509                 
    492510SELECTIONSHAPEACTIONSOURCE = \
  • src/Actions/SelectionAction/Atoms/NotAtomByIdAction.def

    r7b38d3 r0ac85c3  
    2626(STLVectorValidator< std::vector<atomId_t> >(AtomIdValidator()))
    2727
    28 
    2928#define statetypes (atomids_t)
    3029#define statereferences (undoatomids)
  • src/Actions/SelectionAction/Molecules/MoleculeByIdAction.cpp

    r7b38d3 r0ac85c3  
    5353/** =========== define the function ====================== */
    5454ActionState::ptr SelectionMoleculeByIdAction::performCall() {
    55   const molecule *mol = World::getInstance().getMolecule(MoleculeById(params.molindex.get()));
    56   if (mol != NULL) {
    57     if (!World::getInstance().isSelected(mol)) {
    58       LOG(1, "Selecting molecule " << mol->name);
    59       World::getInstance().selectAllMolecules(MoleculeById(params.molindex.get()));
    60       LOG(0, World::getInstance().countSelectedMolecules() << " molecules selected.");
    61       return ActionState::ptr(new SelectionMoleculeByIdState(params));
     55
     56  enum Sucess {
     57    NoStatus,
     58    AllMoleculesUnselected,
     59    MoleculesSelected,
     60    MoleculeMissing
     61  } status = NoStatus;
     62
     63  const molids_t molids = params.molids.get();
     64  molids_t undomolids;
     65  undomolids.reserve(molids.size());
     66  for (molids_t::const_iterator iter = molids.begin(); iter != molids.end(); ++iter) {
     67    const molecule *Walker = World::getInstance().getMolecule(MoleculeById(*iter));
     68    if (Walker != NULL) {
     69      if (!World::getInstance().isSelected(Walker)) {
     70        LOG(1, "Selecting mol " << Walker->getName());
     71        World::getInstance().selectMolecule(Walker);
     72        undomolids.push_back(*iter);
     73        if (status < MoleculeMissing)
     74          status = MoleculesSelected;
     75      } else {
     76        if (status == NoStatus)
     77          status = AllMoleculesUnselected;
     78      }
    6279    } else {
    63       return Action::success;
     80      status = MoleculeMissing;
    6481    }
    65   } else {
    66     STATUS("Cannot find molecule by given index "+toString(params.molindex.get())+".");
    67     return Action::failure;
    6882  }
     83  LOG(0, World::getInstance().countSelectedMolecules() << " mols selected.");
     84
     85  switch (status) {
     86    case MoleculeMissing:
     87      STATUS("Cannot find all mols with given ids.");
     88      return Action::failure;
     89      break;
     90    case AllMoleculesUnselected:
     91    case MoleculesSelected:
     92      return ActionState::ptr(new SelectionMoleculeByIdState(undomolids, params));
     93      break;
     94    default:
     95      STATUS("No mols have been selected.");
     96      return Action::failure;
     97      break;
     98  }
     99  return Action::failure;
    69100}
    70101
     
    72103  SelectionMoleculeByIdState *state = assert_cast<SelectionMoleculeByIdState*>(_state.get());
    73104
    74   World::getInstance().unselectAllMolecules(MoleculeById(state->params.molindex.get()));
     105  for (molids_t::const_iterator iter = state->undomolids.begin();
     106      iter != state->undomolids.end(); ++iter) {
     107    const molecule *Walker = World::getInstance().getMolecule(MoleculeById(*iter));
     108    World::getInstance().unselectMolecule(Walker);
     109  }
    75110
    76111  return ActionState::ptr(_state);
     
    80115  SelectionMoleculeByIdState *state = assert_cast<SelectionMoleculeByIdState*>(_state.get());
    81116
    82   World::getInstance().selectAllMolecules(MoleculeById(state->params.molindex.get()));
     117  for (molids_t::const_iterator iter = state->undomolids.begin();
     118      iter != state->undomolids.end(); ++iter) {
     119    const molecule *Walker = World::getInstance().getMolecule(MoleculeById(*iter));
     120    World::getInstance().selectMolecule(Walker);
     121  }
    83122
    84123  return ActionState::ptr(_state);
  • src/Actions/SelectionAction/Molecules/MoleculeByIdAction.def

    r7b38d3 r0ac85c3  
    77
    88// all includes and forward declarations necessary for non-integral types below
     9#include <vector>
    910#include "types.hpp"
    1011
     12typedef std::vector<moleculeId_t> molids_t;
     13
     14#include "Parameters/Validators/STLVectorValidator.hpp"
    1115#include "Parameters/Validators/Specific/MoleculeIdValidator.hpp"
    1216
     
    1418// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    1519// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    16 #define paramtypes (moleculeId_t)
     20#define paramtypes (molids_t)
    1721#define paramtokens ("select-molecule-by-id")
    18 #define paramdescriptions ("molecule index")
     22#define paramdescriptions ("molecule indices to select")
    1923#undef paramdefaults
    20 #define paramreferences (molindex)
     24#define paramreferences (molids)
    2125#define paramvalids \
    22 (MoleculeIdValidator())
     26(STLVectorValidator< std::vector<moleculeId_t> >(MoleculeIdValidator()))
    2327
    24 #undef statetypes
    25 #undef statereferences
     28#define statetypes (molids_t)
     29#define statereferences (undomolids)
    2630
    2731// some defines for all the names, you may use ACTION, STATE and PARAMS
  • src/Actions/SelectionAction/Molecules/NotMoleculeByIdAction.cpp

    r7b38d3 r0ac85c3  
    5353/** =========== define the function ====================== */
    5454ActionState::ptr SelectionNotMoleculeByIdAction::performCall() {
    55   const molecule *mol = World::getInstance().getMolecule(MoleculeById(params.molindex.get()));
    56   if (mol != NULL) {
    57     if (World::getInstance().isSelected(mol)) {
    58       LOG(1, "Unselecting molecule " << mol->name);
    59       World::getInstance().unselectAllMolecules(MoleculeById(params.molindex.get()));
    60       LOG(0, World::getInstance().countSelectedMolecules() << " molecules remain selected.");
    61       return ActionState::ptr(new SelectionNotMoleculeByIdState(params));
     55  enum Sucess {
     56    NoStatus,
     57    AllMoleculesSelected,
     58    MoleculesUnselected,
     59    MoleculeMissing
     60  } status = NoStatus;
     61
     62  const molids_t molids = params.molids.get();
     63  molids_t undomolids;
     64  undomolids.reserve(molids.size());
     65  for (molids_t::const_iterator iter = molids.begin(); iter != molids.end(); ++iter) {
     66    const molecule *Walker = World::getInstance().getMolecule(MoleculeById(*iter));
     67    if (Walker != NULL) {
     68      if (World::getInstance().isSelected(Walker)) {
     69        LOG(1, "Unselecting mol " << Walker->getName());
     70        World::getInstance().unselectMolecule(Walker);
     71        undomolids.push_back(*iter);
     72        if (status < MoleculeMissing)
     73          status = MoleculesUnselected;
     74      } else {
     75        if (status == NoStatus)
     76          status = AllMoleculesSelected;
     77      }
    6278    } else {
    63       return Action::success;
     79      status = MoleculeMissing;
    6480    }
    65   } else {
    66     STATUS("Cannot find molecule by given index "+toString(params.molindex.get())+".");
    67     return Action::failure;
    6881  }
     82  LOG(0, World::getInstance().countSelectedMolecules() << " mols remain selected.");
     83
     84  switch (status) {
     85    case MoleculeMissing:
     86      STATUS("Cannot find all mols by given ids.");
     87      return Action::failure;
     88      break;
     89    case AllMoleculesSelected:
     90    case MoleculesUnselected:
     91      return ActionState::ptr(new SelectionNotMoleculeByIdState(undomolids, params));
     92      break;
     93    default:
     94      STATUS("No mols have been selected.");
     95      return Action::failure;
     96      break;
     97  }
     98  return Action::failure;
    6999}
    70100
     
    72102  SelectionNotMoleculeByIdState *state = assert_cast<SelectionNotMoleculeByIdState*>(_state.get());
    73103
    74   World::getInstance().selectAllMolecules(MoleculeById(state->params.molindex.get()));
     104  for (molids_t::const_iterator iter = state->undomolids.begin();
     105      iter != state->undomolids.end(); ++iter) {
     106    const molecule *Walker = World::getInstance().getMolecule(MoleculeById(*iter));
     107    World::getInstance().selectMolecule(Walker);
     108  }
    75109
    76110  return ActionState::ptr(_state);
     
    80114  SelectionNotMoleculeByIdState *state = assert_cast<SelectionNotMoleculeByIdState*>(_state.get());
    81115
    82   World::getInstance().unselectAllMolecules(MoleculeById(state->params.molindex.get()));
     116  for (molids_t::const_iterator iter = state->undomolids.begin();
     117      iter != state->undomolids.end(); ++iter) {
     118    const molecule *Walker = World::getInstance().getMolecule(MoleculeById(*iter));
     119    World::getInstance().unselectMolecule(Walker);
     120  }
    83121
    84122  return ActionState::ptr(_state);
  • src/Actions/SelectionAction/Molecules/NotMoleculeByIdAction.def

    r7b38d3 r0ac85c3  
    77
    88// all includes and forward declarations necessary for non-integral types below
     9#include <vector>
    910#include "types.hpp"
    1011
     12typedef std::vector<moleculeId_t> molids_t;
     13
     14#include "Parameters/Validators/STLVectorValidator.hpp"
    1115#include "Parameters/Validators/Specific/MoleculeIdValidator.hpp"
    1216
     
    1418// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    1519// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    16 #define paramtypes (moleculeId_t)
     20#define paramtypes (molids_t)
    1721#define paramtokens ("unselect-molecule-by-id")
    18 #define paramdescriptions ("molecule index")
     22#define paramdescriptions ("molecule indices to unselect")
    1923#undef paramdefaults
    20 #define paramreferences (molindex)
     24#define paramreferences (molids)
    2125#define paramvalids \
    22 (MoleculeIdValidator())
     26(STLVectorValidator< std::vector<moleculeId_t> >(MoleculeIdValidator()))
    2327
    24 #undef statetypes
    25 #undef statereferences
     28#define statetypes (molids_t)
     29#define statereferences (undomolids)
    2630
    2731// some defines for all the names, you may use ACTION, STATE and PARAMS
  • src/Actions/UndoRedoHelpers.cpp

    r7b38d3 r0ac85c3  
    5252#include "WorldTime.hpp"
    5353
    54 bool MoleCuilder::AddAtomsFromAtomicInfo(std::vector<AtomicInfo> &atoms)
     54bool MoleCuilder::AddAtomsFromAtomicInfo(const std::vector<AtomicInfo> &atoms)
    5555{
    5656  size_t i=0;
     
    6969    for (size_t j=0;j<i;++j)
    7070      World::getInstance().destroyAtom(atoms[j].getId());
     71    // and announce the failure
     72    return false;
     73  }
     74  return true;
     75}
     76
     77bool MoleCuilder::AddMoleculesFromAtomicInfo(std::map< moleculeId_t, std::vector<AtomicInfo> > &mol_atoms)
     78{
     79  bool status = true;
     80  for (std::map< moleculeId_t, std::vector<AtomicInfo> >::const_iterator iter = mol_atoms.begin();
     81      iter != mol_atoms.end(); ++iter) {
     82    // re-create the atom
     83    LOG(3, "DEBUG: Re-adding molecule " << iter->first << ".");
     84    molecule *mol_Walker = World::getInstance().createMolecule();
     85
     86    // reset the mol id
     87    bool status = true;
     88    if (mol_Walker->getId() != iter->first)
     89      status &= mol_Walker->changeId(iter->first);
     90
     91    // add all its atoms
     92    status &= AddAtomsFromAtomicInfo(iter->second);
     93  }
     94  if (!status) {
     95    // remove all molecules again
     96    for (std::map< moleculeId_t, std::vector<AtomicInfo> >::const_iterator iter = mol_atoms.begin();
     97        iter != mol_atoms.end(); ++iter) {
     98      molecule * mol = World::getInstance().getMolecule(MoleculeById(iter->first));
     99      if (mol != NULL)
     100        removeAtomsinMolecule(mol);
     101    }
    71102    // and announce the failure
    72103    return false;
     
    173204  for (std::vector<moleculeId_t>::const_iterator iter = ids.begin();
    174205      iter != ids.end(); ++iter) {
    175     molecule * const mol = World::getInstance().getMolecule(MoleculeById(*iter));
     206    molecule * mol = World::getInstance().getMolecule(MoleculeById(*iter));
    176207    if (mol != NULL) {
    177       mol->removeAtomsinMolecule();
    178       World::getInstance().destroyMolecule(mol);
     208      removeAtomsinMolecule(mol);
     209      // molecules are automatically removed when empty
    179210    }
    180211  }
  • src/Actions/UndoRedoHelpers.hpp

    r7b38d3 r0ac85c3  
    2727   * @return restoral was successful, at least atom could not be restored.
    2828   */
    29   bool AddAtomsFromAtomicInfo(std::vector<AtomicInfo> &atoms);
     29  bool AddAtomsFromAtomicInfo(const std::vector<AtomicInfo> &atoms);
     30
     31  /** Adds removed molecules with their atoms back to the world.
     32   *
     33   * @param mol_atoms map of molecules with ids and their atoms as AtomicInfo
     34   * \return true - restoral was successful, at least one atom or molecule could not be restored
     35   */
     36  bool AddMoleculesFromAtomicInfo(std::map< moleculeId_t, std::vector<AtomicInfo> > &mol_atoms);
    3037
    3138  /** Removes atoms whose state information is stored as AtomicInfo.
  • src/Actions/WorldAction/RepeatBoxAction.cpp

    r7b38d3 r0ac85c3  
    147147      iter != allmolecules.end();
    148148      ++iter) {
    149     if (state->oldmolecules.find(*iter) == state->oldmolecules.end()) {
    150       (*iter)->removeAtomsinMolecule();
    151       // TODO: Remove this when World don't has deprecated MoleculeListClass anymore
    152       molecules->erase(*iter);
    153       World::getInstance().destroyMolecule(*iter);
    154     }
     149    if (state->oldmolecules.find(*iter) == state->oldmolecules.end())
     150      removeAtomsinMolecule(*iter);
    155151  }
    156152
  • src/Atom/atom.cpp

    r7b38d3 r0ac85c3  
    270270  removeFromMolecule();
    271271  mol = _mol;
    272   if ((mol) && (!mol->containsAtom(this)))
     272  if ((mol) && (!mol->containsAtom(this))) {
     273    signOn(mol, AtomObservable::PositionChanged);
    273274    mol->insert(this);
     275  }
    274276}
    275277
     
    279281  ASSERT(!mol->containsAtom(this),
    280282      "atom::unsetMolecule() - old molecule "+toString(mol)+" still contains us!");
     283  signOff(mol, AtomObservable::PositionChanged);
    281284  mol = NULL;
    282285}
     
    289292  if(mol){
    290293    if(mol->containsAtom(this)){
     294      signOff(mol, AtomObservable::PositionChanged);
    291295      mol->erase(this);
    292296    }
  • src/Fragmentation/Exporters/ExportGraph.cpp

    r7b38d3 r0ac85c3  
    8080    // remove copied atoms and molecule again
    8181    molecule *mol = *iter;
    82     mol->removeAtomsinMolecule();
    83     World::getInstance().destroyMolecule(mol);
    8482    BondFragments.ListOfMolecules.erase(iter);
     83    removeAtomsinMolecule(mol);
    8584  }
    8685}
  • src/Graph/DepthFirstSearchAnalysis.cpp

    r7b38d3 r0ac85c3  
    431431      World::getInstance().getMoleculeIter() != World::getInstance().moleculeEnd();
    432432      iter = World::getInstance().getMoleculeIter()) {
     433    // TODO: remove when deprecated MoleculeListClass is gone
    433434    World::getInstance().getMolecules()->erase(*iter);
    434435    World::getInstance().destroyMolecule(*iter);
  • src/Graph/unittests/AdjacencyListUnitTest.cpp

    r7b38d3 r0ac85c3  
    153153
    154154  // destroy molecule and contained atoms
    155   TestMolecule->removeAtomsinMolecule();
    156   World::getInstance().destroyMolecule(TestMolecule);
     155  removeAtomsinMolecule(TestMolecule);
    157156  // destroy World
    158157  World::purgeInstance();
  • src/MoleculeLeafClass.cpp

    r7b38d3 r0ac85c3  
    8585  //  }
    8686  // remove the leaf itself
    87   if (Leaf != NULL) {
    88     Leaf->removeAtomsinMolecule();
    89     World::getInstance().destroyMolecule(Leaf);
    90     Leaf = NULL;
    91   }
     87  if (Leaf != NULL)
     88    removeAtomsinMolecule(Leaf);
    9289  // remove this Leaf from level list
    9390  if (previous != NULL)
  • src/UIElements/CommandLineUI/CommandLineParser.cpp

    r7b38d3 r0ac85c3  
    443443    // force action queue to stop thread
    444444    ActionQueue::getInstance().stop();
     445    ActionQueue::getInstance().clearTempQueue();
    445446#endif
    446447    ActionQueue::getInstance().clearQueue();
  • src/UIElements/Qt4/QtMainWindow.cpp

    r7b38d3 r0ac85c3  
    146146  settings.endGroup();
    147147
    148   connect(glWorldView,SIGNAL(hoverChanged(const atom*)), infoBox,SLOT(atomHover(const atom*)));
     148  qRegisterMetaType<moleculeId_t>("moleculeId_t");
     149
     150  connect(glWorldView,SIGNAL(hoverChanged(const atom&)), infoBox,SLOT(atomHover(const atom&)));
     151  connect(glWorldView,SIGNAL(hoverChanged(const molecule&, int)), infoBox,SLOT(moleculeHover(const molecule&)));
     152  connect(moleculeList,SIGNAL(moleculesVisibilityChanged(const moleculeId_t,bool)), glWorldView, SIGNAL(moleculesVisibilityChanged(const moleculeId_t,bool)));
    149153}
    150154
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.cpp

    r7b38d3 r0ac85c3  
    6262QGLMaterial *GLMoleculeObject::m_selectionBoxMaterial = NULL;
    6363
     64QGLSceneNode *GLMoleculeObject::meshEmpty[GLMoleculeObject::DETAILTYPES_MAX];
     65QGLSceneNode *GLMoleculeObject::meshSphere[GLMoleculeObject::DETAILTYPES_MAX];
     66QGLSceneNode *GLMoleculeObject::meshCylinder[GLMoleculeObject::DETAILTYPES_MAX];
    6467
    6568double GLMoleculeObject::detailMinDistance[GLMoleculeObject::DETAILTYPES_MAX] = {0, 15, 30, 42};
     
    6972{
    7073   //mesh->setParent(this);
    71    for (int i=0;i<DETAILTYPES_MAX;i++)
    72      m_mesh[i] = mesh[i];
     74  for (int i=0;i<DETAILTYPES_MAX;i++)
     75    m_mesh[i] = mesh[i];
     76  MeshFreeType = free_none;
     77   m_scaleX = 1.0f;
     78   m_scaleY = 1.0f;
     79   m_scaleZ = 1.0f;
     80   m_rotationAngle = 0.0f;
     81   m_effect = 0;
     82   m_objectId = -1;
     83   m_hovering = false;
     84   m_selected = false;
     85   m_visible = true;
     86   m_material = 0;
     87   initStaticMaterials();
     88}
     89
     90GLMoleculeObject::GLMoleculeObject(QGLSceneNode *mesh, QObject *parent)
     91   : QObject(parent)
     92{
     93   //mesh->setParent(this);
     94  for (int i=0;i<DETAILTYPES_MAX;i++)
     95    m_mesh[i] = mesh;
     96  MeshFreeType = free_none;
    7397   m_scaleX = 1.0f;
    7498   m_scaleY = 1.0f;
     
    83107}
    84108
    85 GLMoleculeObject::GLMoleculeObject(QGLSceneNode *mesh, QObject *parent)
     109GLMoleculeObject::GLMoleculeObject(QGLAbstractScene *scene, QObject *parent)
    86110   : QObject(parent)
    87111{
    88    //mesh->setParent(this);
    89    for (int i=0;i<DETAILTYPES_MAX;i++)
    90      m_mesh[i] = mesh;
     112  for (int i=0;i<DETAILTYPES_MAX;i++)
     113    m_mesh[i] = scene->mainNode();
     114  MeshFreeType = free_none;
    91115   m_scaleX = 1.0f;
    92116   m_scaleY = 1.0f;
     
    101125}
    102126
    103 GLMoleculeObject::GLMoleculeObject(QGLAbstractScene *scene, QObject *parent)
    104    : QObject(parent)
    105 {
    106    scene->setParent(this);
    107    for (int i=0;i<DETAILTYPES_MAX;i++)
    108      m_mesh[i] = scene->mainNode();
    109    m_scaleX = 1.0f;
    110    m_scaleY = 1.0f;
    111    m_scaleZ = 1.0f;
    112    m_rotationAngle = 0.0f;
    113    m_effect = 0;
    114    m_objectId = -1;
    115    m_hovering = false;
    116    m_selected = false;
    117    m_material = 0;
    118    initStaticMaterials();
    119 }
    120 
    121127GLMoleculeObject::~GLMoleculeObject()
    122128{
     
    163169   painter->modelViewMatrix().push();
    164170   painter->modelViewMatrix().translate(m_position);
     171   if ((m_scaleX != 1.0f) || (m_scaleY != 1.0f) || (m_scaleZ != 1.0f))
     172     painter->modelViewMatrix().scale(m_scaleX, m_scaleY, m_scaleZ);
    165173   if (m_rotationAngle != 0.0f)
    166174     painter->modelViewMatrix().rotate(m_rotationAngle, m_rotationVector);
    167    painter->modelViewMatrix().scale(m_scaleX, m_scaleY, m_scaleZ);
    168175
    169176   // Apply the material and effect to the painter.
     
    325332  }
    326333}
     334
     335void GLMoleculeObject::setVisible(bool value)
     336{
     337  if (value != m_visible){
     338    m_visible = value;
     339    emit changed();
     340  }
     341}
     342
     343void GLMoleculeObject::updateMesh(QGLSceneNode *mesh)
     344{
     345  if (m_mesh[0] != NULL) {
     346    switch(MeshFreeType) {
     347    case free_all:
     348      for (int i=0;i<DETAILTYPES_MAX;i++)
     349        delete m_mesh[i];
     350      break;
     351    case free_single:
     352      delete m_mesh[0];
     353      break;
     354    default:
     355    case free_none:
     356      break;
     357    }
     358  }
     359  MeshFreeType = free_single;
     360  for (int i=0;i<DETAILTYPES_MAX;i++)
     361    m_mesh[i] = mesh;
     362}
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject.hpp

    r7b38d3 r0ac85c3  
    7474   void setSelected(bool value);
    7575
     76   bool visible() const { return m_visible; }
     77   virtual void setVisible(bool value);
     78
    7679   void initStaticMaterials();
    77    void initialize(QGLView *view, QGLPainter *painter);
     80   virtual void initialize(QGLView *view, QGLPainter *painter);
    7881   virtual void draw(QGLPainter *painter, const QVector4D &cameraPlane);
    7982   void drawSelectionBox(QGLPainter *painter);
     
    9497   static void cleanMaterialMap();
    9598
     99   void updateMesh(QGLSceneNode *scene);
     100
    96101   typedef std::map< size_t, QGLMaterial *> ElementMaterialMap;
    97102   static ElementMaterialMap ElementNoMaterialMap;
     
    100105   enum{DETAIL_HIGHEST, DETAIL_HIGH, DETAIL_MEDIUM, DETAIL_LOW, DETAILTYPES_MAX} DetailType;
    101106
     107   static QGLSceneNode *meshEmpty[DETAILTYPES_MAX];
     108   static QGLSceneNode *meshSphere[DETAILTYPES_MAX];
     109   static QGLSceneNode *meshCylinder[DETAILTYPES_MAX];
     110
    102111protected:
    103112
     
    105114
    106115   QGLSceneNode *m_mesh[DETAILTYPES_MAX];
     116   enum enum_MeshFreeType {
     117     free_all,
     118     free_single,
     119     free_none
     120   } MeshFreeType;
    107121   QGLAbstractScene *m_scene;
    108122   QVector3D m_position;
     
    120134   bool m_hovering;
    121135   bool m_selected;
     136   bool m_visible;
    122137};
    123138
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp

    r7b38d3 r0ac85c3  
    5656  GLMoleculeObject(mesh, parent),
    5757  Observer(std::string("GLMoleculeObject_atom")+toString(_id)),
    58   atomicid(_id)
     58  atomicid(_id),
     59  uptodatePosition(false),
     60  uptodateElement(false)
    5961{
    6062  // sign on as observer (obtain non-const instance before)
     
    108110    ELOG(2, "Atom with id "+toString(atomicid)+" is already gone.");
    109111  }
     112  uptodatePosition = true;
    110113}
    111114
     
    141144  }
    142145  setScale( radius / 4. );
     146
     147  uptodateElement = true;
    143148}
    144149
     
    165170  // selected?
    166171  setSelected(World::getInstance().isAtomSelected(atomicid));
     172}
     173
     174void GLMoleculeObject_atom::draw(QGLPainter *painter, const QVector4D &cameraPlane)
     175{
     176  // hook to update prior to painting
     177  if (!uptodatePosition)
     178    resetPosition();
     179  if (!uptodateElement)
     180    resetElement();
     181
     182  // call old hook to do the actual paining
     183  GLMoleculeObject::draw(painter, cameraPlane);
    167184}
    168185
     
    185202    switch (notification->getChannelNo()) {
    186203      case AtomObservable::ElementChanged:
    187         resetElement();
    188         emit changed();
     204        uptodateElement = false;
    189205        break;
    190206      case AtomObservable::IndexChanged:
     
    192208        break;
    193209      case AtomObservable::PositionChanged:
    194         resetPosition();
    195         emit changed();
     210        uptodatePosition = false;
    196211        break;
    197212      case AtomObservable::BondsAdded:
     
    199214        const atom *_atom = World::getInstance().getAtom(AtomById(atomicid));
    200215        if (_atom != NULL) {
     216          // make sure position is up-to-date
     217          if (!uptodatePosition)
     218            resetPosition();
    201219          ASSERT(!_atom->getListOfBonds().empty(),
    202220              "GLMoleculeObject_atom::recieveNotification() - received BondsAdded but ListOfBonds is empty.");
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp

    r7b38d3 r0ac85c3  
    3131  virtual ~GLMoleculeObject_atom();
    3232
     33  void draw(QGLPainter *painter, const QVector4D &cameraPlane);
     34
    3335  // Observer functions
    3436  void update(Observable *publisher);
     
    4547
    4648private:
    47   //!> grant GLWorldScene acess to reset functions
    48   friend class GLWorldScene;
     49  //!> grant GLMoleculeObject_molecule acess to reset functions
     50  friend class GLMoleculeObject_molecule;
    4951
    5052  void resetPosition();
     
    5658
    5759  const atomId_t atomicid;
     60
     61  bool uptodatePosition;
     62  bool uptodateElement;
    5863};
    5964
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp

    r7b38d3 r0ac85c3  
    4343
    4444private:
    45   //!> grant WorldScene access to reset functions
    46   friend class GLWorldScene;
     45  //!> grant GLMoleculeObject_molecule acess to reset functions
     46  friend class GLMoleculeObject_molecule;
    4747
    4848  /** Recalculates the position of the cylinder representing the bond.
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp

    r7b38d3 r0ac85c3  
    4141
    4242#include <Qt3D/qglscenenode.h>
     43#include <Qt3D/qglbuilder.h>
    4344
    4445#include "CodePatterns/MemDebug.hpp"
     
    5455#include "Element/element.hpp"
    5556#include "LinearAlgebra/Vector.hpp"
     57#include "LinkedCell/PointCloudAdaptor.hpp"
     58#include "LinkedCell/linkedcell.hpp"
     59#include "Tesselation/tesselation.hpp"
     60#include "Tesselation/BoundaryLineSet.hpp"
     61#include "Tesselation/BoundaryTriangleSet.hpp"
     62#include "Tesselation/CandidateForTesselation.hpp"
     63#include "Atom/TesselPoint.hpp"
    5664#include "World.hpp"
    5765
    58 GLMoleculeObject_molecule::GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const molecule *molref) :
    59   GLMoleculeObject(mesh, parent),
     66#include "GLMoleculeObject_atom.hpp"
     67
     68static QGLSceneNode *createMoleculeMesh(const molecule *molref, QObject *parent)
     69{
     70//  Shape shape = molref->getBoundingSphere();
     71  double minradius = 2.; // TODO: set to maximum bond length value
     72  LOG(3, "DEBUG: Molecule fits into sphere of radius " << minradius);
     73  if (minradius < 1.)
     74    minradius = 1.;
     75
     76  QGeometryData geo;
     77  // we need at least three points for tesselation
     78  if (molref->getAtomCount() >= 3) {
     79    // Tesselate the points.
     80    Tesselation T;
     81    PointCloudAdaptor<molecule> cloud(const_cast<molecule *>(molref), molref->getName());
     82    T(cloud, minradius);
     83
     84    // Fill the points into a Qt geometry.
     85    LinkedCell_deprecated LinkedList(cloud, minradius);
     86    std::map<int, int> indices;
     87    std::map<int, Vector> normals;
     88    int index = 0;
     89    for (PointMap::const_iterator piter = T.PointsOnBoundary.begin();
     90        piter != T.PointsOnBoundary.end(); ++piter) {
     91      const Vector &point = piter->second->getPosition();
     92      // add data to the primitive
     93      geo.appendVertex(QVector3D(point[0], point[1], point[2]));
     94      Vector normalvector;
     95      for (LineMap::const_iterator lineiter = piter->second->lines.begin();
     96          lineiter != piter->second->lines.end(); ++lineiter)
     97        for (TriangleMap::const_iterator triangleiter = lineiter->second->triangles.begin();
     98            triangleiter != lineiter->second->triangles.end(); ++triangleiter)
     99          normalvector +=
     100              triangleiter->second->NormalVector;
     101      normalvector.Normalize();
     102      geo.appendNormal(QVector3D(normalvector[0], normalvector[1], normalvector[2]));
     103      geo.appendColor(QColor(1, 1, 1, 1));
     104      geo.appendTexCoord(QVector2D(0, 0));
     105      indices.insert( std::make_pair( piter->second->getNr(), index++));
     106    }
     107
     108    // Fill the tesselated triangles into the geometry.
     109    for (TriangleMap::const_iterator runner = T.TrianglesOnBoundary.begin();
     110        runner != T.TrianglesOnBoundary.end(); runner++) {
     111      int v[3];
     112      for (size_t i=0; i<3; ++i)
     113        v[i] = runner->second->endpoints[i]->getNr();
     114
     115      // Sort the vertices so the triangle is clockwise (relative to the normal vector).
     116      Vector cross = T.PointsOnBoundary[v[1]]->getPosition() - T.PointsOnBoundary[v[0]]->getPosition();
     117      cross.VectorProduct(T.PointsOnBoundary[v[2]]->getPosition() - T.PointsOnBoundary[v[0]]->getPosition());
     118      if (cross.ScalarProduct(runner->second->NormalVector) > 0)
     119        geo.appendIndices(indices[v[0]], indices[v[1]], indices[v[2]]);
     120      else
     121        geo.appendIndices(indices[v[0]], indices[v[2]], indices[v[1]]);
     122    }
     123  }
     124
     125  // Build a mesh from the geometry.
     126  QGLBuilder builder;
     127  builder.addTriangles(geo);
     128  QGLSceneNode *mesh = builder.finalizedSceneNode();
     129  return mesh;
     130}
     131
     132GLMoleculeObject_molecule::GLMoleculeObject_molecule(QObject *parent, const molecule *molref) :
     133  GLMoleculeObject(createMoleculeMesh(molref, parent), parent),
    60134  Observer(std::string("GLMoleculeObject_molecule")+toString(molref->getId())),
    61   _molecule(molref)
     135  isBoundingBoxUptodate(true),
     136  isSignedOn(false),
     137  _molecule(molref),
     138  TesselationHullUptodate(true),
     139  hoverAtom(NULL)
    62140{
    63141  // sign on as observer (obtain non-const instance before)
     142  _molecule->signOn(this, molecule::AtomInserted);
     143  _molecule->signOn(this, molecule::AtomRemoved);
     144  _molecule->signOn(this, molecule::AtomMoved);
     145  isSignedOn = true;
    64146  /*molref->signOn(this, AtomObservable::IndexChanged);
    65147  molref->signOn(this, AtomObservable::PositionChanged);
     
    69151  World::getInstance().signOn(this, World::SelectionChanged);
    70152  updateBoundingBox();
     153
     154  // initially, atoms and bonds should be visible
     155  m_visible = false;
     156
     157  init();
     158
     159  connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
     160  connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
     161
     162  connect( this, SIGNAL(clicked()), this, SLOT(wasClicked()));
     163}
     164
     165GLMoleculeObject_molecule::GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const molecule *molref) :
     166  GLMoleculeObject(mesh, parent),
     167  Observer(std::string("GLMoleculeObject_molecule")+toString(molref->getId())),
     168  isBoundingBoxUptodate(true),
     169  isSignedOn(false),
     170  _molecule(molref),
     171  TesselationHullUptodate(true),
     172  hoverAtom(NULL)
     173{
     174  // sign on as observer (obtain non-const instance before)
     175  _molecule->signOn(this, molecule::AtomInserted);
     176  _molecule->signOn(this, molecule::AtomRemoved);
     177  _molecule->signOn(this, molecule::AtomMoved);
     178  isSignedOn = true;
     179  /*molref->signOn(this, AtomObservable::IndexChanged);
     180  molref->signOn(this, AtomObservable::PositionChanged);
     181  molref->signOn(this, AtomObservable::ElementChanged);
     182  molref->signOn(this, AtomObservable::BondsAdded);*/
     183  setMaterial(getMaterial(1));
     184  World::getInstance().signOn(this, World::SelectionChanged);
     185  updateBoundingBox();
     186
     187  // initially, atoms and bonds should be visible
     188  m_visible = false;
     189
     190  init();
     191
     192  connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
     193  connect (this, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
     194
     195  connect( this, SIGNAL(clicked()), this, SLOT(wasClicked()));
    71196}
    72197
    73198GLMoleculeObject_molecule::~GLMoleculeObject_molecule()
    74199{
     200  if (isSignedOn) {
     201    _molecule->signOff(this, molecule::AtomInserted);
     202    _molecule->signOff(this, molecule::AtomRemoved);
     203    _molecule->signOff(this, molecule::AtomMoved);
     204  }
    75205  /*_atom->signOff(this, AtomObservable::IndexChanged);
    76206  _atom->signOff(this, AtomObservable::PositionChanged);
     
    80210}
    81211
     212/** Initialise the WorldScene with molecules and atoms from World.
     213 *
     214 */
     215void GLMoleculeObject_molecule::init()
     216{
     217  if (_molecule->begin() != _molecule->end()) {
     218    int atomicid = -1;
     219    for (molecule::const_iterator atomiter = _molecule->begin();
     220        atomiter != _molecule->end();
     221        atomiter++) {
     222      // create atom objects in scene
     223      atomicid = (*atomiter)->getId();
     224      atomInserted(atomicid);
     225
     226      // create bond objects in scene
     227      const BondList &bondlist = (*atomiter)->getListOfBonds();
     228      for (BondList::const_iterator bonditer = bondlist.begin();
     229          bonditer != bondlist.end();
     230          ++bonditer) {
     231        const bond::ptr _bond = *bonditer;
     232        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
     233            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     234        bondInserted(_bond, side);
     235      }
     236    }
     237    // set id to one of the atom's as either mol or atoms is present at the same time
     238    setObjectId(atomicid);
     239  }
     240}
     241
     242void GLMoleculeObject_molecule::addAtomBonds(
     243    const bond::ptr &_bond,
     244    const GLMoleculeObject_bond::SideOfBond _side
     245    )
     246{
     247  bool bond_present = false;
     248  const BondIds ids = getBondIds(_bond, _side);
     249  // check whether bond is not present already
     250  bond_present = BondsinSceneMap.count(ids);
     251  if (!bond_present)
     252    bondInserted(_bond, _side);
     253  else {
     254    BondsinSceneMap[ids]->resetPosition();
     255    BondsinSceneMap[ids]->resetWidth();
     256  }
     257}
     258
     259void GLMoleculeObject_molecule::addAtomBonds(
     260    const atom *_atom)
     261{
     262  const bool atom_present = AtomsinSceneMap.count(_atom->getId());
     263  const BondList &bondlist = _atom->getListOfBonds();
     264  for (BondList::const_iterator bonditer = bondlist.begin();
     265      (bonditer != bondlist.end()) && atom_present;
     266      ++bonditer) {
     267    const bond::ptr _bond = *bonditer;
     268    // check if OtherAtom's sphere is already present
     269    const atom *OtherAtom = _bond->GetOtherAtom(_atom);
     270    const bool otheratom_present = AtomsinSceneMap.count(OtherAtom->getId());
     271    if (otheratom_present && atom_present) {
     272      const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == _atom) ?
     273          GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     274      const GLMoleculeObject_bond::SideOfBond otherside = (_bond->leftatom == _atom) ?
     275          GLMoleculeObject_bond::right : GLMoleculeObject_bond::left;
     276      addAtomBonds(_bond, side);
     277      addAtomBonds(_bond, otherside);
     278    }
     279  }
     280}
     281
     282void GLMoleculeObject_molecule::reinit()
     283{
     284  if (_molecule->getAtomCount() > 0) {
     285    for (molecule::const_iterator atomiter = _molecule->begin();
     286        atomiter != _molecule->end();
     287        atomiter++) {
     288      // check whether atom already exists
     289      const atomId_t atomid = (*atomiter)->getId();
     290      const bool atom_present = AtomsinSceneMap.count(atomid);
     291      if (!atom_present)
     292        atomInserted((*atomiter)->getId());
     293      else
     294        AtomsinSceneMap[atomid]->resetPosition();
     295
     296
     297      // create bond objects in scene
     298      addAtomBonds(*atomiter);
     299    }
     300  }
     301}
     302
    82303void GLMoleculeObject_molecule::updateBoundingBox()
    83304{
     305  isBoundingBoxUptodate = true;
    84306  Shape shape = _molecule->getBoundingSphere();
    85307  Vector v = shape.getCenter();
     
    97319
    98320void GLMoleculeObject_molecule::subjectKilled(Observable *publisher)
    99 {}
     321{
     322  isSignedOn = false;
     323}
    100324
    101325void GLMoleculeObject_molecule::recieveNotification(Observable *publisher, Notification_ptr notification)
     
    108332          << notification->getChannelNo() << ".";
    109333#endif
     334    switch (notification->getChannelNo()) {
     335      case molecule::AtomInserted:
     336      {
     337        const atomId_t _id = _molecule->lastChanged()->getId();
     338  #ifdef LOG_OBSERVER
     339        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
     340  #endif
     341        TesselationHullUptodate = false;
     342        isBoundingBoxUptodate = false;
     343        atomInserted(_id);
     344        break;
     345      }
     346      case World::AtomRemoved:
     347      {
     348        const atomId_t _id = _molecule->lastChanged()->getId();
     349  #ifdef LOG_OBSERVER
     350        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been removed.";
     351  #endif
     352        TesselationHullUptodate = false;
     353        isBoundingBoxUptodate = false;
     354        atomRemoved(_id);
     355        break;
     356      }
     357      case molecule::AtomMoved:
     358      {
     359  #ifdef LOG_OBSERVER
     360        const atomId_t _id = _molecule->lastChanged()->getId();
     361        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
     362  #endif
     363        TesselationHullUptodate = false;
     364        isBoundingBoxUptodate = false;
     365        break;
     366      }
     367      default:
     368        break;
     369    }
    110370  }else{
    111371    // notification from world
     
    125385}
    126386
     387void GLMoleculeObject_molecule::initialize(QGLView *view, QGLPainter *painter)
     388{
     389  // Initialize all of the mesh objects that we have as children.
     390  if (m_visible) {
     391    GLMoleculeObject::initialize(view, painter);
     392  } else {
     393   foreach (QObject *obj, children()) {
     394     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
     395       if (meshobj)
     396         meshobj->initialize(view, painter);
     397   }
     398  }
     399}
     400
     401void GLMoleculeObject_molecule::draw(QGLPainter *painter, const QVector4D &cameraPlane)
     402{
     403  // draw either molecule's mesh or all atoms and bonds
     404  if (m_visible) {
     405    updateTesselationHull();
     406
     407    painter->modelViewMatrix().push();
     408
     409    // Apply the material and effect to the painter.
     410    QGLMaterial *material;
     411    if (m_hovering)
     412        material = m_hoverMaterial;
     413    else if (m_selected)
     414        material = m_selectionMaterial;
     415    else
     416        material = m_material;
     417
     418    ASSERT(material, "GLMoleculeObject::draw: chosen material is NULL");
     419
     420    painter->setColor(material->diffuseColor());
     421    painter->setFaceMaterial(QGL::AllFaces, material);
     422    if (m_effect)
     423        painter->setUserEffect(m_effect);
     424    else
     425        painter->setStandardEffect(QGL::LitMaterial);
     426
     427    // Mark the object for object picking purposes.
     428    int prevObjectId = painter->objectPickId();
     429    if (m_objectId != -1)
     430        painter->setObjectPickId(m_objectId);
     431
     432    m_mesh[0]->draw(painter);
     433
     434    // Turn off the user effect, if present.
     435    if (m_effect)
     436        painter->setStandardEffect(QGL::LitMaterial);
     437
     438    // Revert to the previous object identifier.
     439    painter->setObjectPickId(prevObjectId);
     440
     441    // Restore the modelview matrix.
     442    painter->modelViewMatrix().pop();
     443
     444    //    GLMoleculeObject::draw(painter, cameraPlane);
     445  } else {
     446    // Draw all of the mesh objects that we have as children.
     447    foreach (QObject *obj, children()) {
     448      GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
     449      if (meshobj)
     450        meshobj->draw(painter, cameraPlane);
     451    }
     452
     453    // update bounding box prior to selection
     454    if (!isBoundingBoxUptodate)
     455      updateBoundingBox();
     456
     457    painter->modelViewMatrix().push();
     458    painter->modelViewMatrix().translate(m_position);
     459    if ((m_scaleX != 1.0f) || (m_scaleY != 1.0f) || (m_scaleZ != 1.0f))
     460      painter->modelViewMatrix().scale(m_scaleX, m_scaleY, m_scaleZ);
     461    if (m_rotationAngle != 0.0f)
     462      painter->modelViewMatrix().rotate(m_rotationAngle, m_rotationVector);
     463
     464    // Draw a box around the mesh, if selected.
     465    if (m_selected)
     466      drawSelectionBox(painter);
     467
     468    // Restore the modelview matrix.
     469    painter->modelViewMatrix().pop();
     470  }
     471}
     472
     473/** Adds an atom of this molecule to the scene.
     474 *
     475 * @param _atom atom to add
     476 */
     477void GLMoleculeObject_molecule::atomInserted(const atomicNumber_t _id)
     478{
     479  LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
     480  GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(GLMoleculeObject::meshSphere, this, _id);
     481  AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
     482  ASSERT(iter == AtomsinSceneMap.end(),
     483      "GLWorldScene::atomAdded() - same atom with id "+toString(_id)+" added again.");
     484  AtomsinSceneMap.insert( make_pair(_id, atomObject) );
     485
     486  qRegisterMetaType<atomId_t>("atomId_t");
     487  qRegisterMetaType<bond::ptr>("bond::ptr");
     488  qRegisterMetaType<GLMoleculeObject_bond::SideOfBond>("GLMoleculeObject_bond::SideOfBond");
     489  connect (atomObject, SIGNAL(clicked(atomId_t)), this, SIGNAL(atomClicked(atomId_t)));
     490  connect (atomObject, SIGNAL(changed()), this, SIGNAL(changed()));
     491  connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
     492  connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
     493  connect (atomObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     494  connect (atomObject, SIGNAL(BondsInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)));
     495  connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, int, int)), this, SIGNAL(changeAtomId(GLMoleculeObject_atom*, int, int)));
     496
     497  isBoundingBoxUptodate = false;
     498
     499  if (m_objectId  == -1)
     500    setObjectId(_id);
     501
     502  // add all bonds
     503  const atom *Walker = World::getInstance().getAtom(AtomById(_id));
     504  addAtomBonds(Walker);
     505
     506  emit changeOccured();
     507}
     508
     509/** Removes an atom of this molecule from the scene.
     510 *
     511 * We just the id as the atom might have already been destroyed.
     512 *
     513 * @param _id id of atom to remove
     514 */
     515void GLMoleculeObject_molecule::atomRemoved(const atomicNumber_t _id)
     516{
     517  LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");
     518  // bonds are removed by signal coming from ~bond
     519
     520  if (m_objectId == _id)
     521    setObjectId(-1);
     522
     523  // remove atoms
     524  AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
     525  ASSERT(iter != AtomsinSceneMap.end(),
     526      "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display.");
     527  GLMoleculeObject_atom *atomObject = iter->second;
     528  atomObject->disconnect();
     529  AtomsinSceneMap.erase(iter);
     530  delete atomObject;
     531
     532  isBoundingBoxUptodate = false;
     533
     534  emit changeOccured();
     535}
     536
     537void GLMoleculeObject_molecule::hoverChangedSignalled(GLMoleculeObject *ob)
     538{
     539  // Find the atom, ob corresponds to.
     540  hoverAtom = NULL;
     541  GLMoleculeObject_atom *atomObject = dynamic_cast<GLMoleculeObject_atom *>(ob);
     542  if (atomObject){
     543    for (AtomNodeMap::iterator iter = AtomsinSceneMap.begin();iter != AtomsinSceneMap.end(); ++ iter){
     544      if (iter->second == atomObject)
     545        hoverAtom = World::getInstance().getAtom(AtomById(iter->first));
     546    }
     547
     548    // Propagate signal.
     549    emit hoverChanged(*hoverAtom);
     550  } else {
     551    // Find the atom, ob corresponds to.
     552    GLMoleculeObject_molecule *moleculeObject = dynamic_cast<GLMoleculeObject_molecule *>(ob);
     553    if (moleculeObject == this){
     554      // Propagate signal.
     555      emit hoverChanged(*_molecule, 0);
     556    }
     557  }
     558}
     559
     560
     561/** Helper function to get bond ids in the correct order for BondNodeMap.
     562 *
     563 * \return pair of ids in correct order.
     564 */
     565GLMoleculeObject_molecule::BondIds GLMoleculeObject_molecule::getBondIds(
     566    const bond::ptr _bond,
     567    const enum GLMoleculeObject_bond::SideOfBond _side)
     568{
     569  BondIds ids;
     570  switch (_side) {
     571    case GLMoleculeObject_bond::left:
     572      ids = std::make_pair(_bond->leftatom->getId(), _bond->rightatom->getId());
     573      break;
     574    case GLMoleculeObject_bond::right:
     575      ids = std::make_pair(_bond->rightatom->getId(), _bond->leftatom->getId());
     576      break;
     577  }
     578  return ids;
     579}
     580
     581/** Adds a bond to the scene.
     582 *
     583 * @param _bond bond to add
     584 * @param side which side of the bond (left or right)
     585 */
     586void GLMoleculeObject_molecule::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
     587{
     588  LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
     589  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
     590
     591  const BondIds ids = getBondIds(_bond, _side);
     592  BondNodeMap::iterator iter = BondsinSceneMap.find(ids);
     593  if (iter == BondsinSceneMap.end()) {
     594    GLMoleculeObject_bond * bondObject =
     595        new GLMoleculeObject_bond(GLMoleculeObject::meshCylinder, this, _bond, _side);
     596    connect (
     597        bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
     598        this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
     599    connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
     600    BondsinSceneMap.insert( make_pair(ids, bondObject) );
     601  //    BondIdsinSceneMap.insert( Leftids );
     602  } else {
     603    iter->second->resetPosition();
     604    iter->second->resetWidth();
     605  }
     606  emit changeOccured();
     607}
     608
     609/** Removes a bond from the scene.
     610 *
     611 * @param _bond bond to remove
     612 */
     613void GLMoleculeObject_molecule::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
     614{
     615  LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+".");
     616  {
     617    // left bond
     618    const BondIds Leftids( make_pair(leftnr, rightnr) );
     619    BondNodeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
     620    ASSERT(leftiter != BondsinSceneMap.end(),
     621        "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
     622        +toString(rightnr)+" not on display.");
     623    GLMoleculeObject_bond *bondObject = leftiter->second;
     624    bondObject->disconnect();
     625    BondsinSceneMap.erase(leftiter);
     626    delete bondObject; // is done by signal from bond itself
     627    //LOG(4, "INFO: Still present bonds " << BondsinSceneMap << ".");
     628  }
     629
     630  emit changeOccured();
     631}
     632
     633void GLMoleculeObject_molecule::setVisible(bool value)
     634{
     635  // first update the mesh if we are going to be visible now
     636  if (value)
     637    updateTesselationHull();
     638  // then emit onward
     639  GLMoleculeObject::setVisible(value);
     640}
     641
     642void GLMoleculeObject_molecule::updateTesselationHull()
     643{
     644  if (!TesselationHullUptodate) {
     645    updateMesh(createMoleculeMesh(_molecule, parent()));
     646    TesselationHullUptodate = true;
     647  }
     648}
     649
     650std::ostream &operator<<(std::ostream &ost, const GLMoleculeObject_molecule::BondIds &t)
     651{
     652  ost << t.first << "," << t.second;
     653  return ost;
     654}
     655
     656void GLMoleculeObject_molecule::wasClicked()
     657{
     658  LOG(4, "INFO: GLMoleculeObject_molecule: atom " << _molecule->getId() << " has been clicked");
     659  emit moleculeClicked(_molecule->getId());
     660}
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp

    r7b38d3 r0ac85c3  
    2222class atom;
    2323class bond;
     24class GLMoleculeObject_atom;
     25class GLWorldScene;
    2426class molecule;
    2527
     
    2830  Q_OBJECT
    2931public:
     32  GLMoleculeObject_molecule(QObject *parent, const molecule *molref);
    3033  GLMoleculeObject_molecule(QGLSceneNode *mesh[], QObject *parent, const molecule *molref);
    3134  virtual ~GLMoleculeObject_molecule();
     
    3841  void recieveNotification(Observable *publisher, Notification_ptr notification);
    3942
     43  void initialize(QGLView *view, QGLPainter *painter);
     44  void draw(QGLPainter *painter, const QVector4D &cameraPlane);
     45
     46  typedef std::pair< atomId_t, atomId_t> BondIds;
     47  friend std::ostream &operator<<(std::ostream &ost, const BondIds &t);
     48
     49  static BondIds getBondIds(
     50      const bond::ptr _bond,
     51      const enum GLMoleculeObject_bond::SideOfBond side);
     52
     53  void selected(const bool _isSelected)
     54  { isSelected = _isSelected; }
     55
     56signals:
     57  void changed();
     58  void changeOccured();
     59  void hoverChanged(const atom&);
     60  void hoverChanged(const molecule&, int);
     61  void atomClicked(atomId_t no);
     62  void moleculeClicked(moleculeId_t no);
     63  void changeAtomId(GLMoleculeObject_atom *, int, int);
     64
     65private slots:
     66  //!> grant GLWorldScene access to private slots
     67  friend class GLWorldScene;
     68
     69  void wasClicked();
     70  void atomInserted(const atomicNumber_t _id);
     71  void atomRemoved(const atomicNumber_t _id);
     72  void bondInserted(const bond::ptr _bond, const GLMoleculeObject_bond::SideOfBond side);
     73  void bondRemoved(const atomId_t leftnr, const atomId_t rightnr);
     74  void hoverChangedSignalled(GLMoleculeObject *ob);
     75
     76  void setVisible(bool value);
     77
    4078private:
     79  void init();
     80  void reinit();
     81
     82  void addAtomBonds(
     83      const bond::ptr &_bond,
     84      const GLMoleculeObject_bond::SideOfBond _side
     85      );
     86  void addAtomBonds(const atom *_atom);
     87
     88  void updateTesselationHull();
     89
     90  //!> states whether selection box is additionally drawn or not
     91  bool isSelected;
     92  bool isBoundingBoxUptodate;
     93
     94  //!> whether we are signed on to the associated molecule
     95  bool isSignedOn;
    4196
    4297  const molecule *_molecule;
     98
     99  bool TesselationHullUptodate;
     100
     101  typedef std::map< atomId_t, GLMoleculeObject_atom* > AtomNodeMap;
     102  typedef std::map< BondIds , GLMoleculeObject_bond* > BondNodeMap;
     103  AtomNodeMap AtomsinSceneMap;
     104  BondNodeMap BondsinSceneMap;
     105
     106  const atom *hoverAtom;
    43107};
    44108
     109std::ostream &operator<<(std::ostream &ost, const GLMoleculeObject_molecule::BondIds &t);
    45110
    46111
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.cpp

    r7b38d3 r0ac85c3  
    6363typedef QGLSceneNode *MeshList[GLMoleculeObject::DETAILTYPES_MAX];
    6464
    65 QGLSceneNode *createShapeMesh(Shape &shape, QObject *parent)
     65static QGLSceneNode *createShapeMesh(Shape &shape, QObject *parent)
    6666{
    6767  size_t NumPointsonSurface = 200;
  • src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp

    r7b38d3 r0ac85c3  
    6060#include "Bond/bond.hpp"
    6161#include "Descriptors/AtomIdDescriptor.hpp"
     62#include "Descriptors/MoleculeIdDescriptor.hpp"
    6263#include "Helpers/helpers.hpp"
    6364#include "Shapes/ShapeRegistry.hpp"
     
    6970using namespace MoleCuilder;
    7071
    71 std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t)
    72 {
    73   ost << t.first << "," << t.second;
    74   return ost;
    75 }
    76 
    7772GLWorldScene::GLWorldScene(QObject *parent)
    78    : QObject(parent),
    79      hoverAtom(NULL)
     73   : QObject(parent)
    8074{
    8175  int sphereDetails[] = {5, 3, 2, 0};
     
    8377  for (int i=0;i<GLMoleculeObject::DETAILTYPES_MAX;i++){
    8478    QGLBuilder emptyBuilder;
    85     meshEmpty[i] = emptyBuilder.finalizedSceneNode();
     79    GLMoleculeObject::meshEmpty[i] = emptyBuilder.finalizedSceneNode();
    8680    QGLBuilder sphereBuilder;
    8781    sphereBuilder << QGLSphere(2.0, sphereDetails[i]);
    88     meshSphere[i] = sphereBuilder.finalizedSceneNode();
    89     meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true);
     82    GLMoleculeObject::meshSphere[i] = sphereBuilder.finalizedSceneNode();
     83    GLMoleculeObject::meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true);
    9084    QGLBuilder cylinderBuilder;
    9185    cylinderBuilder << QGLCylinder(.25,.25,1.0,cylinderDetails[i]);
    92     meshCylinder[i] = cylinderBuilder.finalizedSceneNode();
    93     meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);
     86    GLMoleculeObject::meshCylinder[i] = cylinderBuilder.finalizedSceneNode();
     87    GLMoleculeObject::meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);
    9488  }
    9589
    9690  connect(this, SIGNAL(updated()), this, SLOT(update()));
     91
    9792
    9893  setSelectionMode(SelectAtom);
     
    112107void GLWorldScene::init()
    113108{
    114   const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
    115 
    116   if (atoms.size() > 0) {
    117     for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
    118         atomiter != atoms.end();
    119         atomiter++) {
    120       // create atom objects in scene
    121       atomInserted((*atomiter)->getId());
    122 
    123       // create bond objects in scene
    124       const BondList &bondlist = (*atomiter)->getListOfBonds();
    125       for (BondList::const_iterator bonditer = bondlist.begin();
    126           bonditer != bondlist.end();
    127           ++bonditer) {
    128         const bond::ptr _bond = *bonditer;
    129         const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
    130             GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
    131         bondInserted(_bond, side);
    132       }
    133     }
     109  const std::vector<molecule *> &molecules = World::getInstance().getAllMolecules();
     110
     111  for (std::vector<molecule*>::const_iterator moliter = molecules.begin();
     112      moliter != molecules.end();
     113      moliter++) {
     114    // create molecule objects in scene
     115    moleculeInserted(*moliter);
    134116  }
    135117}
     
    143125void GLWorldScene::update()
    144126{
    145   const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
    146 
    147   if (atoms.size() > 0) {
    148     for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
    149         atomiter != atoms.end();
    150         atomiter++) {
    151       // check whether atom already exists
    152       const atomId_t atomid = (*atomiter)->getId();
    153       const bool atom_present = AtomsinSceneMap.count(atomid);
    154       if (!atom_present)
    155         atomInserted((*atomiter)->getId());
    156       else
    157         AtomsinSceneMap[atomid]->resetPosition();
    158 
    159 
    160       // create bond objects in scene
    161       const BondList &bondlist = (*atomiter)->getListOfBonds();
    162       for (BondList::const_iterator bonditer = bondlist.begin();
    163           bonditer != bondlist.end();
    164           ++bonditer) {
    165         const bond::ptr _bond = *bonditer;
    166         const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
    167             GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
    168         bool bond_present = false;
    169         const BondIds ids = getBondIds(_bond,side);
    170         if (atom_present) {
    171           // check whether bond is not present already
    172           bond_present = BondsinSceneMap.count(ids);
    173         }
    174         if (!bond_present)
    175           bondInserted(_bond, side);
    176         else {
    177           BondsinSceneMap[ids]->resetPosition();
    178           BondsinSceneMap[ids]->resetWidth();
    179         }
    180       }
    181     }
    182   }
    183 }
    184 
    185 /** Adds an atom to the scene.
    186  *
    187  * @param _atom atom to add
    188  */
    189 void GLWorldScene::atomInserted(const atomicNumber_t _id)
    190 {
    191   LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
    192   GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(meshSphere, this, _id);
    193   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
    194   ASSERT(iter == AtomsinSceneMap.end(),
    195       "GLWorldScene::atomAdded() - same atom with id "+toString(_id)+" added again.");
    196   AtomsinSceneMap.insert( make_pair(_id, atomObject) );
    197 
    198   qRegisterMetaType<atomId_t>("atomId_t");
    199   qRegisterMetaType<bond::ptr>("bond::ptr");
    200   qRegisterMetaType<GLMoleculeObject_bond::SideOfBond>("GLMoleculeObject_bond::SideOfBond");
    201   connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
    202   connect (atomObject, SIGNAL(changed()), this, SIGNAL(changed()));
    203   connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
    204   connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
    205   connect (atomObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
    206   connect (atomObject, SIGNAL(BondsInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)));
    207   connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, int, int)), this, SLOT(changeAtomId(GLMoleculeObject_atom*, int, int)));
    208   //bondsChanged(_atom);
    209   emit changeOccured();
    210 }
    211 
    212 /** Removes an atom from the scene.
    213  *
    214  * We just the id as the atom might have already been destroyed.
    215  *
    216  * @param _id id of atom to remove
    217  */
    218 void GLWorldScene::atomRemoved(const atomicNumber_t _id)
    219 {
    220   LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");
    221   // bonds are removed by signal coming from ~bond
    222   // remove atoms
    223   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
    224   ASSERT(iter != AtomsinSceneMap.end(),
    225       "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display.");
    226   GLMoleculeObject_atom *atomObject = iter->second;
    227   atomObject->disconnect();
    228   AtomsinSceneMap.erase(iter);
    229   delete atomObject;
    230   emit changeOccured();
    231 }
    232 
    233 /** ....
    234  *
    235  */
    236 void GLWorldScene::worldSelectionChanged()
    237 {
    238   LOG(3, "INFO: GLWorldScene: Received signal selectionChanged.");
    239 
    240   const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
    241 
    242   if (molecules.size() > 0) {
    243     for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
    244         Runner != molecules.end();
    245         Runner++) {
    246 
    247       MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find((*Runner)->getId());
    248       bool isSelected = World::getInstance().isSelected(*Runner);
    249 
    250       // molecule selected but not in scene?
    251       if (isSelected && (iter == MoleculesinSceneMap.end())){
    252         // -> create new mesh
    253         GLMoleculeObject_molecule *molObject = new GLMoleculeObject_molecule(meshEmpty, this, *Runner);
    254         MoleculesinSceneMap.insert( make_pair((*Runner)->getId(), molObject) );
    255         connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
    256         connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
    257         connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
    258         emit changed();
    259         emit changeOccured();
    260       }
    261 
    262       // molecule not selected but in scene?
    263       if (!isSelected && (iter != MoleculesinSceneMap.end())){
    264         // -> remove from scene
    265         moleculeRemoved(*Runner);
    266       }
    267 
    268     }
    269   }
    270 }
    271 
    272 /** Removes a molecule from the scene.
    273  *
    274  * @param _molecule molecule to remove
    275  */
    276 void GLWorldScene::moleculeRemoved(const molecule *_molecule)
    277 {
    278   LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_molecule->getId())+".");
    279   MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_molecule->getId());
    280 
    281   // only remove if the molecule is in the scene
    282   //  (= is selected)
    283   if (iter != MoleculesinSceneMap.end()){
    284     GLMoleculeObject_molecule *molObject = iter->second;
    285     molObject->disconnect();
    286     MoleculesinSceneMap.erase(iter);
    287     delete molObject;
    288     emit changed();
    289     emit changeOccured();
    290   }
    291 }
    292 
    293 /** Helper function to get bond ids in the correct order for BondNodeMap.
    294  *
    295  * \return pair of ids in correct order.
    296  */
    297 GLWorldScene::BondIds GLWorldScene::getBondIds(
    298     const bond::ptr _bond,
    299     const enum GLMoleculeObject_bond::SideOfBond _side) const
    300 {
    301   BondIds ids;
    302   switch (_side) {
    303     case GLMoleculeObject_bond::left:
    304       ids = std::make_pair(_bond->leftatom->getId(), _bond->rightatom->getId());
    305       break;
    306     case GLMoleculeObject_bond::right:
    307       ids = std::make_pair(_bond->rightatom->getId(), _bond->leftatom->getId());
    308       break;
    309   }
    310   return ids;
    311 }
    312 
    313 /** Adds a bond to the scene.
    314  *
    315  * @param _bond bond to add
    316  * @param side which side of the bond (left or right)
    317  */
    318 void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
    319 {
    320   LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
    321   //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
    322 
    323   const BondIds ids = getBondIds(_bond, _side);
    324   BondNodeMap::iterator iter = BondsinSceneMap.find(ids);
    325   if (iter == BondsinSceneMap.end()) {
    326     GLMoleculeObject_bond * bondObject =
    327         new GLMoleculeObject_bond(meshCylinder, this, _bond, _side);
    328     connect (
    329         bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
    330         this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
    331     connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
    332     BondsinSceneMap.insert( make_pair(ids, bondObject) );
    333   //    BondIdsinSceneMap.insert( Leftids );
    334   } else {
    335     iter->second->resetPosition();
    336     iter->second->resetWidth();
    337   }
    338   emit changeOccured();
    339 }
    340 
    341 /** Removes a bond from the scene.
    342  *
    343  * @param _bond bond to remove
    344  */
    345 void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
    346 {
    347   LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+".");
    348   {
    349     // left bond
    350     const BondIds Leftids( make_pair(leftnr, rightnr) );
    351     BondNodeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
    352     ASSERT(leftiter != BondsinSceneMap.end(),
    353         "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
    354         +toString(rightnr)+" not on display.");
    355     GLMoleculeObject_bond *bondObject = leftiter->second;
    356     BondsinSceneMap.erase(leftiter);
    357     delete bondObject; // is done by signal from bond itself
    358     //LOG(4, "INFO: Still present bonds " << BondsinSceneMap << ".");
    359   }
    360 
    361   emit changeOccured();
    362 }
    363 
    364 /** Adds a shape to the scene.
    365  *
    366  * uses ShapeRegistry::lastChanged()
    367  *
    368  */
    369 void GLWorldScene::addShape()
    370 {
    371   Shape &shape = *ShapeRegistry::getInstance().lastChanged();
    372   GLMoleculeObject_shape *shapeObject = new GLMoleculeObject_shape(shape, this);
    373   ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
    374   ASSERT(iter == ShapesinSceneMap.end(),
    375       "GLWorldScene::addShape() - same shape "+shape.getName()+" added again.");
    376   ShapesinSceneMap.insert( make_pair(shape.getName(), shapeObject) );
    377 }
    378 
    379 void GLWorldScene::removeShape()
    380 {
    381   Shape &shape = *ShapeRegistry::getInstance().lastChanged();
    382   ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
    383   ASSERT(iter != ShapesinSceneMap.end(),
    384       "GLWorldScene::removeShape() - shape "+shape.getName()+" not in scene.");
    385   ShapesinSceneMap.erase(iter);
    386   delete(iter->second);
    387 }
    388 
    389 void GLWorldScene::updateSelectedShapes()
    390 {
    391   foreach (QObject *obj, children()) {
    392     GLMoleculeObject_shape *shapeobj = qobject_cast<GLMoleculeObject_shape *>(obj);
    393       if (shapeobj){
    394         shapeobj->enable(ShapeRegistry::getInstance().isSelected(shapeobj->getShape()));
    395       }
    396   }
    397 }
    398 
    399 void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const
    400 {
    401   // Initialize all of the mesh objects that we have as children.
    402    foreach (QObject *obj, children()) {
    403      GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
    404        if (meshobj)
    405          meshobj->initialize(view, painter);
    406    }
    407 }
    408 
    409 void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const
    410 {
    411    // Draw all of the mesh objects that we have as children.
    412    foreach (QObject *obj, children()) {
    413      GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
    414        if (meshobj)
    415          meshobj->draw(painter, cameraPlane);
    416    }
     127  const std::vector<molecule *> &molecules = World::getInstance().getAllMolecules();
     128
     129  for (std::vector<molecule*>::const_iterator moliter = molecules.begin();
     130      moliter != molecules.end();
     131      moliter++) {
     132    // check whether molecule already exists
     133    const moleculeId_t molid = (*moliter)->getId();
     134    const bool mol_present = MoleculesinSceneMap.count(molid);
     135    if (!mol_present)
     136      moleculeInserted(*moliter);
     137  }
    417138}
    418139
    419140void GLWorldScene::atomClicked(atomId_t no)
    420141{
    421    LOG(3, "INFO: GLWorldScene - atom " << no << " has been clicked.");
     142   LOG(3, "INFO: GLMoleculeObject_molecule - atom " << no << " has been clicked.");
    422143   const atom *Walker = World::getInstance().getAtom(AtomById(no));
    423144   if (selectionMode == SelectAtom){
     
    429150     const molecule *mol = Walker->getMolecule();
    430151     ASSERT(mol, "Atom without molecule has been clicked.");
     152     molids_t ids(1, mol->getId());
    431153     if (!World::getInstance().isSelected(mol))
    432        SelectionMoleculeById(mol->getId());
     154       SelectionMoleculeById(ids);
    433155     else
    434        SelectionNotMoleculeById(mol->getId());
     156       SelectionNotMoleculeById(ids);
    435157   }
    436158   emit clicked(no);
    437159}
    438160
     161void GLWorldScene::moleculeClicked(moleculeId_t no)
     162{
     163   LOG(3, "INFO: GLMoleculeObject_molecule - mol " << no << " has been clicked.");
     164   const molecule *mol= World::getInstance().getMolecule(MoleculeById(no));
     165   ASSERT(mol, "Atom without molecule has been clicked.");
     166   molids_t ids(1, mol->getId());
     167   if (!World::getInstance().isSelected(mol))
     168     SelectionMoleculeById(ids);
     169   else
     170     SelectionNotMoleculeById(ids);
     171   emit clicked(no);
     172}
     173
     174
     175/** Adds an atom to the scene.
     176 *
     177 * @param _atom atom to add
     178 */
     179void GLWorldScene::atomInserted(const atomId_t _id)
     180{
     181  LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
     182  // find associated molecule
     183  const moleculeId_t molid = World::getInstance().getAtom(AtomById(_id))->getMolecule()->getId();
     184  MoleculeNodeMap::const_iterator moliter = MoleculesinSceneMap.find(molid );
     185  ASSERT(moliter != MoleculesinSceneMap.end(),
     186      "GLWorldScene::atomAdded() - molecule with id of "+toString(molid)
     187      +" atom with id "+toString(_id)+" is unknown.");
     188  GLMoleculeObject_molecule *molObject = moliter->second;
     189
     190  // add atom to internal list
     191#ifndef NDEBUG
     192  AtomMoleculeMap::const_iterator atomiter = AtomsinSceneMap.find(_id);
     193    ASSERT(atomiter == AtomsinSceneMap.end(),
     194        "GLWorldScene::atomRemoved() - atom "+toString(_id)+" already known.");
     195#endif
     196  AtomsinSceneMap.insert( std::make_pair( _id, molObject ));
     197
     198  // inform its GlMoleculeObject_molecule.
     199  molObject->atomInserted(_id);
     200
     201  // emit change
     202  emit changeOccured();
     203}
     204
     205/** Removes an atom from the scene.
     206 *
     207 * We just the id as the atom might have already been destroyed.
     208 *
     209 * @param _id id of atom to remove
     210 */
     211void GLWorldScene::atomRemoved(const atomId_t _id)
     212{
     213  LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");
     214  // find associated molecule
     215  AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(_id);
     216  ASSERT(iter != AtomsinSceneMap.end(),
     217      "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display.");
     218  GLMoleculeObject_molecule *molObject = iter->second;
     219
     220  // remove from internal list
     221  AtomsinSceneMap.erase(iter);
     222
     223  // inform its GlMoleculeObject_molecule.
     224  molObject->atomRemoved(_id);
     225
     226  // emit change
     227  emit changeOccured();
     228}
     229
     230/** ....
     231 *
     232 */
     233void GLWorldScene::worldSelectionChanged()
     234{
     235  LOG(3, "INFO: GLWorldScene: Received signal selectionChanged.");
     236
     237  const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
     238
     239  if (molecules.size() > 0) {
     240    for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
     241        Runner != molecules.end();
     242        Runner++) {
     243
     244      // molecule selected but not in scene?
     245      const bool isSelected = World::getInstance().isSelected(*Runner);
     246      if (isSelected){
     247        MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find((*Runner)->getId());
     248        ASSERT( iter != MoleculesinSceneMap.end(),
     249            "GLWorldScene::worldSelectionChanged() - selected molecule is unknown.");
     250        GLMoleculeObject_molecule *molObject = iter->second;
     251        // inform molecule object
     252        molObject->selected(isSelected);
     253      }
     254    }
     255  }
     256}
     257
     258/** Inserts a molecule into the scene.
     259 *
     260 * @param _mol molecule to insert
     261 */
     262void GLWorldScene::moleculeInserted(const molecule * _mol)
     263{
     264  LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_mol->getId())+".");
     265  MoleculeNodeMap::const_iterator iter = MoleculesinSceneMap.find(_mol->getId());
     266  ASSERT( iter == MoleculesinSceneMap.end(),
     267      "GLWorldScene::moleculeInserted() - molecule's id "+toString(_mol->getId())+" already present.");
     268
     269  // add new object
     270  GLMoleculeObject_molecule *molObject = new GLMoleculeObject_molecule(GLMoleculeObject::meshEmpty, this, _mol);
     271  MoleculesinSceneMap.insert( make_pair(_mol->getId(), molObject) );
     272  connect (molObject, SIGNAL(changed()), this, SIGNAL(changed()));
     273  connect (molObject, SIGNAL(changeOccured()), this, SIGNAL(changeOccured()));
     274  connect (molObject, SIGNAL(atomClicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
     275  connect (molObject, SIGNAL(moleculeClicked(moleculeId_t)), this, SLOT(moleculeClicked(moleculeId_t)));
     276  connect (molObject, SIGNAL(changeAtomId(GLMoleculeObject_atom *, int, int)), this, SLOT(changeAtomId(GLMoleculeObject_atom *, int, int)));
     277  connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     278  connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     279  connect (molObject, SIGNAL(hoverChanged(const atom &)), this, SIGNAL(hoverChanged(const atom &)));
     280  connect (molObject, SIGNAL(hoverChanged(const molecule &, int)), this, SIGNAL(hoverChanged(const molecule &, int)));
     281  emit changed();
     282  emit changeOccured();
     283}
     284
     285/** Removes a molecule from the scene.
     286 *
     287 * @param _id id of molecule to remove
     288 */
     289void GLWorldScene::moleculeRemoved(const moleculeId_t _id)
     290{
     291  LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_id)+".");
     292  MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id);
     293  ASSERT( iter != MoleculesinSceneMap.end(),
     294      "GLWorldScene::moleculeInserted() - molecule's id "+toString(_id)+" is unknown.");
     295
     296  GLMoleculeObject_molecule *molObject = iter->second;
     297  molObject->disconnect();
     298  MoleculesinSceneMap.erase(iter);
     299  delete molObject;
     300  emit changed();
     301  emit changeOccured();
     302}
     303
     304void GLWorldScene::moleculesVisibilityChanged(const moleculeId_t _id, bool _visible)
     305{
     306  MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id);
     307  ASSERT( iter != MoleculesinSceneMap.end(),
     308      "GLWorldScene::moleculeInserted() - molecule's id "+toString(_id)+" is unknown.");
     309
     310  GLMoleculeObject_molecule *molObject = iter->second;
     311  molObject->setVisible(_visible);
     312
     313  emit changed();
     314  emit changeOccured();
     315}
     316
     317/** Adds a bond to the scene.
     318 *
     319 * @param _bond bond to add
     320 * @param side which side of the bond (left or right)
     321 */
     322void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
     323{
     324  LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
     325  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
     326  // bond partners must both belong to same atom
     327  ASSERT( _bond->leftatom->getMolecule() == _bond->rightatom->getMolecule(),
     328      "GLWorldScene::bondInserted() - bond partners do not belong to same molecule.");
     329
     330  // find associated molecule object
     331  const moleculeId_t molid = _bond->leftatom->getMolecule()->getId();
     332  MoleculeNodeMap::const_iterator moliter = MoleculesinSceneMap.find(molid );
     333  ASSERT(moliter != MoleculesinSceneMap.end(),
     334      "GLWorldScene::bondInserted() - molecule with id of "+toString(molid)
     335      +" atom with id "+toString(_bond->leftatom->getId())+" is unknown.");
     336  GLMoleculeObject_molecule *molObject = moliter->second;
     337
     338  // add to internal list
     339  const GLMoleculeObject_molecule::BondIds ids =
     340      GLMoleculeObject_molecule::getBondIds(_bond, _side);
     341  BondMoleculeMap::const_iterator iter = BondsinSceneMap.find(ids);
     342  ASSERT(iter == BondsinSceneMap.end(),
     343      "GLWorldScene::bondInserted() - bond with ids "+toString(ids.first)
     344      +","+toString(ids.second)+" already present.");
     345  BondsinSceneMap.insert( std::make_pair( ids, molObject ));
     346
     347  // inform its GlMoleculeObject_molecule.
     348  molObject->bondInserted(_bond, _side);
     349
     350  // emit change
     351  emit changeOccured();
     352}
     353
     354/** Removes a bond from the scene.
     355 *
     356 * @param _bond bond to remove
     357 */
     358void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
     359{
     360  LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+".");
     361  {
     362    // left bond
     363    const GLMoleculeObject_molecule::BondIds Leftids( make_pair(leftnr, rightnr) );
     364    BondMoleculeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
     365    ASSERT(leftiter != BondsinSceneMap.end(),
     366        "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
     367        +toString(rightnr)+" not on display.");
     368    GLMoleculeObject_molecule *molObject = leftiter->second;
     369
     370    // remove from internal list
     371    BondsinSceneMap.erase(leftiter);
     372
     373    // inform its GlMoleculeObject_molecule.
     374    molObject->bondRemoved( leftnr, rightnr );
     375  }
     376
     377  // emit change
     378  emit changeOccured();
     379}
     380
     381/** Adds a shape to the scene.
     382 *
     383 * uses ShapeRegistry::lastChanged()
     384 *
     385 */
     386void GLWorldScene::addShape()
     387{
     388  Shape &shape = *ShapeRegistry::getInstance().lastChanged();
     389  GLMoleculeObject_shape *shapeObject = new GLMoleculeObject_shape(shape, this);
     390  ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
     391  ASSERT(iter == ShapesinSceneMap.end(),
     392      "GLWorldScene::addShape() - same shape "+shape.getName()+" added again.");
     393  ShapesinSceneMap.insert( make_pair(shape.getName(), shapeObject) );
     394}
     395
     396void GLWorldScene::removeShape()
     397{
     398  Shape &shape = *ShapeRegistry::getInstance().lastChanged();
     399  ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName());
     400  ASSERT(iter != ShapesinSceneMap.end(),
     401      "GLWorldScene::removeShape() - shape "+shape.getName()+" not in scene.");
     402  ShapesinSceneMap.erase(iter);
     403  delete(iter->second);
     404}
     405
     406void GLWorldScene::updateSelectedShapes()
     407{
     408  foreach (QObject *obj, children()) {
     409    GLMoleculeObject_shape *shapeobj = qobject_cast<GLMoleculeObject_shape *>(obj);
     410      if (shapeobj){
     411        shapeobj->enable(ShapeRegistry::getInstance().isSelected(shapeobj->getShape()));
     412      }
     413  }
     414}
     415
     416void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const
     417{
     418  // Initialize all of the mesh objects that we have as children.
     419   foreach (QObject *obj, children()) {
     420     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
     421       if (meshobj)
     422         meshobj->initialize(view, painter);
     423   }
     424}
     425
     426void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const
     427{
     428   // Draw all of the mesh objects that we have as children.
     429   foreach (QObject *obj, children()) {
     430     GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
     431       if (meshobj)
     432         meshobj->draw(painter, cameraPlane);
     433   }
     434}
     435
    439436void GLWorldScene::setSelectionMode(SelectionModeType mode)
    440437{
     
    453450}
    454451
    455 void GLWorldScene::hoverChangedSignalled(GLMoleculeObject *ob)
    456 {
    457   // Find the atom, ob corresponds to.
    458   hoverAtom = NULL;
    459   GLMoleculeObject_atom *atomObject = dynamic_cast<GLMoleculeObject_atom *>(ob);
    460   if (atomObject){
    461     for (AtomNodeMap::iterator iter = AtomsinSceneMap.begin();iter != AtomsinSceneMap.end(); ++ iter){
    462       if (iter->second == atomObject)
    463         hoverAtom = World::getInstance().getAtom(AtomById(iter->first));
    464     }
    465   }
    466 
    467   // Propagate signal.
    468   emit hoverChanged(hoverAtom);
    469 }
    470 
    471452void GLWorldScene::changeAtomId(GLMoleculeObject_atom *ob, int oldId, int newId)
    472453{
    473454  LOG(3, "INFO: GLWorldScene - change atom id " << oldId << " to " << newId << ".");
    474455  // Remove from map.
    475   AtomNodeMap::iterator iter = AtomsinSceneMap.find(oldId);
     456  AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(oldId);
    476457  ASSERT(iter != AtomsinSceneMap.end(),
    477         "GLWorldScene::objectIdChangedSignalled() - atom with id "+toString(oldId)+" not on display.");
    478   GLMoleculeObject_atom *atomObject = iter->second;
     458        "GLWorldScene::changeAtomId() - atom with old id "+toString(oldId)+" not on display.");
     459  GLMoleculeObject_molecule *molObject = iter->second;
     460
     461  // erase by signalling removal
     462  molObject->atomRemoved(oldId);
     463
     464  // remove from internal list
    479465  AtomsinSceneMap.erase(iter);
    480466
    481467  // Reinsert with new id.
    482   AtomsinSceneMap.insert( make_pair(newId, atomObject) );
    483 }
    484 
     468  {
     469    AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(newId);
     470    ASSERT(iter == AtomsinSceneMap.end(),
     471          "GLWorldScene::changeAtomId() - atom with new id "+toString(newId)+" already known.");
     472  }
     473  AtomsinSceneMap.insert( make_pair(newId, molObject) );
     474
     475  // inform molecule object
     476  molObject->atomInserted(oldId);
     477}
  • src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp

    r7b38d3 r0ac85c3  
    7575  void clicked(atomId_t);
    7676  void doubleClicked();
    77   void hoverChanged(const atom*);
     77  void hoverChanged(const atom &);
     78  void hoverChanged(const molecule &, int);
    7879
    7980private slots:
    8081  void atomClicked(atomId_t no);
    81   void atomInserted(const atomicNumber_t _id);
    82   void atomRemoved(const atomicNumber_t _id);
    83   void moleculeRemoved(const molecule *_molecule);
     82  void atomInserted(const atomId_t _id);
     83  void atomRemoved(const atomId_t _id);
     84  void moleculeClicked(moleculeId_t no);
     85  void moleculeRemoved(const moleculeId_t _id);
     86  void moleculeInserted(const molecule * _mol);
    8487  void worldSelectionChanged();
    8588  void bondInserted(const bond::ptr _bond, const GLMoleculeObject_bond::SideOfBond side);
     
    8790  void setSelectionModeAtom();
    8891  void setSelectionModeMolecule();
    89   void hoverChangedSignalled(GLMoleculeObject *ob);
    9092  void changeAtomId(GLMoleculeObject_atom *ob, int oldId, int newOd);
    9193  void addShape();
    9294  void removeShape();
    9395  void update();
     96  void moleculesVisibilityChanged(const moleculeId_t _id, bool _visible);
    9497
    9598public:
     
    100103
    101104private:
    102   typedef std::pair< atomId_t, atomId_t> BondIds;
    103   friend std::ostream &operator<<(std::ostream &ost, const BondIds &t);
    104105
    105   BondIds getBondIds(
    106       const bond::ptr _bond,
    107       const enum GLMoleculeObject_bond::SideOfBond side) const;
    108 
    109   typedef std::map< atomId_t, GLMoleculeObject_atom* > AtomNodeMap;
    110   typedef std::map< BondIds , GLMoleculeObject_bond* > BondNodeMap;
     106  typedef std::map< atomId_t, GLMoleculeObject_molecule* > AtomMoleculeMap;
     107  typedef std::map< GLMoleculeObject_molecule::BondIds , GLMoleculeObject_molecule* > BondMoleculeMap;
    111108  typedef std::map< moleculeId_t , GLMoleculeObject_molecule* > MoleculeNodeMap;
    112109  typedef std::map< std::string , GLMoleculeObject_shape* > ShapeNodeMap;
    113   AtomNodeMap AtomsinSceneMap;
    114   BondNodeMap BondsinSceneMap;
     110  AtomMoleculeMap AtomsinSceneMap;
     111  BondMoleculeMap BondsinSceneMap;
    115112  MoleculeNodeMap MoleculesinSceneMap;
    116113  ShapeNodeMap ShapesinSceneMap;
    117114
    118   QGLSceneNode *meshEmpty[GLMoleculeObject::DETAILTYPES_MAX];
    119   QGLSceneNode *meshSphere[GLMoleculeObject::DETAILTYPES_MAX];
    120   QGLSceneNode *meshCylinder[GLMoleculeObject::DETAILTYPES_MAX];
    121 
    122115  SelectionModeType selectionMode;
    123   const atom *hoverAtom;
    124116};
    125117
    126 std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t);
    127 
    128118#endif /* GLWORLDSCENE_HPP_ */
  • src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp

    r7b38d3 r0ac85c3  
    7171  setOption(QGLView::ObjectPicking, true);
    7272  setOption(QGLView::CameraNavigation, false);
     73  setFocusPolicy(Qt::StrongFocus);
    7374  setCameraControlMode(Rotate);
    7475  defaultEyeSeparation = 4.0;
     
    7879  //changeMaterials(false);
    7980
    80   qRegisterMetaType<atomicNumber_t>("atomicNumber_t");
     81  qRegisterMetaType<atomId_t>("atomId_t");
     82  qRegisterMetaType<moleculeId_t>("moleculeId_t");
    8183
    8284  connect(this, SIGNAL(ShapeAdded()), worldscene, SLOT(addShape()));
     
    8587  connect(worldscene, SIGNAL(changeOccured()), this, SLOT(changeSignalled()));
    8688  connect(worldscene, SIGNAL(changed()), this, SIGNAL(changed()));
    87   connect(worldscene, SIGNAL(hoverChanged(const atom *)), this, SLOT(sceneHoverSignalled(const atom *)));
    88   connect(this, SIGNAL(atomInserted(const atomicNumber_t)), worldscene, SLOT(atomInserted(const atomicNumber_t)));
    89   connect(this, SIGNAL(atomRemoved(const atomicNumber_t)), worldscene, SLOT(atomRemoved(const atomicNumber_t)));
     89  connect(worldscene, SIGNAL(hoverChanged(const atom &)), this, SLOT(sceneHoverSignalled(const atom &)));
     90  connect(worldscene, SIGNAL(hoverChanged(const molecule &, int)), this, SLOT(sceneHoverSignalled(const molecule &, int)));
    9091  connect(this, SIGNAL(worldSelectionChanged()), worldscene, SLOT(worldSelectionChanged()));
    91   connect(this, SIGNAL(moleculeRemoved(const molecule *)), worldscene, SLOT(moleculeRemoved(const molecule *)));
    92   //connect(this, SIGNAL(moleculeInserted(const molecule *)), worldscene, SLOT(moleculeInserted(const molecule *)));
     92  connect(this, SIGNAL(moleculeRemoved(const moleculeId_t)), worldscene, SLOT(moleculeRemoved(const moleculeId_t)));
     93  connect(this, SIGNAL(moleculeInserted(const molecule *)), worldscene, SLOT(moleculeInserted(const molecule *)));
    9394  //connect(this, SIGNAL(changed()), this, SLOT(updateGL()));
    9495  connect(this, SIGNAL(changed()), this, SLOT(sceneChangeSignalled()));
     96  connect(this, SIGNAL(moleculesVisibilityChanged(const moleculeId_t,bool)), worldscene, SLOT(moleculesVisibilityChanged(const moleculeId_t,bool)));
    9597
    9698  // sign on to changes in the world
    9799  World::getInstance().signOn(this);
    98   World::getInstance().signOn(this, World::AtomInserted);
    99   World::getInstance().signOn(this, World::AtomRemoved);
    100100  World::getInstance().signOn(this, World::MoleculeInserted);
    101101  World::getInstance().signOn(this, World::MoleculeRemoved);
     
    338338  if (static_cast<World *>(publisher) == World::getPointer()) {
    339339    switch (notification->getChannelNo()) {
    340       case World::AtomInserted:
    341       {
    342         const atomicNumber_t _id = World::getInstance().lastChanged<atom>()->getId();
    343   #ifdef LOG_OBSERVER
    344         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
    345   #endif
    346         emit atomInserted(_id);
    347         break;
    348       }
    349       case World::AtomRemoved:
    350       {
    351         const atomicNumber_t _id = World::getInstance().lastChanged<atom>()->getId();
    352   #ifdef LOG_OBSERVER
    353         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been removed.";
    354   #endif
    355         emit atomRemoved(_id);
    356         break;
    357       }
    358340      case World::SelectionChanged:
    359341      {
     
    366348      case World::MoleculeInserted:
    367349      {
    368         const molecule *_molecule = World::getInstance().lastChanged<molecule>();
     350        const molecule * _mol = World::getInstance().lastChanged<molecule>();
    369351  #ifdef LOG_OBSERVER
    370         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_molecule->getId())+" has been removed.";
     352        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_mol->getId())+" has been removed.";
    371353  #endif
    372         emit moleculeInserted(_molecule);
     354        emit moleculeInserted(_mol);
    373355        break;
    374356      }
    375357      case World::MoleculeRemoved:
    376358      {
    377         const molecule *_molecule = World::getInstance().lastChanged<molecule>();
     359        const moleculeId_t _id = World::getInstance().lastChanged<molecule>()->getId();
    378360  #ifdef LOG_OBSERVER
    379         observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_molecule->getId())+" has been removed.";
     361        observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_id)+" has been removed.";
    380362  #endif
    381         emit moleculeRemoved(_molecule);
     363        emit moleculeRemoved(_id);
    382364        break;
    383365      }
     
    518500void GLWorldView::keyPressEvent(QKeyEvent *e)
    519501{
     502  // Find the distance between the eye and focus point.
     503  QVector3D d = camera()->eye() - camera()->center();
     504//  LOG(1, "Distance vector eye and center is "
     505//      << d.x() << "," << d.y() << "," << d.z());
     506  // scale the move unit by the eye <-> domain center distance
     507  const double key_move_unit = 0.04*(d.length()/50.);
     508
    520509  if (e->key() == Qt::Key_Tab) {
    521510    // The Tab key turns the ShowPicking option on and off,
     
    523512    setOption(QGLView::ShowPicking, ((options() & QGLView::ShowPicking) == 0));
    524513    updateGL();
     514  } else if ((e->key() == Qt::Key_Minus) || (e->key() == Qt::Key_Plus)) {
     515    // Scale the distance.
     516    if (e->key() == Qt::Key_Minus)
     517      d *= 1.2;
     518    else if (e->key() == Qt::Key_Plus)
     519      d /= 1.2;
     520    // Set new eye position.
     521    camera()->setEye(camera()->center() + d);
     522  } else if ((e->key() == Qt::Key_Left) || (e->key() == Qt::Key_Right)) {
     523    // Translate the camera.
     524    const double d = (e->key() == Qt::Key_Left) ? -key_move_unit : key_move_unit;
     525    camera()->translateCenter( d, 0., 0);
     526    camera()->translateEye( d, 0., 0);
     527  } else if ((e->key() == Qt::Key_Up) || (e->key() == Qt::Key_Down)) {
     528    // Translate the camera.
     529    const double d = (e->key() == Qt::Key_Up) ? -key_move_unit : key_move_unit;
     530    camera()->translateCenter( 0., d, 0);
     531    camera()->translateEye( 0., d, 0);
     532  } else if ((e->key() == Qt::Key_PageUp) || (e->key() == Qt::Key_PageDown)) {
     533    // Translate the camera.
     534    const double d = (e->key() == Qt::Key_PageUp) ? -key_move_unit : key_move_unit;
     535    camera()->translateCenter( 0., 0., d);
     536    camera()->translateEye( 0., 0., d);
    525537  }
    526538  QGLView::keyPressEvent(e);
     
    750762}
    751763
    752 void GLWorldView::sceneHoverSignalled(const atom *_atom)
     764void GLWorldView::sceneHoverSignalled(const atom &_atom)
    753765{
    754766  emit hoverChanged(_atom);
    755767}
     768
     769void GLWorldView::sceneHoverSignalled(const molecule &_mol, int _i)
     770{
     771  emit hoverChanged(_mol, _i);
     772}
  • src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp

    r7b38d3 r0ac85c3  
    5151  void checkChanges();
    5252  void sceneChangeSignalled();
    53   void sceneHoverSignalled(const atom *_atom);
     53  void sceneHoverSignalled(const atom &_atom);
     54  void sceneHoverSignalled(const molecule &_mol, int);
    5455  void changeDreiBein();
    5556  void changeDomain();
     
    5859  void changed();
    5960  void TimeChanged();
    60   void atomInserted(const atomicNumber_t _id);
    61   void atomRemoved(const atomicNumber_t _id);
    62   void moleculeInserted(const molecule *_molecule);
    63   void moleculeRemoved(const molecule *_molecule);
     61  void moleculeInserted(const molecule * _mol);
     62  void moleculeRemoved(const moleculeId_t _id);
    6463  void worldSelectionChanged();
    65   void hoverChanged(const atom *_atom);
     64  void hoverChanged(const atom &_atom);
     65  void hoverChanged(const molecule &_mol, int);
    6666  void ShapeAdded();
    6767  void ShapeRemoved();
     68  void moleculesVisibilityChanged(const moleculeId_t,bool);
    6869
    6970protected:
  • src/UIElements/Views/Qt4/QtInfoBox.cpp

    r7b38d3 r0ac85c3  
    5050    QTabWidget(),
    5151    curAtom(NULL), nextAtom(NULL),
     52    curMolecule(NULL), nextMolecule(NULL),
    5253    page_mol(NULL), page_atom(NULL)
    5354{
     
    6768}
    6869
    69 void QtInfoBox::atomHover(const atom *_atom)
    70 {
    71   nextAtom = _atom;
     70void QtInfoBox::atomHover(const atom &_atom)
     71{
     72  nextAtom = &_atom;
     73  timer->start(500);
     74}
     75
     76void QtInfoBox::moleculeHover(const molecule &_mol)
     77{
     78  nextMolecule = &_mol;
    7279  timer->start(500);
    7380}
     
    7784  if (nextAtom)
    7885    showAtom(nextAtom);
     86  if (nextMolecule)
     87    showMolecule(nextMolecule);
    7988}
    8089
     
    101110
    102111  curAtom = _atom;
     112  nextAtom = NULL;
     113  nextMolecule = NULL;
    103114
    104115  // Show new tabs.
     
    116127        setCurrentIndex(currentPage);
    117128    }
     129  }
     130}
     131
     132void QtInfoBox::showMolecule(const molecule *_mol)
     133{
     134  currentPage = currentIndex();
     135
     136  // Remove old tabs.
     137  clearTabs();
     138
     139  curMolecule = _mol;
     140  nextAtom = NULL;
     141  nextMolecule = NULL;
     142
     143  // Show new tabs.
     144  if (curMolecule){
     145    page_mol = new QtMoleculeInfoPage(curMolecule, this);
     146    addTab(page_mol, "Molecule");
     147    connect(page_mol, SIGNAL(moleculeKilled()), this, SLOT(clearTabs()));
     148
     149    if (currentPage > 0)
     150      setCurrentIndex(currentPage);
    118151  }
    119152}
  • src/UIElements/Views/Qt4/QtInfoBox.hpp

    r7b38d3 r0ac85c3  
    3636
    3737  void showAtom(const atom *_atom);
     38  void showMolecule(const molecule *_mol);
    3839
    3940public slots:
    40   void atomHover(const atom *_atom);
     41  void atomHover(const atom &_atom);
     42  void moleculeHover(const molecule &_mol);
    4143  void timerTimeout();
    4244
     
    4648  const atom *curAtom;
    4749  const atom *nextAtom;
     50  const molecule *curMolecule;
     51  const molecule *nextMolecule;
    4852  QtMoleculeInfoPage *page_mol;
    4953  QtAtomInfoPage *page_atom;
  • src/UIElements/Views/Qt4/QtMoleculeList.cpp

    r7b38d3 r0ac85c3  
    5555// these attributes are skipped so far
    5656const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX;
    57 const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/};
     57const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Visibility", "Atoms","Formula","Occurrence"/*,"Size"*/};
    5858
    5959QtMoleculeList::QtMoleculeList(QWidget * _parent) :
     
    6969  setHeaderLabels(header);
    7070
    71   World::getInstance().signOn(this);//, World::MoleculeInserted);
    72   //World::getInstance().signOn(this, World::MoleculeRemoved);
     71  World::getInstance().signOn(this, World::MoleculeInserted);
     72  World::getInstance().signOn(this, World::MoleculeRemoved);
    7373
    7474
     
    7676  clearing = false;
    7777  selecting = false;
     78  ChangingChildrensVisibility = false;
    7879  refill();
    7980
     
    8182  //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
    8283  connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection)));
    83 
     84  connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(visibilityChanged(QTreeWidgetItem*, int)));
    8485}
    8586
    8687QtMoleculeList::~QtMoleculeList()
    8788{
    88   World::getInstance().signOff(this);//, World::MoleculeInserted);
    89   //World::getInstance().signOff(this, World::MoleculeRemoved);
     89  World::getInstance().signOff(this, World::MoleculeInserted);
     90  World::getInstance().signOff(this, World::MoleculeRemoved);
    9091}
    9192
    9293void QtMoleculeList::update(Observable *publisher) {
     94  ASSERT(0,
     95      "QtMoleculeList::update() - we did not sign up for any global updates.");
     96}
     97
     98void QtMoleculeList::recieveNotification(Observable *publisher, Notification_ptr notification) {
    9399
    94100  if (selecting)
     
    96102
    97103  dirty = true;
    98 
    99   // force an update from Qt...
    100   clearing = true;
    101   clear();
    102   clearing = false;
    103 }
     104}
     105
    104106
    105107void QtMoleculeList::refill() {
     
    108110
    109111  clear();
    110 
    111   // list of (unique) formulas in the world
    112   std::vector<Formula> formula;
     112  formula.clear();
     113  FormulaVisibilityCountMap.clear();
    113114
    114115  for (std::vector<molecule*>::const_iterator iter = molecules.begin();
     
    118119    // find group if already in list
    119120    QTreeWidgetItem *groupItem = NULL;
    120     for (unsigned int j=0;j<formula.size();j++)
    121       if ((*iter)->getFormula() == formula[j]){
    122         groupItem = topLevelItem(j);
    123         break;
    124       }
     121    const std::string &molecule_formula = (*iter)->getFormula().toString();
     122    FormulaTreeItemMap_t::const_iterator formulaiter =
     123        formula.find(molecule_formula);
    125124
    126125    // new molecule type -> create new group
    127     if (!groupItem){
    128       formula.push_back((*iter)->getFormula());
     126    if (formulaiter == formula.end()){
     127      // insert new formula entry into visibility
     128#ifndef NDEBUG
     129      std::pair< FormulaVisibilityCountMap_t::iterator, bool> visibilityinserter =
     130#endif
     131          FormulaVisibilityCountMap.insert(
     132              std::make_pair( molecule_formula, (unsigned int)0) );
     133      ASSERT( visibilityinserter.second,
     134          "QtMoleculeList::refill() - molecule with formula "
     135          +molecule_formula+" already in FormulaVisibilityCountMap.");
     136
     137      // create item and place into Map with formula as key
    129138      groupItem = new QTreeWidgetItem(this);
    130       groupItem->setText(0, QString("default"));
    131       groupItem->setText(1, QString::number(0));
    132       groupItem->setText(2, QString(""));
    133       groupItem->setText(3, "0");
     139      formula.insert( std::make_pair(molecule_formula, groupItem) );
     140      // fill item
     141      groupItem->setText(NAME, QString("default"));
     142      groupItem->setFlags((groupItem->flags() | Qt::ItemIsUserCheckable) ^ Qt::ItemIsSelectable);
     143      groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
     144      groupItem->setText(ATOMCOUNT, QString::number(0));
     145      groupItem->setText(FORMULA, QString(""));
     146      groupItem->setText(OCCURRENCE, "0");
    134147      groupItem->setData(0, Qt::UserRole, QVariant(-1));
     148    } else {
     149      groupItem = formulaiter->second;
    135150    }
    136151
    137152    // add molecule
    138153    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
    139     molItem->setText(0, QString((*iter)->getName().c_str()));
    140     molItem->setText(1, QString::number((*iter)->getAtomCount()));
    141     molItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
     154    molItem->setText(NAME, QString((*iter)->getName().c_str()));
     155    molItem->setFlags(molItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
     156    molItem->setCheckState(VISIBILITY, Qt::Unchecked);
     157    molItem->setText(ATOMCOUNT, QString::number((*iter)->getAtomCount()));
     158    molItem->setText(FORMULA, QString(molecule_formula.c_str()));
    142159    const int index = (*iter)->getId();
    143160    molItem->setData(0, Qt::UserRole, QVariant(index));
    144161    molItem->setSelected(World::getInstance().isSelected(*iter));
    145162
    146 
    147163    // increase group occurrence
    148     int count = groupItem->text(3).toInt() + 1;
    149     groupItem->setText(3, QString::number(count));
     164    int count = groupItem->text(OCCURRENCE).toInt() + 1;
     165    groupItem->setText(OCCURRENCE, QString::number(count));
    150166  }
    151167  dirty = false;
     
    161177
    162178void QtMoleculeList::subjectKilled(Observable *publisher) {
     179}
     180
     181void QtMoleculeList::visibilityChanged(QTreeWidgetItem* item, int column)
     182{
     183  if ((!clearing) && (!ChangingChildrensVisibility))
     184    if (column == VISIBILITY) {
     185      const moleculeId_t molid = item->data(0, Qt::UserRole).toInt();
     186      const bool visible = item->checkState(VISIBILITY);
     187      if (molid != (unsigned int)-1) { // molecule item
     188        const molecule * const _molecule =
     189            World::getInstance().getMolecule(MoleculeById(molid));
     190        ASSERT( _molecule != NULL,
     191            "QtMoleculeList::visibilityChanged() - molecule with id "
     192            +toString(molid)+" is not known to World.");
     193        const std::string &molecule_formula = _molecule->getFormula().toString();
     194        ASSERT( FormulaVisibilityCountMap.count(molecule_formula) != 0,
     195            "QtMoleculeList::visibilityChanged() - molecule with formula " +molecule_formula
     196            +" is not present in FormulaVisibilityCountMap.");
     197
     198        // get parent
     199        QTreeWidgetItem *groupItem = item->parent();
     200        ASSERT( groupItem != NULL,
     201            "QtMoleculeList::visibilityChanged() - item with id "+toString(molid)
     202            +" has not parent?");
     203        // check whether we have to set the group item
     204
     205        ChangingChildrensVisibility = true;
     206        if (visible) {
     207          ++(FormulaVisibilityCountMap[molecule_formula]);
     208          // compare with occurence/total number of molecules
     209          if (FormulaVisibilityCountMap[molecule_formula] ==
     210              (unsigned int)(groupItem->text(OCCURRENCE).toInt()))
     211            groupItem->setCheckState(VISIBILITY, Qt::Checked);
     212        } else {
     213          --(FormulaVisibilityCountMap[molecule_formula]);
     214          // none selected anymore?
     215          if (FormulaVisibilityCountMap[molecule_formula] == 0)
     216            groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
     217        }
     218        ChangingChildrensVisibility = false;
     219
     220        emit moleculesVisibilityChanged(molid, visible);
     221
     222      } else { // group item
     223
     224        // go through all children, but don't enter for groupItem once more
     225        ChangingChildrensVisibility = true;
     226        for (int i=0;i<item->childCount();++i) {
     227          QTreeWidgetItem *molItem = item->child(i);
     228          const moleculeId_t molid = molItem->data(0, Qt::UserRole).toInt();
     229          ASSERT( molid != (unsigned int)-1,
     230              "QtMoleculeList::visibilityChanged() - to child with index"
     231              +toString(i)+" there is no molecule?");
     232          molItem->setCheckState(VISIBILITY, visible ? Qt::Checked : Qt::Unchecked);
     233
     234          // emit signal
     235          emit moleculesVisibilityChanged(molid, visible);
     236        }
     237        // set current number of visible children
     238        const std::string molecule_formula =
     239            item->text(FORMULA).toStdString();
     240        FormulaVisibilityCountMap[molecule_formula] =
     241            visible ? item->text(OCCURRENCE).toInt() : 0;
     242
     243        ChangingChildrensVisibility = false;
     244      }
     245    }
    163246}
    164247
     
    185268  // Select all molecules which belong to newly selected rows.
    186269  QModelIndex index;
    187   QModelIndexList items = selected.indexes();
    188   foreach (index, items)
    189     if (index.column() == 0){
    190       int mol_id = model()->data(index, Qt::UserRole).toInt();
    191       if (mol_id < 0)
    192         continue;
    193       //std::cout << "select molecule" << std::endl;
    194       MoleCuilder::SelectionMoleculeById(mol_id);
    195     }
     270  {
     271    QModelIndexList items = selected.indexes();
     272    molids_t ids;
     273    ids.reserve(items.size());
     274    foreach (index, items)
     275      if (index.column() == 0){
     276        int mol_id = model()->data(index, Qt::UserRole).toInt();
     277        if (mol_id < 0)
     278          continue;
     279        ids.push_back(mol_id);
     280        //std::cout << "select molecule" << std::endl;
     281      }
     282    MoleCuilder::SelectionMoleculeById(ids);
     283  }
    196284
    197285  // Unselect all molecules which belong to newly unselected rows.
    198   items = deselected.indexes();
    199   foreach (index, items)
    200     if (index.column() == 0){
    201       int mol_id = model()->data(index, Qt::UserRole).toInt();
    202       if (mol_id < 0)
    203         continue;
    204       //std::cout << "unselect molecule" << std::endl;
    205       MoleCuilder::SelectionNotMoleculeById(mol_id);
    206     }
     286  {
     287    QModelIndexList items = deselected.indexes();
     288    molids_t ids;
     289    ids.reserve(items.size());
     290    foreach (index, items)
     291      if (index.column() == 0){
     292        int mol_id = model()->data(index, Qt::UserRole).toInt();
     293        if (mol_id < 0)
     294          continue;
     295        //std::cout << "unselect molecule" << std::endl;
     296        ids.push_back(mol_id);
     297      }
     298    MoleCuilder::SelectionNotMoleculeById(ids);
     299  }
    207300
    208301  selecting = false;
  • src/UIElements/Views/Qt4/QtMoleculeList.hpp

    r7b38d3 r0ac85c3  
    1414#endif
    1515
     16#include <QtGui/QTreeWidget>
    1617
    17 #include <QtGui/QTreeWidget>
     18#include <map>
     19#include <string>
     20
    1821#include "CodePatterns/Observer/Observer.hpp"
     22
     23#include "types.hpp"
    1924
    2025class molecule;
     
    3136protected:
    3237  virtual void update(Observable *publisher);
     38  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
    3339  virtual void subjectKilled(Observable *publisher);
    3440  virtual void paintEvent(QPaintEvent * event);
     
    3642
    3743  static const int COLUMNCOUNT;
    38   enum {NAME,ATOMCOUNT,FORMULA,OCCURRENCE,COLUMNTYPES_MAX} COLUMNTYPES;
     44  enum {NAME,VISIBILITY,ATOMCOUNT,FORMULA,OCCURRENCE,COLUMNTYPES_MAX} COLUMNTYPES;
    3945  static const char *COLUMNNAMES[];
    4046
    4147private slots:
    4248  void moleculeChanged();
     49  void visibilityChanged(QTreeWidgetItem*, int);
    4350
    4451  void rowsSelected(const QItemSelection & selected, const QItemSelection & deselected);
     
    4754  void moleculeSelected(molecule*);
    4855  void moleculeUnSelected(molecule*);
     56  void moleculesVisibilityChanged(const moleculeId_t, bool);
    4957
    5058private:
     
    5260  bool clearing;
    5361  bool selecting;
     62  bool ChangingChildrensVisibility;
     63
     64  typedef std::map<std::string, unsigned int> FormulaVisibilityCountMap_t;
     65  FormulaVisibilityCountMap_t FormulaVisibilityCountMap;
     66
     67  typedef std::map<std::string, QTreeWidgetItem*> FormulaTreeItemMap_t;
     68  //!> map of (unique) formulas in the world
     69  FormulaTreeItemMap_t formula;
    5470};
    5571
  • src/UIElements/Views/Qt4/QtToolBar.cpp

    r7b38d3 r0ac85c3  
    2828 */
    2929
    30 
    31 
    32 
    3330// include config.h
    3431#ifdef HAVE_CONFIG_H
     
    3633#endif
    3734
    38 
    3935#include "QtToolBar.hpp"
    4036
    4137#include "CodePatterns/MemDebug.hpp"
    4238
     39#include "CodePatterns/Observer/Notification.hpp"
     40
     41#include "Actions/ActionQueue.hpp"
     42
    4343QtToolBar::QtToolBar(QWidget * _parent) :
    44   QToolBar(_parent)
     44  QToolBar(_parent),
     45  Observer("QToolBar"),
     46  ActionQueue_observing(false),
     47  undoaction(addActionItem("undo", "undo the last Action", "edit-undo")),
     48  redoaction(addActionItem("redo", "redo the last Action", "edit-redo"))
    4549{
    46   addActionItem("undo", "undo the last Action", "edit-undo");
    47   addActionItem("redo", "redo the last Action", "edit-redo");
     50  // gray out undo/redo buttons initially
     51  undoaction->setEnabled(false);
     52  redoaction->setEnabled(false);
     53
     54  // sign in
     55  MoleCuilder::ActionQueue::getInstance().signOn(this, MoleCuilder::ActionQueue::ActionQueued);
     56  ActionQueue_observing = true;
    4857}
    4958
     
    5160QtToolBar::~QtToolBar()
    5261{
     62  // sign off
     63  if (ActionQueue_observing)
     64    MoleCuilder::ActionQueue::getInstance().signOff(this, MoleCuilder::ActionQueue::ActionQueued);
    5365}
    5466
    5567
    56 void QtToolBar::addActionItem(const std::string &token, const std::string &description, const std::string &icon_name)
     68QAction * QtToolBar::addActionItem(
     69    const std::string &token,
     70    const std::string &description,
     71    const std::string &icon_name)
    5772{
    5873  QAction *action = addAction(QString(description.c_str()));
     
    6378  plumbing.push_back(pipe);
    6479  present_actions.insert( token );
     80  return action;
    6581}
    6682
     
    7288}
    7389
     90void QtToolBar::update(Observable *publisher)
     91{
     92  ASSERT(0, "QtToolBar::update() - this should never be called, we are only subscribed to channels.");
     93}
     94
     95void QtToolBar::subjectKilled(Observable *publisher)
     96{
     97  ActionQueue_observing = false;
     98}
     99
     100void QtToolBar::recieveNotification(Observable *publisher, Notification_ptr notification)
     101{
     102  if (dynamic_cast<MoleCuilder::ActionQueue *>(publisher) != NULL) {
     103    switch(notification->getChannelNo()) {
     104      case MoleCuilder::ActionQueue::ActionQueued:
     105        undoaction->setEnabled(MoleCuilder::ActionQueue::getInstance().canUndo());
     106        redoaction->setEnabled(MoleCuilder::ActionQueue::getInstance().canRedo());
     107        break;
     108      default:
     109        ASSERT(0, "QtToolBar::recieveNotification() - cannot get here, not subscribed to channel "
     110            +toString(notification->getChannelNo()));
     111        break;
     112    }
     113  } else {
     114    ASSERT(0, "QtToolBar::recieveNotification() - cannot get here, we are only subscribed to ActionQueue.");
     115  }
     116}
  • src/UIElements/Views/Qt4/QtToolBar.hpp

    r7b38d3 r0ac85c3  
    2727
    2828
    29 class QtToolBar : public QToolBar
     29class QtToolBar : public QToolBar, public Observer
    3030{
    3131  Q_OBJECT
     
    3939   * @param description description to appear as tooltip
    4040   * @param icon_name name of icon
     41   * @return ref to newly created action
    4142   */
    42   void addActionItem(const std::string &token, const std::string &description, const std::string &icon_name);
     43  QAction * addActionItem(
     44      const std::string &token,
     45      const std::string &description,
     46      const std::string &icon_name);
    4347
    4448  /** Function to add a set of favorite actions.
     
    5761  const present_actions_t & getPresentActions() const
    5862  { return present_actions; }
     63
     64  void update(Observable *publisher);
     65  void subjectKilled(Observable *publisher);
     66  void recieveNotification(Observable *publisher, Notification_ptr notification);
    5967
    6068private:
     
    105113  //!> set of already present action icons
    106114  present_actions_t present_actions;
     115
     116  //!> sign in to ActionQueue?
     117  bool ActionQueue_observing;
     118  //!> ref to undoaction to gray out
     119  QAction *undoaction;
     120  //!> ref to redoaction to gray out
     121  QAction *redoaction;
    107122};
    108123
  • src/UIElements/Views/Qt4/QtToolBar_QtFavoriteActions.cpp

    r7b38d3 r0ac85c3  
    4646#include "CodePatterns/Assert.hpp"
    4747#include "CodePatterns/Log.hpp"
    48 #include "CodePatterns/Observer/Observer.hpp"
    4948
    5049#include "Actions/Action.hpp"
  • src/World.cpp

    r7b38d3 r0ac85c3  
    245245    WorldTime::getInstance().setTime(_step);
    246246
    247     // TODO: removed when BondGraph creates the adjacency
    248     // 3. remove all of World's molecules
    249     for (MoleculeIterator iter = getMoleculeIter();
    250         getMoleculeIter() != moleculeEnd();
    251         iter = getMoleculeIter()) {
    252       getMolecules()->erase(*iter);
    253       destroyMolecule(*iter);
    254     }
    255 
    256247    // 4. scan for connected subgraphs => molecules
    257248    DepthFirstSearchAnalysis DFS;
     
    304295
    305296void World::destroyMolecule(molecule* mol){
    306   OBSERVE;
    307297  ASSERT(mol,"Molecule that was meant to be destroyed did not exist");
    308298  destroyMolecule(mol->getId());
     
    319309  }
    320310  mol->signOff(this);
     311  // TODO: removed when depcreated MoleculeListClass is gone
     312  molecules_deprecated->erase(mol);
    321313  DeleteMolecule(mol);
    322314  if (isMoleculeSelected(id))
     
    365357    NOTIFY(AtomRemoved);
    366358  }
     359  // check if it's the last atom
     360  molecule *_mol = atom->getMolecule();
     361  if ((_mol == NULL) || (_mol->getAtomCount() > 1))
     362    _mol = NULL;
    367363  DeleteAtom(atom);
    368364  if (isAtomSelected(id))
     
    370366  atoms.erase(id);
    371367  atomIdPool.releaseId(id);
     368  // remove molecule if empty
     369  if (_mol != NULL)
     370    destroyMolecule(_mol);
    372371}
    373372
     
    555554  std::for_each(invertedSelection.begin(),invertedSelection.end(),
    556555      std::bind1st(std::mem_fun(selector),this)); // func is select... see above
     556}
     557
     558void World::popAtomSelection(){
     559  OBSERVE;
     560  NOTIFY(SelectionChanged);
     561  selectedAtoms = selectedAtoms_Stack.top();
     562  selectedAtoms_Stack.pop();
     563}
     564
     565void World::pushAtomSelection(){
     566  OBSERVE;
     567  NOTIFY(SelectionChanged);
     568  selectedAtoms_Stack.push( selectedAtoms );
     569  selectedAtoms.clear();
    557570}
    558571
     
    685698  std::for_each(invertedSelection.begin(),invertedSelection.end(),
    686699      std::bind1st(std::mem_fun(selector),this)); // func is select... see above
     700}
     701
     702void World::popMoleculeSelection(){
     703  OBSERVE;
     704  NOTIFY(SelectionChanged);
     705  selectedMolecules = selectedMolecules_Stack.top();
     706  selectedMolecules_Stack.pop();
     707}
     708
     709void World::pushMoleculeSelection(){
     710  OBSERVE;
     711  NOTIFY(SelectionChanged);
     712  selectedMolecules_Stack.push( selectedMolecules );
     713  selectedMolecules.clear();
    687714}
    688715
  • src/World.hpp

    r7b38d3 r0ac85c3  
    2020#include <vector>
    2121#include <set>
     22#include <stack>
    2223#include <boost/thread.hpp>
    2324#include <boost/shared_ptr.hpp>
     
    373374  void clearAtomSelection();
    374375  void invertAtomSelection();
     376  void popAtomSelection();
     377  void pushAtomSelection();
    375378  void selectAtom(const atom*);
    376379  void selectAtom(const atomId_t);
     
    390393  void clearMoleculeSelection();
    391394  void invertMoleculeSelection();
     395  void popMoleculeSelection();
     396  void pushMoleculeSelection();
    392397  void selectMolecule(const molecule*);
    393398  void selectMolecule(const moleculeId_t);
     
    486491  AtomSet atoms;
    487492  AtomSet selectedAtoms;
     493  std::stack<AtomSet> selectedAtoms_Stack;
    488494  /**
    489495   * stores the pool for all available AtomIds below currAtomId
     
    495501  MoleculeSet molecules;
    496502  MoleculeSet selectedMolecules;
     503  std::stack<MoleculeSet> selectedMolecules_Stack;
    497504  /**
    498505   * stores the pool for all available AtomIds below currAtomId
  • src/molecule.cpp

    r7b38d3 r0ac85c3  
    4949#include "CodePatterns/enumeration.hpp"
    5050#include "CodePatterns/Log.hpp"
     51#include "CodePatterns/Observer/Notification.hpp"
    5152#include "config.hpp"
    5253#include "Descriptors/AtomIdDescriptor.hpp"
     
    146147  OBSERVE;
    147148  if(atomIdPool.reserveId(newNr)){
     149    _lastchangedatom = target;
    148150    NOTIFY(AtomNrChanged);
    149151    if (oldNr != -1)  // -1 is reserved and indicates no number
     
    207209{
    208210  OBSERVE;
    209   NOTIFY(AtomRemoved);
    210211  const_iterator iter = loc;
    211212  ++iter;
    212213  atom * const _atom = const_cast<atom *>(*loc);
     214  {
     215    _lastchangedatom = _atom;
     216    NOTIFY(AtomRemoved);
     217  }
    213218  atomIds.erase( _atom->getId() );
    214219  {
     
    226231{
    227232  OBSERVE;
    228   NOTIFY(AtomRemoved);
     233  {
     234    _lastchangedatom = key;
     235    NOTIFY(AtomRemoved);
     236  }
    229237  const_iterator iter = find(key);
    230238  if (iter != end()){
     
    247255  OBSERVE;
    248256  NOTIFY(AtomInserted);
     257  _lastchangedatom = key;
    249258  std::pair<iterator,bool> res = atomIds.insert(key->getId());
    250259  if (res.second) { // push atom if went well
     
    637646/** Destroys all atoms inside this molecule.
    638647 */
    639 void molecule::removeAtomsinMolecule()
     648void removeAtomsinMolecule(molecule *&_mol)
    640649{
    641650  // remove each atom from world
    642   for(iterator AtomRunner = begin(); !empty(); AtomRunner = begin())
     651  for(molecule::iterator AtomRunner = _mol->begin(); !_mol->empty(); AtomRunner = _mol->begin())
    643652    World::getInstance().destroyAtom(*AtomRunner);
     653  // make sure that pointer os not usable
     654  _mol = NULL;
    644655};
    645656
     
    974985    for(const_iterator iter = begin(); iter != end(); ++iter)
    975986      center += (*iter)->getPosition();
    976     center *= 1./(double)size();
     987    if (begin() != end())
     988      center *= 1./(double)size();
    977989    for(const_iterator iter = begin(); iter != end(); ++iter) {
    978990      const Vector &position = (*iter)->getPosition();
     
    9951007}
    9961008
     1009void molecule::update(Observable *publisher)
     1010{
     1011  ASSERT(0, "molecule::update() - did not sign on for any general updates.");
     1012}
     1013
     1014void molecule::recieveNotification(Observable *publisher, Notification_ptr notification)
     1015{
     1016  const atom * const _atom = dynamic_cast<atom *>(publisher);
     1017  if ((_atom != NULL) && containsAtom(_atom)) {
     1018#ifdef LOG_OBSERVER
     1019    observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(static_cast<Observer *>(this))
     1020          << " received notification from atom " << _atom->getId() << " for channel "
     1021          << notification->getChannelNo() << ".";
     1022#endif
     1023    switch (notification->getChannelNo()) {
     1024      case AtomObservable::PositionChanged:
     1025      {
     1026        // emit others about one of our atoms moved
     1027        _lastchangedatom = const_cast<atom *>(_atom);
     1028        OBSERVE;
     1029        NOTIFY(AtomMoved);
     1030        break;
     1031      }
     1032      default:
     1033        ASSERT( 0, "molecule::recieveNotification() - we did not sign up for channel "
     1034            +toString(notification->getChannelNo()));
     1035        break;
     1036    }
     1037  }
     1038}
     1039
     1040void molecule::subjectKilled(Observable *publisher)
     1041{
     1042  // do nothing, atom does it all
     1043}
     1044
     1045
    9971046// construct idpool
    9981047CONSTRUCT_IDPOOL(atomId_t, continuousId)
  • src/molecule.hpp

    r7b38d3 r0ac85c3  
    5757/************************************* Class definitions ****************************************/
    5858
     59/** External function to remove all atoms since this will also delete the molecule
     60 *
     61 * \param _mol ref pointer to molecule to destroy
     62 */
     63void removeAtomsinMolecule(molecule *&_mol);
     64
    5965/** The complete molecule.
    6066 * Class incorporates number of types
     
    105111    AtomRemoved,
    106112    AtomNrChanged,
     113    AtomMoved,
    107114    MoleculeNameChanged,
    108115    NotificationType_MAX
    109116  };
     117
     118  //>! access to last changed element (atom)
     119  const atom* lastChanged() const
     120  { return _lastchangedatom; }
    110121
    111122public:
     
    257268  bool UnlinkAtom(atom *pointer);
    258269  bool CleanupMolecule();
    259   void removeAtomsinMolecule();
    260270
    261271  /// Add/remove atoms to/from molecule.
     
    318328  void flipActiveFlag();
    319329
     330  virtual void update(Observable *publisher);
     331  virtual void recieveNotification(Observable *publisher, Notification_ptr notification);
     332  virtual void subjectKilled(Observable *publisher);
     333
    320334private:
     335  friend const atom *detail::lastChanged<atom>();
     336  atom *_lastchangedatom;
     337
    321338  int last_atom; //!< number given to last atom
    322339};
  • tests/regression/Atoms/Translation/testsuite-atoms-translation.at

    r7b38d3 r0ac85c3  
    2424AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Atoms/Translation/pre/test.xyz $file], 0)
    2525AT_CHECK([chmod u+w $file], 0)
    26 AT_CHECK([../../molecuilder -i $file --select-all-atoms -t "1,0,0"], 0, [stdout], [stderr])
     26AT_CHECK([../../molecuilder -i $file --select-all-atoms --translate-atoms --position "1,0,0"], 0, [stdout], [stderr])
    2727AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Atoms/Translation/post/test-shifted.xyz], 0, [ignore], [ignore])
    2828
     
    3636AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Atoms/Translation/pre/test.xyz $file], 0)
    3737AT_CHECK([chmod u+w $file], 0)
    38 AT_CHECK([../../molecuilder -i $file --select-all-atoms -t "1,0,0" --undo], 0, [stdout], [stderr])
     38AT_CHECK([../../molecuilder -i $file --select-all-atoms --translate-atoms --position "1,0,0" --undo], 0, [stdout], [stderr])
    3939AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Atoms/Translation/pre/test.xyz], 0, [ignore], [ignore])
    4040
     
    4848AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Atoms/Translation/pre/test.xyz $file], 0)
    4949AT_CHECK([chmod u+w $file], 0)
    50 AT_CHECK([../../molecuilder -i $file --select-all-atoms -t "1,0,0" --undo --redo], 0, [stdout], [stderr])
     50AT_CHECK([../../molecuilder -i $file --select-all-atoms --translate-atoms --position "1,0,0" --undo --redo], 0, [stdout], [stderr])
    5151AT_CHECK([diff -I '.*Created by molecuilder.*' $file ${abs_top_srcdir}/tests/regression/Atoms/Translation/post/test-shifted.xyz], 0, [ignore], [ignore])
    5252
  • tests/regression/Filling/SuspendInWater/pre/test.conf

    r7b38d3 r0ac85c3  
    2828OutSrcStep      5       # Output "restart" data every ..th step
    2929TargetTemp      0.000950045     # Target temperature
    30 MaxPsiStep      0       # number of Minimisation steps per state (0 - default)
     30MaxPsiStep      3       # number of Minimisation steps per state (0 - default)
    3131EpsWannier      1e-07   # tolerance value for spread minimisation of orbitals
    3232
     
    3535RelEpsTotalE    1e-07   # relative change in total energy
    3636RelEpsKineticE  1e-05   # relative change in kinetic energy
    37 MaxMinStopStep  0       # check every ..th steps
    38 MaxMinGapStopStep       0       # check every ..th steps
     37MaxMinStopStep  12      # check every ..th steps
     38MaxMinGapStopStep       1       # check every ..th steps
    3939
    4040# Values specifying when to stop for INIT, otherwise same as above
     
    4242InitRelEpsTotalE        1e-05   # relative change in total energy
    4343InitRelEpsKineticE      0.0001  # relative change in kinetic energy
    44 InitMaxMinStopStep      0       # check every ..th steps
    45 InitMaxMinGapStopStep   0       # check every ..th steps
     44InitMaxMinStopStep      12      # check every ..th steps
     45InitMaxMinGapStopStep   1       # check every ..th steps
    4646
    4747BoxLength                       # (Length of a unit cell)
     
    5555RiemannTensor   0       # (Use metric)
    5656PsiType         0       # 0 - doubly occupied, 1 - SpinUp,SpinDown
    57 MaxPsiDouble    0       # here: specifying both maximum number of SpinUp- and -Down-states
    58 PsiMaxNoUp      0       # here: specifying maximum number of SpinUp-states
    59 PsiMaxNoDown    0       # here: specifying maximum number of SpinDown-states
     57MaxPsiDouble    12      # here: specifying both maximum number of SpinUp- and -Down-states
     58PsiMaxNoUp      12      # here: specifying maximum number of SpinUp-states
     59PsiMaxNoDown    12      # here: specifying maximum number of SpinDown-states
    6060AddPsis         0       # Additional unoccupied Psis for bandgap determination
    6161
     
    6464IsAngstroem     1       # 0 - Bohr, 1 - Angstroem
    6565RelativeCoord   0       # whether ion coordinates are relative (1) or absolute (0)
    66 MaxTypes        2       # maximum number of different ion types
     66MaxTypes        3       # maximum number of different ion types
    6767
    6868# Ion type data (PP = PseudoPotential, Z = atomic number)
    6969#Ion_TypeNr.    Amount  Z       RGauss  L_Max(PP)L_Loc(PP)IonMass       # chemical name, symbol
    70 Ion_Type1       8       1       1.0     3       3       1.00800000000   Hydrogen        H
     70Ion_Type1       10      1       1.0     3       3       1.00800000000   Hydrogen        H
    7171Ion_Type2       3       6       1.0     3       3       12.01100000000  Carbon  C
     72Ion_Type3       1       8       1.0     3       3       15.99900000000  Oxygen  O
    7273#Ion_TypeNr._Nr.R[0]    R[1]    R[2]    MoveType (0 MoveIon, 1 FixedIon)
    73 Ion_Type2_1     9.782085945     3.275186040     3.535886037     0 # molecule nr 0
    74 Ion_Type2_2     8.532785963     4.158586027     3.535886037     0 # molecule nr 1
    75 Ion_Type2_3     7.283585982     3.275186040     3.535886037     0 # molecule nr 2
    76 Ion_Type1_1     9.782085945     2.645886050     2.645886050     0 # molecule nr 3
    77 Ion_Type1_2     9.782085945     2.645886050     4.425886024     0 # molecule nr 4
    78 Ion_Type1_3     10.672039608    3.904536878     3.535886037     0 # molecule nr 5
    79 Ion_Type1_4     8.532785963     4.787886018     2.645886050     0 # molecule nr 6
    80 Ion_Type1_5     8.532785963     4.787886018     4.425886024     0 # molecule nr 7
    81 Ion_Type1_6     6.393632318     3.904536877     3.535886037     0 # molecule nr 8
    82 Ion_Type1_7     7.283585982     2.645886050     2.645886050     0 # molecule nr 9
    83 Ion_Type1_8     7.283585982     2.645886050     4.425886024     0 # molecule nr 10
     74Ion_Type1_1     9.782085945     2.645886050     2.645886050     0 # molecule nr 0
     75Ion_Type1_2     9.782085945     2.645886050     4.425886024     0 # molecule nr 1
     76Ion_Type1_3     10.672039608    3.904536878     3.535886037     0 # molecule nr 2
     77Ion_Type1_4     8.532785963     4.787886018     2.645886050     0 # molecule nr 3
     78Ion_Type1_5     8.532785963     4.787886018     4.425886024     0 # molecule nr 4
     79Ion_Type1_6     6.393632318     3.904536877     3.535886037     0 # molecule nr 5
     80Ion_Type1_7     7.283585982     2.645886050     2.645886050     0 # molecule nr 6
     81Ion_Type1_8     7.283585982     2.645886050     4.425886024     0 # molecule nr 7
     82Ion_Type2_1     9.782085945     3.275186040     3.535886037     0 # molecule nr 8
     83Ion_Type2_2     8.532785963     4.158586027     3.535886037     0 # molecule nr 9
     84Ion_Type2_3     7.283585982     3.275186040     3.535886037     0 # molecule nr 10
     85Ion_Type3_1     2.000000000     2.000000000     2.000000000     0 # molecule nr 11
     86Ion_Type1_9     2.758602000     2.000000000     2.504284000     0 # molecule nr 12
     87Ion_Type1_10    2.758602000     2.000000000     1.495716000     0 # molecule nr 13
  • tests/regression/Filling/SuspendInWater/testsuite-suspend-in-water.at

    r7b38d3 r0ac85c3  
    1818### suspend in water with certain density
    1919
     20AT_SETUP([Filling - suspend in water fails with rho=1])
     21AT_KEYWORDS([filling suspend-in-water])
     22
     23file=test.conf
     24AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/test.conf $file], 0)
     25AT_CHECK([chmod u+w $file], 0)
     26AT_CHECK([../../molecuilder -i $file -I -v 3 --select-molecule-by-id 0 -u --density 1.], 5, [stdout], [stderr])
     27
     28AT_CLEANUP
     29
     30AT_SETUP([Filling - suspend in water fails with just one molecule])
     31AT_KEYWORDS([filling suspend-in-water])
     32
     33file=single_molecule.conf
     34AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/$file $file], 0)
     35AT_CHECK([chmod u+w $file], 0)
     36AT_CHECK([../../molecuilder -i $file -I -v 3 --select-molecule-by-id 0 -u --density 1.], 5, [stdout], [stderr])
     37AT_CHECK([grep "at least two molecules" stdout], 0, [ignore], [ignore])
     38
     39AT_CLEANUP
     40
     41# rho must be on same side of 1 as the present density
     42AT_SETUP([Filling - suspend in water fails with wrong rho])
     43AT_KEYWORDS([filling suspend-in-water])
     44
     45file=test.conf
     46AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/$file $file], 0)
     47AT_CHECK([chmod u+w $file], 0)
     48AT_CHECK([../../molecuilder -i $file -I -v 3 --select-molecule-by-id 0 -u --density .5], 5, [stdout], [stderr])
     49AT_CHECK([grep "Desired and present molecular densities must both be either" stdout], 0, [ignore], [ignore])
     50
     51AT_CLEANUP
     52
    2053AT_SETUP([Filling - suspend in water])
    2154AT_XFAIL_IF([/bin/true])
     
    2356
    2457file=test.conf
    25 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/test.conf $file], 0)
     58AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/$file $file], 0)
    2659AT_CHECK([chmod u+w $file], 0)
    27 AT_CHECK([../../molecuilder -i $file  -v 3 --select-molecule-by-id 0 -u 1.3], 0, [stdout], [stderr])
     60AT_CHECK([../../molecuilder -i $file -I -v 3 --select-molecule-by-id 0 -u --density 2.], 5, [stdout], [stderr])
    2861AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/post/test.conf], 0, [ignore], [ignore])
    2962
    3063AT_CLEANUP
    31 
    3264
    3365AT_SETUP([Filling - suspend in water with Undo])
     
    3870AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/test.conf $file], 0)
    3971AT_CHECK([chmod u+w $file], 0)
    40 AT_CHECK([../../molecuilder -i $file  -v 3 --select-molecule-by-id 0 -u 1.3 --undo], 0, [stdout], [stderr])
     72AT_CHECK([../../molecuilder -i $file -I -v 3 --select-molecule-by-id 0 -u --density 2. --undo], 0, [stdout], [stderr])
    4173AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/post/test.conf], 0, [ignore], [ignore])
    4274
     
    5183AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/pre/test.conf $file], 0)
    5284AT_CHECK([chmod u+w $file], 0)
    53 AT_CHECK([../../molecuilder -i $file  -v 3 --select-molecule-by-id 0 -u 1.3 --undo --redo], 0, [stdout], [stderr])
     85AT_CHECK([../../molecuilder -i $file -I -v 3 --select-molecule-by-id 0 -u --density 2. --undo --redo], 0, [stdout], [stderr])
    5486AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Filling/SuspendInWater/post/test.conf], 0, [ignore], [ignore])
    5587
  • tests/regression/Makefile.am

    r7b38d3 r0ac85c3  
    9898        $(srcdir)/Molecules/ForceAnnealing/testsuite-molecules-force-annealing.at \
    9999        $(srcdir)/Molecules/LinearInterpolationofTrajectories/testsuite-molecules-linear-interpolation-of-trajectories.at \
     100        $(srcdir)/Molecules/Remove/testsuite-molecules-remove.at \
    100101        $(srcdir)/Molecules/RotateAroundOrigin/testsuite-molecules-rotate-around-origin.at \
    101102        $(srcdir)/Molecules/RotateAroundSelf/testsuite-molecules-rotate-around-self.at \
     
    201202        $(srcdir)/Selection/Atoms/ClearAtoms/testsuite-selection-clear-atoms.at \
    202203        $(srcdir)/Selection/Atoms/InvertAtoms/testsuite-selection-invert-atoms.at \
     204        $(srcdir)/Selection/Atoms/PopAtomSelection/testsuite-selection-pop-atom-selection.at \
     205        $(srcdir)/Selection/Atoms/PushAtomSelection/testsuite-selection-push-atom-selection.at \
    203206        $(srcdir)/Selection/Molecules/testsuite-selection-molecules.at \
    204207        $(srcdir)/Selection/Molecules/AllMolecules/testsuite-selection-select-all-molecules.at \
     
    218221        $(srcdir)/Selection/Molecules/MoleculeOfAtom/testsuite-selection-select-atoms-molecules.at \
    219222        $(srcdir)/Selection/Molecules/MoleculeOfAtom/testsuite-selection-unselect-atoms-molecules.at \
     223        $(srcdir)/Selection/Molecules/PopMoleculeSelection/testsuite-selection-pop-molecule-selection.at \
     224        $(srcdir)/Selection/Molecules/PushMoleculeSelection/testsuite-selection-push-molecule-selection.at \
    220225        $(srcdir)/Tesselation/testsuite-tesselation.at \
    221226        $(srcdir)/Tesselation/BigConvex/testsuite-tesselation-big-convex-envelope.at \
  • tests/regression/Molecules/Translation-Periodic/testsuite-molecules-translation-periodic.at

    r7b38d3 r0ac85c3  
    11#
    22#    MoleCuilder - creates and alters molecular systems
    3 #    Copyright (C) 2008-2012 University of Bonn
     3#    Copyright (C) 2014 Frederik Heber
    44#
    55#    This program is free software: you can redistribute it and/or modify
     
    1919
    2020AT_SETUP([Molecules - Translation with periodic boundaries])
    21 AT_KEYWORDS([molecules translate-atoms])
     21AT_KEYWORDS([molecules translate-molecules])
    2222
    2323file=test.conf
    2424AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation-Periodic/pre/test.conf $file], 0)
    2525AT_CHECK([chmod u+w $file], 0)
    26 AT_CHECK([../../molecuilder -i $file  --select-molecule-by-id 0 --select-molecules-atoms -t "-8., -8., -8." --periodic 1], 0, [stdout], [stderr])
     26AT_CHECK([../../molecuilder -i $file  --select-molecule-by-id 0 --translate-molecules --position "-8., -8., -8." --periodic 1], 0, [stdout], [stderr])
    2727AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation-Periodic/post/test.conf], 0, [ignore], [ignore])
    2828
     
    3131
    3232AT_SETUP([Molecules - Translation with periodic boundaries with Undo])
    33 AT_KEYWORDS([molecules translate-atoms undo])
     33AT_KEYWORDS([molecules translate-molecules undo])
    3434
    3535file=test.conf
    3636AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation-Periodic/pre/test.conf $file], 0)
    3737AT_CHECK([chmod u+w $file], 0)
    38 AT_CHECK([../../molecuilder -i $file  --select-molecule-by-id 0 --select-molecules-atoms -t "-8., -8., -8." --periodic 1 --undo], 0, [stdout], [stderr])
     38AT_CHECK([../../molecuilder -i $file  --select-molecule-by-id 0 --translate-molecules --position "-8., -8., -8." --periodic 1 --undo], 0, [stdout], [stderr])
    3939AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation-Periodic/post/test-undo.conf], 0, [ignore], [ignore])
    4040
     
    4343
    4444AT_SETUP([Molecules - Translation with periodic boundaries with Redo])
    45 AT_KEYWORDS([molecules translate-atoms redo])
     45AT_KEYWORDS([molecules translate-molecules redo])
    4646
    4747file=test.conf
    4848AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation-Periodic/pre/test.conf $file], 0)
    4949AT_CHECK([chmod u+w $file], 0)
    50 AT_CHECK([../../molecuilder -i $file  --select-molecule-by-id 0 --select-molecules-atoms -t "-8., -8., -8." --periodic 1 --undo --redo], 0, [stdout], [stderr])
     50AT_CHECK([../../molecuilder -i $file  --select-molecule-by-id 0 --translate-molecules --position "-8., -8., -8." --periodic 1 --undo --redo], 0, [stdout], [stderr])
    5151AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation-Periodic/post/test.conf], 0, [ignore], [ignore])
    5252
  • tests/regression/Molecules/Translation/testsuite-molecules-translation.at

    r7b38d3 r0ac85c3  
    11#
    22#    MoleCuilder - creates and alters molecular systems
    3 #    Copyright (C) 2008-2012 University of Bonn
     3#    Copyright (C) 2014 Frederik Heber
    44#
    55#    This program is free software: you can redistribute it and/or modify
     
    1919
    2020AT_SETUP([Molecules - Translation])
    21 AT_KEYWORDS([molecules translate-atoms])
     21AT_KEYWORDS([molecules translate-molecules])
    2222
    2323file=test.conf
    2424AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation/pre/test.conf $file], 0)
    2525AT_CHECK([chmod u+w $file], 0)
    26 AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --select-molecules-atoms -t "1., 1., 1." --periodic 0], 0, [stdout], [stderr])
     26AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --translate-molecules --position "1., 1., 1." --periodic 0], 0, [stdout], [stderr])
    2727AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation/post/test.conf], 0, [ignore], [ignore])
    2828
     
    3030AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation/pre/test2.conf $file], 0)
    3131AT_CHECK([chmod u+w $file], 0)
    32 AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --select-molecules-atoms -t "-1., -1., -1." --periodic 0], 0, [stdout], [stderr])
     32AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --translate-molecules --position "-1., -1., -1." --periodic 0], 0, [stdout], [stderr])
    3333AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation/post/test2.conf], 0, [ignore], [ignore])
    3434
     
    3737
    3838AT_SETUP([Molecules - Translation with Undo])
    39 AT_KEYWORDS([molecules translate-atoms undo])
     39AT_KEYWORDS([molecules translate-molecules undo])
    4040
    4141file=test.conf
    4242AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation/pre/test.conf $file], 0)
    4343AT_CHECK([chmod u+w $file], 0)
    44 AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --select-molecules-atoms -t "1., 1., 1." --periodic 0 --undo], 0, [stdout], [stderr])
     44AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --translate-molecules --position "1., 1., 1." --periodic 0 --undo], 0, [stdout], [stderr])
    4545AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation/post/test-undo.conf], 0, [ignore], [ignore])
    4646
     
    4848AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation/pre/test2.conf $file], 0)
    4949AT_CHECK([chmod u+w $file], 0)
    50 AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --select-molecules-atoms -t "-1., -1., -1." --periodic 0 --undo], 0, [stdout], [stderr])
     50AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --translate-molecules --position "-1., -1., -1." --periodic 0 --undo], 0, [stdout], [stderr])
    5151AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation/post/test2-undo.conf], 0, [ignore], [ignore])
    5252
     
    5555
    5656AT_SETUP([Molecules - Translation with Redo])
    57 AT_KEYWORDS([molecules translate-atoms redo])
     57AT_KEYWORDS([molecules translate-molecules redo])
    5858
    5959file=test.conf
    6060AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation/pre/test.conf $file], 0)
    6161AT_CHECK([chmod u+w $file], 0)
    62 AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --select-molecules-atoms -t "1., 1., 1." --periodic 0 --undo --redo], 0, [stdout], [stderr])
     62AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --translate-molecules --position "1., 1., 1." --periodic 0 --undo --redo], 0, [stdout], [stderr])
    6363AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation/post/test.conf], 0, [ignore], [ignore])
    6464
     
    6666AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Molecules/Translation/pre/test2.conf $file], 0)
    6767AT_CHECK([chmod u+w $file], 0)
    68 AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --select-molecules-atoms -t "-1., -1., -1." --periodic 0 --undo --redo], 0, [stdout], [stderr])
     68AT_CHECK([../../molecuilder -i $file --select-molecule-by-id 0 --translate-molecules --position "-1., -1., -1." --periodic 0 --undo --redo], 0, [stdout], [stderr])
    6969AT_CHECK([diff $file ${abs_top_srcdir}/tests/regression/Molecules/Translation/post/test2.conf], 0, [ignore], [ignore])
    7070
  • tests/regression/Molecules/testsuite-molecules.at

    r7b38d3 r0ac85c3  
    5454m4_include([Molecules/Translation-Periodic/testsuite-molecules-translation-periodic.at])
    5555
     56# remove whole molecules
     57m4_include([Molecules/Remove/testsuite-molecules-remove.at])
     58
    5659# Rotate to Principal Axis System
    5760m4_include([Molecules/RotateToPrincipalAxisSystem/testsuite-molecules-rotate-to-principal-axis-system.at])
  • tests/regression/Options/InvalidCommands/testsuite-options-invalid-commands.at

    r7b38d3 r0ac85c3  
    2424AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Options/InvalidCommands/pre/test.conf $file], 0)
    2525AT_CHECK([chmod u+w $file], 0)
    26 AT_CHECK([../../molecuilder -i $file  -t], 134, [ignore], [stderr])
    2726AT_CHECK([../../molecuilder -i $file  -s -b -E -c -b -a], 134, [ignore], [stderr])
    2827AT_CHECK([../../molecuilder -i $file  -b -E -c -b -a], 134, [ignore], [stderr])
  • tests/regression/Parser/Mpqc/testsuite-parser-mpqc-load-multiply.at

    r7b38d3 r0ac85c3  
    2424destfile=doublewater.in
    2525AT_CHECK([../../molecuilder -i $destfile -o mpqc -l ${abs_top_srcdir}/tests/regression/Parser/Mpqc/pre/$srcfile], 0, [ignore], [ignore])
    26 AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Mpqc/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms "2,0,0"], 0, [ignore], [ignore])
     26AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Mpqc/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms --position "2,0,0"], 0, [ignore], [ignore])
    2727AT_CHECK([diff -I '%.*' $destfile ${abs_top_srcdir}/tests/regression/Parser/Mpqc/post/$destfile], 0, [ignore], [ignore])
    2828
  • tests/regression/Parser/Pcp/testsuite-parser-pcp-load-multiply.at

    r7b38d3 r0ac85c3  
    2424destfile=doublewater.conf
    2525AT_CHECK([../../molecuilder -i $destfile -o pcp -l ${abs_top_srcdir}/tests/regression/Parser/Pcp/pre/$srcfile], 0, [ignore], [ignore])
    26 AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Pcp/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms "2,0,0"], 0, [ignore], [ignore])
     26AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Pcp/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms --position "2,0,0"], 0, [ignore], [ignore])
    2727AT_CHECK([diff $destfile ${abs_top_srcdir}/tests/regression/Parser/Pcp/post/$destfile], 0, [ignore], [ignore])
    2828
  • tests/regression/Parser/Pdb/testsuite-parser-pdb-load-multiply.at

    r7b38d3 r0ac85c3  
    2424destfile=doublewater.pdb
    2525AT_CHECK([../../molecuilder -i $destfile -o pdb -l ${abs_top_srcdir}/tests/regression/Parser/Pdb/pre/$srcfile], 0, [ignore], [ignore])
    26 AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Pdb/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms "2,0,0"], 0, [ignore], [ignore])
     26AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Pdb/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms --position "2,0,0"], 0, [ignore], [ignore])
    2727AT_CHECK([diff -I 'REMARK.*' $destfile ${abs_top_srcdir}/tests/regression/Parser/Pdb/post/$destfile], 0, [ignore], [ignore])
    2828
  • tests/regression/Parser/Psi3/testsuite-parser-psi3-load-multiply.at

    r7b38d3 r0ac85c3  
    2424destfile=doublewater.psi
    2525AT_CHECK([../../molecuilder -i $destfile -o psi3 -l ${abs_top_srcdir}/tests/regression/Parser/Psi3/pre/$srcfile], 0, [ignore], [ignore])
    26 AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Psi3/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms "2,0,0"], 0, [ignore], [ignore])
     26AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Psi3/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms --position "2,0,0"], 0, [ignore], [ignore])
    2727AT_CHECK([diff -w -I '%.*' $destfile ${abs_top_srcdir}/tests/regression/Parser/Psi3/post/$destfile], 0, [ignore], [ignore])
    2828
  • tests/regression/Parser/Tremolo/testsuite-parser-tremolo-load-multiply.at

    r7b38d3 r0ac85c3  
    2525destfile=doublewater.data
    2626AT_CHECK([../../molecuilder -i $destfile -o tremolo -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$srcfile], 0, [ignore], [ignore])
    27 AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms "2,0,0"], 0, [ignore], [ignore])
     27AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Tremolo/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms --position "2,0,0"], 0, [ignore], [ignore])
    2828AT_CHECK([diff -w -I '#.*' $destfile ${abs_top_srcdir}/tests/regression/Parser/Tremolo/post/$destfile], 0, [ignore], [ignore])
    2929
  • tests/regression/Parser/Xyz/testsuite-parser-xyz-load-multiply.at

    r7b38d3 r0ac85c3  
    2424destfile=doublewater.xyz
    2525AT_CHECK([../../molecuilder -i $destfile -o xyz -l ${abs_top_srcdir}/tests/regression/Parser/Xyz/pre/$srcfile], 0, [ignore], [ignore])
    26 AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Xyz/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms "2,0,0"], 0, [ignore], [ignore])
     26AT_CHECK([../../molecuilder -i $destfile -l ${abs_top_srcdir}/tests/regression/Parser/Xyz/pre/$srcfile --select-molecule-by-order -1 --select-molecules-atoms --translate-atoms --position "2,0,0"], 0, [ignore], [ignore])
    2727AT_CHECK([diff -I '.*Created by molecuilder.*' $destfile ${abs_top_srcdir}/tests/regression/Parser/Xyz/post/$destfile], 0, [ignore], [ignore])
    2828
  • tests/regression/Selection/Atoms/testsuite-selection-atoms.at

    r7b38d3 r0ac85c3  
    5959m4_include(Selection/Atoms/InvertAtoms/testsuite-selection-invert-atoms.at)
    6060
     61# push atom selection
     62m4_include(Selection/Atoms/PushAtomSelection/testsuite-selection-push-atom-selection.at)
     63
     64# pop atom selection
     65m4_include(Selection/Atoms/PopAtomSelection/testsuite-selection-pop-atom-selection.at)
  • tests/regression/Selection/Molecules/MoleculeById/testsuite-selection-select-molecule-by-id.at

    r7b38d3 r0ac85c3  
    2525srcfile=box.xyz
    2626testfile=test.xyz
    27 targetfile=water_id4.xyz
     27targetfile=water_id2_4.xyz
    2828AT_CHECK([cp -n ${regressionpath}/pre/$srcfile $testfile], 0)
    29 AT_CHECK([../../molecuilder -i $testfile -I --select-molecule-by-id 4 -s $targetfile], 0, [stdout], [stderr])
     29AT_CHECK([../../molecuilder -i $testfile -I --select-molecule-by-id 2 4 -s $targetfile], 0, [stdout], [stderr])
    3030AT_CHECK([diff -I '.*Created by molecuilder.*' $targetfile ${regressionpath}/post/$targetfile], 0, [ignore], [ignore])
    3131
     
    4141targetfile=empty.xyz
    4242AT_CHECK([cp -n ${regressionpath}/pre/$srcfile $testfile], 0)
    43 AT_CHECK([../../molecuilder -i $testfile -I --select-molecule-by-id 4 --undo -s $targetfile], 0, [stdout], [stderr])
     43AT_CHECK([../../molecuilder -i $testfile -I --select-molecule-by-id 2 4 --undo -s $targetfile], 0, [stdout], [stderr])
    4444AT_CHECK([diff -I '.*Created by molecuilder.*' $targetfile ${regressionpath}/post/$targetfile], 0, [ignore], [ignore])
    4545
     
    5353srcfile=box.xyz
    5454testfile=test.xyz
    55 targetfile=water_id4.xyz
     55targetfile=water_id2_4.xyz
    5656AT_CHECK([cp -n ${regressionpath}/pre/$srcfile $testfile], 0)
    57 AT_CHECK([../../molecuilder -i $testfile -I --select-molecule-by-id 4 --undo --redo -s $targetfile], 0, [stdout], [stderr])
     57AT_CHECK([../../molecuilder -i $testfile -I --select-molecule-by-id 2 4 --undo --redo -s $targetfile], 0, [stdout], [stderr])
    5858AT_CHECK([diff -I '.*Created by molecuilder.*' $targetfile ${regressionpath}/post/$targetfile], 0, [ignore], [ignore])
    5959
  • tests/regression/Selection/Molecules/MoleculeById/testsuite-selection-unselect-molecule-by-id.at

    r7b38d3 r0ac85c3  
    2525srcfile=box.xyz
    2626testfile=test.xyz
    27 targetfile=id4_missing.xyz
     27targetfile=id2_4_missing.xyz
    2828AT_CHECK([cp -n ${regressionpath}/pre/$srcfile $testfile], 0)
    29 AT_CHECK([../../molecuilder -i $testfile -I --select-all-molecules --unselect-molecule-by-id 4 -s $targetfile], 0, [stdout], [stderr])
     29AT_CHECK([../../molecuilder -i $testfile -I --select-all-molecules --unselect-molecule-by-id 2 4 -s $targetfile], 0, [stdout], [stderr])
    3030AT_CHECK([diff -I '.*Created by molecuilder.*' $targetfile ${regressionpath}/post/$targetfile], 0, [ignore], [ignore])
    3131
     
    4141targetfile=box.xyz
    4242AT_CHECK([cp -n ${regressionpath}/pre/$srcfile $testfile], 0)
    43 AT_CHECK([../../molecuilder -i $testfile -I --select-all-molecules --unselect-molecule-by-id 4 --undo -s $targetfile], 0, [stdout], [stderr])
     43AT_CHECK([../../molecuilder -i $testfile -I --select-all-molecules --unselect-molecule-by-id 2 4 --undo -s $targetfile], 0, [stdout], [stderr])
    4444AT_CHECK([diff -I '.*Created by molecuilder.*' $targetfile ${regressionpath}/post/$targetfile], 0, [ignore], [ignore])
    4545
     
    5353srcfile=box.xyz
    5454testfile=test.xyz
    55 targetfile=id4_missing.xyz
     55targetfile=id2_4_missing.xyz
    5656AT_CHECK([cp -n ${regressionpath}/pre/$srcfile $testfile], 0)
    57 AT_CHECK([../../molecuilder -i $testfile -I --select-all-molecules --unselect-molecule-by-id 4 --undo --redo -s $targetfile], 0, [stdout], [stderr])
     57AT_CHECK([../../molecuilder -i $testfile -I --select-all-molecules --unselect-molecule-by-id 2 4 --undo --redo -s $targetfile], 0, [stdout], [stderr])
    5858AT_CHECK([diff -I '.*Created by molecuilder.*' $targetfile ${regressionpath}/post/$targetfile], 0, [ignore], [ignore])
    5959
  • tests/regression/Selection/Molecules/testsuite-selection-molecules.at

    r7b38d3 r0ac85c3  
    5252m4_include(Selection/Molecules/InvertMolecules/testsuite-selection-invert-molecules.at)
    5353
     54# push molecule selection
     55m4_include(Selection/Molecules/PushMoleculeSelection/testsuite-selection-push-molecule-selection.at)
     56
     57# pop molecule selection
     58m4_include(Selection/Molecules/PopMoleculeSelection/testsuite-selection-pop-molecule-selection.at)
Note: See TracChangeset for help on using the changeset viewer.