initial attempt to allow viewing molecules.

This commit is contained in:
Axel Kohlmeyer
2025-04-10 08:23:04 -04:00
parent f2bf0d0a8b
commit bc031bdd7a
2 changed files with 74 additions and 8 deletions

View File

@ -139,8 +139,8 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge
QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea), QDialog(parent), menuBar(new QMenuBar), imageLabel(new QLabel), scrollArea(new QScrollArea),
buttonBox(nullptr), scaleFactor(1.0), atomSize(1.0), saveAsAct(nullptr), copyAct(nullptr), buttonBox(nullptr), scaleFactor(1.0), atomSize(1.0), saveAsAct(nullptr), copyAct(nullptr),
cmdAct(nullptr), zoomInAct(nullptr), zoomOutAct(nullptr), normalSizeAct(nullptr), cmdAct(nullptr), zoomInAct(nullptr), zoomOutAct(nullptr), normalSizeAct(nullptr),
lammps(_lammps), group("all"), filename(fileName), useelements(false), usediameter(false), lammps(_lammps), group("all"), molecule("none"), filename(fileName), useelements(false),
usesigma(false) usediameter(false), usesigma(false)
{ {
imageLabel->setBackgroundRole(QPalette::Base); imageLabel->setBackgroundRole(QPalette::Base);
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
@ -239,19 +239,30 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge
recenter->setToolTip("Recenter on group"); recenter->setToolTip("Recenter on group");
auto *reset = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), ""); auto *reset = new QPushButton(QIcon(":/icons/gtk-zoom-fit.png"), "");
reset->setToolTip("Reset view to defaults"); reset->setToolTip("Reset view to defaults");
auto *combo = new QComboBox;
combo->setObjectName("group");
combo->setToolTip("Select group to display");
combo->setObjectName("group");
int ngroup = lammps->id_count("group");
constexpr int BUFLEN = 256; constexpr int BUFLEN = 256;
char gname[BUFLEN]; char gname[BUFLEN];
auto *combo = new QComboBox;
combo->setToolTip("Select group to display");
combo->setObjectName("group");
int ngroup = lammps->id_count("group");
for (int i = 0; i < ngroup; ++i) { for (int i = 0; i < ngroup; ++i) {
memset(gname, 0, BUFLEN); memset(gname, 0, BUFLEN);
lammps->id_name("group", i, gname, BUFLEN); lammps->id_name("group", i, gname, BUFLEN);
combo->addItem(gname); combo->addItem(gname);
} }
auto *molbox = new QComboBox;
molbox->setToolTip("Select molecule to display");
molbox->setObjectName("molecule");
molbox->addItem("none");
int nmols = lammps->id_count("molecule");
for (int i = 0; i < nmols; ++i) {
memset(gname, 0, BUFLEN);
lammps->id_name("molecule", i, gname, BUFLEN);
molbox->addItem(gname);
}
auto *menuLayout = new QHBoxLayout; auto *menuLayout = new QHBoxLayout;
auto *buttonLayout = new QHBoxLayout; auto *buttonLayout = new QHBoxLayout;
auto *topLayout = new QVBoxLayout; auto *topLayout = new QVBoxLayout;
@ -272,6 +283,8 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge
menuLayout->addWidget(dummy1); menuLayout->addWidget(dummy1);
menuLayout->addWidget(new QLabel(" Group: ")); menuLayout->addWidget(new QLabel(" Group: "));
menuLayout->addWidget(combo); menuLayout->addWidget(combo);
menuLayout->addWidget(new QLabel(" Molecule: "));
menuLayout->addWidget(molbox);
buttonLayout->addWidget(dummy2); buttonLayout->addWidget(dummy2);
buttonLayout->addWidget(dossao); buttonLayout->addWidget(dossao);
buttonLayout->addWidget(doanti); buttonLayout->addWidget(doanti);
@ -304,6 +317,7 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge
connect(recenter, &QPushButton::released, this, &ImageViewer::do_recenter); connect(recenter, &QPushButton::released, this, &ImageViewer::do_recenter);
connect(reset, &QPushButton::released, this, &ImageViewer::reset_view); connect(reset, &QPushButton::released, this, &ImageViewer::reset_view);
connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(change_group(int))); connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(change_group(int)));
connect(molbox, SIGNAL(currentIndexChanged(int)), this, SLOT(change_molecule(int)));
mainLayout->addLayout(topLayout); mainLayout->addLayout(topLayout);
mainLayout->addWidget(scrollArea); mainLayout->addWidget(scrollArea);
@ -529,16 +543,60 @@ void ImageViewer::cmd_to_clipboard()
void ImageViewer::change_group(int) void ImageViewer::change_group(int)
{ {
auto *box = findChild<QComboBox *>("group"); auto *box = findChild<QComboBox *>("group");
if (box) group = box->currentText(); group = box ? box->currentText() : "all";
// reset molecule to "none" when changing group
box = findChild<QComboBox *>("molecule");
if (box && (box->currentIndex() > 0)) {
box->setCurrentIndex(0); // triggers call to createImage()
} else {
createImage();
}
}
void ImageViewer::change_molecule(int)
{
auto *box = findChild<QComboBox *>("molecule");
molecule = box ? box->currentText() : "none";
createImage(); createImage();
} }
// This function creates a visualization of the current system using the
// "dump image" command and reads and displays the renderd image.
// To visualize molecules we create new atoms with create_atoms and
// put them into a new, temporary group and then visualize that group.
// After rendering the image, the atoms and group are deleted.
// to update bond data, we also need to issue a "run 0" command.
void ImageViewer::createImage() void ImageViewer::createImage()
{ {
auto *renderstatus = findChild<QLabel *>("renderstatus"); auto *renderstatus = findChild<QLabel *>("renderstatus");
if (renderstatus) renderstatus->setEnabled(true); if (renderstatus) renderstatus->setEnabled(true);
repaint(); repaint();
QString oldgroup = group;
if (molecule != "none") {
// get center of box
double *boxlo, *boxhi, xmid, ymid, zmid;
boxlo = (double *)lammps->extract_global("boxlo");
boxhi = (double *)lammps->extract_global("boxhi");
if (boxlo && boxhi) {
xmid = 0.5 * (boxhi[0] + boxlo[0]);
ymid = 0.5 * (boxhi[1] + boxlo[1]);
zmid = 0.5 * (boxhi[2] + boxlo[2]);
} else {
xmid = ymid = zmid = 0.0;
}
QString molcreate = "create_atoms 0 single %1 %2 %3 mol %4 312944 group %5 units box";
group = "imgviewer_tmp_mol";
lammps->command(molcreate.arg(xmid).arg(ymid).arg(zmid).arg(molecule).arg(group));
lammps->command("run 0 post no");
}
QSettings settings; QSettings settings;
QString dumpcmd = QString("write_dump ") + group + " image "; QString dumpcmd = QString("write_dump ") + group + " image ";
QDir dumpdir(QDir::tempPath()); QDir dumpdir(QDir::tempPath());
@ -683,6 +741,12 @@ void ImageViewer::createImage()
imageLabel->adjustSize(); imageLabel->adjustSize();
if (renderstatus) renderstatus->setEnabled(false); if (renderstatus) renderstatus->setEnabled(false);
repaint(); repaint();
if (molecule != "none") {
lammps->command(QString("delete_atoms group %1 compress no").arg(group));
lammps->command(QString("group %1 delete").arg(group));
group = oldgroup;
}
} }
void ImageViewer::saveAs() void ImageViewer::saveAs()

View File

@ -60,6 +60,7 @@ private slots:
void do_recenter(); void do_recenter();
void cmd_to_clipboard(); void cmd_to_clipboard();
void change_group(int); void change_group(int);
void change_molecule(int);
public: public:
void createImage(); void createImage();
@ -89,6 +90,7 @@ private:
LammpsWrapper *lammps; LammpsWrapper *lammps;
QString group; QString group;
QString molecule;
QString filename; QString filename;
QString last_dump_cmd; QString last_dump_cmd;
int xsize, ysize; int xsize, ysize;