diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 93c3f1dc80..254312ca67 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -32,10 +32,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -60,6 +62,34 @@ static char *mystrdup(const std::string &text) return tmp; } +// find if executable is in path +// https://stackoverflow.com/a/51041497 + +static bool has_exe(const QString &exe) +{ + QProcess findProcess; + QStringList arguments; + arguments << exe; +#if defined(_WIN32) + findProcess.start("where", arguments); +#else + findProcess.start("which", arguments); +#endif + findProcess.setReadChannel(QProcess::ProcessChannel::StandardOutput); + + if (!findProcess.waitForFinished()) return false; // Not found or which does not work + + QString retStr(findProcess.readAll()); + retStr = retStr.trimmed(); + + QFile file(retStr); + QFileInfo check_file(file); + if (check_file.exists() && check_file.isFile()) + return true; // Found! + else + return false; // Not found! +} + LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), status(nullptr), logwindow(nullptr), imagewindow(nullptr), chartwindow(nullptr), @@ -140,6 +170,12 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : update_recents(); + // check if we have OVITO and VMD installed and deacivate actions if not + ui->actionView_in_OVITO->setEnabled(has_exe("ovito")); + ui->actionView_in_OVITO->setData("ovito"); + ui->actionView_in_VMD->setEnabled(has_exe("vmd")); + ui->actionView_in_VMD->setData("vmd"); + connect(ui->actionNew, &QAction::triggered, this, &LammpsGui::new_document); connect(ui->actionOpen, &QAction::triggered, this, &LammpsGui::open); connect(ui->actionSave, &QAction::triggered, this, &LammpsGui::save); @@ -160,6 +196,8 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : connect(ui->actionLAMMPS_Manual, &QAction::triggered, this, &LammpsGui::manual); connect(ui->actionPreferences, &QAction::triggered, this, &LammpsGui::preferences); connect(ui->actionDefaults, &QAction::triggered, this, &LammpsGui::defaults); + connect(ui->actionView_in_OVITO, &QAction::triggered, this, &LammpsGui::start_exe); + connect(ui->actionView_in_VMD, &QAction::triggered, this, &LammpsGui::start_exe); connect(ui->actionView_Log_Window, &QAction::triggered, this, &LammpsGui::view_log); connect(ui->actionView_Graph_Window, &QAction::triggered, this, &LammpsGui::view_chart); connect(ui->actionView_Image_Window, &QAction::triggered, this, &LammpsGui::view_image); @@ -259,6 +297,57 @@ void LammpsGui::open_recent() if (act) open_file(act->data().toString()); } +void LammpsGui::start_exe() +{ + if (!lammps.extract_setting("box_exists")) return; + QAction *act = qobject_cast(sender()); + if (act) { + auto exe = act->data().toString(); + QString datacmd = "write_data "; + QDir datadir(QDir::tempPath()); + QFile datafile(datadir.absoluteFilePath(current_file + ".data")); + datacmd += datafile.fileName(); + if (exe == "vmd") { + QStringList args; + QFile vmdfile(datadir.absoluteFilePath(current_file + ".vmd")); + vmdfile.open(QIODevice::WriteOnly); + vmdfile.write("package require topotools\n"); + vmdfile.write("topo readlammpsdata "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write("\ntopo guessatom lammps data\n"); + vmdfile.write("animate write psf "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(".psf\nanimate write dcd "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(".dcd\nmol delete top\nmol new "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(".psf type psf waitfor all\nmol addfile "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(".dcd type dcd waitfor all\nfile delete "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(" "); + vmdfile.write(vmdfile.fileName().toLocal8Bit()); + vmdfile.write(" "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(".dcd "); + vmdfile.write(datafile.fileName().toLocal8Bit()); + vmdfile.write(".psf\n"); + vmdfile.close(); + args << "-e" << vmdfile.fileName(); + lammps.command(datacmd.toLocal8Bit()); + auto *vmd = new QProcess(this); + vmd->start(exe, args); + } + if (exe == "ovito") { + QStringList args; + args << datafile.fileName(); + lammps.command(datacmd.toLocal8Bit()); + auto *ovito = new QProcess(this); + ovito->start(exe, args); + } + } +} + void LammpsGui::update_recents(const QString &filename) { QSettings settings; diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index d6e9ceb086..5fed14d743 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -66,6 +66,7 @@ private slots: void new_document(); void open(); void open_recent(); + void start_exe(); void save(); void save_as(); void quit(); diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index d718634452..88526719f0 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -41,5 +41,7 @@ axes-img.png hd-img.png antialias.png + ovito.png + vmd.png diff --git a/tools/lammps-gui/lammpsgui.ui b/tools/lammps-gui/lammpsgui.ui index 14fad503d7..6bda61dbb4 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -73,6 +73,8 @@ + + @@ -293,6 +295,28 @@ Reset to &Defaults + + + + + + View in &OVITO + + + Ctrl+Shift+O + + + + + + + + View in VM&D + + + Ctrl+Shift+D + + diff --git a/tools/lammps-gui/ovito.png b/tools/lammps-gui/ovito.png new file mode 100644 index 0000000000..7b34660cf3 Binary files /dev/null and b/tools/lammps-gui/ovito.png differ diff --git a/tools/lammps-gui/vmd.png b/tools/lammps-gui/vmd.png new file mode 100644 index 0000000000..34b8e737a1 Binary files /dev/null and b/tools/lammps-gui/vmd.png differ