diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 45ef858b3c..d936bf82d9 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.1.5 LANGUAGES CXX) +project(lammps-gui VERSION 1.1.6 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) diff --git a/tools/lammps-gui/imageviewer.cpp b/tools/lammps-gui/imageviewer.cpp index d492b86bb2..526f9c41d0 100644 --- a/tools/lammps-gui/imageviewer.cpp +++ b/tools/lammps-gui/imageviewer.cpp @@ -58,12 +58,12 @@ ImageViewer::ImageViewer(const QString &fileName, LammpsWrapper *_lammps, QWidge QVBoxLayout *mainLayout = new QVBoxLayout; - auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), "Zoom In"); - auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"),"Zoom Out"); - auto *rotleft = new QPushButton(QIcon(":/object-rotate-left.png"), "Rotate Left"); - auto *rotright = new QPushButton(QIcon(":/object-rotate-right.png"), "Rotate Right"); - auto *rotup = new QPushButton(QIcon(":/gtk-go-up.png"),"Rotate Up"); - auto *rotdown = new QPushButton(QIcon(":/gtk-go-down.png"),"Rotate Down"); + auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), ""); + auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"), ""); + auto *rotleft = new QPushButton(QIcon(":/object-rotate-left.png"), ""); + auto *rotright = new QPushButton(QIcon(":/object-rotate-right.png"), ""); + auto *rotup = new QPushButton(QIcon(":/gtk-go-up.png"), ""); + auto *rotdown = new QPushButton(QIcon(":/gtk-go-down.png"), ""); auto *combo = new QComboBox; combo->setObjectName("group"); int ngroup = lammps->id_count("group"); @@ -148,14 +148,14 @@ void ImageViewer::do_rot_right() void ImageViewer::do_rot_down() { hrot -= 15; - if (hrot < -0) hrot += 180; + if (hrot < 0) hrot += 360; createImage(); } void ImageViewer::do_rot_up() { hrot += 15; - if (hrot > 180) hrot -= 180; + if (hrot > 360) hrot -= 360; createImage(); } @@ -178,6 +178,7 @@ void ImageViewer::createImage() int aa = settings.value("antialias", 0).toInt() + 1; int xsize = settings.value("xsize", 800).toInt() * aa; int ysize = settings.value("ysize", 600).toInt() * aa; + int hhrot = (hrot > 180) ? 360 - hrot : hrot; dumpcmd += blank + settings.value("color", "type").toString(); dumpcmd += blank + settings.value("diameter", "type").toString(); @@ -185,9 +186,18 @@ void ImageViewer::createImage() dumpcmd += QString(" zoom ") + QString::number(zoom); lammps->command(dumpcmd.toLocal8Bit()); if (lammps->extract_setting("dimension") == 3) { - dumpcmd += QString(" view ") + QString::number(hrot) + blank + QString::number(vrot); + dumpcmd += QString(" view ") + QString::number(hhrot) + blank + QString::number(vrot); } if (settings.value("ssao", false).toBool()) dumpcmd += QString(" ssao yes 453983 0.6"); + if (settings.value("box", true).toBool()) + dumpcmd += QString(" box yes 0.02"); + else + dumpcmd += QString(" box no 0.0"); + if (settings.value("axes", true).toBool()) + dumpcmd += QString(" axes yes 0.2 0.02"); + else + dumpcmd += QString(" axes no 0.0 0.0"); + settings.endGroup(); lammps->command(dumpcmd.toLocal8Bit()); diff --git a/tools/lammps-gui/imageviewer.h b/tools/lammps-gui/imageviewer.h index 9aee1cf957..3e038f0231 100644 --- a/tools/lammps-gui/imageviewer.h +++ b/tools/lammps-gui/imageviewer.h @@ -53,9 +53,10 @@ private slots: void do_rot_down(); void change_group(int); +public: + void createImage(); private: void createActions(); - void createImage(); void updateActions(); void saveFile(const QString &fileName); void scaleImage(double factor); diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 5546173a44..5ef4fc8f88 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -177,7 +177,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : connect(ui->actionRedo, &QAction::triggered, this, &LammpsGui::redo); connect(ui->actionRun_Buffer, &QAction::triggered, this, &LammpsGui::run_buffer); connect(ui->actionStop_LAMMPS, &QAction::triggered, this, &LammpsGui::stop_run); - connect(ui->actionImage, &QAction::triggered, this, &LammpsGui::view_image); + connect(ui->actionImage, &QAction::triggered, this, &LammpsGui::render_image); connect(ui->actionAbout_LAMMPS_GUI, &QAction::triggered, this, &LammpsGui::about); connect(ui->action_Help, &QAction::triggered, this, &LammpsGui::help); connect(ui->actionLAMMPS_Manual, &QAction::triggered, this, &LammpsGui::manual); @@ -185,6 +185,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : connect(ui->actionDefaults, &QAction::triggered, this, &LammpsGui::defaults); 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); connect(ui->action_1, &QAction::triggered, this, &LammpsGui::open_recent); connect(ui->action_2, &QAction::triggered, this, &LammpsGui::open_recent); connect(ui->action_3, &QAction::triggered, this, &LammpsGui::open_recent); @@ -704,7 +705,7 @@ void LammpsGui::run_buffer() logupdater->start(250); } -void LammpsGui::view_image() +void LammpsGui::render_image() { // LAMMPS is not re-entrant, so we can only query LAMMPS when it is not running if (!lammps.is_running()) { @@ -714,6 +715,8 @@ void LammpsGui::view_image() "Cannot create snapshot image without a system box"); return; } + // if configured, delete old image window before opening new one + if (QSettings().value("imagereplace", false).toBool()) delete imagewindow; imagewindow = new ImageViewer(current_file, &lammps); } else { QMessageBox::warning(this, "ImageViewer Error", @@ -756,6 +759,17 @@ void LammpsGui::view_log() } } +void LammpsGui::view_image() +{ + if (imagewindow) { + if (imagewindow->isVisible()) { + imagewindow->hide(); + } else { + imagewindow->show(); + } + } +} + void LammpsGui::about() { std::string version = "This is LAMMPS-GUI version " LAMMPS_GUI_VERSION; @@ -871,6 +885,7 @@ void LammpsGui::preferences() (oldecho != settings.value("echo", 0).toInt()) || (oldcite != settings.value("cite", 0).toInt())) lammps.close(); + if (imagewindow) imagewindow->createImage(); } } diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index d539b51529..f2a0fbbbc2 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -75,6 +75,7 @@ private slots: void clear(); void run_buffer(); void stop_run(); + void render_image(); void view_image(); void view_chart(); void view_log(); diff --git a/tools/lammps-gui/lammpsgui.ui b/tools/lammps-gui/lammpsgui.ui index 3031b31d23..69fa4946b4 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -86,6 +86,7 @@ + @@ -404,6 +405,14 @@ &5. + + + + + + &Image Window + + diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index 423328a837..fb83a8b3f9 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -120,6 +120,10 @@ void Preferences::accept() if (combo) settings->setValue("antialias", combo->currentIndex()); QCheckBox *box = tabWidget->findChild("ssao"); if (box) settings->setValue("ssao", box->isChecked()); + box = tabWidget->findChild("box"); + if (box) settings->setValue("box", box->isChecked()); + box = tabWidget->findChild("axes"); + if (box) settings->setValue("axes", box->isChecked()); settings->endGroup(); // general settings @@ -131,6 +135,8 @@ void Preferences::accept() if (box) settings->setValue("logreplace", box->isChecked()); box = tabWidget->findChild("chartreplace"); if (box) settings->setValue("chartreplace", box->isChecked()); + box = tabWidget->findChild("imagereplace"); + if (box) settings->setValue("imagereplace", box->isChecked()); box = tabWidget->findChild("viewlog"); if (box) settings->setValue("viewlog", box->isChecked()); box = tabWidget->findChild("viewchart"); @@ -159,6 +165,10 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa logr->setObjectName("logreplace"); logr->setCheckState(settings->value("logreplace", false).toBool() ? Qt::Checked : Qt::Unchecked); + auto *imgr = new QCheckBox("Replace image window on new render"); + imgr->setObjectName("imagereplace"); + imgr->setCheckState(settings->value("imagereplace", false).toBool() ? Qt::Checked + : Qt::Unchecked); auto *pltr = new QCheckBox("Replace chart window on new run"); pltr->setObjectName("chartreplace"); pltr->setCheckState(settings->value("chartreplace", false).toBool() ? Qt::Checked @@ -202,6 +212,7 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa layout->addWidget(pltv); layout->addWidget(logr); layout->addWidget(pltr); + layout->addWidget(imgr); #if !defined(__APPLE__) layout->addLayout(tmplayout); #endif @@ -382,12 +393,16 @@ SnapshotTab::SnapshotTab(QSettings *_settings, QWidget *parent) : auto *zoom = new QLabel("Zoom factor:"); auto *anti = new QLabel("Antialias:"); auto *ssao = new QLabel("HQ Image mode:"); + auto *bbox = new QLabel("Show Box:"); + auto *axes = new QLabel("Show Axes:"); settings->beginGroup("snapshot"); auto *xval = new QLineEdit(settings->value("xsize", "800").toString()); auto *yval = new QLineEdit(settings->value("ysize", "600").toString()); auto *zval = new QLineEdit(settings->value("zoom", "1.0").toString()); auto *aval = new QComboBox; auto *sval = new QCheckBox; + auto *bval = new QCheckBox; + auto *eval = new QCheckBox; sval->setCheckState(settings->value("ssao", false).toBool() ? Qt::Checked : Qt::Unchecked); sval->setObjectName("ssao"); aval->addItem("1x", 1); @@ -396,6 +411,10 @@ SnapshotTab::SnapshotTab(QSettings *_settings, QWidget *parent) : aval->addItem("4x", 4); aval->setCurrentIndex(settings->value("antialias", "0").toInt()); aval->setObjectName("anti"); + bval->setCheckState(settings->value("box", true).toBool() ? Qt::Checked : Qt::Unchecked); + bval->setObjectName("box"); + eval->setCheckState(settings->value("axes", false).toBool() ? Qt::Checked : Qt::Unchecked); + eval->setObjectName("axes"); settings->endGroup(); auto *intval = new QIntValidator(100, 100000, this); @@ -411,14 +430,18 @@ SnapshotTab::SnapshotTab(QSettings *_settings, QWidget *parent) : grid->addWidget(zoom, 2, 0, Qt::AlignTop); grid->addWidget(anti, 3, 0, Qt::AlignTop); grid->addWidget(ssao, 4, 0, Qt::AlignTop); + grid->addWidget(bbox, 5, 0, Qt::AlignTop); + grid->addWidget(axes, 6, 0, Qt::AlignTop); grid->addWidget(xval, 0, 1, Qt::AlignTop); grid->addWidget(yval, 1, 1, Qt::AlignTop); grid->addWidget(zval, 2, 1, Qt::AlignTop); grid->addWidget(aval, 3, 1, Qt::AlignTop); grid->addWidget(sval, 4, 1, Qt::AlignVCenter); - grid->addItem(new QSpacerItem(100, 100, QSizePolicy::Minimum, QSizePolicy::Expanding), 5, 0); - grid->addItem(new QSpacerItem(100, 100, QSizePolicy::Minimum, QSizePolicy::Expanding), 5, 1); - grid->addItem(new QSpacerItem(100, 100, QSizePolicy::Expanding, QSizePolicy::Expanding), 5, 2); + grid->addWidget(bval, 5, 1, Qt::AlignVCenter); + grid->addWidget(eval, 6, 1, Qt::AlignVCenter); + grid->addItem(new QSpacerItem(100, 100, QSizePolicy::Minimum, QSizePolicy::Expanding), 7, 0); + grid->addItem(new QSpacerItem(100, 100, QSizePolicy::Minimum, QSizePolicy::Expanding), 7, 1); + grid->addItem(new QSpacerItem(100, 100, QSizePolicy::Expanding, QSizePolicy::Expanding), 7, 2); setLayout(grid); }