forked from OpenChemistry/avogadrolibs
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request OpenChemistry#1863 from ghutchis/alchemy
Add a quick "change elements" command (e.g., setting to dummy)
- Loading branch information
Showing
4 changed files
with
164 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
include_directories(${CMAKE_CURRENT_BINARY_DIR}) | ||
|
||
avogadro_plugin(Alchemy | ||
"Change elements" | ||
ExtensionPlugin | ||
alchemy.h | ||
Alchemy | ||
"alchemy.cpp" | ||
"" | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/****************************************************************************** | ||
This source file is part of the Avogadro project. | ||
This source code is released under the 3-Clause BSD License, (see "LICENSE"). | ||
******************************************************************************/ | ||
|
||
#include "alchemy.h" | ||
|
||
#include <avogadro/core/elements.h> | ||
#include <avogadro/qtgui/molecule.h> | ||
|
||
#include <QAction> | ||
#include <QtCore/QSettings> | ||
#include <QtWidgets/QDialog> | ||
#include <QtWidgets/QInputDialog> | ||
|
||
#include <vector> | ||
|
||
namespace Avogadro::QtPlugins { | ||
|
||
using Core::Array; | ||
using Core::Elements; | ||
|
||
Alchemy::Alchemy(QObject* parent_) | ||
: Avogadro::QtGui::ExtensionPlugin(parent_), | ||
m_action(new QAction(tr("Change Elements…"), this)), m_molecule(nullptr) | ||
{ | ||
m_action->setProperty("menu priority", 750); | ||
|
||
connect(m_action, &QAction::triggered, this, &Alchemy::changeElements); | ||
} | ||
|
||
Alchemy::~Alchemy() {} | ||
|
||
QList<QAction*> Alchemy::actions() const | ||
{ | ||
QList<QAction*> result; | ||
return result << m_action; | ||
} | ||
|
||
QStringList Alchemy::menuPath(QAction*) const | ||
{ | ||
return QStringList() << tr("&Build"); | ||
} | ||
|
||
void Alchemy::setMolecule(QtGui::Molecule* mol) | ||
{ | ||
m_molecule = mol; | ||
} | ||
|
||
void Alchemy::changeElements() | ||
{ | ||
if (!m_molecule) | ||
return; | ||
|
||
// assemble the list of elements | ||
QStringList choices; | ||
for (unsigned char i = 0; i < Elements::elementCount(); ++i) { | ||
QString choice("%1: %2"); | ||
choice = choice.arg(i).arg(Elements::name(i)); | ||
choices << choice; | ||
} | ||
|
||
// get the element of the first selected atom | ||
unsigned char firstElement = 0; | ||
for (Index i = 0; i < m_molecule->atomCount(); ++i) { | ||
if (m_molecule->atomSelected(i)) { | ||
firstElement = m_molecule->atom(i).atomicNumber(); | ||
break; | ||
} | ||
} | ||
|
||
bool ok = false; | ||
QString currentChoice = QInputDialog::getItem( | ||
qobject_cast<QWidget*>(parent()), tr("Change Elements"), tr("Element:"), | ||
choices, static_cast<int>(firstElement), false, &ok); | ||
if (!ok) | ||
return; | ||
|
||
unsigned char newElement = currentChoice.section(':', 0, 0).toUShort(); | ||
// loop through the selected atoms and change their elements | ||
for (Index i = 0; i < m_molecule->atomCount(); ++i) { | ||
if (m_molecule->atomSelected(i)) | ||
m_molecule->atom(i).setAtomicNumber(newElement); | ||
} | ||
|
||
m_molecule->emitChanged(QtGui::Molecule::Atoms); | ||
} | ||
|
||
} // namespace Avogadro::QtPlugins |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/****************************************************************************** | ||
This source file is part of the Avogadro project. | ||
This source code is released under the 3-Clause BSD License, (see "LICENSE"). | ||
******************************************************************************/ | ||
|
||
#ifndef AVOGADRO_QTPLUGINS_ALCHEMY_H | ||
#define AVOGADRO_QTPLUGINS_ALCHEMY_H | ||
|
||
#include <avogadro/core/avogadrocore.h> | ||
#include <avogadro/qtgui/extensionplugin.h> | ||
|
||
#include <QtWidgets/QDialog> | ||
|
||
namespace Ui { | ||
class BondingDialog; | ||
} | ||
|
||
namespace Avogadro { | ||
namespace QtPlugins { | ||
|
||
/** | ||
* @brief The Bonding class performs bonding operations on demand. | ||
*/ | ||
class Alchemy : public QtGui::ExtensionPlugin | ||
{ | ||
Q_OBJECT | ||
public: | ||
explicit Alchemy(QObject* parent_ = nullptr); | ||
~Alchemy() override; | ||
|
||
QString name() const override { return tr("Alchemy"); } | ||
|
||
QString description() const override | ||
{ | ||
return tr("Change elements of atoms."); | ||
} | ||
|
||
QList<QAction*> actions() const override; | ||
|
||
QStringList menuPath(QAction* action) const override; | ||
|
||
public slots: | ||
void setMolecule(QtGui::Molecule* mol) override; | ||
|
||
private slots: | ||
void changeElements(); | ||
|
||
private: | ||
QtGui::Molecule* m_molecule; | ||
|
||
QAction* m_action; | ||
}; | ||
|
||
} // namespace QtPlugins | ||
} // namespace Avogadro | ||
|
||
#endif // AVOGADRO_QTPLUGINS_ALCHEMY_H |