| [907636] | 1 | /* | 
|---|
|  | 2 | * Project: MoleCuilder | 
|---|
|  | 3 | * Description: creates and alters molecular systems | 
|---|
| [0aa122] | 4 | * Copyright (C)  2010-2012 University of Bonn. All rights reserved. | 
|---|
| [5aaa43] | 5 | * Copyright (C)  2013 Frederik Heber. All rights reserved. | 
|---|
| [94d5ac6] | 6 | * | 
|---|
|  | 7 | * | 
|---|
|  | 8 | *   This file is part of MoleCuilder. | 
|---|
|  | 9 | * | 
|---|
|  | 10 | *    MoleCuilder is free software: you can redistribute it and/or modify | 
|---|
|  | 11 | *    it under the terms of the GNU General Public License as published by | 
|---|
|  | 12 | *    the Free Software Foundation, either version 2 of the License, or | 
|---|
|  | 13 | *    (at your option) any later version. | 
|---|
|  | 14 | * | 
|---|
|  | 15 | *    MoleCuilder is distributed in the hope that it will be useful, | 
|---|
|  | 16 | *    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 17 | *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 18 | *    GNU General Public License for more details. | 
|---|
|  | 19 | * | 
|---|
|  | 20 | *    You should have received a copy of the GNU General Public License | 
|---|
|  | 21 | *    along with MoleCuilder.  If not, see <http://www.gnu.org/licenses/>. | 
|---|
| [907636] | 22 | */ | 
|---|
|  | 23 |  | 
|---|
|  | 24 | /* | 
|---|
|  | 25 | * GLWorldScene.cpp | 
|---|
|  | 26 | * | 
|---|
|  | 27 | *  This is based on the Qt3D example "teaservice", specifically parts of teaservice.cpp. | 
|---|
|  | 28 | * | 
|---|
|  | 29 | *  Created on: Aug 17, 2011 | 
|---|
|  | 30 | *      Author: heber | 
|---|
|  | 31 | */ | 
|---|
|  | 32 |  | 
|---|
|  | 33 | // include config.h | 
|---|
|  | 34 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 35 | #include <config.h> | 
|---|
|  | 36 | #endif | 
|---|
|  | 37 |  | 
|---|
|  | 38 | #include "GLWorldScene.hpp" | 
|---|
| [d1196d] | 39 | #include <Qt3D/qglview.h> | 
|---|
| [bca99d] | 40 | #include <Qt3D/qglbuilder.h> | 
|---|
|  | 41 | #include <Qt3D/qglscenenode.h> | 
|---|
|  | 42 | #include <Qt3D/qglsphere.h> | 
|---|
|  | 43 | #include <Qt3D/qglcylinder.h> | 
|---|
| [907636] | 44 |  | 
|---|
|  | 45 | #include "GLMoleculeObject.hpp" | 
|---|
| [7188b1] | 46 | #include "GLMoleculeObject_atom.hpp" | 
|---|
|  | 47 | #include "GLMoleculeObject_bond.hpp" | 
|---|
| [c67518] | 48 | #include "GLMoleculeObject_molecule.hpp" | 
|---|
| [f75491] | 49 | #include "GLMoleculeObject_shape.hpp" | 
|---|
| [907636] | 50 |  | 
|---|
|  | 51 | #include "CodePatterns/MemDebug.hpp" | 
|---|
|  | 52 |  | 
|---|
| [7188b1] | 53 | #include "CodePatterns/Log.hpp" | 
|---|
|  | 54 |  | 
|---|
| [0e9ffe] | 55 | #include "Actions/SelectionAction/Atoms/AtomByIdAction.hpp" | 
|---|
| [89643d] | 56 | #include "Actions/SelectionAction/Atoms/NotAtomByIdAction.hpp" | 
|---|
| [6966b7] | 57 | #include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp" | 
|---|
|  | 58 | #include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp" | 
|---|
| [6f0841] | 59 | #include "Atom/atom.hpp" | 
|---|
| [7188b1] | 60 | #include "Bond/bond.hpp" | 
|---|
| [89643d] | 61 | #include "Descriptors/AtomIdDescriptor.hpp" | 
|---|
| [8c001a] | 62 | #include "Descriptors/MoleculeIdDescriptor.hpp" | 
|---|
| [37b2575] | 63 | #include "Helpers/helpers.hpp" | 
|---|
| [85c36d] | 64 | #include "Shapes/ShapeRegistry.hpp" | 
|---|
| [907636] | 65 | #include "molecule.hpp" | 
|---|
|  | 66 | #include "World.hpp" | 
|---|
|  | 67 |  | 
|---|
| [2ad1ec] | 68 | #include <iostream> | 
|---|
|  | 69 |  | 
|---|
| [ce7fdc] | 70 | using namespace MoleCuilder; | 
|---|
| [907636] | 71 |  | 
|---|
|  | 72 | GLWorldScene::GLWorldScene(QObject *parent) | 
|---|
| [8c001a] | 73 | : QObject(parent) | 
|---|
| [907636] | 74 | { | 
|---|
| [72a4c1] | 75 | int sphereDetails[] = {5, 3, 2, 0}; | 
|---|
|  | 76 | int cylinderDetails[] = {16, 8, 6, 3}; | 
|---|
|  | 77 | for (int i=0;i<GLMoleculeObject::DETAILTYPES_MAX;i++){ | 
|---|
|  | 78 | QGLBuilder emptyBuilder; | 
|---|
| [8c001a] | 79 | GLMoleculeObject::meshEmpty[i] = emptyBuilder.finalizedSceneNode(); | 
|---|
| [72a4c1] | 80 | QGLBuilder sphereBuilder; | 
|---|
|  | 81 | sphereBuilder << QGLSphere(2.0, sphereDetails[i]); | 
|---|
| [8c001a] | 82 | GLMoleculeObject::meshSphere[i] = sphereBuilder.finalizedSceneNode(); | 
|---|
|  | 83 | GLMoleculeObject::meshSphere[i]->setOption(QGLSceneNode::CullBoundingBox, true); | 
|---|
| [72a4c1] | 84 | QGLBuilder cylinderBuilder; | 
|---|
|  | 85 | cylinderBuilder << QGLCylinder(.25,.25,1.0,cylinderDetails[i]); | 
|---|
| [8c001a] | 86 | GLMoleculeObject::meshCylinder[i] = cylinderBuilder.finalizedSceneNode(); | 
|---|
|  | 87 | GLMoleculeObject::meshCylinder[i]->setOption(QGLSceneNode::CullBoundingBox, true); | 
|---|
| [72a4c1] | 88 | } | 
|---|
| [0a6ff9] | 89 |  | 
|---|
| [ce4126] | 90 | connect(this, SIGNAL(updated()), this, SLOT(update())); | 
|---|
|  | 91 |  | 
|---|
| [8c001a] | 92 |  | 
|---|
| [6966b7] | 93 | setSelectionMode(SelectAtom); | 
|---|
|  | 94 |  | 
|---|
| [907636] | 95 | init(); | 
|---|
|  | 96 | } | 
|---|
|  | 97 |  | 
|---|
|  | 98 | GLWorldScene::~GLWorldScene() | 
|---|
| [7188b1] | 99 | { | 
|---|
|  | 100 | // remove all elements | 
|---|
|  | 101 | GLMoleculeObject::cleanMaterialMap(); | 
|---|
|  | 102 | } | 
|---|
| [907636] | 103 |  | 
|---|
|  | 104 | /** Initialise the WorldScene with molecules and atoms from World. | 
|---|
|  | 105 | * | 
|---|
|  | 106 | */ | 
|---|
|  | 107 | void GLWorldScene::init() | 
|---|
|  | 108 | { | 
|---|
| [8c001a] | 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); | 
|---|
| [ce4126] | 116 | } | 
|---|
|  | 117 | } | 
|---|
| [c67518] | 118 |  | 
|---|
| [ce4126] | 119 | /** Update the WorldScene with molecules and atoms from World. | 
|---|
|  | 120 | * | 
|---|
|  | 121 | * This function should be called after e.g. WorldTime::TimeChanged was | 
|---|
|  | 122 | * received or after another molecule has been loaded. | 
|---|
|  | 123 | * | 
|---|
|  | 124 | */ | 
|---|
|  | 125 | void GLWorldScene::update() | 
|---|
|  | 126 | { | 
|---|
| [8c001a] | 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); | 
|---|
| [907636] | 137 | } | 
|---|
|  | 138 | } | 
|---|
|  | 139 |  | 
|---|
| [8c001a] | 140 | void GLWorldScene::atomClicked(atomId_t no) | 
|---|
|  | 141 | { | 
|---|
|  | 142 | LOG(3, "INFO: GLMoleculeObject_molecule - atom " << no << " has been clicked."); | 
|---|
|  | 143 | const atom *Walker = World::getInstance().getAtom(AtomById(no)); | 
|---|
|  | 144 | if (selectionMode == SelectAtom){ | 
|---|
|  | 145 | if (!World::getInstance().isSelected(Walker)) | 
|---|
|  | 146 | SelectionAtomById(std::vector<atomId_t>(1,no)); | 
|---|
|  | 147 | else | 
|---|
|  | 148 | SelectionNotAtomById(std::vector<atomId_t>(1,no)); | 
|---|
|  | 149 | }else if (selectionMode == SelectMolecule){ | 
|---|
|  | 150 | const molecule *mol = Walker->getMolecule(); | 
|---|
|  | 151 | ASSERT(mol, "Atom without molecule has been clicked."); | 
|---|
|  | 152 | if (!World::getInstance().isSelected(mol)) | 
|---|
|  | 153 | SelectionMoleculeById(mol->getId()); | 
|---|
|  | 154 | else | 
|---|
|  | 155 | SelectionNotMoleculeById(mol->getId()); | 
|---|
|  | 156 | } | 
|---|
|  | 157 | emit clicked(no); | 
|---|
|  | 158 | } | 
|---|
|  | 159 |  | 
|---|
| [9a7ef9] | 160 | void GLWorldScene::moleculeClicked(moleculeId_t no) | 
|---|
|  | 161 | { | 
|---|
|  | 162 | LOG(3, "INFO: GLMoleculeObject_molecule - mol " << no << " has been clicked."); | 
|---|
|  | 163 | const molecule *mol= World::getInstance().getMolecule(MoleculeById(no)); | 
|---|
|  | 164 | ASSERT(mol, "Atom without molecule has been clicked."); | 
|---|
|  | 165 | if (!World::getInstance().isSelected(mol)) | 
|---|
|  | 166 | SelectionMoleculeById(mol->getId()); | 
|---|
|  | 167 | else | 
|---|
|  | 168 | SelectionNotMoleculeById(mol->getId()); | 
|---|
|  | 169 | emit clicked(no); | 
|---|
|  | 170 | } | 
|---|
|  | 171 |  | 
|---|
| [8c001a] | 172 |  | 
|---|
| [7188b1] | 173 | /** Adds an atom to the scene. | 
|---|
|  | 174 | * | 
|---|
|  | 175 | * @param _atom atom to add | 
|---|
|  | 176 | */ | 
|---|
| [8c001a] | 177 | void GLWorldScene::atomInserted(const atomId_t _id) | 
|---|
| [907636] | 178 | { | 
|---|
| [beadd0] | 179 | LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+"."); | 
|---|
| [8c001a] | 180 | // find associated molecule | 
|---|
|  | 181 | const moleculeId_t molid = World::getInstance().getAtom(AtomById(_id))->getMolecule()->getId(); | 
|---|
|  | 182 | MoleculeNodeMap::const_iterator moliter = MoleculesinSceneMap.find(molid ); | 
|---|
|  | 183 | ASSERT(moliter != MoleculesinSceneMap.end(), | 
|---|
|  | 184 | "GLWorldScene::atomAdded() - molecule with id of "+toString(molid) | 
|---|
|  | 185 | +" atom with id "+toString(_id)+" is unknown."); | 
|---|
|  | 186 | GLMoleculeObject_molecule *molObject = moliter->second; | 
|---|
|  | 187 |  | 
|---|
|  | 188 | // add atom to internal list | 
|---|
|  | 189 | #ifndef NDEBUG | 
|---|
|  | 190 | AtomMoleculeMap::const_iterator atomiter = AtomsinSceneMap.find(_id); | 
|---|
|  | 191 | ASSERT(atomiter == AtomsinSceneMap.end(), | 
|---|
|  | 192 | "GLWorldScene::atomRemoved() - atom "+toString(_id)+" already known."); | 
|---|
|  | 193 | #endif | 
|---|
|  | 194 | AtomsinSceneMap.insert( std::make_pair( _id, molObject )); | 
|---|
|  | 195 |  | 
|---|
|  | 196 | // inform its GlMoleculeObject_molecule. | 
|---|
|  | 197 | molObject->atomInserted(_id); | 
|---|
|  | 198 |  | 
|---|
|  | 199 | // emit change | 
|---|
| [65487f] | 200 | emit changeOccured(); | 
|---|
| [7188b1] | 201 | } | 
|---|
|  | 202 |  | 
|---|
|  | 203 | /** Removes an atom from the scene. | 
|---|
|  | 204 | * | 
|---|
| [c48ac12] | 205 | * We just the id as the atom might have already been destroyed. | 
|---|
|  | 206 | * | 
|---|
|  | 207 | * @param _id id of atom to remove | 
|---|
| [7188b1] | 208 | */ | 
|---|
| [8c001a] | 209 | void GLWorldScene::atomRemoved(const atomId_t _id) | 
|---|
| [7188b1] | 210 | { | 
|---|
| [c48ac12] | 211 | LOG(3, "INFO: GLWorldScene: Received signal atomRemoved for atom "+toString(_id)+"."); | 
|---|
| [8c001a] | 212 | // find associated molecule | 
|---|
|  | 213 | AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(_id); | 
|---|
| [37b2575] | 214 | ASSERT(iter != AtomsinSceneMap.end(), | 
|---|
| [c48ac12] | 215 | "GLWorldScene::atomRemoved() - atom "+toString(_id)+" not on display."); | 
|---|
| [8c001a] | 216 | GLMoleculeObject_molecule *molObject = iter->second; | 
|---|
|  | 217 |  | 
|---|
|  | 218 | // remove from internal list | 
|---|
| [37b2575] | 219 | AtomsinSceneMap.erase(iter); | 
|---|
| [8c001a] | 220 |  | 
|---|
|  | 221 | // inform its GlMoleculeObject_molecule. | 
|---|
|  | 222 | molObject->atomRemoved(_id); | 
|---|
|  | 223 |  | 
|---|
|  | 224 | // emit change | 
|---|
| [65487f] | 225 | emit changeOccured(); | 
|---|
| [907636] | 226 | } | 
|---|
|  | 227 |  | 
|---|
| [3927ef] | 228 | /** .... | 
|---|
| [c67518] | 229 | * | 
|---|
|  | 230 | */ | 
|---|
| [3927ef] | 231 | void GLWorldScene::worldSelectionChanged() | 
|---|
| [c67518] | 232 | { | 
|---|
| [3927ef] | 233 | LOG(3, "INFO: GLWorldScene: Received signal selectionChanged."); | 
|---|
|  | 234 |  | 
|---|
|  | 235 | const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules(); | 
|---|
|  | 236 |  | 
|---|
|  | 237 | if (molecules.size() > 0) { | 
|---|
|  | 238 | for (std::vector<molecule*>::const_iterator Runner = molecules.begin(); | 
|---|
|  | 239 | Runner != molecules.end(); | 
|---|
|  | 240 | Runner++) { | 
|---|
|  | 241 |  | 
|---|
|  | 242 | // molecule selected but not in scene? | 
|---|
| [8c001a] | 243 | const bool isSelected = World::getInstance().isSelected(*Runner); | 
|---|
|  | 244 | if (isSelected){ | 
|---|
|  | 245 | MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find((*Runner)->getId()); | 
|---|
|  | 246 | ASSERT( iter != MoleculesinSceneMap.end(), | 
|---|
|  | 247 | "GLWorldScene::worldSelectionChanged() - selected molecule is unknown."); | 
|---|
|  | 248 | GLMoleculeObject_molecule *molObject = iter->second; | 
|---|
|  | 249 | // inform molecule object | 
|---|
|  | 250 | molObject->selected(isSelected); | 
|---|
| [3927ef] | 251 | } | 
|---|
|  | 252 | } | 
|---|
|  | 253 | } | 
|---|
| [c67518] | 254 | } | 
|---|
|  | 255 |  | 
|---|
| [8c001a] | 256 | /** Inserts a molecule into the scene. | 
|---|
| [c67518] | 257 | * | 
|---|
| [8c001a] | 258 | * @param _mol molecule to insert | 
|---|
| [c67518] | 259 | */ | 
|---|
| [8c001a] | 260 | void GLWorldScene::moleculeInserted(const molecule * _mol) | 
|---|
| [c67518] | 261 | { | 
|---|
| [8c001a] | 262 | LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_mol->getId())+"."); | 
|---|
|  | 263 | MoleculeNodeMap::const_iterator iter = MoleculesinSceneMap.find(_mol->getId()); | 
|---|
|  | 264 | ASSERT( iter == MoleculesinSceneMap.end(), | 
|---|
|  | 265 | "GLWorldScene::moleculeInserted() - molecule's id "+toString(_mol->getId())+" already present."); | 
|---|
|  | 266 |  | 
|---|
|  | 267 | // add new object | 
|---|
|  | 268 | GLMoleculeObject_molecule *molObject = new GLMoleculeObject_molecule(GLMoleculeObject::meshEmpty, this, _mol); | 
|---|
|  | 269 | MoleculesinSceneMap.insert( make_pair(_mol->getId(), molObject) ); | 
|---|
|  | 270 | connect (molObject, SIGNAL(changed()), this, SIGNAL(changed())); | 
|---|
|  | 271 | connect (molObject, SIGNAL(changeOccured()), this, SIGNAL(changeOccured())); | 
|---|
|  | 272 | connect (molObject, SIGNAL(atomClicked(atomId_t)), this, SLOT(atomClicked(atomId_t))); | 
|---|
| [9a7ef9] | 273 | connect (molObject, SIGNAL(moleculeClicked(moleculeId_t)), this, SLOT(moleculeClicked(moleculeId_t))); | 
|---|
| [8c001a] | 274 | connect (molObject, SIGNAL(changeAtomId(GLMoleculeObject_atom *, int, int)), this, SLOT(changeAtomId(GLMoleculeObject_atom *, int, int))); | 
|---|
|  | 275 | connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed())); | 
|---|
|  | 276 | connect (molObject, SIGNAL(selectionChanged()), this, SIGNAL(changed())); | 
|---|
| [2b596f] | 277 | connect (molObject, SIGNAL(hoverChanged(const atom &)), this, SIGNAL(hoverChanged(const atom &))); | 
|---|
|  | 278 | connect (molObject, SIGNAL(hoverChanged(const molecule &, int)), this, SIGNAL(hoverChanged(const molecule &, int))); | 
|---|
| [8c001a] | 279 | emit changed(); | 
|---|
|  | 280 | emit changeOccured(); | 
|---|
| [c67518] | 281 | } | 
|---|
|  | 282 |  | 
|---|
| [8c001a] | 283 | /** Removes a molecule from the scene. | 
|---|
| [7188b1] | 284 | * | 
|---|
| [8c001a] | 285 | * @param _id id of molecule to remove | 
|---|
| [7188b1] | 286 | */ | 
|---|
| [8c001a] | 287 | void GLWorldScene::moleculeRemoved(const moleculeId_t _id) | 
|---|
| [7188b1] | 288 | { | 
|---|
| [8c001a] | 289 | LOG(3, "INFO: GLWorldScene: Received signal moleculeRemoved for molecule "+toString(_id)+"."); | 
|---|
|  | 290 | MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id); | 
|---|
|  | 291 | ASSERT( iter != MoleculesinSceneMap.end(), | 
|---|
|  | 292 | "GLWorldScene::moleculeInserted() - molecule's id "+toString(_id)+" is unknown."); | 
|---|
|  | 293 |  | 
|---|
|  | 294 | GLMoleculeObject_molecule *molObject = iter->second; | 
|---|
|  | 295 | molObject->disconnect(); | 
|---|
|  | 296 | MoleculesinSceneMap.erase(iter); | 
|---|
|  | 297 | delete molObject; | 
|---|
|  | 298 | emit changed(); | 
|---|
|  | 299 | emit changeOccured(); | 
|---|
| [ce4126] | 300 | } | 
|---|
|  | 301 |  | 
|---|
| [739ee9] | 302 | void GLWorldScene::moleculesVisibilityChanged(const moleculeId_t _id, bool _visible) | 
|---|
|  | 303 | { | 
|---|
|  | 304 | MoleculeNodeMap::iterator iter = MoleculesinSceneMap.find(_id); | 
|---|
|  | 305 | ASSERT( iter != MoleculesinSceneMap.end(), | 
|---|
|  | 306 | "GLWorldScene::moleculeInserted() - molecule's id "+toString(_id)+" is unknown."); | 
|---|
|  | 307 |  | 
|---|
|  | 308 | GLMoleculeObject_molecule *molObject = iter->second; | 
|---|
|  | 309 | molObject->setVisible(_visible); | 
|---|
|  | 310 |  | 
|---|
|  | 311 | emit changed(); | 
|---|
|  | 312 | emit changeOccured(); | 
|---|
|  | 313 | } | 
|---|
|  | 314 |  | 
|---|
| [ce4126] | 315 | /** Adds a bond to the scene. | 
|---|
|  | 316 | * | 
|---|
|  | 317 | * @param _bond bond to add | 
|---|
|  | 318 | * @param side which side of the bond (left or right) | 
|---|
|  | 319 | */ | 
|---|
|  | 320 | void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side) | 
|---|
|  | 321 | { | 
|---|
|  | 322 | LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+"."); | 
|---|
|  | 323 | //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << "."); | 
|---|
| [8c001a] | 324 | // bond partners must both belong to same atom | 
|---|
|  | 325 | ASSERT( _bond->leftatom->getMolecule() == _bond->rightatom->getMolecule(), | 
|---|
|  | 326 | "GLWorldScene::bondInserted() - bond partners do not belong to same molecule."); | 
|---|
|  | 327 |  | 
|---|
|  | 328 | // find associated molecule object | 
|---|
|  | 329 | const moleculeId_t molid = _bond->leftatom->getMolecule()->getId(); | 
|---|
|  | 330 | MoleculeNodeMap::const_iterator moliter = MoleculesinSceneMap.find(molid ); | 
|---|
|  | 331 | ASSERT(moliter != MoleculesinSceneMap.end(), | 
|---|
|  | 332 | "GLWorldScene::bondInserted() - molecule with id of "+toString(molid) | 
|---|
|  | 333 | +" atom with id "+toString(_bond->leftatom->getId())+" is unknown."); | 
|---|
|  | 334 | GLMoleculeObject_molecule *molObject = moliter->second; | 
|---|
|  | 335 |  | 
|---|
|  | 336 | // add to internal list | 
|---|
|  | 337 | const GLMoleculeObject_molecule::BondIds ids = | 
|---|
|  | 338 | GLMoleculeObject_molecule::getBondIds(_bond, _side); | 
|---|
|  | 339 | BondMoleculeMap::const_iterator iter = BondsinSceneMap.find(ids); | 
|---|
|  | 340 | ASSERT(iter == BondsinSceneMap.end(), | 
|---|
|  | 341 | "GLWorldScene::bondInserted() - bond with ids "+toString(ids.first) | 
|---|
|  | 342 | +","+toString(ids.second)+" already present."); | 
|---|
|  | 343 | BondsinSceneMap.insert( std::make_pair( ids, molObject )); | 
|---|
|  | 344 |  | 
|---|
|  | 345 | // inform its GlMoleculeObject_molecule. | 
|---|
|  | 346 | molObject->bondInserted(_bond, _side); | 
|---|
|  | 347 |  | 
|---|
|  | 348 | // emit change | 
|---|
| [65487f] | 349 | emit changeOccured(); | 
|---|
| [7188b1] | 350 | } | 
|---|
| [907636] | 351 |  | 
|---|
| [37b2575] | 352 | /** Removes a bond from the scene. | 
|---|
| [7188b1] | 353 | * | 
|---|
|  | 354 | * @param _bond bond to remove | 
|---|
|  | 355 | */ | 
|---|
| [37b2575] | 356 | void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr) | 
|---|
| [907636] | 357 | { | 
|---|
| [2ad1ec] | 358 | LOG(3, "INFO: GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(rightnr)+"."); | 
|---|
| [7188b1] | 359 | { | 
|---|
|  | 360 | // left bond | 
|---|
| [8c001a] | 361 | const GLMoleculeObject_molecule::BondIds Leftids( make_pair(leftnr, rightnr) ); | 
|---|
|  | 362 | BondMoleculeMap::iterator leftiter = BondsinSceneMap.find( Leftids ); | 
|---|
| [37b2575] | 363 | ASSERT(leftiter != BondsinSceneMap.end(), | 
|---|
|  | 364 | "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-" | 
|---|
|  | 365 | +toString(rightnr)+" not on display."); | 
|---|
| [8c001a] | 366 | GLMoleculeObject_molecule *molObject = leftiter->second; | 
|---|
|  | 367 |  | 
|---|
|  | 368 | // remove from internal list | 
|---|
| [37b2575] | 369 | BondsinSceneMap.erase(leftiter); | 
|---|
| [8c001a] | 370 |  | 
|---|
|  | 371 | // inform its GlMoleculeObject_molecule. | 
|---|
|  | 372 | molObject->bondRemoved( leftnr, rightnr ); | 
|---|
| [7188b1] | 373 | } | 
|---|
| [2ad1ec] | 374 |  | 
|---|
| [8c001a] | 375 | // emit change | 
|---|
| [65487f] | 376 | emit changeOccured(); | 
|---|
| [7188b1] | 377 | } | 
|---|
|  | 378 |  | 
|---|
| [f75491] | 379 | /** Adds a shape to the scene. | 
|---|
|  | 380 | * | 
|---|
| [4d6662] | 381 | * uses ShapeRegistry::lastChanged() | 
|---|
|  | 382 | * | 
|---|
| [f75491] | 383 | */ | 
|---|
| [4d6662] | 384 | void GLWorldScene::addShape() | 
|---|
| [f75491] | 385 | { | 
|---|
| [4d6662] | 386 | Shape &shape = *ShapeRegistry::getInstance().lastChanged(); | 
|---|
| [f75491] | 387 | GLMoleculeObject_shape *shapeObject = new GLMoleculeObject_shape(shape, this); | 
|---|
| [284551] | 388 | ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName()); | 
|---|
|  | 389 | ASSERT(iter == ShapesinSceneMap.end(), | 
|---|
|  | 390 | "GLWorldScene::addShape() - same shape "+shape.getName()+" added again."); | 
|---|
|  | 391 | ShapesinSceneMap.insert( make_pair(shape.getName(), shapeObject) ); | 
|---|
|  | 392 | } | 
|---|
|  | 393 |  | 
|---|
| [4d6662] | 394 | void GLWorldScene::removeShape() | 
|---|
| [85c36d] | 395 | { | 
|---|
| [4d6662] | 396 | Shape &shape = *ShapeRegistry::getInstance().lastChanged(); | 
|---|
| [85c36d] | 397 | ShapeNodeMap::iterator iter = ShapesinSceneMap.find(shape.getName()); | 
|---|
| [ba6b5c] | 398 | ASSERT(iter != ShapesinSceneMap.end(), | 
|---|
| [85c36d] | 399 | "GLWorldScene::removeShape() - shape "+shape.getName()+" not in scene."); | 
|---|
| [148dde0] | 400 | ShapesinSceneMap.erase(iter); | 
|---|
| [85c36d] | 401 | delete(iter->second); | 
|---|
|  | 402 | } | 
|---|
|  | 403 |  | 
|---|
|  | 404 | void GLWorldScene::updateSelectedShapes() | 
|---|
| [284551] | 405 | { | 
|---|
|  | 406 | foreach (QObject *obj, children()) { | 
|---|
|  | 407 | GLMoleculeObject_shape *shapeobj = qobject_cast<GLMoleculeObject_shape *>(obj); | 
|---|
| [85c36d] | 408 | if (shapeobj){ | 
|---|
|  | 409 | shapeobj->enable(ShapeRegistry::getInstance().isSelected(shapeobj->getShape())); | 
|---|
|  | 410 | } | 
|---|
| [284551] | 411 | } | 
|---|
| [f75491] | 412 | } | 
|---|
|  | 413 |  | 
|---|
| [7188b1] | 414 | void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const | 
|---|
|  | 415 | { | 
|---|
|  | 416 | // Initialize all of the mesh objects that we have as children. | 
|---|
|  | 417 | foreach (QObject *obj, children()) { | 
|---|
|  | 418 | GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj); | 
|---|
|  | 419 | if (meshobj) | 
|---|
|  | 420 | meshobj->initialize(view, painter); | 
|---|
|  | 421 | } | 
|---|
|  | 422 | } | 
|---|
|  | 423 |  | 
|---|
| [72a4c1] | 424 | void GLWorldScene::draw(QGLPainter *painter, const QVector4D &cameraPlane) const | 
|---|
| [7188b1] | 425 | { | 
|---|
|  | 426 | // Draw all of the mesh objects that we have as children. | 
|---|
|  | 427 | foreach (QObject *obj, children()) { | 
|---|
|  | 428 | GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj); | 
|---|
|  | 429 | if (meshobj) | 
|---|
| [72a4c1] | 430 | meshobj->draw(painter, cameraPlane); | 
|---|
| [7188b1] | 431 | } | 
|---|
| [907636] | 432 | } | 
|---|
| [06ebf5] | 433 |  | 
|---|
| [6966b7] | 434 | void GLWorldScene::setSelectionMode(SelectionModeType mode) | 
|---|
|  | 435 | { | 
|---|
|  | 436 | selectionMode = mode; | 
|---|
|  | 437 | // TODO send update to toolbar | 
|---|
|  | 438 | } | 
|---|
|  | 439 |  | 
|---|
|  | 440 | void GLWorldScene::setSelectionModeAtom() | 
|---|
|  | 441 | { | 
|---|
|  | 442 | setSelectionMode(SelectAtom); | 
|---|
|  | 443 | } | 
|---|
|  | 444 |  | 
|---|
|  | 445 | void GLWorldScene::setSelectionModeMolecule() | 
|---|
|  | 446 | { | 
|---|
|  | 447 | setSelectionMode(SelectMolecule); | 
|---|
|  | 448 | } | 
|---|
|  | 449 |  | 
|---|
| [30cd0d] | 450 | void GLWorldScene::changeAtomId(GLMoleculeObject_atom *ob, int oldId, int newId) | 
|---|
|  | 451 | { | 
|---|
|  | 452 | LOG(3, "INFO: GLWorldScene - change atom id " << oldId << " to " << newId << "."); | 
|---|
|  | 453 | // Remove from map. | 
|---|
| [8c001a] | 454 | AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(oldId); | 
|---|
| [30cd0d] | 455 | ASSERT(iter != AtomsinSceneMap.end(), | 
|---|
| [8c001a] | 456 | "GLWorldScene::changeAtomId() - atom with old id "+toString(oldId)+" not on display."); | 
|---|
|  | 457 | GLMoleculeObject_molecule *molObject = iter->second; | 
|---|
|  | 458 |  | 
|---|
|  | 459 | // erase by signalling removal | 
|---|
|  | 460 | molObject->atomRemoved(oldId); | 
|---|
|  | 461 |  | 
|---|
|  | 462 | // remove from internal list | 
|---|
| [30cd0d] | 463 | AtomsinSceneMap.erase(iter); | 
|---|
|  | 464 |  | 
|---|
|  | 465 | // Reinsert with new id. | 
|---|
| [8c001a] | 466 | { | 
|---|
|  | 467 | AtomMoleculeMap::iterator iter = AtomsinSceneMap.find(newId); | 
|---|
|  | 468 | ASSERT(iter == AtomsinSceneMap.end(), | 
|---|
|  | 469 | "GLWorldScene::changeAtomId() - atom with new id "+toString(newId)+" already known."); | 
|---|
|  | 470 | } | 
|---|
|  | 471 | AtomsinSceneMap.insert( make_pair(newId, molObject) ); | 
|---|
|  | 472 |  | 
|---|
|  | 473 | // inform molecule object | 
|---|
|  | 474 | molObject->atomInserted(oldId); | 
|---|
| [30cd0d] | 475 | } | 
|---|