/// Removes atom from the molecule. This will also remove any bonds /// to/from the atom. void Molecule::removeAtom(Atom *atom) { if(!contains(atom)){ return; } // remove all bonds to/from the atom first std::vector<Bond *> bonds = atom->bonds(); foreach(Bond *bond, bonds){ removeBond(bond); }
void Molecule::removeAtom(Atom *atom) { if(atom) { // When deleting an atom this also implicitly deletes any bonds to the atom foreach (unsigned long bond, atom->bonds()) { removeBond(bond); } m_atoms[atom->id()] = 0; // 1 based arrays stored/shown to user int index = atom->index(); m_atomList.removeAt(index); for (int i = index; i < m_atomList.size(); ++i) m_atomList[i]->setIndex(i); atom->deleteLater(); disconnect(atom, SIGNAL(updated()), this, SLOT(updateAtom())); emit atomRemoved(atom); } }
bool Molecule::removeAtom(Index index) { if (index >= atomCount()) return false; Index uniqueId = findAtomUniqueId(index); if (uniqueId == MaxIndex) return false; // Unique ID of an atom that was removed: m_atomUniqueIds[uniqueId] = MaxIndex; // Before removing the atom we must first remove any bonds to it. Core::Array<BondType> atomBonds = Core::Molecule::bonds(atom(index)); while (atomBonds.size()) { removeBond(atomBonds.back()); atomBonds = Core::Molecule::bonds(atom(index)); } Index newSize = static_cast<Index>(m_atomicNumbers.size() - 1); if (index != newSize) { // We need to move the last atom to this position, and update its unique ID. m_atomicNumbers[index] = m_atomicNumbers.back(); if (m_positions2d.size() == m_atomicNumbers.size()) m_positions2d[index] = m_positions2d.back(); if (m_positions3d.size() == m_atomicNumbers.size()) m_positions3d[index] = m_positions3d.back(); // Find any bonds to the moved atom and update their index. atomBonds = Core::Molecule::bonds(atom(newSize)); foreach (const BondType& currentBond, atomBonds) { std::pair<Index, Index> pair = m_bondPairs[currentBond.index()]; if (pair.first == newSize) pair.first = index; else if (pair.second == newSize) pair.second = index; m_bondPairs[currentBond.index()] = pair; }
void Molecule::removeBond(Bond *bond) { if(bond) { removeBond(bond->id()); } }