- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
rd7cad1 rce4126 60 60 #include "Bond/bond.hpp" 61 61 #include "Descriptors/AtomIdDescriptor.hpp" 62 #include "Descriptors/MoleculeIdDescriptor.hpp"63 62 #include "Helpers/helpers.hpp" 64 63 #include "Shapes/ShapeRegistry.hpp" … … 70 69 using namespace MoleCuilder; 71 70 71 std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t) 72 { 73 ost << t.first << "," << t.second; 74 return ost; 75 } 76 72 77 GLWorldScene::GLWorldScene(QObject *parent) 73 : QObject(parent) 78 : QObject(parent), 79 hoverAtom(NULL) 74 80 { 75 81 int sphereDetails[] = {5, 3, 2, 0}; … … 77 83 for (int i=0;i<GLMoleculeObject::DETAILTYPES_MAX;i++){ 78 84 QGLBuilder emptyBuilder; 79 GLMoleculeObject::meshEmpty[i] = emptyBuilder.finalizedSceneNode();85 meshEmpty[i] = emptyBuilder.finalizedSceneNode(); 80 86 QGLBuilder sphereBuilder; 81 87 sphereBuilder << QGLSphere(2.0, sphereDetails[i]); 82 GLMoleculeObject::meshSphere[i] = sphereBuilder.finalizedSceneNode();83 GLMoleculeObject::meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true);88 meshSphere[i] = sphereBuilder.finalizedSceneNode(); 89 meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true); 84 90 QGLBuilder cylinderBuilder; 85 91 cylinderBuilder << QGLCylinder(.25,.25,1.0,cylinderDetails[i]); 86 GLMoleculeObject::meshCylinder[i] = cylinderBuilder.finalizedSceneNode();87 GLMoleculeObject::meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true);92 meshCylinder[i] = cylinderBuilder.finalizedSceneNode(); 93 meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true); 88 94 } 89 95 90 96 connect(this, SIGNAL(updated()), this, SLOT(update())); 91 92 97 93 98 setSelectionMode(SelectAtom); … … 107 112 void GLWorldScene::init() 108 113 { 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); 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 } 116 134 } 117 135 } … … 125 143 void GLWorldScene::update() 126 144 { 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 } 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 } 138 417 } 139 418 140 419 void GLWorldScene::atomClicked(atomId_t no) 141 420 { 142 LOG(3, "INFO: GL MoleculeObject_molecule - atom " << no << " has been clicked.");421 LOG(3, "INFO: GLWorldScene - atom " << no << " has been clicked."); 143 422 const atom *Walker = World::getInstance().getAtom(AtomById(no)); 144 423 if (selectionMode == SelectAtom){ … … 150 429 const molecule *mol = Walker->getMolecule(); 151 430 ASSERT(mol, "Atom without molecule has been clicked."); 152 molids_t ids(1, mol->getId());153 431 if (!World::getInstance().isSelected(mol)) 154 SelectionMoleculeById( ids);432 SelectionMoleculeById(mol->getId()); 155 433 else 156 SelectionNotMoleculeById( ids);434 SelectionNotMoleculeById(mol->getId()); 157 435 } 158 436 emit clicked(no); 159 437 } 160 438 161 void 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 else170 SelectionNotMoleculeById(ids);171 emit clicked(no);172 }173 174 175 /** Adds an atom to the scene.176 *177 * @param _atom atom to add178 */179 void GLWorldScene::atomInserted(const atomId_t _id)180 {181 LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");182 // find associated molecule183 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 list191 #ifndef NDEBUG192 AtomMoleculeMap::const_iterator atomiter = AtomsinSceneMap.find(_id);193 ASSERT(atomiter == AtomsinSceneMap.end(),194 "GLWorldScene::atomRemoved() - atom "+toString(_id)+" already known.");195 #endif196 AtomsinSceneMap.insert( std::make_pair( _id, molObject ));197 198 // inform its GlMoleculeObject_molecule.199 molObject->atomInserted(_id);200 201 // emit change202 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 remove210 */211 void GLWorldScene::atomRemoved(const atomId_t _id)212 {213 LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+".");214 // find associated molecule215 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 list221 AtomsinSceneMap.erase(iter);222 223 // inform its GlMoleculeObject_molecule.224 molObject->atomRemoved(_id);225 226 // emit change227 emit changeOccured();228 }229 230 /** ....231 *232 */233 void 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 object252 molObject->selected(isSelected);253 }254 }255 }256 }257 258 /** Inserts a molecule into the scene.259 *260 * @param _mol molecule to insert261 */262 void 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 object270 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 remove288 */289 void 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 304 void 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 add320 * @param side which side of the bond (left or right)321 */322 void 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 atom327 ASSERT( _bond->leftatom->getMolecule() == _bond->rightatom->getMolecule(),328 "GLWorldScene::bondInserted() - bond partners do not belong to same molecule.");329 330 // find associated molecule object331 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 list339 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 change351 emit changeOccured();352 }353 354 /** Removes a bond from the scene.355 *356 * @param _bond bond to remove357 */358 void 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 bond363 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 list371 BondsinSceneMap.erase(leftiter);372 373 // inform its GlMoleculeObject_molecule.374 molObject->bondRemoved( leftnr, rightnr );375 }376 377 // emit change378 emit changeOccured();379 }380 381 /** Adds a shape to the scene.382 *383 * uses ShapeRegistry::lastChanged()384 *385 */386 void 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 396 void 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 406 void 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 416 void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const417 {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 426 void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const427 {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 436 439 void GLWorldScene::setSelectionMode(SelectionModeType mode) 437 440 { … … 450 453 } 451 454 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 452 471 void GLWorldScene::changeAtomId(GLMoleculeObject_atom *ob, int oldId, int newId) 453 472 { 454 473 LOG(3, "INFO: GLWorldScene - change atom id " << oldId << " to " << newId << "."); 455 474 // Remove from map. 456 Atom MoleculeMap::iterator iter = AtomsinSceneMap.find(oldId);475 AtomNodeMap::iterator iter = AtomsinSceneMap.find(oldId); 457 476 ASSERT(iter != AtomsinSceneMap.end(), 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 477 "GLWorldScene::objectIdChangedSignalled() - atom with id "+toString(oldId)+" not on display."); 478 GLMoleculeObject_atom *atomObject = iter->second; 465 479 AtomsinSceneMap.erase(iter); 466 480 467 481 // Reinsert with new id. 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 } 482 AtomsinSceneMap.insert( make_pair(newId, atomObject) ); 483 } 484
Note:
See TracChangeset
for help on using the changeset viewer.