- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp
rce4126 rd7cad1 60 60 #include "Bond/bond.hpp" 61 61 #include "Descriptors/AtomIdDescriptor.hpp" 62 #include "Descriptors/MoleculeIdDescriptor.hpp" 62 63 #include "Helpers/helpers.hpp" 63 64 #include "Shapes/ShapeRegistry.hpp" … … 69 70 using namespace MoleCuilder; 70 71 71 std::ostream &operator<<(std::ostream &ost, const GLWorldScene::BondIds &t)72 {73 ost << t.first << "," << t.second;74 return ost;75 }76 77 72 GLWorldScene::GLWorldScene(QObject *parent) 78 : QObject(parent), 79 hoverAtom(NULL) 73 : QObject(parent) 80 74 { 81 75 int sphereDetails[] = {5, 3, 2, 0}; … … 83 77 for (int i=0;i<GLMoleculeObject::DETAILTYPES_MAX;i++){ 84 78 QGLBuilder emptyBuilder; 85 meshEmpty[i] = emptyBuilder.finalizedSceneNode();79 GLMoleculeObject::meshEmpty[i] = emptyBuilder.finalizedSceneNode(); 86 80 QGLBuilder sphereBuilder; 87 81 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); 90 84 QGLBuilder cylinderBuilder; 91 85 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); 94 88 } 95 89 96 90 connect(this, SIGNAL(updated()), this, SLOT(update())); 91 97 92 98 93 setSelectionMode(SelectAtom); … … 112 107 void GLWorldScene::init() 113 108 { 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); 134 116 } 135 117 } … … 143 125 void GLWorldScene::update() 144 126 { 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 } 417 138 } 418 139 419 140 void GLWorldScene::atomClicked(atomId_t no) 420 141 { 421 LOG(3, "INFO: GL WorldScene - atom " << no << " has been clicked.");142 LOG(3, "INFO: GLMoleculeObject_molecule - atom " << no << " has been clicked."); 422 143 const atom *Walker = World::getInstance().getAtom(AtomById(no)); 423 144 if (selectionMode == SelectAtom){ … … 429 150 const molecule *mol = Walker->getMolecule(); 430 151 ASSERT(mol, "Atom without molecule has been clicked."); 152 molids_t ids(1, mol->getId()); 431 153 if (!World::getInstance().isSelected(mol)) 432 SelectionMoleculeById( mol->getId());154 SelectionMoleculeById(ids); 433 155 else 434 SelectionNotMoleculeById( mol->getId());156 SelectionNotMoleculeById(ids); 435 157 } 436 158 emit clicked(no); 437 159 } 438 160 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 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 */ 179 void 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 */ 211 void 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 */ 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 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 */ 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 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 */ 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 add 320 * @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 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 */ 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 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 */ 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) 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 426 void 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 439 436 void GLWorldScene::setSelectionMode(SelectionModeType mode) 440 437 { … … 453 450 } 454 451 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 471 452 void GLWorldScene::changeAtomId(GLMoleculeObject_atom *ob, int oldId, int newId) 472 453 { 473 454 LOG(3, "INFO: GLWorldScene - change atom id " << oldId << " to " << newId << "."); 474 455 // Remove from map. 475 Atom NodeMap::iterator iter = AtomsinSceneMap.find(oldId);456 AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(oldId); 476 457 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 479 465 AtomsinSceneMap.erase(iter); 480 466 481 467 // 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.