source: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp@ b7ff03

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 Candidate_v1.7.0 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since b7ff03 was 0e9ffe, checked in by Frederik Heber <heber@…>, 14 years ago

Enabled selection when clicking atoms.

  • Property mode set to 100644
File size: 8.8 KB
RevLine 
[907636]1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * GLWorldScene.cpp
10 *
11 * This is based on the Qt3D example "teaservice", specifically parts of teaservice.cpp.
12 *
13 * Created on: Aug 17, 2011
14 * Author: heber
15 */
16
17// include config.h
18#ifdef HAVE_CONFIG_H
19#include <config.h>
20#endif
21
22#include "GLWorldScene.hpp"
23
24#include "GLMoleculeObject.hpp"
[7188b1]25#include "GLMoleculeObject_atom.hpp"
26#include "GLMoleculeObject_bond.hpp"
[907636]27
28#include "CodePatterns/MemDebug.hpp"
29
[7188b1]30#include "CodePatterns/Log.hpp"
31
[0e9ffe]32#include "Actions/SelectionAction/Atoms/AtomByIdAction.hpp"
[907636]33#include "atom.hpp"
[7188b1]34#include "Bond/bond.hpp"
[37b2575]35#include "Helpers/helpers.hpp"
[907636]36#include "molecule.hpp"
37#include "World.hpp"
38
39
40GLWorldScene::GLWorldScene(QObject *parent)
41 : QObject(parent)
42{
43 init();
44
45 //changeMaterials(false);
46}
47
48GLWorldScene::~GLWorldScene()
[7188b1]49{
50 // remove all elements
51 GLMoleculeObject::cleanMaterialMap();
52}
[907636]53
54/** Initialise the WorldScene with molecules and atoms from World.
55 *
56 */
57void GLWorldScene::init()
58{
59 const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
60
61 if (molecules.size() > 0) {
62 for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
63 Runner != molecules.end();
64 Runner++) {
65 // create molecule
[7188b1]66 for (molecule::const_iterator atomiter = (*Runner)->begin();
67 atomiter != (*Runner)->end();
68 ++atomiter) {
69 // create atom objects in scene
70 atomInserted(*atomiter);
71
[9c18e4]72 // create bond objects in scene
73 bondsChanged(*atomiter);
[7188b1]74 }
[907636]75 }
76 }
77}
78
[7188b1]79/** Adds an atom to the scene.
80 *
81 * @param _atom atom to add
82 */
83void GLWorldScene::atomInserted(const atom *_atom)
[907636]84{
[7188b1]85 LOG(0, "GLWorldScene: Received signal atomInserted for atom "+toString(_atom->getId())+".");
86 GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(this, _atom);
[37b2575]87 AtomNodeMap::iterator iter = AtomsinSceneMap.find(_atom->getId());
88 ASSERT(iter == AtomsinSceneMap.end(),
[7188b1]89 "GLWorldScene::atomAdded() - same atom "+_atom->getName()+" added again.");
[37b2575]90 AtomsinSceneMap.insert( make_pair(_atom->getId(), atomObject) );
[7188b1]91 connect (atomObject, SIGNAL(clicked(atomId_t)), this, SLOT(atomClicked(atomId_t)));
[a099d3]92 connect (atomObject, SIGNAL(hoverChanged()), this, SIGNAL(changed()));
[37b2575]93 connect (atomObject, SIGNAL(BondsChanged(const atom *)), this, SLOT(bondsChanged(const atom *)));
94 bondsChanged(_atom);
[65487f]95 emit changeOccured();
[7188b1]96}
97
98/** Removes an atom from the scene.
99 *
100 * @param _atom atom to remove
101 */
102void GLWorldScene::atomRemoved(const atom *_atom)
103{
104 LOG(0, "GLWorldScene: Received signal atomRemoved for atom "+toString(_atom->getId())+".");
105 // remove all its bonds
106 const BondList& bondlist = _atom->getListOfBonds();
107 for (BondList::const_iterator iter = bondlist.begin(); iter != bondlist.end(); ++iter) {
[37b2575]108 bondRemoved((*iter)->leftatom->getId(), (*iter)->rightatom->getId());
109 bondRemoved((*iter)->rightatom->getId(), (*iter)->leftatom->getId());
[907636]110 }
[7188b1]111 // remove atoms
[37b2575]112 AtomNodeMap::iterator iter = AtomsinSceneMap.find(_atom->getId());
113 ASSERT(iter != AtomsinSceneMap.end(),
[7188b1]114 "GLWorldScene::atomRemoved() - atom "+_atom->getName()+" not on display.");
115 GLMoleculeObject_atom *atomObject = iter->second;
116 atomObject->disconnect();
[37b2575]117 AtomsinSceneMap.erase(iter);
[7188b1]118 delete atomObject;
[65487f]119 emit changeOccured();
[907636]120}
121
[37b2575]122/** Updates the bond structure of the signaled \a _atom.
123 *
124 * @param _atom atom whose bonds changed.
125 */
126void GLWorldScene::bondsChanged(const atom *_atom)
127{
128 const atomId_t id = _atom->getId();
129
130 // create list with all present bonds
131 std::set< atomId_t > presentBonds;
132 std::pair< BondIdsMap::const_iterator, BondIdsMap::const_iterator> range =
133 BondIdsinSceneMap.equal_range( id );
134 for (BondIdsMap::const_iterator iter = range.first; iter != range.second; ++iter) {
135 const atomId_t otherid = iter->second;
136#ifndef NDEBUG
137 std::set< atomId_t >::const_iterator iter = presentBonds.find(otherid);
138 ASSERT(iter == presentBonds.end(),
139 "GLWorldScene::BondsChanged() - bond id "+toString(otherid)+" for atom "
140 +toString(id)+" present twice.");
141#endif
142 presentBonds.insert( otherid );
143 }
144 LOG(0, "We have the following bonds: "+toString(presentBonds)+".");
145
146 // search for added bonds
147 const BondList &bondlist = _atom->getListOfBonds();
148 for (BondList::const_iterator bonditer = bondlist.begin();
149 bonditer != bondlist.end();
150 ++bonditer) {
151 const bond *_bond = *bonditer;
152 const atomId_t otherid = _bond->GetOtherAtom(_atom)->getId();
153 const BondIds ids = std::make_pair( id, otherid );
154 BondNodeMap::const_iterator iter = BondsinSceneMap.find(ids);
155 if (iter != BondsinSceneMap.end()) {
156 // bond is already present
157 std::set< atomId_t >::const_iterator iter = presentBonds.find(otherid);
158 ASSERT(iter != presentBonds.end(),
159 "GLWorldScene::BondsChanged() - other id "+toString(otherid)+" for atom "
160 +toString(_atom->getId())+" not present in BondIdsinSceneMap.");
161 presentBonds.erase(otherid);
162 LOG(0, "Removing "+toString(otherid)+" from presentBonds.");
163 } else {
164 // insert new bond
165 bondInserted(_bond);
166 }
167 }
168 LOG(0, "The following bonds should not be present: "+toString(presentBonds)+".");
169
170 // remove all still presentBonds
171 for (std::set< atomId_t >::iterator iter = presentBonds.begin();
172 !presentBonds.empty(); iter = presentBonds.begin()) {
173 bondRemoved( id, *iter );
174 }
175}
176
177/** Adds a bond to the scene.
[7188b1]178 *
179 * @param _bond bond to add
180 */
181void GLWorldScene::bondInserted(const bond *_bond)
182{
[37b2575]183 LOG(0, "GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
[7188b1]184 const double distance =
185 _bond->leftatom->getPosition().distance(_bond->rightatom->getPosition())/2.;
186 {
187 // left bond
188 const BondIds Leftids( make_pair(_bond->leftatom->getId(), _bond->rightatom->getId()) );
[37b2575]189 BondNodeMap::iterator iter = BondsinSceneMap.find(Leftids);
190 ASSERT(iter == BondsinSceneMap.end(),
[7188b1]191 "GLWorldScene::bondAdded() - same left-sided bond "+toString(*_bond)+" added again.");
192 GLMoleculeObject_bond *bondObject =
193 new GLMoleculeObject_bond(this, _bond, distance, GLMoleculeObject_bond::left);
[37b2575]194 BondsinSceneMap.insert( make_pair(Leftids, bondObject) );
195 BondIdsinSceneMap.insert( Leftids );
[7188b1]196 }
197 {
198 // right bond
199 const BondIds Rightids( make_pair(_bond->rightatom->getId(), _bond->leftatom->getId()) );
[37b2575]200 BondNodeMap::iterator iter = BondsinSceneMap.find(Rightids);
201 ASSERT(iter == BondsinSceneMap.end(),
[7188b1]202 "GLWorldScene::bondAdded() - same right-sided bond "+toString(*_bond)+" added again.");
203 GLMoleculeObject_bond *bondObject =
204 new GLMoleculeObject_bond(this, _bond, distance, GLMoleculeObject_bond::right);
[37b2575]205 BondsinSceneMap.insert( make_pair(Rightids, bondObject) );
206 BondIdsinSceneMap.insert( Rightids );
[7188b1]207 }
[65487f]208 emit changeOccured();
[7188b1]209}
[907636]210
[37b2575]211/** Removes a bond from the scene.
[7188b1]212 *
213 * @param _bond bond to remove
214 */
[37b2575]215void GLWorldScene::bondRemoved(const atomId_t leftnr, const atomId_t rightnr)
[907636]216{
[37b2575]217 LOG(0, "GLWorldScene::bondRemoved() - Removing bond between "+toString(leftnr)+" and "+toString(leftnr)+".");
[7188b1]218 {
219 // left bond
[37b2575]220 const BondIds Leftids( make_pair(leftnr, rightnr) );
221 BondNodeMap::iterator leftiter = BondsinSceneMap.find( Leftids );
222 ASSERT(leftiter != BondsinSceneMap.end(),
223 "GLWorldScene::bondRemoved() - bond "+toString(leftnr)+"-"
224 +toString(rightnr)+" not on display.");
[7188b1]225 GLMoleculeObject_bond *bondObject = leftiter->second;
[37b2575]226 BondsinSceneMap.erase(leftiter);
[7188b1]227 delete bondObject;
228 }
[37b2575]229 // remove from bond ids
230 std::pair<BondIdsMap::iterator, BondIdsMap::iterator> leftrange =
231 BondIdsinSceneMap.equal_range(leftnr);
232 BondIdsMap::iterator iter;
233 for (iter = leftrange.first; iter != leftrange.second; ++iter) {
234 if (iter->second == rightnr) {
235 BondIdsinSceneMap.erase(iter);
236 break;
237 }
[907636]238 }
[37b2575]239 ASSERT(iter != leftrange.second,
240 "GLWorldScene::bondRemoved() - could not find ("
241 +toString(leftnr)+"-"+toString(rightnr)+" in BondIdsinSceneMap.");
[65487f]242 emit changeOccured();
[7188b1]243}
244
245void GLWorldScene::initialize(QGLView *view, QGLPainter *painter) const
246{
247 // Initialize all of the mesh objects that we have as children.
248 foreach (QObject *obj, children()) {
249 GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
250 if (meshobj)
251 meshobj->initialize(view, painter);
252 }
253}
254
255void GLWorldScene::draw(QGLPainter *painter) const
256{
257 // Draw all of the mesh objects that we have as children.
258 foreach (QObject *obj, children()) {
259 GLMoleculeObject *meshobj = qobject_cast<GLMoleculeObject *>(obj);
260 if (meshobj)
261 meshobj->draw(painter);
262 }
[907636]263}
[06ebf5]264
[7188b1]265void GLWorldScene::atomClicked(atomId_t no)
[907636]266{
[7188b1]267 qDebug("GLWorldScene: atom %d has been clicked.", no);
[0e9ffe]268 SelectionAtomById(no);
[7188b1]269 emit clicked(no);
[907636]270}
[029bb4]271
Note: See TracBrowser for help on using the repository browser.