Changeset 68418e for src/UIElements/Qt4/InstanceBoard
- Timestamp:
- Feb 12, 2016, 11:15:24 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:
- ab628c
- Parents:
- 90821d
- git-author:
- Frederik Heber <heber@…> (10/29/15 14:41:13)
- git-committer:
- Frederik Heber <heber@…> (02/12/16 23:15:24)
- Location:
- src/UIElements/Qt4/InstanceBoard
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp
r90821d r68418e 32 32 class ObservedValuesContainer 33 33 { 34 public: 35 36 //!> typedef for callback functions to be used on last SubjectKilled() 37 typedef boost::function<void (const id _id)> onDestroy_t; 38 34 39 /** Cstor of class ObservedValuesContainer. 35 40 * 36 41 * \param _name name used in debugging and prints 37 42 * \param _board ref to InstanceBoard 43 * \param _onDestroy function to call when last subjectKilled() was received and 44 * ObservedValues are destroyed 38 45 */ 39 46 ObservedValuesContainer( 40 47 const std::string _name, 41 QtObservedInstanceBoard &_board); 48 QtObservedInstanceBoard &_board, 49 const onDestroy_t _onDestroy); 42 50 43 51 /** Delivers the set of Observed value for the instance identified by \a _id. … … 48 56 typename T::ptr get(const id _id); 49 57 50 /** Returns an observed instance identified by \a _id, for deallocation.58 /** Used by QtObserved.. instance to note that signOn() has been called. 51 59 * 52 * \param _id identifier of the instance 60 * \param _id identifier of the instance who called signOn() 53 61 */ 54 void yield(const id _id);62 void markObservedValuesAsConnected(const id _id); 55 63 56 ObservedValues_t getObservedValues(const id _id); 57 58 void returnObservedValues(const id _id, ObservedValues_t &_observedvalues); 64 /** Used by QtObserved.. instance to note that signOff() has been called. 65 * 66 * \param _id identifier of the instance who called signOff() 67 */ 68 void markObservedValuesAsDisconnected(const id _id); 59 69 60 70 /** Inform this container that subjectKilled() was received by one of the ObservedValues. 61 71 * 62 72 * \param _id identifier of the receiving instance 63 * \param _onDestroy function to call when last subjectKilled() was received and64 * ObservedValues are destroyed65 73 */ 66 void countsubjectKilled( 67 const id _id, 68 boost::function<void (const id _id)> _onDestroy); 74 void countsubjectKilled(const id _id); 75 76 /** Erases a vector of observed values of an instance identified by \a _id. 77 * 78 * \param _id identifier of instance 79 */ 80 void removeObservedValues(const id _id); 69 81 70 82 private: 71 typedef std::pair< ObservedValues_t, size_t> RefCountedObservedValues_t;83 typedef std::pair<typename T::ptr, size_t> RefCountedObservedValues_t; 72 84 typedef std::map<id, RefCountedObservedValues_t> CountedObservedValues_t; 73 85 //!> internal vector of observed values … … 86 98 QtObservedInstanceBoard &board; 87 99 100 //!> callback function when ObservedValues need to be destroyed 101 const onDestroy_t onDestroy; 102 103 private: 104 /** Internal function to check whether an Observed instance identified by 105 * \a _id is still signOn() to its associated World instance. 106 * 107 * \param _id identifier of instance 108 * \return true - no more signOn()s, false - else 109 */ 110 bool checkRefCount(const id _id) const; 111 112 /** Internal function to check whether any ObservedValue identified by 113 * \a _id is still signOn() to its associated World instance. 114 * 115 * \param _id identifier of instance 116 * \return true - no more signOn()s, false - else 117 */ 118 bool checksubjectKilled(const id _id) const; 119 88 120 private: 89 121 //!> QtObservedInstanceBoard may access anything … … 96 128 * \return true - insertion successful, false - else 97 129 */ 98 bool insert(const id _id, ObservedValues_t&_obsvalues);130 bool insert(const id _id, const typename T::ptr &_obsvalues); 99 131 100 132 /** Use to change the identifier associated with a vector of observed values. … … 113 145 size_t getRefCount(const id _id) const; 114 146 115 /** Erases a vector of observed values of an instance identified by \a _id.116 *117 * \param _id identifier of instance118 * \return true - erase successful, false - else119 */120 bool erase(const id _id);121 122 147 /** Checks whether a vector of observed values of an instance identified by \a _id 123 148 * is present. -
src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp
r90821d r68418e 22 22 ObservedValuesContainer<T,id>::ObservedValuesContainer( 23 23 const std::string _name, 24 QtObservedInstanceBoard &_board) : 24 QtObservedInstanceBoard &_board, 25 const onDestroy_t _onDestroy) : 25 26 NameOfType(_name), 26 board(_board) 27 board(_board), 28 onDestroy(_onDestroy) 27 29 {} 28 30 … … 34 36 "ObservedValuesContainer::getObservedValues() - no observed values present for " 35 37 +NameOfType+" "+toString(_id)); 36 const ObservedValues_t &obsvalues = iter->second.first; 37 // increase refcount 38 ++(iter->second.second); 39 typename T::ptr _molecule(new T(obsvalues, board)); 38 const typename T::ptr &obsvalues = iter->second.first; 40 39 41 return _molecule;40 return obsvalues; 42 41 } 43 42 44 43 template <class T, typename id> 45 void ObservedValuesContainer<T,id>::yield(const id _id) 44 void ObservedValuesContainer<T,id>::markObservedValuesAsConnected( 45 const id _id) 46 46 { 47 47 typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); 48 ASSERT( iter != ObservedValues.end(), 49 "ObservedValuesContainer::returnObservedAtom() - no observed values present for " 50 +NameOfType+" "+toString(_id)); 51 ASSERT( iter->second.second != 0, 52 "ObservedValuesContainer::returnObservedAtom() - all instances for " 53 +NameOfType+" "+toString(_id)+" have already been returned."); 54 // decrease refcount 55 --(iter->second.second); 56 if (iter->second.second == 0) { 57 // free instance 58 } 48 ASSERT (iter != ObservedValues.end(), 49 "ObservedValuesContainer<T,id>::markObservedValuesAsConnected() - Observed value of " 50 +NameOfType+" "+toString(_id)+" is not present yet."); 51 ++(iter->second.second); 59 52 } 60 53 61 54 template <class T, typename id> 62 ObservedValues_t ObservedValuesContainer<T,id>::getObservedValues(const id _id) 55 bool ObservedValuesContainer<T,id>::checkRefCount( 56 const id _id) const 63 57 { 64 ObservedValues_t returnvalues; 65 typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); 66 ASSERT(iter != ObservedValues.end(), 67 "ObservedValuesContainer::getObservedValues() - "+NameOfType 68 +" values not present for id "+toString(_id)); 69 if (iter->first == _id) { 70 returnvalues = iter->second.first; 71 ObservedValues.erase(iter); 72 } 73 return returnvalues; 58 typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id); 59 return ((iter != ObservedValues.end()) && (iter->second.second == 0)); 74 60 } 75 61 76 62 template <class T, typename id> 77 void ObservedValuesContainer<T,id>::returnObservedValues( 78 const id _id, 79 ObservedValues_t &_observedvalues) 63 void ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected( 64 const id _id) 80 65 { 81 #ifndef NDEBUG 82 std::pair<typename CountedObservedValues_t::iterator, bool> inserter = 83 #endif 84 ObservedValues.insert( 85 std::make_pair( _id, std::make_pair(_observedvalues,0) ) ); 86 ASSERT( inserter.second, 87 "QtObservedInstanceBoard::returnAtomObservedValues() - could not insert ObservedValues for" 88 +toString(_id)+"."); 66 typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); 67 ASSERT (iter != ObservedValues.end(), 68 "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() - Observed value of " 69 +NameOfType+" "+toString(_id)+" is not present yet."); 70 ASSERT (iter->second.second != 0, 71 "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() - Observed value of " 72 +NameOfType+" "+toString(_id)+" is already signOff() from all."); 73 --(iter->second.second); 74 75 if (checkRefCount(_id) && checksubjectKilled(_id)) 76 removeObservedValues(_id); 89 77 } 90 78 91 79 template <class T, typename id> 92 void ObservedValuesContainer<T,id>::countsubjectKilled( 93 const id _id, 94 boost::function<void (const id _id)> _onDestroy) 80 bool ObservedValuesContainer<T,id>::checksubjectKilled( 81 const id _id) const 82 { 83 typename subjectKilledCount_t::const_iterator iter = subjectKilledCount.find(_id); 84 return ((iter != subjectKilledCount.end()) && (iter->second == T::MAX_ObservedTypes)); 85 } 86 87 template <class T, typename id> 88 void ObservedValuesContainer<T,id>::countsubjectKilled(const id _id) 95 89 { 96 90 LOG(3, "DEBUG: ObservedValuesContainer got subjectKilled() for an observed value of " … … 102 96 iter = inserter.first; 103 97 } 98 ASSERT (iter->second < T::MAX_ObservedTypes, 99 "ObservedValuesContainer<T,id>::countsubjectKilled() - all subjectKilled() for " 100 +NameOfType+" "+toString(_id)+" for each observed channel came in already."); 104 101 ++(iter->second); 105 102 106 if (iter->second > T::MAX_ObservedTypes) { 107 ASSERT( getRefCount(_id) == 0, 108 "ObservedValuesContainer::countsubjectKilled() - observed Values for " 109 +NameOfType+" "+toString(_id)+" are still being held somewhere."); 110 _onDestroy(_id); 111 subjectKilledCount.erase(iter); 112 } 103 if (checkRefCount(_id) && checksubjectKilled(_id)) 104 removeObservedValues(_id); 113 105 } 114 106 115 107 template <class T, typename id> 116 bool ObservedValuesContainer<T,id>::insert(const id _id, ObservedValues_t &_obsvalues) 108 void ObservedValuesContainer<T,id>::removeObservedValues(const id _id) 109 { 110 LOG(3, "DEBUG: ObservedValuesContainer removes " << NameOfType << " " << _id); 111 // call callback function 112 onDestroy(_id); 113 subjectKilledCount.erase(_id); 114 ObservedValues.erase(_id); 115 } 116 117 template <class T, typename id> 118 bool ObservedValuesContainer<T,id>::insert(const id _id, const typename T::ptr &_obsvalues) 117 119 { 118 120 std::pair<typename CountedObservedValues_t::iterator, bool> inserter = 119 121 ObservedValues.insert( 120 122 std::make_pair( _id, std::make_pair(_obsvalues,0) ) ); 123 _obsvalues->activateObserver(); 121 124 return inserter.second; 122 125 } … … 156 159 157 160 template <class T, typename id> 158 bool ObservedValuesContainer<T,id>::erase(const id _id)159 {160 typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id);161 if (iter != ObservedValues.end()) {162 ObservedValues.erase(iter);163 return true;164 } else165 return false;166 }167 168 template <class T, typename id>169 161 bool ObservedValuesContainer<T,id>::isPresent(const id _id) const 170 162 { -
src/UIElements/Qt4/InstanceBoard/QtObservedAtom.cpp
r90821d r68418e 94 94 ObservedValues(_ObservedValues) 95 95 { 96 activateObserver();96 // activating Observer is done by ObservedValueContainer when it's prepared 97 97 } 98 98 … … 173 173 owner = NULL; 174 174 175 board. returnObservedAtom(getAtomIndex());175 board.markObservedAtomAsDisconnected(getAtomIndex()); 176 176 } 177 177 } … … 224 224 owner = NULL; 225 225 signedOffChannels = AllsignedOnChannels; 226 board.markObservedAtomAsDisconnected(getAtomIndex()); 226 227 } 227 228 } -
src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp
r90821d r68418e 40 40 41 41 #include "CodePatterns/MemDebug.hpp" 42 43 #include <boost/bind.hpp> 42 44 43 45 #include "CodePatterns/Log.hpp" … … 54 56 Observer("QtObservedInstanceBoard"), 55 57 WorldSignedOn(false), 56 atomObservedValues("atom", *this), 57 moleculeObservedValues("molecule", *this), 58 atomObservedValues( 59 "atom", 60 *this, 61 boost::bind(&QtObservedInstanceBoard::atomcountsubjectKilled, this, _1)), 62 moleculeObservedValues( 63 "molecule", 64 *this, 65 boost::bind(&QtObservedInstanceBoard::moleculecountsubjectKilled, this, _1)), 66 atomSubjectKilled( 67 boost::bind(&ObservedValuesContainer<QtObservedAtom, atomId_t>::countsubjectKilled, 68 boost::ref(atomObservedValues), 69 _1)), 70 moleculeSubjectKilled( 71 boost::bind(&ObservedValuesContainer<QtObservedMolecule, moleculeId_t>::countsubjectKilled, 72 boost::ref(moleculeObservedValues), 73 _1)), 58 74 lastremovedatom((atomId_t)-1), 59 75 lastremovedatomsmolecule( std::make_pair((moleculeId_t)-1,(atomId_t)-1) ), 60 76 lastremovedmolecule((moleculeId_t)-1) 61 77 { 62 boost::function<void (const atomId_t _id)> atomfctor =63 boost::bind(&QtObservedInstanceBoard::atomcountsubjectKilled, this, _1);64 atomSubjectKilled =65 boost::bind(&ObservedValuesContainer<QtObservedAtom, atomId_t>::countsubjectKilled,66 boost::ref(atomObservedValues),67 _1,68 atomfctor69 );70 boost::function<void (const moleculeId_t _id)> molfctor =71 boost::bind(&QtObservedInstanceBoard::moleculecountsubjectKilled, this, _1);72 moleculeSubjectKilled =73 boost::bind(&ObservedValuesContainer<QtObservedMolecule, moleculeId_t>::countsubjectKilled,74 boost::ref(moleculeObservedValues),75 _1,76 molfctor77 );78 79 78 // be first (besides ObservedValues to know about new insertions) 80 79 World::getInstance().signOn(this, World::AtomInserted, GlobalObservableInfo::PriorityLevel(int(-10))); … … 154 153 _molecule, 155 154 moleculeSubjectKilled); 155 QtObservedMolecule::ptr observedmolecule(new QtObservedMolecule(ObservedValues, *this)); 156 156 #ifndef NDEBUG 157 157 bool status = 158 158 #endif 159 moleculeObservedValues.insert(_id, ObservedValues);159 moleculeObservedValues.insert(_id, observedmolecule); 160 160 ASSERT( status, 161 "QtObservedInstanceBoard::recieveNotification() - could not insert Observed Valuesfor"161 "QtObservedInstanceBoard::recieveNotification() - could not insert ObservedMolecule for" 162 162 +toString(_id)+"."); 163 163 // we need to check for index changes … … 201 201 _atom, 202 202 atomSubjectKilled); 203 QtObservedAtom::ptr observedatom(new QtObservedAtom(ObservedValues, *this)); 203 204 #ifndef NDEBUG 204 205 bool status = 205 206 #endif 206 atomObservedValues.insert(_id, ObservedValues);207 atomObservedValues.insert(_id, observedatom); 207 208 ASSERT( status, 208 209 "QtObservedInstanceBoard::recieveNotification() - could not insert ObservedValues for" … … 307 308 void QtObservedInstanceBoard::atomcountsubjectKilled(const atomId_t _atomid) 308 309 { 309 if (_atomid == lastremovedatomsmolecule.second) 310 if ((_atomid == lastremovedatomsmolecule.second) && (_atomid == lastremovedatom)) { 311 LOG(3, "DEBUG: InstanceBoard emits atomRemoved for " << _atomid); 310 312 emit atomRemoved(lastremovedatomsmolecule.first, lastremovedatomsmolecule.second); 311 else313 } else 312 314 ELOG(2, "QtObservedInstanceBoard::atomcountsubjectKilled() - id " << _atomid 313 << " not fitting with " << lastremovedatomsmolecule );315 << " not fitting with " << lastremovedatomsmolecule << " or " << lastremovedatom); 314 316 } 315 317 316 318 void QtObservedInstanceBoard::moleculecountsubjectKilled(const moleculeId_t _molid) 317 319 { 318 emit moleculeRemoved(_molid); 320 if (lastremovedmolecule == _molid) { 321 LOG(3, "DEBUG: InstanceBoard emits moleculeRemoved for " << _molid); 322 emit moleculeRemoved(_molid); 323 } else 324 ELOG(2, "QtObservedInstanceBoard::moleculecountsubjectKilled() - id " << _molid 325 << " not fitting with " << lastremovedmolecule); 319 326 } 320 327 … … 329 336 } 330 337 331 void QtObservedInstanceBoard::returnObservedAtom(const atomId_t _id) 332 { 333 atomObservedValues.yield(_id); 334 } 335 336 void QtObservedInstanceBoard::returnObservedMolecule(const moleculeId_t _id) 337 { 338 moleculeObservedValues.yield(_id); 339 } 340 341 ObservedValues_t QtObservedInstanceBoard::getAtomObservedValues(const atomId_t _id) 342 { 343 return atomObservedValues.getObservedValues(_id); 344 } 345 ObservedValues_t QtObservedInstanceBoard::getMoleculeObservedValues(const moleculeId_t _id) 346 { 347 return moleculeObservedValues.getObservedValues(_id); 348 } 349 350 void QtObservedInstanceBoard::returnAtomObservedValues( 351 const atomId_t _id, 352 ObservedValues_t &_observedvalues) 353 { 354 if (lastremovedatom != _id) { 355 atomObservedValues.returnObservedValues(_id, _observedvalues); 356 } else { 357 lastremovedatom = (atomId_t)-1; 358 atomObservedValues.erase(_id); 359 } 360 } 361 362 void QtObservedInstanceBoard::returnMoleculeObservedValues( 363 const moleculeId_t _id, 364 ObservedValues_t &_observedvalues) 365 { 366 if (lastremovedmolecule != _id) { 367 moleculeObservedValues.returnObservedValues(_id, _observedvalues); 368 } else { 369 lastremovedmolecule = (moleculeId_t)-1; 370 moleculeObservedValues.erase(_id); 371 } 372 } 373 338 void QtObservedInstanceBoard::markObservedAtomAsConnected(const atomId_t _id) 339 { 340 atomObservedValues.markObservedValuesAsConnected(_id); 341 } 342 343 void QtObservedInstanceBoard::markObservedAtomAsDisconnected(const atomId_t _id) 344 { 345 atomObservedValues.markObservedValuesAsDisconnected(_id); 346 } 347 348 void QtObservedInstanceBoard::markObservedMoleculeAsConnected(const moleculeId_t _id) 349 { 350 moleculeObservedValues.markObservedValuesAsConnected(_id); 351 } 352 353 void QtObservedInstanceBoard::markObservedMoleculeAsDisconnected(const moleculeId_t _id) 354 { 355 moleculeObservedValues.markObservedValuesAsDisconnected(_id); 356 } -
src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp
r90821d r68418e 81 81 QtObservedAtom::ptr getObservedAtom(const atomId_t _id); 82 82 QtObservedMolecule::ptr getObservedMolecule(const moleculeId_t _id); 83 void returnObservedAtom(const atomId_t _id); 84 void returnObservedMolecule(const moleculeId_t _id); 85 86 ObservedValues_t getAtomObservedValues(const atomId_t _id); 87 ObservedValues_t getMoleculeObservedValues(const moleculeId_t _id); 88 89 void returnAtomObservedValues(const atomId_t _id, ObservedValues_t &_observedvalues); 90 void returnMoleculeObservedValues(const moleculeId_t _id, ObservedValues_t &_observedvalues); 83 void markObservedAtomAsConnected(const atomId_t _id); 84 void markObservedAtomAsDisconnected(const atomId_t _id); 85 void markObservedMoleculeAsConnected(const moleculeId_t _id); 86 void markObservedMoleculeAsDisconnected(const moleculeId_t _id); 91 87 92 88 signals: -
src/UIElements/Qt4/InstanceBoard/QtObservedMolecule.cpp
r90821d r68418e 84 84 ObservedValues(_ObservedValues) 85 85 { 86 activateObserver();86 // activating Observer is done by ObservedValueContainer when it's prepared 87 87 } 88 88 … … 101 101 owner = NULL; 102 102 signedOffChannels = AllsignedOnChannels; 103 board.markObservedMoleculeAsDisconnected(getMolIndex()); 103 104 } 104 105 } … … 132 133 owner = NULL; 133 134 134 board. returnObservedMolecule(getMolIndex());135 board.markObservedMoleculeAsDisconnected(getMolIndex()); 135 136 } 136 137 }
Note:
See TracChangeset
for help on using the changeset viewer.