Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp

    rce4126 rd7cad1  
    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}
Note: See TracChangeset for help on using the changeset viewer.