From e886d0119029eb143938da677a903f9feb12e84a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 15 Aug 2023 08:04:01 -0400 Subject: [PATCH] add View in OVITO and View in VMD entries to Run menu --- tools/lammps-gui/lammpsgui.cpp | 89 +++++++++++++++++++++++++++++++++ tools/lammps-gui/lammpsgui.h | 1 + tools/lammps-gui/lammpsgui.qrc | 2 + tools/lammps-gui/lammpsgui.ui | 24 +++++++++ tools/lammps-gui/ovito.png | Bin 0 -> 7080 bytes tools/lammps-gui/vmd.png | Bin 0 -> 4332 bytes 6 files changed, 116 insertions(+) create mode 100644 tools/lammps-gui/ovito.png create mode 100644 tools/lammps-gui/vmd.png 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 0000000000000000000000000000000000000000..7b34660cf3bde4321e63ca71d1a105d7ed4d5ddc GIT binary patch literal 7080 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 literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/vmd.png b/tools/lammps-gui/vmd.png new file mode 100644 index 0000000000000000000000000000000000000000..34b8e737a12efd14a498b098b660026212edfe5e GIT binary patch literal 4332 zcmeHKYj6|S6<%Y&j<6H#BsIZdycRS#E~{O=cefI@krb?gY(iFqV#7+^?ZXww>E7^f+uG{!cA+cc9G;b|zZKum#@yhsR%b9eo~o@A!u zndYB0vwQd6bIy0p`R=)Abf0jS%uiQMS0M*>R>U}zOYi{%NgR*3Ph@nVXl zW*f=|=CG-5t+lwT@ZJNr;^s0>DC6Az%7RlTSN85pZm9k(f1xn*9qG-U z?Oy-i+wv#>GQ&PGw|i~#^T&R_z9r3a@Q8KQs(nqL&iOcA|8(xFAzjDp%-M^(+8WJ` zLGzBu7wgXE{kbRq8g;FuC~Ma0^Lx*Jl6`S^*Mzs9n!e|q>0Ed91K_TaL`7wEUNExQ_jT0HfItxx1X()Pz!@+HqgmM{45 zOitC!%sqFBW&3+}t)UG)Pv_jcV|7i%bKC#W+Y(bvTea)TGnHuD6zSo=d{Y-bvH8x9 z{11A~Q?Vk2TNuN2xdO*)`YoH?~h8R!wO* z+4ltS=DMNM~C8z#9Xdn_-K5P1;_`U05M#vA@E29A88Sn z9MuqHFrXi_i2L9n#XVeHs1g~@QO!lAnIj=sX4pPfC5DxBSO(|9Tm-7dp;zrFm-C%2 z_ppUbL6DEc6e~#fC{2kE+#+jKY_dd2XJjDId>D6>_E7GMGSqUpXuH5v$>BNeR<-P( zW(9_4Y2}kKaug9@00v0Th#5>Ig^`Tei0K2AS?4G9CJN|BKslpv2}BuAhJxT49^z1X zQXeoe1g0}nBxd0BMvNqk0AmbBEyXYa#>^Q;K$MC+tV$3b8I=shLMUJ~0KW+aVqyV= z0s#*52PlAPNdwFJDPYoTfda)c^aFwz0dPC{2ncd`EE-e+;k*)%+0>dS9YLA&X3{_z^!kCA6}*QyF%BzH#?%s;L5aLAG)x8( z3*+tkOa{u2w|&QhCpS@VX+GyCl*M+4kQkO5;{FikhIq5BTTfxL~BWm zFwn#ZeSzfzEB=?Ze0WgHz?K*Dap-@AvNUj_yjp^Q~{S3)4jFB;oMvn^t zsRoE#Q4sP7xq{`XaE0b68+HF^?V1oL?*b$YBS`G~gyDk;<8sd!%GiQ`j}wccFrvvo zyMZ;>ykIZHhnwLbXL8&55r2bw@gsVG(Bn?V#P2v=<8+OQfiWqMSJyaQV`5-T%H!4b zf1^uv>pI0n;lH37cv(uz2AknUE7QHu=TNR(NIx8ur@y~n(^=99r%95h#ETSOI12Ck zNRofSd^^%OX+|-e+!iZd97m8Tcgjx^vT@TixR@e2U5=ECsduO}nGe4*`wh5M>9iO5 z$TzPv7pXeXw23L7=dR02UET3mf4z5o`=Q!U->U~4V$bROvdeG$+TMWfIXvOPibYha z-?8#`)ypS7#qZH+AIkgr*4MI|kDs~w(4@$gt#5anK`uR;^Q#@7WhU08CSU%~?TEK< k0XW$9)sgjczA4N8?902qAhZ8^2|7odjuQLMdCMRD4sNF#&;S4c literal 0 HcmV?d00001