Changeset 65c323 for src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp
- Timestamp:
- Feb 12, 2016, 11:15:23 PM (9 years ago)
- Branches:
- 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, 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
- Children:
- 494478
- Parents:
- 41e287
- git-author:
- Frederik Heber <heber@…> (10/29/15 10:46:45)
- git-committer:
- Frederik Heber <heber@…> (02/12/16 23:15:23)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp
r41e287 r65c323 36 36 #include "QtObservedAtom.hpp" 37 37 38 #include "UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp" 39 38 40 #include "CodePatterns/MemDebug.hpp" 39 41 42 #include <boost/assign.hpp> 43 44 #include "Atom/atom.hpp" 45 #include "Bond/bond.hpp" 46 #include "Descriptors/AtomIdDescriptor.hpp" 47 #include "Element/element.hpp" 48 #include "World.hpp" 49 50 #include "UIElements/Views/Qt4/Qt3D/ObservedValue_wCallback.hpp" 51 52 using namespace boost::assign; 53 54 static const Observable::channels_t getAtomBondsChannels() 55 { 56 Observable::channels_t channels; 57 channels += AtomObservable::BondsAdded, AtomObservable::BondsRemoved; 58 return channels; 59 } 60 61 static const Observable::channels_t getAllObservedChannels() 62 { 63 Observable::channels_t channels; 64 channels += 65 AtomObservable::IndexChanged, 66 AtomObservable::PositionChanged, 67 AtomObservable::ElementChanged, 68 AtomObservable::BondsAdded, 69 AtomObservable::BondsRemoved; 70 return channels; 71 } 72 73 // static entities 74 const Observable::channels_t 75 QtObservedAtom::AtomIndexChannels(1, AtomObservable::IndexChanged); 76 const Observable::channels_t 77 QtObservedAtom::AtomPositionChannels(1, AtomObservable::PositionChanged); 78 const Observable::channels_t 79 QtObservedAtom::AtomElementChannels(1, AtomObservable::ElementChanged); 80 const Observable::channels_t 81 QtObservedAtom::AtomBondsChannels(getAtomBondsChannels()); 82 40 83 QtObservedAtom::QtObservedAtom( 41 const ObservedValues_t &_obsvalues, 84 const ObservedValues_t &_ObservedValues, 85 QtObservedInstanceBoard &_board, 42 86 QWidget * _parent) : 43 87 QWidget(_parent), 44 88 Observer("QtObservedAtom"), 45 obsvalues(_obsvalues) 46 {} 89 subjectKilledCount(0), 90 AllsignedOnChannels(getAllObservedChannels().size()), 91 signedOffChannels(0), 92 owner(NULL), 93 board(_board), 94 ObservedValues(_ObservedValues) 95 { 96 activateObserver(); 97 } 47 98 48 99 QtObservedAtom::~QtObservedAtom() 49 {} 100 { 101 deactivateObserver(); 102 } 103 104 const atom * const QtObservedAtom::getAtomConst(const atomId_t _id) 105 { 106 const atom * const _atom = const_cast<const World &>(World::getInstance()). 107 getAtom(AtomById(_id)); 108 return _atom; 109 } 110 111 atom * const QtObservedAtom::getAtom(const atomId_t _id) 112 { 113 atom * const _atom = World::getInstance().getAtom(AtomById(_id)); 114 return _atom; 115 } 116 117 atomId_t QtObservedAtom::updateIndex() 118 { 119 return const_cast<const World &>(World::getInstance()).lastChangedAtomId(); 120 } 121 122 Vector QtObservedAtom::updatePosition( 123 const boost::function<const atomId_t ()> &_getAtomIndex) 124 { 125 const atom * const _atom = getAtomConst(_getAtomIndex()); 126 if (_atom != NULL) { 127 return _atom->getPosition(); 128 } else { 129 return zeroVec; 130 } 131 } 132 133 atomicNumber_t QtObservedAtom::updateElement( 134 const boost::function<const atomId_t ()> &_getAtomIndex) 135 { 136 const atom * const _atom = getAtomConst(_getAtomIndex()); 137 if (_atom != NULL) { 138 return _atom->getElementNo(); 139 } else { 140 return (atomicNumber_t)-1; 141 } 142 } 143 144 QtObservedAtom::ListOfBonds_t QtObservedAtom::updateBonds( 145 const boost::function<const atomId_t ()> &_getAtomIndex) 146 { 147 ListOfBonds_t ListOfBonds; 148 const atom * const _atom = getAtomConst(_getAtomIndex()); 149 if (_atom != NULL) { 150 // make sure bonds is up-to-date 151 const BondList ListBonds = _atom->getListOfBonds(); 152 for (BondList::const_iterator iter = ListBonds.begin(); 153 iter != ListBonds.end(); 154 ++iter) 155 ListOfBonds.insert( ListOfBonds.end(), std::make_pair( 156 (*iter)->leftatom->getId(), 157 (*iter)->rightatom->getId()) ); 158 } 159 return ListOfBonds; 160 } 50 161 51 162 void QtObservedAtom::update(Observable *publisher) 52 {} 163 { 164 ASSERT(0, "QtObservedAtom::update() - we are not signed on for global updates."); 165 } 53 166 54 167 void QtObservedAtom::subjectKilled(Observable *publisher) 55 {} 168 { 169 ++signedOffChannels; 170 171 if (signedOffChannels == AllsignedOnChannels) { 172 // remove owner: no more signOff needed 173 owner = NULL; 174 175 board.atomcountsubjectKilled(getAtomIndex()); 176 } 177 } 56 178 57 179 void QtObservedAtom::recieveNotification(Observable *publisher, Notification_ptr notification) 58 {} 180 { 181 // ObservedValues have been updated before, hence convert updates to Qt's signals 182 switch (notification->getChannelNo()) { 183 case AtomObservable::IndexChanged: 184 emit indexChanged(); 185 break; 186 case AtomObservable::PositionChanged: 187 emit positionChanged(); 188 break; 189 case AtomObservable::ElementChanged: 190 emit elementChanged(); 191 break; 192 case AtomObservable::BondsAdded: 193 case AtomObservable::BondsRemoved: 194 emit bondsChanged(); 195 break; 196 default: 197 ASSERT(0, "QtObservedAtom::recieveNotification() - we are not signed on to channel " 198 +toString(notification->getChannelNo())+" of the atom."); 199 break; 200 } 201 } 202 203 void QtObservedAtom::activateObserver() 204 { 205 atom * atomref = getAtom(getAtomIndex()); 206 if (atomref != NULL) { 207 Observable::channels_t channels = getAllObservedChannels(); 208 owner = static_cast<const Observable *>(atomref); 209 for (Observable::channels_t::const_iterator iter = channels.begin(); 210 iter != channels.end(); ++iter) 211 owner->signOn(this, *iter); 212 } else 213 signedOffChannels = getAllObservedChannels().size(); 214 } 215 216 void QtObservedAtom::deactivateObserver() 217 { 218 // sign Off 219 if (owner != NULL) { 220 Observable::channels_t channels = getAllObservedChannels(); 221 for (Observable::channels_t::const_iterator iter = channels.begin(); 222 iter != channels.end(); ++iter) 223 owner->signOff(this, *iter); 224 owner = NULL; 225 signedOffChannels = AllsignedOnChannels; 226 } 227 } 228 229 void QtObservedAtom::initObservedValues( 230 ObservedValues_t &_ObservedValues, 231 const atomId_t _id, 232 const atom * const _atomref, 233 const boost::function<void(const atomId_t)> &_subjectKilled) 234 { 235 /* This is an old note from when the code was still part of cstor's initializer body. 236 * TODO: Probably does not apply anymore but has not yet been tested. 237 * 238 * We must not use boost::cref(this) as "this" has not been properly constructed and seemingly 239 * boost::cref tries to do some magic to grasp the inheritance hierarchy which fails because 240 * the class has not been fully constructed yet. "This" itself seems to be working fine. 241 */ 242 243 ASSERT( _ObservedValues.size() == MAX_ObservedTypes, 244 "QtObservedAtom::initObservedValues() - given ObservedValues has not correct size."); 245 246 // fill ObservedValues: index first 247 const boost::function<atomId_t ()> AtomIndexUpdater( 248 boost::bind(&QtObservedAtom::updateIndex)); 249 250 ObservedValue_wCallback<atomId_t> * const IndexObservable = 251 new ObservedValue_wCallback<atomId_t>( 252 _atomref, 253 boost::bind(&QtObservedAtom::updateIndex), 254 "AtomIndex_"+toString(_id), 255 _id, 256 AtomIndexChannels, 257 _subjectKilled); 258 _ObservedValues[AtomIndex] = IndexObservable; 259 260 const boost::function<const atomId_t ()> AtomIndexGetter = 261 boost::bind(&ObservedValue_wCallback<atomId_t>::get, 262 IndexObservable); 263 264 // fill ObservedValues: then all the other that need index 265 const boost::function<Vector ()> AtomPositionUpdater( 266 boost::bind(&QtObservedAtom::updatePosition, AtomIndexGetter)); 267 const boost::function<atomicNumber_t ()> AtomElementUpdater( 268 boost::bind(&QtObservedAtom::updateElement, AtomIndexGetter)); 269 const boost::function<ListOfBonds_t ()> AtomBondsUpdater( 270 boost::bind(&QtObservedAtom::updateBonds, AtomIndexGetter)); 271 272 _ObservedValues[AtomPosition] = new ObservedValue_wCallback<Vector, atomId_t>( 273 _atomref, 274 AtomPositionUpdater, 275 "AtomPosition_"+toString(_id), 276 AtomPositionUpdater(), 277 AtomPositionChannels, 278 _subjectKilled, 279 AtomIndexGetter); 280 _ObservedValues[AtomElement] = new ObservedValue_wCallback<atomicNumber_t, atomId_t>( 281 _atomref, 282 AtomElementUpdater, 283 "AtomElement"+toString(_id), 284 AtomElementUpdater(), 285 AtomElementChannels, 286 _subjectKilled, 287 AtomIndexGetter); 288 _ObservedValues[AtomBonds] = new ObservedValue_wCallback<ListOfBonds_t, atomId_t>( 289 _atomref, 290 AtomBondsUpdater, 291 "AtomBonds_"+toString(_id), 292 AtomBondsUpdater(), 293 AtomBondsChannels, 294 _subjectKilled, 295 AtomIndexGetter); 296 } 297 298 void QtObservedAtom::destroyObservedValues( 299 std::vector<boost::any> &_ObservedValues) 300 { 301 delete boost::any_cast<ObservedValue_wCallback<atomId_t> *>(_ObservedValues[AtomIndex]); 302 delete boost::any_cast<ObservedValue_wCallback<Vector, atomId_t> *>(_ObservedValues[AtomPosition]); 303 delete boost::any_cast<ObservedValue_wCallback<atomicNumber_t, atomId_t> *>(_ObservedValues[AtomElement]); 304 delete boost::any_cast<ObservedValue_wCallback<ListOfBonds_t, atomId_t> *>(_ObservedValues[AtomBonds]); 305 _ObservedValues.clear(); 306 } 307 308 atomId_t QtObservedAtom::getAtomIndex() const 309 { 310 return boost::any_cast<ObservedValue_wCallback<atomId_t> *>(ObservedValues[AtomIndex])->get(); 311 } 312 313 Vector QtObservedAtom::getAtomPosition() const 314 { 315 return boost::any_cast<ObservedValue_wCallback<Vector, atomId_t> *>(ObservedValues[AtomPosition])->get(); 316 } 317 318 atomicNumber_t QtObservedAtom::getAtomElement() const 319 { 320 return boost::any_cast<ObservedValue_wCallback<atomicNumber_t, atomId_t> *>(ObservedValues[AtomElement])->get(); 321 } 322 323 QtObservedAtom::ListOfBonds_t QtObservedAtom::getAtomBonds() const 324 { 325 return boost::any_cast<ObservedValue_wCallback<ListOfBonds_t, atomId_t> *>(ObservedValues[AtomBonds])->get(); 326 }
Note:
See TracChangeset
for help on using the changeset viewer.